2014-05-05 62 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变量。你不需要其他任何东西。