我阅读了 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 中的方法。
最佳答案
如果我对您的理解正确,您正在尝试做的是动态地将一些可执行代码发送到内存中并设置 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/