本人学习笔记,代码参考如下网址
参考http://www.cnblogs.com/dma1982/archive/2012/02/08/2342215.html
zhangbh@prolin-srv:<~$> gcc -g -rdynamic -o my a.c zhangbh@prolin-srv:<~$> ./my backtrace() returned 5 addresses ./my(my_func+0x1f)[0x40089c] ./my(run+0x9)[0x4008e0] ./my(main+0x14)[0x4008f6] /lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xf5)[0x7f68032c7ec5] ./my[0x4007b9]
Linux中共提供了三个函数用于打印调用堆栈: /* * 函数说明: 取得当前函数的调用堆栈 * 参数: * buffer:用于存储函数地址的数组 * size:buffer数组的长度 * 返回值: * 存储到数组中的函数个数 */ int backtrace(void **buffer, int size); /* * * 函数说明:将一组函数地址转换为字符串 * 参数: * buffer: 经由backtrace得到的函数地址 * size: buffer数组的长度 * 返回值: * 函数在系统中对应用字符串 */ char **backtrace_symbols(void *const *buffer, int size); /* * 函数说明:将一组函数地址转换为字符串 * 参数: * buffer: 经由backtrace得到的函数地址 * size: buffer数组的长度 * fd: 输出结果文件描述符 */ void backtrace_symbols_fd(void *const *buffer, int size, int fd);
#include <stdio.h> #include <execinfo.h> #include <stdlib.h> #include <unistd.h> void my_func(void) { int j, nptrs; #define SIZE 100 void *buffer[100]; char **strings; nptrs = backtrace(buffer, SIZE); printf("backtrace() returned %d addresses ", nptrs); backtrace_symbols_fd(buffer, nptrs, STDOUT_FILENO); } void run(void) { my_func(); } int main(int argc, char **argv) { run(); return 0; }
addr2line 0x4008e0 -e ./a.out -f
这样可以找到具体的c文件的行号