使用__builtin_return_address获得程序运行栈情况
2013-11-26 15:42
302 查看
项目中遇到了一个多线程的问题,系统总是莫名其妙的崩溃,而且bug不可重现,后来发现是接收到某些信号的问题,于是乎就加入了信号处理函数,想获得是什么地方触发了这个信号,因为感觉多线程调试比较麻烦,于是就想到了使用利用__builtin_return_address来获得函数运行栈的方法。
直接上测试代码:
运行结果:
wangyao@wangyao-laptop:~/Test$ ./a.out
a(0): 0x8048554
b(0): 0x804851e
sigfunc(0): 0xb7eef420
sigfunc(1): 0x80484f2
sigfunc(2): 0x804851e
sigfunc(3): 0x8048554
sigfunc(4): 0xb7da2450
我们已经拿到了程序运行轨迹中的逻辑地址,下面的就是在gdb里面l一下那些地址就可以了:
wangyao@wangyao-laptop:~/Test$ gdb -q a.out
(gdb) l *0x804851e
0x804851e is in a (t_return.c:37).
32 temp += 1;
33 printf("%s(0): %p\n", __func__, __builtin_return_address(0));
34
35 b();
36
37 return temp;
38 }
39
40 int main()
41 {
(gdb) q
这样就已经找到了程序运行的轨迹,如果使用一些ELF处理的库直接解析符号表的话,也可以不用gdb来做,直接通过得到的逻辑地址进行定位;-)
直接上测试代码:
#include <stdio.h> #include <stdlib.h> #include <signal.h> #define MAX_LEVEL 4 void sigfunc(int signo) { printf("%s(0): %p\n", __func__, __builtin_return_address(0)); printf("%s(1): %p\n", __func__, __builtin_return_address(1)); printf("%s(2): %p\n", __func__, __builtin_return_address(2)); printf("%s(3): %p\n", __func__, __builtin_return_address(3)); printf("%s(4): %p\n", __func__, __builtin_return_address(4)); exit(1); } int b() { printf("%s(0): %p\n", __func__, __builtin_return_address(0)); while(1) { sleep(1); } } int a(int temp) { temp += 1; printf("%s(0): %p\n", __func__, __builtin_return_address(0)); b(); return temp; } int main() { signal(SIGINT, sigfunc); a(123); return 0; } |
wangyao@wangyao-laptop:~/Test$ ./a.out
a(0): 0x8048554
b(0): 0x804851e
sigfunc(0): 0xb7eef420
sigfunc(1): 0x80484f2
sigfunc(2): 0x804851e
sigfunc(3): 0x8048554
sigfunc(4): 0xb7da2450
我们已经拿到了程序运行轨迹中的逻辑地址,下面的就是在gdb里面l一下那些地址就可以了:
wangyao@wangyao-laptop:~/Test$ gdb -q a.out
(gdb) l *0x804851e
0x804851e is in a (t_return.c:37).
32 temp += 1;
33 printf("%s(0): %p\n", __func__, __builtin_return_address(0));
34
35 b();
36
37 return temp;
38 }
39
40 int main()
41 {
(gdb) q
这样就已经找到了程序运行的轨迹,如果使用一些ELF处理的库直接解析符号表的话,也可以不用gdb来做,直接通过得到的逻辑地址进行定位;-)
相关文章推荐
- 使用__builtin_return_address获得程序运行栈情况
- 用__builtin_return_address获得程序运行栈情况【转】
- 用__builtin_return_address获得程序运行栈情况
- 如何查看程序的运行栈 之 __builtin_return_address的使用
- 使用backtrace在程序运行时获得函数栈情况
- 使用CLR Profiler查看C#运行程序的内存占用情况
- Linux使用screen实现关闭ssh连接的情况下,让程序继续在后台运行
- 使用top命令动态监听运行时间非常短的程序的内存使用情况
- 用MAT分析JAVA程序运行时的内存使用情况
- 将gcc下的程序移植到MSVC下 之二 - __builtin_return_address的实现
- js中不存在exit函数,程序的运行中断停止,可使用return
- Java程序运行前后内存使用情况
- 关于使用time.h和clock()函数获得程序运行时间
- 使用Return来结束程序运行并返回值
- 使用__builtin_return_address(level)和objdump查找bug和宕机
- C# 实现程序只启动一次(多次运行激活第一个实例,使其获得焦点,并在最前端显示)
- 使用JConsole观察分析Java程序的运行(转)
- statfs获得硬盘使用情况 模拟linux命令 df
- 初探服务器:使用服务器运行自己的程序
- c# 程序只能运行一次(多次运行只能打开同一个程序) 并激活第一个实例,使其获得焦点,并在最前端显示.