除錯 列印函式棧,以及由函式指標輸出函式名的方法

2021-07-15 16:24:46 字數 1605 閱讀 7514

以下皆在linux環境下。windows上用vs可隨時檢視函式棧。

使用backtrace()相關函式來達到輸出函式棧的目的,man backtrace檢視詳細的引數,返回值等資訊。

以下測試例,編譯時需加上-rdynamic選項:

#include 

#include

#include

#define size 100

void myfunc3(void)

for (j = 0; j < nptrs; j++)

printf("%s\n", strings[j]);

free(strings);

// */

}static

void

/* "static" means don't export the symbol... */

myfunc2()

void myfunc()

int main()

簡單說下這3個函式的用法:

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

backtrace()把函式棧中的函式位址寫到buffer陣列,buffer陣列的成員即void *型別。size表示把棧頂size個函式位址搞出來,如果想把函式棧完全搞出來,確保buffer陣列和size足夠大。

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

void backtrace_symbols_fd(void *const *buffer, int size, int fd);

backtrace_symbols()或者backtrace_symbols_fd()與上邊的backtrace()配合使用,起乙個翻譯作用,即把函式位址翻譯為函式名(還有函式的偏移和返回位址)。backtrace_symbols()把buffer陣列中的size個元素翻譯為函式名,把字串陣列儲存在返回值char **中,自帶了malloc功能,用完需把返回值free,見測試例。backtrace_symbols_fd()前兩個引數和前者一樣,但是把結果字串陣列輸出到fd中,如fd=1,即輸出到螢幕。

根據以上可以看出,backtrace_symbols和backtrace_symbols_fd可以用來將函式指標轉換為函式名,函式指標的講解可以參考這裡,以下是測試例:

#include

#include

void hello_world()

int main()

這裡就把函式指標func的函式名輸出了出來。

使用dump_stack()函式。直接在需要檢視函式棧的位置加入這一句,然後dmesg中就可以看到函式棧了。

void testname()

void test()

以上就是在使用者態,核心態輸出函式棧,以及由函式指標輸出函式名的方法,在除錯的過程中有時能幫助加深對**的理解。

函式指標以及指標函式

1.函式指標 每個函式都占用一段記憶體單元,它們有乙個起始位址,指向函式入口位址的指標,稱為函式指標。一般形式 資料型別 指標變數名 參數列 int maxvalue int x,int y intminvalue int x,int y intadd int x,int y int p int a...

列印函式呼叫棧

我有時候對於程式呼叫不明顯的時候,看程式很費勁,這時候我們希望把程式呼叫鏈列印出來。對於庫函式提供了執行緒介面。backtrace backtrace symbols backtrace symbols fd 其實網上的教程都是結合這個示例寫的。我的也不例外。直接上核心部分,如果你想看func 1的...

gdb除錯(檢視函式棧 除錯coredump檔案)

檢視函式棧用在gdb中用bt,觀察變數值用watch 變數值發生變化時會暫停程式的執行 一 除錯coredump檔案 什麼是core dump?core的意思是記憶體,dump的意思是扔出來,堆出來.一般以core.程序號的檔案呈現,可以知己設定,這個檔案便是作業系統把程式down掉時的記憶體內容扔...