如何在GDB中打印寄存器值?
如何打印%eax
和%ebp
的值?
(gdb) p $eax $1 = void
info registers
显示所有的寄存器; info registers eax
只显示寄存器eax
。 该命令可以缩写为ir
如果您要在GDB中打印特定的寄存器,则必须省略%符号。 例如,
info registers eip
如果您的可执行文件是64位,则寄存器以r开头。 用e启动它是无效的。
info registers rip
这些可以缩写为:
ir rip
还有:
info all-registers
然后你可以得到你感兴趣的寄存器名称 – 非常有用的寻找平台特定的寄存器(如ARM上的NEON Q …)。
- 如果只想检查一次,
info registers
显示寄存器。 - 如果只想看一个寄存器,例如,
display $esp
continue在gdb命令行中显示esp寄存器。 - 如果要观看所有寄存器,
layout regs
继续显示寄存器,用TUI模式。
Gdb命令 :
-
ir <register_name>
:打印单个注册,例如ir rax
,ir eax
-
ir <register_name_1> <register_name_2> ...
:打印多个寄存器,例如ir rdi rsi
, -
ir
:打印除浮点和向量寄存器(xmm,ymm,zmm)以外的所有寄存器。 -
ira
:打印所有的寄存器,包括浮点和vector寄存器(xmm,ymm,zmm)。
提示 :
-
xmm0
位,几乎每台现代机都有它,它们在1999年发布。 -
ymm0
,都是256位,新机通常都有,2011年发布。 -
zmm0
,是512位,普通pc可能没有( 截至2016年 ),它们在2013年发布,主要用于服务器到目前为止。 - 只会显示一个xmm / ymm / zmm序列,因为它们是不同模式下的相同寄存器。 在我的机器上显示ymm。
从GDB 7.7.1开始,你尝试的命令就是这样工作的:
set $eax = 0 p $eax # $1 = 0 set $eax = 1 p $eax # $2 = 1
从文档 :
除非是预定义的机器特定寄存器名称之一,否则以“$”开头的任何名称都可以用作便利variables。
和 :
您可以在expression式中引用机器寄存器内容作为名称以“$”开头的variables。 每台机器的寄存器名称不同; 使用信息寄存器来查看您的机器上使用的名称。
但是到目前为止,我还没有很好的控制寄存器:OSDev 2012 http://f.osdev.org/viewtopic.php?f=1&t=25968 2005function请求https://www.sourceware.org/ml/gdb/2005-03/msg00158.html || alt.lang.asm 2013 https://groups.google.com/forum/#!topic/alt.lang.asm/JC7YS3Wu31I