如何打印 %eax 和 %ebp 的值?
%eax
%ebp
(gdb) p $eax $1 = void
info registers 显示所有寄存器; info registers eax 只显示寄存器 eax . 该命令可以缩写为 i r
info registers
info registers eax
eax
i r
p $eax works as of 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
如果您尝试在GDB中打印特定寄存器,则必须省略%符号 . 例如,
info registers eip
如果您的可执行文件是64位,则寄存器以r开头 . 用e开头是无效的 .
info registers rip
这些可以缩写为:
i r rip
如果只想检查一次, info registers 显示寄存器 .
如果只想看一个寄存器,例如, display $esp 继续在gdb命令行中显示esp寄存器 .
display $esp
如果要监视所有寄存器, layout regs 继续显示寄存器,使用TUI模式 .
layout regs
Gdb commands :
i r <register_name> :打印一个寄存器,例如 i r rax , i r eax
i r <register_name>
i r rax
i r eax
i r <register_name_1> <register_name_2> ... :打印多个寄存器,例如 i r rdi rsi ,
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 a
i r f :打印所有FPU浮动寄存器( st0-7 和其他一些 f* )
i r f
st0-7
f*
除了 a ( all )和 f ( float )之外的其他寄存器组可以找到:
a
all
f
float
maint print reggroups
记录于:https://sourceware.org/gdb/current/onlinedocs/gdb/Registers.html#Registers
Tips :
xmm0 ~ xmm15 ,是128位,几乎每台现代机器都有它,它们于1999年发布 .
xmm0
xmm15
ymm0 ~ ymm15 ,是256位,新机器通常都有它,它们是在2011年发布的 .
ymm0
ymm15
zmm0 ~ zmm31 ,是512位,普通PC可能没有它(如2016年),它们是2013年发布的,主要用于服务器到目前为止 .
zmm0
zmm31
仅显示一个xmm / ymm / zmm的序列,因为它们在不同模式下是相同的寄存器 . 在我的机器上显示ymm .
还有:
info all-registers
然后,您可以获得您感兴趣的寄存器名称 - 对于查找特定于平台的寄存器(如ARM上的NEON Q ...)非常有用 .
6 回答
info registers
显示所有寄存器;info registers eax
只显示寄存器eax
. 该命令可以缩写为i r
p $eax works as of GDB 7.7.1
从GDB 7.7.1开始,您尝试过的命令有效:
该语法还可用于在不同的联合成员之间进行选择,例如对于ARM浮点寄存器,可以是浮点数或整数:
来自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
如果您尝试在GDB中打印特定寄存器,则必须省略%符号 . 例如,
如果您的可执行文件是64位,则寄存器以r开头 . 用e开头是无效的 .
这些可以缩写为:
如果只想检查一次,
info registers
显示寄存器 .如果只想看一个寄存器,例如,
display $esp
继续在gdb命令行中显示esp寄存器 .如果要监视所有寄存器,
layout regs
继续显示寄存器,使用TUI模式 .Gdb commands :
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
)之外的其他寄存器组可以找到:记录于:https://sourceware.org/gdb/current/onlinedocs/gdb/Registers.html#Registers
Tips :
xmm0
~xmm15
,是128位,几乎每台现代机器都有它,它们于1999年发布 .ymm0
~ymm15
,是256位,新机器通常都有它,它们是在2011年发布的 .zmm0
~zmm31
,是512位,普通PC可能没有它(如2016年),它们是2013年发布的,主要用于服务器到目前为止 .仅显示一个xmm / ymm / zmm的序列,因为它们在不同模式下是相同的寄存器 . 在我的机器上显示ymm .
还有:
然后,您可以获得您感兴趣的寄存器名称 - 对于查找特定于平台的寄存器(如ARM上的NEON Q ...)非常有用 .