LLDB 在内存转储中显示陷阱操作码

LLDB Show trap opcodes in memory dump

我想知道是否有可能使用 LLDB 的内存转储器在我刚刚设置的 beakpoint 的位置看到陷阱操作码? 正如我所见,LLDB 足够聪明,可以用原始操作码隐藏陷阱操作码:

(lldb) memory read --format instruction --count 5 0x00000076619b5478
->  0x76619b5478: 0xf9401668   ldr    x8, [x19, #0x28]
    0x76619b547c: 0xf9400289   ldr    x9, [x20]
    0x76619b5480: 0xeb09011f   cmp    x8, x9
    0x76619b5484: 0x540000e1   b.ne   0x76619b54a0              ; <+200>
    0x76619b5488: 0xa95d7bf3   ldp    x19, x30, [sp, #0x1d0]
(lldb) breakpoint set --address 0x76619b5488
Breakpoint 3: where = libface_detector_v2_jni.so`___lldb_unnamed_symbol20247$$libface_detector_v2_jni.so + 176, address = 0x00000076619b5488
(lldb) memory read --format instruction --count 5 0x00000076619b5478
->  0x76619b5478: 0xf9401668   ldr    x8, [x19, #0x28]
    0x76619b547c: 0xf9400289   ldr    x9, [x20]
    0x76619b5480: 0xeb09011f   cmp    x8, x9
    0x76619b5484: 0x540000e1   b.ne   0x76619b54a0              ; <+200>
    0x76619b5488: 0xa95d7bf3   ldp    x19, x30, [sp, #0x1d0]

这里我在0x76619b5488设置了一个中断,但dumper仍然在那个地方显示原始指令。 help memory read 没有关于如何查看陷阱操作码的提示。

有什么想法吗?

P.S。它是一个与 Android SDK 捆绑在一起的 LLDB,声称的版本:7.0.0。目标是 Android Aarch64。

Here I set a break at 0x76619b5488 but dumper still shows original instruction at that place.

这是非常典型的调试器:他们不想让您与他们插入的断点指令混淆,所以向您展示内存的原始内容。

在 x86 上,做任何其他事情都会使指令流不同步(因为指令是可变长度的),因此显示插入断点的 实际 指令会产生完全的垃圾。

how one could see trap opcodes

您可以复制(拍摄快照)一个内存区域(例如 1 个函数的内存)并在该函数上有断点时将其与当前内容进行比较。他们不会匹配。这是程序可以检测到它正在被调试的方法之一。

然后您可以要求 LLDB 反汇编复制的区域(对于插入断点后获取的副本),您将看到您希望观察的断点(但 IP 相对偏移将指向错误的位置)。

我不知道有什么更简单的方法可以做到这一点。