訂閱
糾錯
加入自媒體

linux:如何查看函數被哪些函數調用過?

2021-03-25 14:12
一口Linux
關注

一、問題

有個打印log的函數,想知道該函數執(zhí)行的時候,之前執(zhí)行了哪些函數?

二、分析

在應用程序打印函數棧需要通過函數backtrace(),該函數對應頭文件如下:

 #include <execinfo.h>

1、三個與打印調用棧相關的函數

打印函數棧需要使用到以下3個函數

int backtrace(void** buffer, int size);

函數功能:用于獲取當前線程的調用堆棧。參數:buffer:它是一個指針數組,函數獲取的當前線程的調用堆棧將會被存放在buffer中。在buffer中的指針實際是從堆棧中獲取的返回地址,每一個堆棧 框架有一個返回地址。size:用來指定buffer中可以保存多少個void*元素。返回值:實際獲取的指針個數,最大不超過size大小。

char** backtrace_symbols (void *const *buffer, int size);

函數功能:將從backtrace函數獲取的信息轉化為一個字符串數組。參數:buffer:從backtrace函數獲取的數組指針。size:是該數組中的元素個數(backtrace函數的返回值)。返回值:是一個指向字符串數組的指針,它的大小同buffer相同。每個字符串包含了一個相對于buffer中對應元素的 可打印信息。它包括函數名,函數的偏移地址,和實際的返回地址。

注:

1、只有使用ELF二進制格式的程序才能獲取函數名稱和偏移地址。在其他系統(tǒng),只有16進制的返回地址能被獲取。另外,需要傳遞相應的標志給鏈接器,以能支持函數名功能即編譯選項-rdynamic。2、backtrace_symbols生成的字符串都是malloc出來的,最后需要free該塊內存。void backtrace_symbols_fd (void *const *buffer, int size, int fd)

功能:backtrace_symbols_fd與backtrace_symbols函數具有相同的功能,不同的是它不會給調用者返回字符串數組,而是將結果寫入文件描述符為fd的文件中,每個函數對應一行.它不需要調用malloc函數,因此適用于有可能調用該函數會失敗的情況。參數:fd:通常填寫STDOUT_FILENO

2. 鏈接庫

在編譯的時候需要加上**-rdynamic**選項。

-rdynamic
    Pass the flag -export-dynamic to the ELF linker, on targets that support it. This instructs the linker to add all symbols, not only used ones, to the dynamic symbol table. This option is needed for some uses of "dlopen" or to allow obtaining backtraces from within a program.

該選項讓鏈接器將所有符號添加到動態(tài)符號表中,這樣才能將函數地址翻譯成函數名,否則打印的結果是不會打印函數名的。

另外,這個選項不會處理static函數,所以,static函數的符號無法得到。

3. 舉例 #include <execinfo.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

void fun1();
void fun2();
void fun3();

void print_stacktrace();

void print_stacktrace()

   int size = 16;
   void * array[100];

   int stack_num = backtrace(array, size);

char ** stacktrace = backtrace_symbols(array, stack_num);

backtrace_symbols_fd(array,size,STDOUT_FILENO);

1  2  下一頁>  
聲明: 本文由入駐維科號的作者撰寫,觀點僅代表作者本人,不代表OFweek立場。如有侵權或其他問題,請聯(lián)系舉報。

發(fā)表評論

0條評論,0人參與

請輸入評論內容...

請輸入評論/評論長度6~500個字

您提交的評論過于頻繁,請輸入驗證碼繼續(xù)

暫無評論

暫無評論

    人工智能 獵頭職位 更多
    掃碼關注公眾號
    OFweek人工智能網
    獲取更多精彩內容
    文章糾錯
    x
    *文字標題:
    *糾錯內容:
    聯(lián)系郵箱:
    *驗 證 碼:

    粵公網安備 44030502002758號