每当调用某个函数时,是否有任何方法可以在C或C ++的运行进程中转储调用堆栈?我想到的是这样的:
void foo() { print_stack_trace(); // foo's body return }
Where的print_stack_trace工作方式与callerPerl 类似。
print_stack_trace
caller
或类似这样的东西:
int main (void) { // will print out debug info every time foo() is called register_stack_trace_function(foo); // etc... }
在其中register_stack_trace_function放置某种内部断点,该断点将在每次foo调用时打印堆栈跟踪。
register_stack_trace_function
foo
标准的C库中是否存在类似的东西?
我正在使用GCC在Linux上工作。
我有一个测试运行,该行为基于一些不应影响此行为的命令行开关而有所不同。我的代码有一个伪随机数生成器,我假设根据这些开关的调用方式有所不同。我希望能够使用每组开关运行测试,并查看每个随机数生成器的调用方式是否有所不同。
对于仅适用于Linux的解决方案,您可以使用backtrace(3),它仅返回一个数组void *(实际上,每个数组都指向相应堆栈帧中的返回地址)。为了将这些转换为有用的东西,有backtrace_symbols(3)。
void *
注意backtrace(3)中的notes部分:
如果不使用特殊的链接器选项,则符号名称可能不可用。对于使用GNU链接程序的系统,必须使用- rdynamic链接程序选项。请注意,“静态”函数的名称未公开,并且在回溯中将不可用。