通过编程方式获取backtrace
2008-12-29 11:35
351 查看
http://www.top-e.org/jiaoshi/html/?164.html在用GDB调试器时可以查看所谓的Backtrace,它包含一系列的函数调用信息,用命令backtrace或bt可以在GDB中查看函数调用栈的信息。有些场合没法使用GDB时,则可以用glibc库函数中的一些相关函数来得到backtrace的信息(在头文件execinfo.h中):
使用函数backtrace_symbols()或者backtrace_symbols_fd()时,需要用-rdynamic编译才能得到正确的符号名,否则只能得到偏移地址。
下面的示例代码应用了backtrace()和backtrace_symbols()函数来打印backtrace的信息:
编译运行的结果如下:
你可以应用这些函数在程序异常退出时打印backtrace或将它保存到某个文件中,用于之后的分析。更详细的介绍可以参考http://www.linuxjournal.com/article/6391。
// 获取将backstrace信息,将地址存到buffer中。 // 参数size指定buffer的最大值,返回值则是backstrace的实际大小 int backtrace (void **buffer, int size) // 根据buffer指定的地址,返回符号信息。参数size指定返回符号信息的大小 char ** backtrace_symbols (void *const *buffer, int size) // 类似backtrace_symbols()函数,但是不需要malloc空间来存放符号信息, // 而是将结果写到文件描述符fd所代表的文件中 void backtrace_symbols_fd (void *const *buffer, int size, int fd) |
下面的示例代码应用了backtrace()和backtrace_symbols()函数来打印backtrace的信息:
1 #include <execinfo.h> 2 #include <stdio.h> 3 #include <stdlib.h> 4 5 /* Obtain a backtrace and print it to stdout. */ 6 void print_trace (void) 7 { 8 void *array[10]; 9 size_t size; 10 char **strings; 11 size_t i; 12 13 size = backtrace (array, 10); 14 strings = backtrace_symbols (array, size); 15 16 printf ("Obtained %zd stack frames./n", size); 17 18 for (i = 0; i < size; i++) 19 printf ("%s/n", strings[i]); 20 21 free (strings); 22 } 23 24 /* A dummy function to make the backtrace more interesting. */ 25 void dummy_function (void) 26 { 27 print_trace (); 28 } 29 30 int main (void) 31 { 32 dummy_function (); 33 return 0; 34 } |
# gcc bt.c -rdynamic -o bt # ./bt Obtained 5 stack frames. ./bt(print_trace+0x14) [0x80486e4] ./bt(dummy_function+0xb) [0x8048765] ./bt(main+0x15) [0x804877c] /lib/tls/libc.so.6(__libc_start_main+0xe4) [0x42015574] ./bt(backtrace_symbols+0x31) [0x8048641] |
相关文章推荐
- 通过编程方式获取backtrace
- 通过编程方式获取Kafka中Topic的Metadata信息
- (转)在C#中使用WIA获取扫描仪数据(四、通过编程方式扫描图像)
- 如何通过VB6.0编程的方式获取百度贴吧帐号的BDUSS
- 通过编程方式获取backtrace(函数调用栈)(接上篇core dump调试解释)
- 通过编程方式在InfoPath 2010表单的下拉框修改事件中获取数据
- 通过编程方式获取backtrace(函数调用栈)
- 安卓网络编程-通过GET方式获取网络图片
- 如何通过编程方式获取alexa排名的数据
- spring通过编程的方式获取bean
- PHP下通过系统信号量加锁方式获取递增序列ID
- 通过HTML PARSER编程实时获取外汇牌价
- Flex编程注意之直接获取某个组件的对象(this[]用法)通过id获取控件
- Java 编程下通过反射获取一个类中的方法名和对应参数名
- Android获取指定路径的图片(通过Drawable方式)
- MASM32编程通过WMI获取BIOS、主板、硬盘、CPU、网卡的信息
- Java 编程下通过反射获取一个类中的方法名和对应参数名
- 使用VBS通过3种方式浏览本地文件,获取完整路径。
- 实践:通过编程来获取资源的值
- 在java项目中通过相对路径获取资源的方式