【问题标题】:GDB JIT Interface simpliest exampleGDB JIT 接口最简单的例子
【发布时间】:2013-12-19 22:26:48
【问题描述】:

我阅读了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 Windows 或来自this for Linux 的方法。

【问题讨论】:

  • -450 赏金。很抱歉,但我不能提供其他任何东西。

标签: c++ debugging gdb jit


【解决方案1】:

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

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

您最好的选择是查看 LLVM。文档中的Debugging JIT-ed Code with GDB 部分描述了如何使用 MCJIT 执行此操作,底部有一个完整示例 - 从一些简单的 C 代码开始,使用 LLVM MCJIT 将其 JIT 到内存并将 GDB 附加到它。此外,由于涉及 LLVM MCJIT 框架,您可以在那里获得完整的调试信息,直至 C 级!

说实话,该文档部分已经有一段时间没有更新了,但它应该可以工作。如果没有,请告诉我 - 我会考虑修复并更新它。

我希望这会有所帮助。

【讨论】:

  • 你的假设是正确的。但是 MinGW 和 GDB 在 Windows 中是如何工作的呢?没有ELF文件格式,只有PE。
  • @Dukales:AFAIK,MinGW 确实在 Windows 上发出 PE,但为了调试它实际上将 DWARF 嵌入其中。 Windows 上的 GDB 也会读取 PE,但随后会从中获取 DWARF 调试信息。
【解决方案2】:

【讨论】:

    猜你喜欢
    • 2014-04-18
    • 2016-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-11
    • 1970-01-01
    • 2013-10-12
    相关资源
    最近更新 更多