2011-10-18 72 views
9

我正在查看一些反汇编代码,看到类似0x01c8f09b <+0015> mov 0x8(%edx),%edi,我想知道%edx%edi的值是多少。如何在Xcode控制台中打印反汇编寄存器

有没有办法打印%edx或其他装配变量的值?有没有办法在%edx指向的内存地址处打印值(我假设edx是包含指向...的某个指针的寄存器)。

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

背景:

我得到这条线上EXC_BAD_ACCESS,我想调试是怎么回事。我知道这个错误与内存管理有关,我正在考虑找出我可能丢失的位置/太多保留/释放/自动释放调用。

附加信息:

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

回答

14

可以打印一个寄存器(例如,eax)使用:

print $eax 

或简称:

p $eax 

要打印为十六进制:

p/x $eax 

要显示寄存器指向的值:

x $eax 

详细信息请参考gdb的帮助:

help print 
help x 
2

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

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

info registers 

注意寄存器包含整数值(在你的情况下32位,作为寄存器名称由e前缀) 。它代表的是不知道的。它可以是一个指针,一个整数,主要是任何东西。

如果po当你尝试打印一个寄存器的值作为一个指针时崩溃,它可能是该值不是一个指针(或一个无效的)。

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 寄存器来查看您的机器上使用的名称。

info registers 

打印除了浮点 寄存器(在所选择的堆栈帧)的名称和所有寄存器的值。

info all-registers 

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

info registers regname ... 

打印每个指定寄存器名称的相对化值。 注册名称可以是您正在使用的机器上有效的任何注册名称, 有或没​​有初始`$'。

8

要看了您正在使用的Xcode的编译器/调试器。对于GCC/GDB每次的

info registers 

但铛/ LLDB它

register read 
4

如果您正在使用LLDB代替GDB可以使用register read

相关问题