這從維基百科的文章Call stack圖可以幫助:
GDB的info frame
對應的功能在運行時被調用的程序。從輸出中,我們可以推斷出這個關於棧幀佈局:
- 0xb75f7388:4個字節從這裏開始儲存舊EBP值,0xb75f73a8。通過
base::func()
- 0xb75f738c的函數序言推的第一個值:4個字節從這裏開始保存返回地址,0x804869a。由
call
指令在先前幀
- 0xb75f7390被推:該4個字節從這裏開始,存儲所述隱式
this
參數base::func()
,。
我將通過線解釋info frame
輸出線:
Stack level 0, frame at 0xb75f7390:
堆棧級別0表示這是最新幀。 frame at
之後的地址稱爲規範幀地址(CFA)。在x86上,這被定義爲在執行調用指令之前的前一幀處的堆棧指針(ESP)的值。
eip = 0x804877f in base::func() (testing.cpp:16); saved eip 0x804869a
EIP是x86指令指針。 saved eip
是返回地址。 如果您嘗試查找包含0x804869a和info symbol 0x804869a
的函數,它應指向調用base::func()
的函數。
called by frame at 0xb75f73b0
called by
顯示前一幀的規範幀地址。我們可以看到兩個幀之間的堆棧指針高級32字節(0xb75f73b0 - 0xb75f7390 = 32)。
source language c++.
Arglist at 0xb75f7388, args: this=0x0
Locals at 0xb75f7388, Previous frame's sp is 0xb75f7390
x86 ABI將參數傳遞給堆棧。 base::func()
只有一個隱含的this
參數。這是0x0
這一事實,即NULL
預示着生病。在附註中,Arglist
和Locals
在x86和x86-64上的info frame
中似乎總是具有相同的值。
Saved registers:
ebp at 0xb75f7388, eip at 0xb75f738c
Saved registers
反映了在函數入口處保存的寄存器。它列出了舊寄存器值保存在堆棧中的位置。已保存EIP是返回地址,因此如果您檢查存儲在0xb75f738c與x/a 0xb75f738c
的地址,它應該給0x804869a。這EBP是列在這裏的事實意味着你的代碼很可能不是用編譯,有一個標準的函數序言:
push %ebp
movl %esp, %ebp
在base::func()
非常乞討其中規定了EBP充當框架指針。
可能重複的[如何解釋GDB「信息框架」輸出?](http://stackoverflow.com/questions/5144727/how-to-interpret-gdb-info-frame-output) – 2011-03-01 04:37:56
確切的重複的http ://stackoverflow.com/questions/5144727/how-to-interpret-gdb-info-frame-output。你爲什麼一直問同樣的問題? – 2011-03-01 04:38:52
他可能試圖得到一個更具描述性的答案,可能並不想花費精力閱讀所有這些維基百科鏈接。 – anio 2011-03-01 04:45:40