c++ - GDB JIT 接口(interface)最简单的例子

标签 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 中的方法。

最佳答案

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

使这个任务很难用“最小”示例来表达的原因是,GDB 实际上希望在内存中找到整个 ELF 对象,而不仅仅是一堆代码。 GDB 的注册接口(interface)需要 ELF 符号表来检查,以便找出发出的代码中存在哪些符号以及它们位于何处。

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

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

希望对您有所帮助。

关于c++ - GDB JIT 接口(interface)最简单的例子,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20046943/

相关文章:

c++ - 当出现 icq 桌面错误时如何编辑 makefile (make : *** [all] Error 2) Ubuntu 18. 04 64 bit

c++ - 包装 STL 迭代器以使用引用而不是指针

c++ - 将 INT3 中断留给 visual studio 上应用程序的异常处理程序

dynamic - 如何在GDB中自动打印接下来的N行执行?

c++ - gdb中链接命令观察执行栈

c++ - 没有重载函数的实例....(消息框::显示)

c++ - 将 int 传递给需要枚举数据类型的函数

c++ - 是否可以直接识别覆盖整个堆栈的错误代码?

perl - 如何调查 "Attempt to free unreferenced scalar"

c++ - 应该使用什么命令来创建只包含所有目标文件符号的文件?