2014-05-05 88 views
6

所以我想調試一些代碼,我所有的就是可執行文件。我知道一個寄存器包含了需要知道的地址。有沒有一種方法可以打印出從該地址開始到給定長度的十六進制值?解引用寄存器gdb

東西我曾嘗試:

x/s $ebp 
p (char) ($ebp) 
p (char) (*ebp >> 4) 
p (char)*(%ebp 4) 
p $($ebp) 
p $(%ebp + $0x1) 

是否正常指針運算不登記工作?這是什麼意思時,它說:「歷史是空的

+0

相關:http://stackoverflow.com/questions/12758217/printing-string-pointed-to-from-register-in-gdb –

回答

7

x命令會在內存中顯示值最簡單的方法嘗試,例如:

(gdb) x/32b $ebp 

如果這不起作用(尤其是如果出現「值無法轉換爲整數」的錯誤),那麼您可能正在調試64位可執行文件,x86-64寄存器具有不同的名稱;請使用$rbp代替

斜槓後面的字符在x命令控制顯示多少個值,以及使用什麼格式。例如,將嘗試從該地址讀取字符串。如果你不使用任何東西,gdb將使用你上次使用的任何東西。

雖然不是絕對必要回答你的問題,我已經定了一些你想運行其他命令:

p *((char *) $ebp)  <- treat $ebp as a character pointer and display what it points to 
p *((char *) $ebp + 4) <- with an offset 
p ((char *) $ebp)[4]  <- same thing as above, except using array syntax 

指寄存器時,才需要$字符,或gdb變量。你不需要其他任何東西。