如何在Xcode控制台中打印反汇编寄存器

15
我正在查看一些反汇编代码,看到类似于 0x01c8f09b <+0015> mov 0x8(%edx),%edi 的东西,想知道 %edx%edi 的值是多少。
是否有一种方法可以打印出 %edx 或其他汇编变量的值? 是否有一种方法可以打印出 %edx 指向的内存地址的值(我假设 edx 是一个寄存器,它包含指向 ... 某个地方的指针。)
例如,您可以在控制台中输入 po 来打印对象,那么是否有一种命令或语法来打印汇编中的寄存器/变量?
背景:
在这一行上,我遇到了 EXC_BAD_ACCESS 错误,我想调试一下发生了什么。 我意识到这个错误与内存管理有关,并且正在努力找出我可能缺失/过多使用保留/释放/自动释放调用的位置。
附加信息:
这是在 IOS 上,我的应用程序正在 iPhone 模拟器中运行。
5个回答

21

您可以使用以下代码打印寄存器(例如eax):

print $eax

或者简称:

p $eax

以十六进制形式打印:

p/x $eax

显示寄存器指向的值:

x $eax

请查看gdb帮助以获取更多详细信息:

help print
help x

13

取决于您正在使用的Xcode编译器/调试器。对于gcc/gdb,它是

info registers

但对于clang/lldb来说,它是

register read

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

来自使用gdb进行调试

You can refer to machine register contents, in expressions, as variables with names starting with `$'. The names of registers are different for each machine; use info registers to see the names used on your machine.

info registers

Print the names and values of all registers except floating-point registers (in the selected stack frame).

info all-registers

Print the names and values of all registers, including floating-point registers.

info registers regname ...

Print the relativized value of each specified register regname. regname may be any register name valid on the machine you are using, with or without the initial `$'.


7
如果您使用LLDB而不是GDB,您可以使用register read

3

这些不是变量,而是寄存器。

在GDB中,您可以使用以下命令查看标准寄存器的值:

info registers

请注意,寄存器包含整数值(在您的情况下为32位,因为寄存器名称以e为前缀)。它代表的内容未知。它可以是指针、整数或任何其他类型的数据。
如果尝试将寄存器的值作为指针进行打印时,po程序崩溃,则很可能该值不是指针(或无效指针)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接