如何打印%eax和%ebp的值?

(gdb) p $eax
$1 = void

当前回答

p $eax从GDB 7.7.1开始工作

经过GDB 7.7.1的测试,您尝试的命令可以工作:

set $eax = 0
p $eax
# $1 = 0
set $eax = 1
p $eax
# $2 = 1

此语法也可以用于在不同的联合成员之间进行选择,例如对于ARM浮点寄存器,它可以是浮点数或整数:

p $s0.f
p $s0.u

从文档中可以看出:

任何前面带' $ '的名称都可以用作方便变量,除非它是预定义的特定于机器的寄存器名称之一。

and:

在表达式中,您可以将机器寄存器内容引用为名称以' $ '开头的变量。寄存器的名称对于每台机器都是不同的;使用信息寄存器查看在您的机器上使用的名称。

但我还没有太多的运气控制寄存器到目前为止:OSDev 2012 http://f.osdev.org/viewtopic.php?f=1&t=25968 || 2005功能请求https://www.sourceware.org/ml/gdb/2005-03/msg00158.html || alt.lang.asm 2013 https://groups.google.com/forum/#!topic/alt.lang.asm/JC7YS3Wu31I

ARM浮点寄存器

参见:https://reverseengineering.stackexchange.com/questions/8992/floating-point-registers-on-arm/20623 # 20623

其他回答

如果只想检查一次,信息寄存器显示寄存器。 如果只想查看一个寄存器,例如在gdb命令行中display $esp continue display esp registers。 如果要观察所有寄存器,布局规则继续显示寄存器,使用TUI模式。

p $eax从GDB 7.7.1开始工作

经过GDB 7.7.1的测试,您尝试的命令可以工作:

set $eax = 0
p $eax
# $1 = 0
set $eax = 1
p $eax
# $2 = 1

此语法也可以用于在不同的联合成员之间进行选择,例如对于ARM浮点寄存器,它可以是浮点数或整数:

p $s0.f
p $s0.u

从文档中可以看出:

任何前面带' $ '的名称都可以用作方便变量,除非它是预定义的特定于机器的寄存器名称之一。

and:

在表达式中,您可以将机器寄存器内容引用为名称以' $ '开头的变量。寄存器的名称对于每台机器都是不同的;使用信息寄存器查看在您的机器上使用的名称。

但我还没有太多的运气控制寄存器到目前为止:OSDev 2012 http://f.osdev.org/viewtopic.php?f=1&t=25968 || 2005功能请求https://www.sourceware.org/ml/gdb/2005-03/msg00158.html || alt.lang.asm 2013 https://groups.google.com/forum/#!topic/alt.lang.asm/JC7YS3Wu31I

ARM浮点寄存器

参见:https://reverseengineering.stackexchange.com/questions/8992/floating-point-registers-on-arm/20623 # 20623

对我来说最简单的是:

(gdb) x/x $eax

第一个x代表检查,第二个x是十六进制。你可以看到其他格式使用:

(gdb) help x

您可以使用x/s $eax或x/a $ebp+4轻松打印字符串。

还有:

info all-registers

然后你可以得到你感兴趣的寄存器名——这对于找到特定于平台的寄存器非常有用(比如NEON Q…手臂)。

如果试图在GDB中打印特定寄存器,则必须省略%符号。例如,

info registers eip

如果你的可执行文件是64位的,寄存器以r开始。以e开始是无效的。

info registers rip

这些可以缩写为:

i r rip