首页 > 解决方案 > gdb/lldb 无法访问 jit 代码的内存地址

问题描述

我正在开发一个 JIT 编译器,并且经常需要调试 gdb/lldb 中 jitted 代码的执行。call但是,在使用 jit 代码执行期间尝试跳过 a时nexti,gdb 会出现以下错误:

(gdb) nexti
Warning:
Cannot insert breakpoint 0.
Cannot access memory at address 0x7ffff7fcc056

在 lldb 中也会发生同样的情况:

    frame #0: 0x00007ffff7fcc053
->  0x7ffff7fcc053: call   r11
    0x7ffff7fcc056: pop    r11
    0x7ffff7fcc058: pop    r10
    0x7ffff7fcc05a: pop    r9
(lldb) ni
warning: failed to set breakpoint site at 0x7ffff7fcc056 for breakpoint -2.1: error: 9 sending the breakpoint request

尝试在该地址(例如b *0x7ffff7fcc056)手动设置断点时出现相同的错误。我不知道这是否与我们调用调用的方式有关(将调用符号的地址加载到寄存器中并以这种方式调用),而 gdb/lldb 无法解决如何跳过它。但这并不能解释为什么手动将断点设置为地址也不起作用。还是因为正在执行的代码是在运行时生成的,并且只存在于内存中,而 gdb/lldb 试图将地址与可执行二进制文件匹配,而这个地址显然不存在?

我正在使用最新版本的 gdb (9.2) 和 lldb (11)。对此的任何帮助将不胜感激。

标签: debugginggdblldbjit

解决方案


推荐阅读