1. 程式人生 > >gdb檢視函式呼叫棧

gdb檢視函式呼叫棧

(1)楨號:呼叫棧中對楨的一個編號,從0開始,依次增大(2)PC:Program counter暫存器,指向當前楨中下一條要執行的指令的地址(3)函式名:當前楨中被呼叫的函式的名字(4)引數及傳入的值:當前楨中被呼叫的函式在呼叫時傳入的引數及其值(5)原始碼位置:當前楨執行到的原始碼位置,格式為 file:linenum

這裡還有一點需要說明,不知道細心的讀者朋友有沒有發現,foo那一楨沒有PC的地址,GDB通過這樣來標示該楨是當前正在執行到的楨,因此我們通過看呼叫棧的資訊,便可得知程式執行到哪裡了。

讀者朋友有沒有覺得原來函式呼叫的過程還有這麼多資訊可以知道啊,下面我就開始介紹一些GDB命令,通過這些命令你便可以檢視到上面介紹的這些資訊,甚至更加詳細的資訊。
1. 檢視呼叫棧資訊:(具體資訊的內容,與上面第二部分中介紹的相同)

(1)backtrace: 顯示程式的呼叫棧資訊,可以用bt縮寫(2)backtrace n: 顯示程式的呼叫棧資訊,只顯示棧頂n楨(frame)(3)backtrace –n: 顯示程式的呼叫棧資訊,只顯示棧底部n
楨(frame)(4)set backtrace limit n: 設定bt顯示的最大楨層數(5)where, info stack:都是bt的別名,功能一樣

2. 檢視楨資訊:

(1)frame n: 檢視第n楨的資訊, frame可以用f縮寫(2)frame addr: 檢視pc地址為addr的楨的相關資訊(3)up n: 檢視當前楨上面第n楨的資訊(4)down n: 檢視當前楨下面第n楨的資訊

3. 檢視更加詳細的資訊:

(1)info frameinfo frame n或者info frame addr

檢視指定楨的詳細資訊,關於詳細資訊的內容,這裡有必要做一個介紹,如下圖所示:

上圖中顯示的資訊有:
a. 當前楨的地址: 0xbffff400
b. 當前楨PC: eip = 0x8048516
c. 當前楨函式: bar (test.cpp:16)
d. caller楨的PC: saved eip 0x8048535
e. caller楨的地址: called by frame at 0xbffff420
f. callee楨的地址: caller of frame at 0xbffff3e0
g. 原始碼所用的程式的語言(c/c++): source language c++
h. 當前楨的引數的地址及值: Arglist at 0xbffff3f8, args: name=0x8048621 “jessie”, myname=0x804861c “jack”
i. 當前相中區域性變數的地址:Locals at 0xbffff3f8, Previous frame’s sp is 0xbffff400
k. 當前楨中儲存的暫存器: Saved registers: ebp at 0xbffff3f8, eip at 0xbffff3fc

(2)info args:檢視當前楨中的引數(3)info locals:檢視當前楨中的區域性變數(4)info catch:檢視當前楨中的異常處理器(exception handlers