如何打印%eax
和%ebp
的值?
(gdb) p $eax
$1 = void
info registers
显示所有寄存器; info registers eax
只显示寄存器eax
。该命令可以缩写为i r
如果您尝试在GDB中打印特定寄存器,则必须省略%符号。例如,
info registers eip
如果您的可执行文件是64位,则寄存器以r开头。用e开头是无效的。
info registers rip
这些可以缩写为:
i r rip
还有:
info all-registers
然后,您可以获得您感兴趣的寄存器名称 - 对于查找特定于平台的寄存器(如ARM上的NEON Q ...)非常有用。
info registers
显示寄存器。display $esp
继续在gdb命令行中显示esp寄存器。layout regs
继续显示寄存器,使用TUI模式。Gdb命令:
i r <register_name>
:打印一个寄存器,例如i r rax
,i r eax
i r <register_name_1> <register_name_2> ...
:打印多个寄存器,例如i r rdi rsi
,i r
:打印除浮点和向量寄存器(xmm,ymm,zmm)之外的所有寄存器。i r a
:打印所有寄存器,包括浮点和向量寄存器(xmm,ymm,zmm)。i r f
:打印所有FPU浮动寄存器(st0-7
和其他一些f*
)除了a
(all
)和f
(float
)之外的其他注册组可以找到:
maint print reggroups
记录于:https://sourceware.org/gdb/current/onlinedocs/gdb/Registers.html#Registers
提示:
xmm0
~xmm15
,是128位,几乎每台现代机器都有它,它们于1999年发布。ymm0
~ymm15
,是256位,新机器通常都有它,它们是在2011年发布的。zmm0
~zmm31
,是512位,普通PC可能没有它(如2016年),它们在2013年发布,主要用于服务器到目前为止。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
来自the docs:
任何以'$'开头的名称都可以用作便利变量,除非它是预定义的机器专用寄存器名称之一。
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浮点寄存器