【发布时间】:2010-02-09 01:17:35
【问题描述】:
是否可以使用 gdb 调试 llvm 通道?我在 llvm 网站上找不到任何文档。
【问题讨论】:
是否可以使用 gdb 调试 llvm 通道?我在 llvm 网站上找不到任何文档。
【问题讨论】:
是的。以非发布模式(默认)构建 LLVM。它比发布版本需要更长的时间,但您可以使用 gdb 来调试生成的目标文件。
注意一点:我必须将我的 Linux 机器升级到 3GB 内存,以使 LLVM 调试模式链接时间合理。
【讨论】:
首先确保在编译 LLVM 时启用了调试选项,这基本上是默认设置。如果您没有使用非默认选项编译 LLVM,那么您当前的构建应该没问题。
所有 LLVM 通道都使用 LLVM 的 opt(优化器)工具运行。通行证被编译成共享对象文件,即build/lib 中的LLVMHello.so 文件,然后由opt 工具加载。要调试或单步执行 pass,我们必须在 LLVM 开始执行 .so 文件之前停止它,因为无法在共享对象文件中放置断点。取而代之的是,我们可以在代码中在它调用 pass 之前放置一个中断。
我们将在llvm/lib/IR/Pass.cpp 中放置一个断点
这是怎么做的:
导航到 build/bin 并打开终端并输入 gdb opt。如果你在编译 llvm 时添加了调试符号,那么 gdb 将需要一些时间来加载调试符号,否则 gdb 会显示 loading debugging symbols ... (no debugging symbols found)。
现在我们需要在Pass.cpp 中的void Pass::preparePassManager(PMStack &) 方法处设置一个断点。这可能是加载通行证所涉及的第一个(或第一个)方法。
您可以通过在终端中键入 break llvm::Pass::preparePassManager 来执行此操作。
运行通行证。我有一个名为trial.bc 的位码文件和相同的LLVMHello.so pass 所以我用
run -load ~/llvm/build/lib/LLVMHello.so -hello < ~/llvmexamples/trial.bc > /dev/null
gdb 现在将停在Pass::preparePassManager,从这里我们可以使用 step 和 next 来跟踪执行。
【讨论】:
遵循 Richard Penningtons 的建议 + 添加反引号对我有用:
gdb /usr/local/bin/opt
然后输入
run `opt -load=/pathTo/LLVMHello.so -hello < /pathTo/your.bc > /dev/null`
注意:我会发表评论,但不能(缺少代表)
【讨论】: