使用__builtin_return_address(level)和objdump查找bug和宕機

有些時候我們很難知道問題出在哪裏,特別是類的析構,以及一些函數(調用這個函數的地方很多並且很頻繁,不確定調用這個函數的堆棧)的調用,當我們去查找相應功能的代碼問題時,如果簡單的通過斷點不好查找,就可以使用這個辦法。

所以我們使用gcc的編譯特性使用__builtin_return_address(level)打印出一個函數的堆棧地址。其中level代表是堆棧中第幾層調用地址,__builtin_return_address(0)表示第一層調用地址,即當前函數,__builtin_return_address(1)表示第二層。如代碼

#define __built_in_return_address(x) t(x)

void f()

{

     print("%p,%p" , t(0), t(1));

}

void g()

{

      f();

}

分別打印出函數f()和g() 的函數地址,我們通過objdump 出來的文件去查找打印出來的函數地址,這樣就能看到調用的函數名了。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章