在Linux中打印函數調用堆棧【原創】


本人學習筆記,代碼參考如下網址

參考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文件的行號

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM