本人學習筆記,代碼參考如下網址
參考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 \r\n", 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文件的行號