mirror of
https://github.com/zeek/zeek.git
synced 2025-10-02 06:38:20 +00:00
Add backtrace() and print_backtrace()
This commit is contained in:
parent
76e67ff239
commit
a1c19840ce
11 changed files with 242 additions and 41 deletions
78
scripts/base/utils/backtrace.zeek
Normal file
78
scripts/base/utils/backtrace.zeek
Normal file
|
@ -0,0 +1,78 @@
|
|||
## Prints a Zeek function call stack.
|
||||
##
|
||||
## show_args: whether to print function argument names/types/values.
|
||||
##
|
||||
## one_line: whether to print the stack in a single line or multiple.
|
||||
##
|
||||
## one_line_delim: delimiter between stack elements if printing to one line.
|
||||
##
|
||||
## skip: the number of call stack elements to skip past, starting from zero,
|
||||
## with that being the call to this function.
|
||||
##
|
||||
## to_file: the file to which the call stack will be printed.
|
||||
##
|
||||
## .. zeek:see:: backtrace
|
||||
function print_backtrace(show_args: bool &default=F,
|
||||
one_line: bool &default=F,
|
||||
one_line_delim: string &default="|",
|
||||
skip: count &default=1,
|
||||
to_file: file &default=open("/dev/stdout"))
|
||||
{
|
||||
local bt = backtrace();
|
||||
local vs: vector of string = vector();
|
||||
local orig_skip = skip;
|
||||
|
||||
for ( i in bt )
|
||||
{
|
||||
if ( skip > 0 )
|
||||
{
|
||||
--skip;
|
||||
next;
|
||||
}
|
||||
|
||||
local bte = bt[i];
|
||||
|
||||
local info = fmt("%s(", bte$function_name);
|
||||
|
||||
if ( show_args )
|
||||
for ( ai in bte$function_args )
|
||||
{
|
||||
local arg = bte$function_args[ai];
|
||||
|
||||
if ( ai > 0 )
|
||||
info += ", ";
|
||||
|
||||
info += fmt("%s: %s", arg$name, arg$type_name);
|
||||
|
||||
if ( arg?$value )
|
||||
info += fmt(" = %s", arg$value);
|
||||
}
|
||||
|
||||
info += ")";
|
||||
|
||||
if ( bte?$file_location )
|
||||
info += fmt(" at %s:%s", bte$file_location, bte$line_location);
|
||||
|
||||
vs += fmt("#%s: %s", i - orig_skip, info);
|
||||
}
|
||||
|
||||
if ( one_line )
|
||||
{
|
||||
local line = "";
|
||||
|
||||
for ( vsi in vs )
|
||||
{
|
||||
line += one_line_delim + " " + vs[vsi] + " ";
|
||||
|
||||
if ( vsi == |vs| - 1 )
|
||||
line += one_line_delim;
|
||||
}
|
||||
|
||||
print to_file, line;
|
||||
}
|
||||
else
|
||||
{
|
||||
for ( vsi in vs )
|
||||
print to_file, vs[vsi];
|
||||
}
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue