GDB JIT接口最简单的例子

时间:2013-11-18 11:44:33

标签: c++ debugging gdb jit

我阅读了JIT Interface章并遇到了问题:如何为最简单的可能代码编写一个最简单的示例(最好是 C ++ ,至少 x86-64 平台)?说,我想调试以下代码(即code_.data()函数):

#include "eallocator.hpp"

#include <iostream>
#include <vector>

#include <cstdlib>

int main()
{
    std::vector< std::uint8_t, eallocator< std::uint8_t > > code_;
    code_.push_back(0b11011001u); code_.push_back(0b11101011u); // fldpi
    code_.push_back(0b11000011u);                               // ret

    double result_;
    __asm("call *%1"
            : "=&t"(result_)
            : "r"(code_.data())
            :
              );
    std::cout << result_ << std::endl;

    return EXIT_SUCCESS;
}

使用界面我应该做什么(最低限度)?特别是,我希望能够提供一些伪代码(内存中的任意文本)作为“源”(带有相应的行信息),如果可能的话。

如何检测上述代码(或类似内容),同时保持简洁。

#include "eallocator.hpp"应使用this for Windowsthis for Linux中的方法。

2 个答案:

答案 0 :(得分:3)

答案 1 :(得分:3)

如果我理解正确的话,你要做的是动态地将一些可执行代码发送到内存中并设置GDB以便能够调试它,这是正确的吗?

这个任务在“最小”示例中很难表达的原因是GDB实际上希望在内存中找到一个完整的ELF对象,而不仅仅是一块代码。 GDB的注册接口需要检查ELF符号表,以便确定发出的代码中存在哪些符号以及它们驻留的位置。

在没有不合理努力的情况下做这件事最好的办法就是看看LLVM。文档中的Debugging JIT-ed Code with GDB部分描述了如何使用MCJIT执行此操作,底部有完整示例 - 从一些简单的C代码开始,使用LLVM MCJIT将其JIT到内存并将GDB附加到内存。此外,由于涉及LLVM MCJIT框架,您可以获得完整的调试信息,直到C级!

说实话,该文档部分暂时没有更新,但应该可以正常工作。如果没有,请告诉我 - 我会考虑修理并更新它。

我希望这会有所帮助。