C++ GDB JIT接口最简单的示例

C++ GDB JIT接口最简单的示例,c++,debugging,gdb,jit,C++,Debugging,Gdb,Jit,我读了这一章,遇到了一个问题:如何为最简单的代码编写最简单的示例(最好是在C++中,至少对于x86-64平台)?比方说,我想调试以下代码(即,code.data()function): #包括“eallocator.hpp” #包括 #包括 #包括 int main() { std::vector代码; 代码\推回(0b11011001u);代码\推回(0b11101011u);//fldpi 代码u.push_back(0b11000011u);//ret 双重结果; __asm(“呼叫*%1

我读了这一章,遇到了一个问题:如何为最简单的代码编写最简单的示例(最好是在C++中,至少对于x86-64平台)?比方说,我想调试以下代码(即,
code.data()
function):

#包括“eallocator.hpp”
#包括
#包括
#包括
int main()
{
std::vector>代码;
代码\推回(0b11011001u);代码\推回(0b11101011u);//fldpi
代码u.push_back(0b11000011u);//ret
双重结果;
__asm(“呼叫*%1”
:“=&t”(结果)
:“r”(代码.数据())
:
);

std::cout在他们的测试中有一个例子应该会有所帮助


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

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

要做到这一点,最好的办法是看看LLVM。文档中的这一节描述了如何使用MCJIT实现这一点,在底部有一个完整的示例—从一些简单的C代码开始,使用LLVM MCJIT将其JIT到内存,并将GDB附加到其中。此外,由于涉及LLVM MCJIT框架,因此您可以进行完整的调试在那里,达到C级

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


我希望这有帮助。

-450作为赏金。很抱歉,我不能提供任何其他东西。你的假设是正确的。但是MinGW和GDB在Windows中是如何工作的?没有ELF文件格式,只有PE。@Dukales:AFAIK,MinGW确实在Windows上发出PE,但为了调试它,它实际上嵌入了DWARF。Windows上的GDB也读取PE,但随后会发出DWARF deb的声音ug信息来自它。
#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;
}