为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C++ C
蓝山帝景 2019-08-17 14:49:49
用C或C ++打印调用堆栈有没有办法在每次调用某个函数时在C或C ++中正在运行的进程中转储调用堆栈?我的想法是这样的:void foo(){    print_stack_trace();    // foo's body    return}其中的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上工作。背景我有一个测试运行,基于一些不应该影响此行为的命令行开关,行为不同。我的代码有一个伪随机数生成器,我假设它是基于这些开关被不同地调用的。我希望能够使用每组开关运行测试,并查看随机数生成器是否针对每个开关进行不同的调用。
查看完整描述

3 回答

?
qq_花开花谢_0

TA贡献1835条经验 获得超6个赞

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

注意回溯(3)中注释部分

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


查看完整回答
反对 回复 2019-08-17
  • 3 回答
  • 0 关注
  • 1627 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信