使用backtrace獲取堆疊資訊

2021-08-19 19:36:21 字數 998 閱讀 6858

gdb將當前函式的棧幀編號為0,為外層函式的棧幀依次加1,這些編號將成為一些gdb命令的引數,以指明將要操作的是哪乙個函式的棧幀。

gdb還支援使用address作為棧幀的識別符號,可在棧幀編號被破壞的情況下使用。

1.在棧幀之間切換

gdb中有很多針對呼叫堆疊的命令,都需要乙個目標棧幀,例如列印區域性變數值的命令。

frame args 將當前棧幀設定為args(編號或address)指定的棧幀,並列印該棧幀的簡要資訊。

select-frame args 與frame args相同,但是不列印棧幀資訊。

up n 向上回退n個棧幀(更外層),n預設為1.

down n 向下前進n個棧幀(更內層),n預設為1.

up-silently n 與up n相同,但是不列印資訊。

down-silently n 與down n相同,但是不列印資訊。

2.列印棧幀資訊(不移動棧幀)

frame 列印當前棧幀的簡要資訊。

info frame 列印當前棧幀的詳細資訊。

info frame args 列印指定棧幀的詳細資訊。

info args 列印函式引數資訊。

info locals 列印當前可訪問的區域性變數的資訊。

3.列印呼叫堆疊

backtrace 列印全部棧幀的簡要資訊,按ctrl-c可終止列印。

backtrace n 列印最內層的n個棧幀的簡要資訊。

backtrace -n 列印最外層的n個棧幀的簡要資訊。

backtrace full 列印全部棧幀的詳細資訊。

backtrace full n 列印最內層的n個棧幀的詳細資訊。

backtrace full -n 列印最外層的n個棧幀的詳細資訊。

4.一些配置項

set backtrace past-main on 對呼叫堆疊的列印可越過main函式。

set backtrace past-main off 對呼叫堆疊的列印止步於main函式。

使用backtrace獲取堆疊資訊

一些記憶體檢測工具如valgrind,除錯工具如gdb,可以檢視程式執行時函式呼叫的堆疊資訊,有時候在分析程式時要獲得堆疊資訊,借助於backtrace是很有幫助的,其原型如下 include int backtrace void buffer,int size char backtrace sym...

backtrace 堆疊列印除錯

有的時候程式需要檢視程序在某些極端情況下進入某個函式時,需要看是哪個函式呼叫它。這個時候可以使用backtrace進行列印。include include includevoid print trace printf obtained zd stack frames.n size for i 0 i...

通過程式設計方式獲取backtrace

在用gdb 偵錯程式時可以檢視所謂的 backtrace 它包含一系列的函式呼叫資訊,用命令 backtrace或bt 可以在gdb 中檢視函式呼叫棧的資訊。有些場合沒法使用 gdb時,則可以用 glibc 庫函式中的一些相關函式來得到 backtrace 的資訊 在標頭檔案 execinfo.h ...