使用C或C ++打印调用堆栈
每当调用某个函数时,是否有任何方法可以在C或C ++的运行进程中转储调用堆栈?我想到的是这样的:
void foo(){
print_stack_trace();
// foo's body
return
}
Where的print_stack_trace
工作方式与caller
Perl
类似。
或类似这样的东西:
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