调试程序时在不中断程序的情况下输出函数调用信息(Mac OS,Linux & Windows)

有时在查找问题时,不想中断程序运行就输出一下某个条件下的函数执行顺序可以帮助定位问题。


一、在Xcode下可以编辑断点设置中的Action设为Debugger Command, 如果你使用GDB作为调试器(项目设置),然后输入backtrace如下:

记得勾选"Automatically continue after evaluating", 这样程序就不会停在这个断点,而是继续执行下去。


运行结果:

#0  a (i=5) at /xxxx/TestBacktrace/main.c:20

#1  0x0000000100000e72 in main (argc=1, argv=0x7fff5fbffa88) at /xxxx/TestBacktrace/main.c:25



二、如果使用LLDB作为调试器,则输入bt, 其运行结果如下:

* thread #1: tid = 0x2503, 0x0000000102238e37 TestBacktrace`a + 7 at main.c:20, stop reason = breakpoint 1.1

    frame #0: 0x0000000102238e37 TestBacktrace`a + 7 at main.c:20

    frame #1: 0x0000000102238e72 TestBacktrace`main + 34 at main.c:25

    frame #2: 0x0000000102238d44 TestBacktrace`start + 52



Debugger的选择在这里:



另外也可以在代码中调用backtrace函数实现。 当你调试一个多进程程序时,Debugger可能无法及时attach目标进程,这个方法就有用了。

#include <execinfo.h>

void printCallStack(void)

{

    void* callstack[128];

    int i, frames = backtrace(callstack, 128);

    char** strs = backtrace_symbols(callstack, frames);

    for (i = 0; i < frames; ++i) 

    {

        printf("%s\n", strs[i]);

    }

    free(strs);

}


int a(int i)

{

    printCallStack();

    return i+1;

}

...


输出结果:

0   TestBacktrace                       0x00000001013ddd6a printCallStack + 42

1   TestBacktrace                       0x00000001013dde30 a + 16

2   TestBacktrace                       0x00000001013dde72 main + 34

3   TestBacktrace                       0x00000001013ddd34 start + 52



三、Windows下在Visual Studio,有类似的做法, 贴两张图就应该懂了:


*Windows的第二种方法可以参考CaptureStackBackTrace函数的使用:
1.  MSDN
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值