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

简介: 转载请注明出处:http://blog.csdn.net/horkychen 有时在查找问题时,不想中断程序运行就输出一下某个条件下的函数执行顺序可以帮助定位问题。

转载请注明出处:http://blog.csdn.net/horkychen

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


在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
 
目录
相关文章
|
15天前
|
安全 Linux Shell
Linux上执行内存中的脚本和程序
【9月更文挑战第3天】在 Linux 系统中,可以通过多种方式执行内存中的脚本和程序:一是使用 `eval` 命令直接执行内存中的脚本内容;二是利用管道将脚本内容传递给 `bash` 解释器执行;三是将编译好的程序复制到 `/dev/shm` 并执行。这些方法虽便捷,但也需谨慎操作以避免安全风险。
|
22天前
|
网络协议 Linux
Linux查看端口监听情况,以及Linux查看某个端口对应的进程号和程序
Linux查看端口监听情况,以及Linux查看某个端口对应的进程号和程序
99 2
|
22天前
|
Linux Python
linux上根据运行程序的进程号,查看程序所在的绝对路径。linux查看进程启动的时间
linux上根据运行程序的进程号,查看程序所在的绝对路径。linux查看进程启动的时间
40 2
|
28天前
|
存储 监控 安全
在Linux中,⼀个EXT3的文件分区,当使用touch test.file命令创建⼀个新文件时报错,报错的信息是提示磁盘已满,但是采用df -h命令查看磁盘大小时,只使用了,60%的磁盘空间,为什么会出现这个情况?
在Linux中,⼀个EXT3的文件分区,当使用touch test.file命令创建⼀个新文件时报错,报错的信息是提示磁盘已满,但是采用df -h命令查看磁盘大小时,只使用了,60%的磁盘空间,为什么会出现这个情况?
|
2天前
|
iOS开发 MacOS Windows
Mac air使用Boot Camp安装win10 ,拷贝 Windows 文件时出错
Mac air使用Boot Camp安装win10 ,拷贝 Windows 文件时出错
|
25天前
|
NoSQL Linux C语言
嵌入式GDB调试Linux C程序或交叉编译(开发板)
【8月更文挑战第24天】本文档介绍了如何在嵌入式环境下使用GDB调试Linux C程序及进行交叉编译。调试步骤包括:编译程序时加入`-g`选项以生成调试信息;启动GDB并加载程序;设置断点;运行程序至断点;单步执行代码;查看变量值;继续执行或退出GDB。对于交叉编译,需安装对应架构的交叉编译工具链,配置编译环境,使用工具链编译程序,并将程序传输到开发板进行调试。过程中可能遇到工具链不匹配等问题,需针对性解决。
|
28天前
|
监控 安全 Linux
在Linux中,某个账号登陆linux后,系统会在哪些日志文件中记录相关信息?
在Linux中,某个账号登陆linux后,系统会在哪些日志文件中记录相关信息?
|
18天前
|
Linux API 开发工具
Linux内核开发流程指南 - 8. 获取更多信息【ChatGPT】
Linux内核开发流程指南 - 8. 获取更多信息【ChatGPT】
|
22天前
|
Linux Windows Python
最新 Windows\Linux 后台运行程序注解
本文介绍了在Windows和Linux系统后台运行程序的方法,包括Linux系统中使用nohup命令和ps命令查看进程,以及Windows系统中通过编写bat文件和使用PowerShell启动隐藏窗口的程序,确保即使退出命令行界面程序也继续在后台运行。
|
27天前
|
存储 安全 Linux
【Azure 应用服务】App Service For Linux 怎么安装Composer,怎么安装PHP扩展,怎么来修改站点根路径启动程序?
【Azure 应用服务】App Service For Linux 怎么安装Composer,怎么安装PHP扩展,怎么来修改站点根路径启动程序?