mirror of
https://github.com/zeek/zeek.git
synced 2025-10-02 06:38:20 +00:00
78 lines
1.7 KiB
Text
78 lines
1.7 KiB
Text
## 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];
|
|
}
|
|
}
|