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

时间:2011-10-18 19:02:10

标签: objective-c xcode gdb disassembly

我正在查看一些反汇编代码并看到类似0x01c8f09b <+0015> mov 0x8(%edx),%edi的内容,我想知道%edx%edi的价值是什么。

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

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

背景:

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

其他信息:

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

5 个答案:

答案 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

来自Debugging with gdb

  

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

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崩溃,则该值可能不是指针(或无效指针)。