取消引用寄存器gdb

que*_*ngs 7 c gdb pointers

所以我试图调试一些代码,我所拥有的只是可执行文件.我知道寄存器包含需要知道的地址.有没有办法可以打印出从该地址开始到给定长度的十六进制值?

我尝试过的事情:

x/s $ebp
p (char) ($ebp)
p (char) (*ebp >> 4 )
p (char)*(%ebp  4 )
p $($ebp)
p  $(%ebp + $0x1)
Run Code Online (Sandbox Code Playgroud)

普通指针算术不适用于寄存器吗?它说"历史是空的"是什么意思

dus*_*uff 10

x命令将是在内存中显示值的最简单方法.试试,例如:

(gdb) x/32b $ebp
Run Code Online (Sandbox Code Playgroud)

如果这不起作用(特别是如果您收到"值无法转换为整数"的错误),您可能正在调试64位可执行文件.x86-64寄存器有不同的名称; 使用$rbp来代替.

x命令中斜杠后面的字符控制显示多少个值,以及使用的格式.x/s例如,将尝试从该地址读取字符串.如果你不使用任何东西,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
Run Code Online (Sandbox Code Playgroud)

$只有在引用寄存器或gdb变量时才需要该字符.你不需要任何其他东西.