每次调用某个函数时,有没有办法将调用堆栈转储到 C 或 C++ 中正在运行的进程中?我的想法是这样的:
void foo()
{
print_stack_trace();
// foo's body
return
}
其中 print_stack_trace
的工作方式与 Perl 中的 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
时都会打印堆栈跟踪。
某些标准 C 库中是否存在类似的东西?
我正在使用 GCC 在 Linux 上工作。
背景
我有一个测试运行,它基于一些不应影响此行为的命令行开关而表现不同。我的代码有一个伪随机数生成器,我假设它根据这些开关被不同地调用。我希望能够使用每组开关运行测试,看看随机数生成器是否对每个开关都有不同的调用。
原文由 Nathan Fellman 发布,翻译遵循 CC BY-SA 4.0 许可协议
对于仅限 linux 的解决方案,您可以使用 backtrace(3) ,它只返回一个
void *
的数组(实际上每个都指向相应堆栈帧的返回地址)。要将这些转换为有用的东西,可以使用 backtrace_symbols(3) 。注意 backtrace(3) 中的注释部分: