2011-03-25 169 views
124

如何打印的%eax%ebp价值?如何在GDB中打印寄存器值?

(gdb) p $eax 
$1 = void 
+2

使用'布局reg'具有GDB显示所有整数和标志寄存器的一个表,突出由前一指令改变所述一个(多个)。例如,请参阅http://stackoverflow.com/tags/x86/info。 – 2015-07-25 20:08:52

回答

149

info registers显示所有寄存器; info registers eax却与此注册eax。该命令可以。如果你想打印GDB一个特定的寄存器缩写为i r

+0

我得到:无效的寄存器'%eax中” 如果我只是做‘信息登记’EAX不出来。然而,我期待在IDE我的代码组件,其中一个EXC_BAD_ACCESS信号已与指令生成的:测试%EAX,EAX% 这是XCode中运行GDB。 gdb为什么不报告eax寄存器? – NoahR 2011-10-20 18:45:00

+1

同样的问题:%eax在代码中,但是print $ eax显示void。 – 2012-10-08 16:42:33

+4

Bridgette的答案适合我。 geekosaur的答案大部分都是正确的,但是你需要省略%符号,所以特定寄存器的命令是'info registers eax'。不过,我不确定这是不同版本的gdb。 – Kevin 2012-10-10 03:59:10

37

,你必须忽略%的迹象。例如,

info registers eip 

如果你的可执行文件是64位寄存器开始与河用e开始它们是无效的。

info registers rip 

那些可以缩写为:

i r rip 
30

还有:

info all-registers 

然后你就可以得到注册名,你有兴趣 - 寻找非常有用的平台 - 特定的寄存器(如ARM上的NEON Q ...)。

+3

这个教导是关于我不知道存在的寄存器:-) – 2015-05-09 09:29:52

+1

在我的机器上,这将打印'info寄存器'隐藏的'eax','ecx'和其他标准寄存器。这应该可以被接受的答案。 – EntangledLoops 2016-12-20 16:51:26

1

由于GDB 7.7.1,命令你试过作品:

set $eax = 0 
p $eax 
# $1 = 0 
set $eax = 1 
p $eax 
# $2 = 1 

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

7
  • 如果只想检查一次,info registers显示寄存器。
  • 如果仅希望观看一个寄存器,例如,display $esp继续在gdb命令行显示ESP寄存器。
  • 如果想观看所有的寄存器,layout regs继续显示寄存器,以TUI模式。
5

GDB命令

  • i r <register_name>:打印单个寄存器,例如克i r raxi r eax
  • i r <register_name_1> <register_name_2> ...:打印多个寄存器,e.g i r rdi rsi
  • i r:打印所有寄存器除了浮点&矢量寄存器(XMM,YMM,ZMM)。

  • i r a:打印所有寄存器,包含浮点数&矢量寄存器(xmm,ymm,zmm)。

提示

  • xmm0xmm15,为128位,几乎每一个现代化的机器,他们是在1999年
  • ymm0ymm15发布,是256位,新机通常有它,他们被释放在2011年
  • zmm0zmm31,有512位,正常的电脑可能没有它(为2016年),他们被释放在2013年,主要用于在服务器为止。
  • 只有XMM/YMM /个zmm的一个串行将被示出,因为它们是在不同的模式中是相同的寄存器。在我的机器上显示ymm。