Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux LLDB在内存转储中显示陷阱操作码_Linux_Android Ndk_Gdb_Llvm_Lldb - Fatal编程技术网

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

Linux LLDB在内存转储中显示陷阱操作码,linux,android-ndk,gdb,llvm,lldb,Linux,Android Ndk,Gdb,Llvm,Lldb,我想知道,在LLDB的内存转储程序中,是否有可能在我刚刚设置了一个触发点的位置看到陷阱操作码? 正如我所看到的,LLDB足够聪明,可以用原始操作码对陷阱操作码进行阴影处理: (lldb) memory read --format instruction --count 5 0x00000076619b5478 -> 0x76619b5478: 0xf9401668 ldr x8, [x19, #0x28] 0x76619b547c: 0xf9400289 ldr

我想知道,在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]
(lldb)内存读取--格式指令--计数5 0x00000076619b5478
->0x76619b5478:0xf9401668 ldr x8[x19,#0x28]
0x76619b547c:0xf9400289 ldr x9[x20]
0x76619b5480:0xeb09011f cmp x8,x9
0x76619b5484:0x540000e1 b.ne 0x76619b54a0;
0x76619b5488:0xa95d7bf3 ldp x19,x30[sp,#0x1d0]
(lldb)断点集--地址0x76619b5488
断点3:where=libface\u detector\u v2\u jni.so`\uuuuu lldb\u unnamed\u symbol20247$$libface\u detector\u v2\u jni.so+176,地址=0x00000076619b5488
(lldb)内存读取--格式指令--计数5 0x00000076619b5478
->0x76619b5478:0xf9401668 ldr x8[x19,#0x28]
0x76619b547c:0xf9400289 ldr x9[x20]
0x76619b5480:0xeb09011f cmp x8,x9
0x76619b5484:0x540000e1 b.ne 0x76619b54a0;
0x76619b5488:0xa95d7bf3 ldp x19,x30[sp,#0x1d0]
在这里,我在
0x76619b5488
处设置了一个中断,但转储程序仍在该位置显示原始指令。
help memory read
没有关于如何查看陷阱操作码的提示

有什么想法吗

另外,它是一个与Android SDK捆绑的LLDB,声称版本:
7.0.0
。目标是安卓Aarch64

在这里,我将中断设置为0x76619b5488,但转储程序仍在该位置显示原始指令

这是调试器的典型特征:他们不想让您对插入的断点指令感到困惑,因此会向您显示内存的原始内容

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

如何看到陷阱操作码

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

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


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

他/她难道不能检查内存并看到断点吗?类似于
x/16b0x76619b5470
。或者调试器是否知道提供熟值?@jww我不知道LLDB,但GDB提供“熟”值。我希望LLDB也能做到这一点——通常这是在低级的“读取内存”例程中实现的,它知道如何从
核心
RAM
远程
(取决于使用的是哪个后端)读取实际内存,并对其进行“烹调”以删除断点。
检查
反汇编
然后都使用这个低级的
读取_mem
,不需要担心潜在的细节。@EmployedRussian聪明的把戏!令人惊讶的是,
表达式--printf(“%x\n”、*((unsigned*))
也可以打印陷阱字节。可能求值引擎允许直接读取,从而绕过了您刚才提到的调试器的内存访问子系统。是否应该将其视为bug…上次我处理它时,gdb在停止时删除所有断点,并在继续时重新插入它们。这可能就是为什么您没有看到上面所示表达式中的陷阱。我们想让lldb在有很多断点的情况下运行得更快,所以lldb不会这样做,它会保留陷阱。由于表达式访问进程的实际内存,因此它们将看到这些陷阱。在我看来,不必在每一站都处理陷阱的好处非常值得这么做。当内存由debugserver或lldb提供时,“烹饪”就会发生,程序的内存中仍然有陷阱。由于表达式实际上是在目标程序中运行的(例如,printf的运行就像语句是源代码的一部分一样),如果您没有删除陷阱,则在表达式中运行的代码将看到它们。这实际上很有用-如果您想调试具有奇怪输入的函数,请在其中设置断点,然后使用
expr-i0--
调用该函数,然后调试代码。所以我们真的不能用这种方式对你隐藏陷阱。