mirror of
https://github.com/zeek/zeek.git
synced 2025-10-03 15:18:20 +00:00
Improve script debugger backtrace and print commands.
Stack trace context descriptions are no longer limited to 1024 chars and better error messages are relayed when the arguments to print commands fail to parse (e.g. an "unknown identifier" was given).
This commit is contained in:
parent
da34266a52
commit
0c5afc59f7
3 changed files with 23 additions and 8 deletions
18
src/Debug.cc
18
src/Debug.cc
|
@ -721,7 +721,6 @@ static char* get_prompt(bool reset_counter = false)
|
|||
|
||||
string get_context_description(const Stmt* stmt, const Frame* frame)
|
||||
{
|
||||
char buf[1024];
|
||||
ODesc d;
|
||||
const BroFunc* func = frame->GetFunction();
|
||||
|
||||
|
@ -739,10 +738,14 @@ string get_context_description(const Stmt* stmt, const Frame* frame)
|
|||
loc.last_line = 0;
|
||||
}
|
||||
|
||||
safe_snprintf(buf, sizeof(buf), "In %s at %s:%d",
|
||||
size_t buf_size = strlen(d.Description()) + strlen(loc.filename) + 1024;
|
||||
char* buf = new char[buf_size];
|
||||
safe_snprintf(buf, buf_size, "In %s at %s:%d",
|
||||
d.Description(), loc.filename, loc.last_line);
|
||||
|
||||
return string(buf);
|
||||
string retval(buf);
|
||||
delete [] buf;
|
||||
return retval;
|
||||
}
|
||||
|
||||
int dbg_handle_debug_input()
|
||||
|
@ -924,6 +927,8 @@ bool post_execute_stmt(Stmt* stmt, Frame* f, Val* result, stmt_flow_type* flow)
|
|||
// Evaluates the given expression in the context of the currently selected
|
||||
// frame. Returns the resulting value, or nil if none (or there was an error).
|
||||
Expr* g_curr_debug_expr = 0;
|
||||
const char* g_curr_debug_error = 0;
|
||||
bool in_debug = false;
|
||||
|
||||
// ### fix this hardwired access to external variables etc.
|
||||
struct yy_buffer_state;
|
||||
|
@ -969,6 +974,10 @@ Val* dbg_eval_expr(const char* expr)
|
|||
Val* result = 0;
|
||||
if ( yyparse() )
|
||||
{
|
||||
if ( g_curr_debug_error )
|
||||
debug_msg("Parsing expression '%s' failed: %s\n", expr, g_curr_debug_error);
|
||||
else
|
||||
debug_msg("Parsing expression '%s' failed\n", expr);
|
||||
if ( g_curr_debug_expr )
|
||||
{
|
||||
delete g_curr_debug_expr;
|
||||
|
@ -983,6 +992,9 @@ Val* dbg_eval_expr(const char* expr)
|
|||
|
||||
delete g_curr_debug_expr;
|
||||
g_curr_debug_expr = 0;
|
||||
delete [] g_curr_debug_error;
|
||||
g_curr_debug_error = 0;
|
||||
in_debug = false;
|
||||
|
||||
return result;
|
||||
}
|
||||
|
|
|
@ -553,6 +553,7 @@ int dbg_cmd_print(DebugCmd cmd, const vector<string>& args)
|
|||
for ( int i = 0; i < int(args.size()); ++i )
|
||||
{
|
||||
expr += args[i];
|
||||
if ( i < int(args.size()) - 1 )
|
||||
expr += " ";
|
||||
}
|
||||
|
||||
|
@ -566,8 +567,7 @@ int dbg_cmd_print(DebugCmd cmd, const vector<string>& args)
|
|||
}
|
||||
else
|
||||
{
|
||||
// ### Print something?
|
||||
// debug_msg("<expression has no value>\n");
|
||||
debug_msg("<expression has no value>\n");
|
||||
}
|
||||
|
||||
return 1;
|
||||
|
|
|
@ -112,13 +112,14 @@ bool is_export = false; // true if in an export {} block
|
|||
* (obviously not reentrant).
|
||||
*/
|
||||
extern Expr* g_curr_debug_expr;
|
||||
extern bool in_debug;
|
||||
extern const char* g_curr_debug_error;
|
||||
|
||||
#define YYLTYPE yyltype
|
||||
|
||||
Expr* bro_this = 0;
|
||||
int in_init = 0;
|
||||
int in_record = 0;
|
||||
bool in_debug = false;
|
||||
bool resolving_global_ID = false;
|
||||
bool defining_global_ID = false;
|
||||
|
||||
|
@ -249,7 +250,6 @@ bro:
|
|||
TOK_DEBUG { in_debug = true; } expr
|
||||
{
|
||||
g_curr_debug_expr = $3;
|
||||
in_debug = false;
|
||||
}
|
||||
;
|
||||
|
||||
|
@ -1685,6 +1685,9 @@ int yyerror(const char msg[])
|
|||
strcat(msgbuf, "\nDocumentation mode is enabled: "
|
||||
"remember to check syntax of ## style comments\n");
|
||||
|
||||
if ( in_debug )
|
||||
g_curr_debug_error = copy_string(msg);
|
||||
|
||||
reporter->Error("%s", msgbuf);
|
||||
|
||||
return 0;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue