我阅读了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中的方法。
答案 0 :(得分:3)
他们的测试中有一个应该有帮助的例子
https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;a=blob;f=gdb/testsuite/gdb.base/jit-main.c
答案 1 :(得分:3)
如果我理解正确的话,你要做的是动态地将一些可执行代码发送到内存中并设置GDB以便能够调试它,这是正确的吗?
这个任务在“最小”示例中很难表达的原因是GDB实际上希望在内存中找到一个完整的ELF对象,而不仅仅是一块代码。 GDB的注册接口需要检查ELF符号表,以便确定发出的代码中存在哪些符号以及它们驻留的位置。
在没有不合理努力的情况下做这件事最好的办法就是看看LLVM。文档中的Debugging JIT-ed Code with GDB部分描述了如何使用MCJIT执行此操作,底部有完整示例 - 从一些简单的C代码开始,使用LLVM MCJIT将其JIT到内存并将GDB附加到内存。此外,由于涉及LLVM MCJIT框架,您可以获得完整的调试信息,直到C级!
说实话,该文档部分暂时没有更新,但应该可以正常工作。如果没有,请告诉我 - 我会考虑修理并更新它。
我希望这会有所帮助。