如何在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 raxir 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