如何在GDB中打印寄存器值?
info registers
显示所有寄存器; info registers eax
却与此注册eax
。该命令可以。如果你想打印GDB一个特定的寄存器缩写为i r
我得到:无效的寄存器'%eax中” 如果我只是做‘信息登记’EAX不出来。然而,我期待在IDE我的代码组件,其中一个EXC_BAD_ACCESS信号已与指令生成的:测试%EAX,EAX% 这是XCode中运行GDB。 gdb为什么不报告eax寄存器? – NoahR 2011-10-20 18:45:00
同样的问题:%eax在代码中,但是print $ eax显示void。 – 2012-10-08 16:42:33
Bridgette的答案适合我。 geekosaur的答案大部分都是正确的,但是你需要省略%符号,所以特定寄存器的命令是'info registers eax'。不过,我不确定这是不同版本的gdb。 – Kevin 2012-10-10 03:59:10
,你必须忽略%的迹象。例如,
info registers eip
如果你的可执行文件是64位寄存器开始与河用e开始它们是无效的。
info registers rip
那些可以缩写为:
i r rip
还有:
info all-registers
然后你就可以得到注册名,你有兴趣 - 寻找非常有用的平台 - 特定的寄存器(如ARM上的NEON Q ...)。
这个教导是关于我不知道存在的寄存器:-) – 2015-05-09 09:29:52
在我的机器上,这将打印'info寄存器'隐藏的'eax','ecx'和其他标准寄存器。这应该可以被接受的答案。 – EntangledLoops 2016-12-20 16:51:26
由于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
- 如果只想检查一次,
info registers
显示寄存器。 - 如果仅希望观看一个寄存器,例如,
display $esp
继续在gdb命令行显示ESP寄存器。 - 如果想观看所有的寄存器,
layout regs
继续显示寄存器,以TUI模式。
GDB命令:
-
i r <register_name>
:打印单个寄存器,例如克i r rax
,i r eax
-
i r <register_name_1> <register_name_2> ...
:打印多个寄存器,e.gi r rdi rsi
, i r
:打印所有寄存器除了浮点&矢量寄存器(XMM,YMM,ZMM)。i r a
:打印所有寄存器,包含浮点数&矢量寄存器(xmm,ymm,zmm)。
提示:
-
xmm0
〜xmm15
,为128位,几乎每一个现代化的机器,他们是在1999年 -
ymm0
〜ymm15
发布,是256位,新机通常有它,他们被释放在2011年 -
zmm0
〜zmm31
,有512位,正常的电脑可能没有它(为2016年),他们被释放在2013年,主要用于在服务器为止。 - 只有XMM/YMM /个zmm的一个串行将被示出,因为它们是在不同的模式中是相同的寄存器。在我的机器上显示ymm。
使用'布局reg'具有GDB显示所有整数和标志寄存器的一个表,突出由前一指令改变所述一个(多个)。例如,请参阅http://stackoverflow.com/tags/x86/info。 – 2015-07-25 20:08:52