调试程序时在不中断程序的情况下输出函数调用信息(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
 
目录
相关文章
|
3月前
|
安全 Linux Shell
Linux上执行内存中的脚本和程序
【9月更文挑战第3天】在 Linux 系统中,可以通过多种方式执行内存中的脚本和程序:一是使用 `eval` 命令直接执行内存中的脚本内容;二是利用管道将脚本内容传递给 `bash` 解释器执行;三是将编译好的程序复制到 `/dev/shm` 并执行。这些方法虽便捷,但也需谨慎操作以避免安全风险。
223 6
|
4月前
|
网络协议 Linux
Linux查看端口监听情况,以及Linux查看某个端口对应的进程号和程序
Linux查看端口监听情况,以及Linux查看某个端口对应的进程号和程序
723 2
|
2月前
|
运维 Java Linux
【运维基础知识】Linux服务器下手写启停Java程序脚本start.sh stop.sh及详细说明
### 启动Java程序脚本 `start.sh` 此脚本用于启动一个Java程序,设置JVM字符集为GBK,最大堆内存为3000M,并将程序的日志输出到`output.log`文件中,同时在后台运行。 ### 停止Java程序脚本 `stop.sh` 此脚本用于停止指定名称的服务(如`QuoteServer`),通过查找并终止该服务的Java进程,输出操作结果以确认是否成功。
76 1
|
2月前
|
Web App开发 Shell Linux
MacOS环境-手写操作系统-41-mem 第一个控制台程序
MacOS环境-手写操作系统-41-mem 第一个控制台程序
23 1
|
3月前
|
消息中间件 分布式计算 Java
Linux环境下 java程序提交spark任务到Yarn报错
Linux环境下 java程序提交spark任务到Yarn报错
51 5
|
3月前
|
Windows Python
python获取windows机子上运行的程序名称
python获取windows机子上运行的程序名称
|
3月前
|
小程序 Windows
MASM32编写的程序在Windows 7,10下运行正常,但在Win XP下运行时只闻其声不见其形的故障
MASM32编写的程序在Windows 7,10下运行正常,但在Win XP下运行时只闻其声不见其形的故障
|
2月前
|
安全 API C#
C# 如何让程序后台进程不被Windows任务管理器强制结束
C# 如何让程序后台进程不被Windows任务管理器强制结束
79 0
|
2月前
|
小程序 iOS开发 MacOS
MacOS环境-手写操作系统-44-运行简单的程序
MacOS环境-手写操作系统-44-运行简单的程序
31 0
|
2月前
|
Linux C语言 iOS开发
MacOS环境-手写操作系统-06-在mac下通过交叉编译:C语言结合汇编
MacOS环境-手写操作系统-06-在mac下通过交叉编译:C语言结合汇编
48 0