在 C 或 C 中打印调用堆栈

新手上路,请多包涵

每次调用某个函数时,有没有办法将调用堆栈转储到 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 许可协议

阅读 1.8k
2 个回答

对于仅限 linux 的解决方案,您可以使用 backtrace(3) ,它只返回一个 void * 的数组(实际上每个都指向相应堆栈帧的返回地址)。要将这些转换为有用的东西,可以使用 backtrace_symbols(3)

注意 backtrace(3) 中的注释部分

如果不使用特殊的链接器选项,符号名称可能不可用。对于使用 GNU 链接器的系统,必须使用 -rdynamic 链接器选项。请注意,“静态”函数的名称不会公开,并且不会在回溯中可用。

原文由 Idan K 发布,翻译遵循 CC BY-SA 2.5 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题