10

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

4

3 回答 3

8

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

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

于 2010-02-09T13:20:00.447 回答
6

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

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

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

于 2015-08-10T18:42:30.820 回答
1

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

gdb /usr/local/bin/opt

然后输入

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

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

于 2015-01-13T06:43:10.160 回答