在Linux中列印函式呼叫堆疊 原創

2021-09-22 08:39:07 字數 1157 閱讀 9674

本人學習筆記,**參考如下**

參考

zhangbh@prolin-srv: gcc -rdynamic -o my a.c

zhangbh@prolin-srv: ./my

backtrace() returned

5addresses

./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中共提供了三個函式用於列印呼叫堆疊:

/** 函式說明: 取得當前函式的呼叫堆疊

* 引數:

* 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 #include 

#include

#include

void my_func(void

)void run(void

)int main(int argc, char **ar**)

在Linux應用程式中列印函式呼叫棧

在linux中列印函式呼叫棧 要求在linux系統的應用程式中寫乙個函式print stackframe 用於獲取當前位置的函式呼叫棧資訊 方法execinfo.h庫下的函式backtrace可以得到當前執行緒的函式呼叫棧指標和呼叫棧深度,backtrace symbols可以將呼叫棧指標轉化為字串...

函式呼叫堆疊

一 函式呼叫堆疊 認真體會每一行指令位址!include intsum int a,int b mov ebp,esp 讓esp回退到ebp的位置,回退棧幀的過程中,沒有對棧幀中的值進行清0的操作 pop ebp 出棧並把出棧的值賦給ebp int main 下圖為上面示例函式,程式在sum函式中,...

函式呼叫堆疊

一 棧 1 傳統的棧 被定義為乙個特殊的容器,使用者可以將資料壓入棧中,也可以將壓入 棧中的資料彈出,但必須遵守一條規則 先進後出。2 計算機系統中的棧 是乙個有以上屬性的動態記憶體區域,壓棧操作使得棧增大,彈出操作使棧減小。棧通常是向下增長的。3 最重要的是棧儲存了乙個函式呼叫所需的維護資訊,這通...