Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/meteor/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在GDB中打印寄存器值?_Gdb_Cpu Registers - Fatal编程技术网

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

如何在GDB中打印寄存器值?,gdb,cpu-registers,Gdb,Cpu Registers,如何打印%eax和%ebp的值 信息寄存器显示所有寄存器;信息寄存器eax仅显示寄存器eax。该命令可以缩写为i r如果您试图在GDB中打印特定寄存器,则必须省略%符号。比如说, info registers eip 如果可执行文件是64位的,则寄存器以r开头。以e开头是无效的 info registers rip 这些可以缩写为: i r rip 还有: info all-registers 然后你可以得到你感兴趣的寄存器名-对于查找特定于平台的寄存器非常有用,比如NEON Q。。。在

如何打印%eax和%ebp的值


信息寄存器显示所有寄存器;信息寄存器eax仅显示寄存器eax。该命令可以缩写为i r

如果您试图在GDB中打印特定寄存器,则必须省略%符号。比如说,

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

info registers rip
这些可以缩写为:

i r rip
还有:

info all-registers
然后你可以得到你感兴趣的寄存器名-对于查找特定于平台的寄存器非常有用,比如NEON Q。。。在ARM上。

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
发件人:

任何以“$”开头的名称都可以用作方便变量,除非它是预定义的特定于机器的寄存器名称之一

:

可以将表达式中的机器寄存器内容作为名称以“$”开头的变量引用。每台机器的寄存器名称不同;使用信息寄存器查看计算机上使用的名称

但到目前为止,我在控制寄存器方面运气不太好:OSDev 2012 | | | 2005特性请求| | alt.lang.asm 2013

ARM浮点寄存器

见:

如果只想检查一次,信息寄存器显示寄存器。 例如,如果只想查看一个寄存器,请在gdb命令行中显示$esp continue display esp registers。 如果要查看所有寄存器,布局寄存器继续显示寄存器,使用TUI模式。 Gdb命令:

i r:打印单个寄存器,例如i r rax、i r eax i r…:打印多个寄存器,例如i r rdi rsi, i r:打印除浮点和向量寄存器xmm、ymm、zmm以外的所有寄存器。 i r a:打印所有寄存器,包括浮点和向量寄存器xmm、ymm、zmm。 i r f:打印所有FPU浮动寄存器st0-7和一些其他f* 除all和f浮点之外的其他寄存器组可通过以下方式找到:

maint print reggroups
记录于:

小贴士:

xmm0~xmm15是128位,几乎所有现代机器都有,它们是1999年发布的。 ymm0~ymm15,是256位的,新机器通常都有,它们在2011年发布。 zmm0~zmm31,是512位,普通pc可能在2016年没有,它们在2013年发布,目前主要用于服务器。 只显示一个xmm/ymm/zmm序列,因为它们在不同模式下是相同的寄存器。在我的机器上显示ymm。
我得到:无效的寄存器“%eax”,如果我只是执行信息寄存器,则不会显示eax。然而,我在IDE中查看我的代码集,其中使用以下指令生成了EXC_BAD_访问信号:test%eax,%eax这是在运行gdb的XCode中。为什么gdb不报告eax寄存器?同样的问题:%eax在代码中,但print$eax显示无效。Bridgette的答案对我很有用。geekosaur的答案基本上是正确的,但是您需要省略%符号,因此特定寄存器的命令是info registers eax。不过,我不确定这对于不同版本的gdb是否有所不同。我在为lldb搜索相同的内容,所以让我注意:对于lldb,如果您希望在逐步使用display的代码时连续显示寄存器值,则命令为register read[eax]。例如,display$eax。这可能是关于我不知道存在的寄存器:-在我的机器上,这会打印eax、ecx和信息寄存器隐藏的其他标准寄存器。这可能是可以接受的答案。使用layout reg让gdb显示一个包含所有整数和标志寄存器的表,突出显示由上一条指令更改的寄存器。请参阅示例。能够在具有此$syntax的表达式中使用寄存器非常好。
maint print reggroups