2011-03-01 137 views
2

有些人可以幫我理解這一點: -GDB +核心文件轉儲

下面是gdb的摘錄。我的程序崩潰後,我打開了GDB的二進制文件和核心文件,併發出命令info frame

(gdb) info frame 
Stack level 0, frame at 0xb75f7390: 
eip = 0x804877f in base::func() (testing.cpp:16); saved eip 0x804869a 
called by frame at 0xb75f73b0 
source language c++. 
Arglist at 0xb75f7388, args: this=0x0 
Locals at 0xb75f7388, Previous frame's sp is 0xb75f7390 
Saved registers: 
    ebp at 0xb75f7388, eip at 0xb75f738c 

什麼「在當地人的」線「EBP」,「EIP」和「上一幀的SP」的意思?請解釋

+0

可能重複的[如何解釋GDB「信息框架」輸出?](http://stackoverflow.com/questions/5144727/how-to-interpret-gdb-info-frame-output) – 2011-03-01 04:37:56

+0

確切的重複的http ://stackoverflow.com/questions/5144727/how-to-interpret-gdb-info-frame-output。你爲什麼一直問同樣的問題? – 2011-03-01 04:38:52

+3

他可能試圖得到一個更具描述性的答案,可能並不想花費精力閱讀所有這些維基百科鏈接。 – anio 2011-03-01 04:45:40

回答

0

分析核心文件,執行:

$ gdb的可執行核心

GDB $ BT - 回溯

或GDB $ FR 0 - 在運行時的外框堆棧 gdb $ fr 1 &等等會給你導致Seg Fault的函數調用順序。

這裏,GDB $信息幀是爲您提供有關框架信息0.1

5

這從維基百科的文章Call stack圖可以幫助:Stack frame layout

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是返回地址。 如果您嘗試查找包含0x804869ainfo 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預示着生病。在附註中,ArglistLocals在x86和x86-64上的info frame中似乎總是具有相同的值。

Saved registers: 
    ebp at 0xb75f7388, eip at 0xb75f738c 

Saved registers反映了在函數入口處保存的寄存器。它列出了舊寄存器值保存在堆棧中的位置。已保存EIP是返回地址,因此如果您檢查存儲在0xb75f738cx/a 0xb75f738c的地址,它應該給0x804869a。這EBP是列在這裏的事實意味着你的代碼很可能不是用編譯,有一個標準的函數序言:

push %ebp 
movl %esp, %ebp 

base::func()非常乞討其中規定了EBP充當框架指針。