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

发布于 2024-12-10 18:26:30 字数 500 浏览 1 评论 0原文

我正在查看一些反汇编代码,并看到类似 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

唱一曲作罢 2024-12-17 18:26:30

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

print $eax

或者简称:

p $eax

将其打印为十六进制:

p/x $eax

显示寄存器指向的值:

x $eax

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

help print
help x

You can print a register (e.g, eax) using:

print $eax

Or for short:

p $eax

To print it as hexadecimal:

p/x $eax

To display the value pointed to by a register:

x $eax

Check the gdb help for more details:

help print
help x
看轻我的陪伴 2024-12-17 18:26:30

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

info registers

,但是对于 clang/lldb 来说是

register read

Depends up which Xcode compiler/debugger you are using. For gcc/gdb it's

info registers

but for clang/lldb it's

register read
梦幻的心爱 2024-12-17 18:26:30
(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 调试

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

信息寄存器

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

信息所有寄存器

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

info 注册 regname ...

打印每个指定寄存器注册名的相对值。
regname 可以是您正在使用的计算机上有效的任何寄存器名称,
带或不带开头的“$”。

(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

From Debugging with 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 `$'.

流年已逝 2024-12-17 18:26:30

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

If you are using LLDB instead of GDB you can use register read

半夏半凉 2024-12-17 18:26:30

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

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

info registers

请注意,寄存器包含整数值(在您的情况下为 32 位,因为寄存器名称以 e 为前缀)。它代表什么尚不清楚。它可以是一个指针、一个整数,几乎任何东西。

如果当您尝试将寄存器的值打印为指针时,po 崩溃,则该值很可能不是指针(或无效的指针)。

Those are not variables, but registers.

In GDB, you can see the values of standard registers by using the following command:

info registers

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).

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文