一尘不染

使用C或C ++打印调用堆栈

linux

每当调用某个函数时,是否有任何方法可以在C或C ++的运行进程中转储调用堆栈?我想到的是这样的:

void foo()
{
   print_stack_trace();

   // foo's body

   return
}

Where的print_stack_trace工作方式与callerPerl
类似。

或类似这样的东西:

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上工作。


背景

我有一个测试运行,该行为基于一些不应影响此行为的命令行开关而有所不同。我的代码有一个伪随机数生成器,我假设根据这些开关的调用方式有所不同。我希望能够使用每组开关运行测试,并查看每个随机数生成器的调用方式是否有所不同。


阅读 486

收藏
2020-06-02

共1个答案

一尘不染

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

注意backtrace(3)中notes部分

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

2020-06-02