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

Nat*_*ate 12 xcode gdb objective-c disassembly

我在看一些反汇编代码,看到喜欢的东西0x01c8f09b <+0015> mov 0x8(%edx),%edi,我想知道什么的值%edx或者%edi是.

有没有办法打印%edx或其他汇编变量的值?有没有办法在%edx指向的内存地址处打印值(我假设edx是一个寄存器,其中包含一个指向...的东西).

例如,您可以通过po在控制台中键入来打印对象,那么是否有用于在程序集中打印寄存器/变量的命令或语法?

背景:

我正在EXC_BAD_ACCESS上线,我想调试发生了什么.我知道这个错误与内存管理有关,我正在考虑找出可能丢失的地方/太多的保留/释放/自动释放调用.

附加信息:

这是在IOS上,我的应用程序在iPhone模拟器中运行.

dus*_*uff 16

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

print $eax
Run Code Online (Sandbox Code Playgroud)

或者简称:

p $eax
Run Code Online (Sandbox Code Playgroud)

要将其打印为十六进制:

p/x $eax
Run Code Online (Sandbox Code Playgroud)

要显示寄存器指向的值:

x $eax
Run Code Online (Sandbox Code Playgroud)

有关更多详细信息,请查看gdb帮助:

help print
help x
Run Code Online (Sandbox Code Playgroud)


G H*_*ley 11

取决于您使用的Xcode编译器/调试器.对于gcc/gdb来说

info registers
Run Code Online (Sandbox Code Playgroud)

但对于clang/lldb来说

register read
Run Code Online (Sandbox Code Playgroud)


cho*_*own 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
Run Code Online (Sandbox Code Playgroud)

使用gdb调试:

您可以将表达式中的机器寄存器内容称为名称以"$"开头的变量.每台机器的寄存器名称不同; 使用信息寄存器查看您机器上使用的名称.

info registers
Run Code Online (Sandbox Code Playgroud)

打印除浮点寄存器之外的所有寄存器的名称和值(在选定的堆栈帧中).

info all-registers
Run Code Online (Sandbox Code Playgroud)

打印所有寄存器的名称和值,包括浮点寄存器.

info registers regname ...
Run Code Online (Sandbox Code Playgroud)

打印每个指定寄存器regname的相对值.regname可以是您正在使用的机器上有效的任何注册名称,包含或不包含初始的"$".


Hol*_*dad 7

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