使用gdb调试llvm传递

Arj*_*gri 5 debugging llvm

是否可以使用gdb调试llvm传递?我在llvm网站上找不到任何文档.

Ric*_*ton 6

是.在非释放模式下构建LLVM(默认).它需要比发布版本更长的时间,但您可以使用gdb来调试生成的目标文件.

需要注意的一点是:我必须将Linux机箱升级到3GB内存,以使LLVM调试模式链接时间合理.

  • 但是我可以调试 llvm pass 吗?LLVM pass 通常使用 opt 运行,所以我不知道如何使用 gdb 来运行它。你能告诉我命令吗? (2认同)
  • 您可以运行例如“gdb /usr/local/bin/opt”并输入“run <您的命令行>”。 (2认同)

Muh*_*afi 6

首先确保 LLVM 是在启用调试选项的情况下编译的,这基本上是默认设置。如果您没有使用非默认选项编译 LLVM,那么您当前的构建应该没问题。

所有 LLVM 通道都使用 LLVM opt(优化器)工具运行。通行证被编译成共享对象文件,即LLVMHello.so文件输入build/lib然后由opt工具加载。要调试或单步执行,我们必须在开始执行.so文件之前停止 LLVM,因为无法在共享对象文件中放置断点。相反,我们可以在调用 pass之前在代码中放置一个中断。

我们将在其中放置一个断点 llvm/lib/IR/Pass.cpp

这是如何做到的:

  1. 导航到 build/bin 并打开终端并输入gdb opt. 如果您编译 llvm 并添加了调试符号,则 gdb 将需要一些时间来加载调试符号,否则 gdb 会显示loading debugging symbols ... (no debugging symbols found).

  2. 现在我们需要在 中的void Pass::preparePassManager(PMStack &)方法上设置一个断点Pass.cpp。这可能是加载通行证所涉及的第一个(或第一个)方法。您可以通过break llvm::Pass::preparePassManager在终端中输入来完成此操作。

  3. 运行传球。我有一个名为的位码文件trial.bc和相同的LLVMHello.so通行证,所以我运行它

    run -load ~/llvm/build/lib/LLVMHello.so  -hello < ~/llvmexamples/trial.bc > /dev/null
    
    Run Code Online (Sandbox Code Playgroud)

    gdb 现在将停止,Pass::preparePassManager从这里我们可以使用 step 和 next 来跟踪执行。