如何在GDB中打印寄存器值?

时间:2011-03-25 06:07:58

标签: gdb cpu-registers

如何打印%eax%ebp的值?

(gdb) p $eax
$1 = void

7 个答案:

答案 0 :(得分:194)

info registers显示所有寄存器; info registers eax仅显示注册eax。该命令可以缩写为i r

答案 1 :(得分:47)

如果您尝试在GDB中打印特定注册表,则必须省略%符号。例如,

info registers eip

如果您的可执行文件是64位,则寄存器以r开头。用e开头是无效的。

info registers rip

可以缩写为:

i r rip

答案 2 :(得分:34)

还有:

info all-registers

然后你可以得到你感兴趣的寄存器名称 - 对于寻找特定于平台的寄存器非常有用(比如ARM上的NEON Q ...)。

答案 3 :(得分:11)

  • 如果只想检查一次,$user->save(); 显示寄存器。
  • 例如,如果只想看一个寄存器,info registers继续在gdb命令行中显示esp寄存器。
  • 如果要监视所有寄存器,display $esp继续显示寄存器,使用TUI模式。

答案 4 :(得分:8)

Gdb命令

  • i r <register_name>:打印一个注册表,例如i r raxi r eax
  • i r <register_name_1> <register_name_2> ...:打印多个寄存器,例如i r rdi rsi
  • i r:打印除浮点以外的所有寄存器&amp;向量寄存器(xmm,ymm,zmm)。
  • i r a:打印所有寄存器,包括浮点数&amp;向量寄存器(xmm,ymm,zmm)。
  • i r f:打印所有FPU浮动寄存器(st0-7和其他一些f*

除了aall)和ffloat)之外的其他注册组可以找到:

maint print reggroups

记录于:https://sourceware.org/gdb/current/onlinedocs/gdb/Registers.html#Registers

<强>提示

  • xmm0xmm15,是128位,几乎每台现代机器都有它,它们于1999年发布。
  • ymm0ymm15,是256位,新机器通常拥有它,它们将在2011年发布。
  • zmm0zmm31,是512位,普通电脑可能没有它(作为2016年),它们是在2013年发布的,目前主要用于服务器。
  • 仅显示一个xmm / ymm / zmm的序列,因为它们在不同模式下是相同的寄存器。在我的机器上显示ymm。

答案 5 :(得分:3)

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浮点寄存器

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

答案 6 :(得分:0)

对我来说最简单的是:

(gdb) x/x $eax

第一个 x 代表 ex 胺,第二个 x 代表十六进制。您可以使用以下方式查看其他格式:

(gdb) help x

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