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 ...