我正在查看一些反汇编代码并看到类似0x01c8f09b <+0015> mov 0x8(%edx),%edi
的内容,我想知道%edx
或%edi
的价值是什么。
有没有办法打印%edx
或其他汇编变量的值?有没有办法在%edx
指向的内存地址处打印值(我假设edx
是一个寄存器,其中包含指向...的东西)。
例如,您可以通过在控制台中键入po
来打印对象,那么是否有用于在程序集中打印寄存器/变量的命令或语法?
背景:
我在这一行得到EXC_BAD_ACCESS
,我想调试发生了什么。我知道这个错误与内存管理有关,我正在考虑找出可能丢失的地方/太多的保留/释放/自动释放调用。
其他信息:
这是在IOS上,我的应用程序在iPhone模拟器中运行。
答案 0 :(得分:15)
您可以使用以下方式打印寄存器(例如eax
)
print $eax
或简称:
p $eax
将其打印为十六进制:
p/x $eax
显示寄存器指向的值:
x $eax
检查gdb帮助以获取更多详细信息:
help print
help x
答案 1 :(得分:9)
(gdb) info reg
eax 0xe 14
ecx 0x2844e0 2639072
edx 0x285360 2642784
ebx 0x283ff4 2637812
esp 0xbffff350 0xbffff350
ebp 0xbffff368 0xbffff368
esi 0x0 0
edi 0x0 0
eip 0x80483f9 0x80483f9 <main+21>
eflags 0x246 [ PF ZF IF ]
cs 0x73 115
ss 0x7b 123
ds 0x7b 123
es 0x7b 123
fs 0x0 0
gs 0x33 51
您可以将表达式中的机器寄存器内容称为带名称的变量 以'$'开头。每台机器的寄存器名称不同;使用信息 注册以查看您机器上使用的名称。
info registers
打印除浮点之外的所有寄存器的名称和值 寄存器(在选定的堆栈帧中)。
info all-registers
打印所有寄存器的名称和值,包括浮点数 寄存器。
info registers regname ...
打印每个指定寄存器regname的相对值。 regname可以是您正在使用的机器上有效的任何注册名称, 有或没有初始`$'。
答案 2 :(得分:9)
取决于您使用的Xcode编译器/调试器。对于gcc / gdb,它是
info registers
但对于clang / lldb来说是
register read
答案 3 :(得分:6)
如果您使用的是LLDB而不是GDB,则可以使用register read
答案 4 :(得分:2)
这些不是变量,而是寄存器。
在GDB中,您可以使用以下命令查看标准寄存器的值:
info registers
请注意,寄存器包含整数值(在您的情况下为32位,因为寄存器名称以e
为前缀)。它所代表的内容尚不清楚。它可以是指针,整数,大多数都是。
如果在尝试将寄存器的值作为指针打印时po
崩溃,则该值可能不是指针(或无效指针)。