gdb / lldb无法访问jitted代码的内存地址

问题描述

我正在使用JIT编译器,通常需要在gdb / lldb中调试jitted代码的执行。但是,在使用call执行固定代码的过程中尝试跳过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)。任何帮助,将不胜感激。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)