如何在 Xcode 控制台中打印反汇编寄存器
我正在查看一些反汇编代码,并看到类似 0x01c8f09b <+0015> 的内容mov 0x8(%edx),%edi
我想知道 %edx
或 %edi
的值是什么。
有没有办法打印 %edx
或其他汇编变量的值?有没有办法打印 %edx
指向的内存地址处的值(我假设 edx
是一个寄存器,其中包含指向...的指针) 。
例如,您可以通过在控制台中输入po
来打印一个对象,那么是否有用于在程序集中打印寄存器/变量的命令或语法?
背景:
我在这一行收到EXC_BAD_ACCESS
,我想调试正在发生的事情。我知道这个错误与内存管理有关,我正在寻找可能丢失/太多保留/释放/自动释放调用的位置。
附加信息:
这是在 IOS 上,我的应用程序在 iPhone 模拟器中运行。
I'm looking at some disassembly code and see something like 0x01c8f09b <+0015> mov 0x8(%edx),%edi
and I am wondering what the value of %edx
or %edi
is.
Is there a way to print the value of %edx
or other assembly variables? Is there a way to print the value at the memory address that %edx
points at (I'm assuming edx
is a register containing a pointer to ... something here).
For example, you can print an objet by typing po
in the console, so is there a command or syntax for printing registers/variables in the assembly?
Background:
I'm getting EXC_BAD_ACCESS
on this line and I would like to debug what is going on. I'm aware this error is related to memory management and I'm looking at figuring out where I may be missing/too-many retain/release/autorelease calls.
Additional Info:
This is on IOS, and my application is running in the iPhone simulator.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(5)
您可以使用以下方法打印寄存器(例如,
eax
):或者简称:
将其打印为十六进制:
显示寄存器指向的值:
检查 gdb 帮助以获取更多详细信息:
You can print a register (e.g,
eax
) using:Or for short:
To print it as hexadecimal:
To display the value pointed to by a register:
Check the gdb help for more details:
取决于您使用的 Xcode 编译器/调试器。对于 gcc/gdb 来说是
,但是对于 clang/lldb 来说是
Depends up which Xcode compiler/debugger you are using. For gcc/gdb it's
but for clang/lldb it's
来自使用 gdb 调试:
From Debugging with gdb:
如果您使用 LLDB 而不是 GDB,您可以使用
register read
If you are using LLDB instead of GDB you can use
register read
这些不是变量,而是寄存器。
在 GDB 中,您可以使用以下命令查看标准寄存器的值:
请注意,寄存器包含整数值(在您的情况下为 32 位,因为寄存器名称以
e
为前缀)。它代表什么尚不清楚。它可以是一个指针、一个整数,几乎任何东西。如果当您尝试将寄存器的值打印为指针时,
po
崩溃,则该值很可能不是指针(或无效的指针)。Those are not variables, but registers.
In GDB, you can see the values of standard registers by using the following command:
Note that a register contains integer values (32bits in your case, as the register name is prefixed by
e
). What it represent is not known. It can be a pointer, an integer, mostly anything.If
po
crashes when you try to print a register's value as a pointer, it's likely that the value is not a pointer (or an invalid one).