我想知道LLDB的内存转储程序是否有可能在我刚刚设置了喙点的位置看到陷阱操作码?正如我所见,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
处设置了一个休息时间,但转储程序仍在该位置显示原始指令。help memory read
没有暗示如何看到陷阱操作码。
有什么想法吗?
P.S。它是与Android SDK捆绑在一起的LLDB,声明版本为7.0.0
。目标是Android Aarch64。
这里我在0x76619b5488处设置了一个中断,但转储程序仍在该位置显示原始指令。
这在调试器中非常典型:他们不想将它们与插入的断点指令混淆,因此向您展示存储器的原始内容。
在x86上,做任何其他事情都会使指令流不同步(因为指令的长度是可变的,所以显示actual指令并插入断点会产生完全的垃圾。
如何看到陷阱操作码
您可以复制(拍摄快照)一个存储区域(例如1个函数的存储空间),并将其与当前内容进行比较,而该函数上会有一个断点。他们将不匹配。这是程序可以检测到它正在调试的方式之一。
然后您可以要求LLDB分解复制的区域(对于插入断点后获得的副本),您将看到希望观察的断点(但是IP相对偏移将指向错误的位置)。
我不知道实现这一目标的简单方法。