使用gdb调试llvm传递

时间:2010-02-09 01:17:35

标签: debugging llvm

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

3 个答案:

答案 0 :(得分:6)

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

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

答案 1 :(得分:2)

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

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

我们要在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的bitcode文件和相同的LLVMHello.so通行证,所以我用

    运行它
    run -load ~/llvm/build/lib/LLVMHello.so  -hello < ~/llvmexamples/trial.bc > /dev/null
    

    gdb现在将停在Pass::preparePassManager,从此处我们可以使用step和next来跟踪执行情况。

答案 2 :(得分:0)

按照Richard Penningtons的建议+添加反引号对我有用:

gdb /usr/local/bin/opt

然后输入

run `opt -load=/pathTo/LLVMHello.so  -hello < /pathTo/your.bc > /dev/null`

注意:我会评论,但不能(缺少代表)