2014-01-17 44 views
2

我有一個關於調試c代碼的問題。我做了研究,但它不滿足我。 我知道下面的命令:使用gdb調試c程序以顯示十六進制地址

(gdb) x/x 'address' #show hexadecimal address 

(gdb) x/100s 'address' #show next 100 decimals 

(gdb) x/10b 0x0804846c-10 #show byte at 0x0804846c-10 

(gdb) x/10b 0x0804846c+20 #show byte at 0x0804846c+20 

(gdb) x/10x 0x0804846c show 10 addresses at 0x0804846c 

(gdb) x/10x $esp #show next 10 addresses at esp register 

,但我想知道是什麼x/10x $esp - 50做什麼呢? 我知道了嗎?這是對的嗎?

「這顯示出50個地址之前$ ESP多達10個地址後,」 我想,如果你告訴我,徹底糾正我要感謝... :(

回答

1

檢查從地址10個十六進制字(ESP -50)起。

你正期待着在內存中,當你做$ ESP-50,因爲棧從內存最大到最小的內存。

試試這個,以便更好地瞭解gdb的是給你

x/10xw $ esp-1您正在查看較低的內存地址,您正在從$ esp -1讀取1byte($ esp -1不在您的堆棧幀中,堆棧從大到小地址從當前堆棧幀增長已經以$ esp結尾,$ esp -1是一些隨機存儲器)

x/10xw $ esp //這會打印出你真正希望看到的內容,打印從當前$ esp推送到堆棧的所有內容以下

X/10xw $ ESP + 1 //這一個你失去1個字節,因爲存在被壓入堆棧1個字節,但你跳過它

Lower Memory addresses 
^$esp -1 random garbadge in memory 
^$esp local function variables 0 
^$esp +1 local variable 1 
^  local variable 2 
^  local variable 3 
^  local variable 4 
Higer Memory Addresses 

所以當你說X/10xw $ ESP,GDB打印一切都低於$ ESP(但低於意味着一切高端內存中的地址看看圖)

+0

這意味着:想象一下我們在「ESP-50」節目之後有10個十六進制字? – MLSC

+0

我預計'$ esp -50'是'x/10x 0x ... - 50',是一個「包含」到堆棧寄存器 – ShinTakezou

+0

@ShinTakezou的地址不是「x/10x 0x ...」 。 - 0x50「? – MLSC

相關問題