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

每当调用某个函数时,是否有任何方法可以在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上工作。


回答:

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

回答:

对于仅适用于Linux的解决方案,您可以使用backtrace(3),它仅返回一个数组void

*(实际上,每个数组都指向相应堆栈帧中的返回地址)。为了将这些转换为有用的东西,有backtrace_symbols(3)。

注意backtrace(3)中的notes部分:

如果不使用特殊的链接器选项,则符号名称可能不可用。对于使用GNU链接程序的系统,必须使用-

rdynamic链接程序选项。请注意,“静态”函数的名称未公开,并且在回溯中将不可用。

以上是 使用C或C ++打印调用堆栈 的全部内容, 来源链接: utcz.com/qa/411744.html

回到顶部