尝试使用gdb调试LLVM传递,gdb说没有找到调试符号?

时间:2015-08-07 05:40:06

标签: c++ debugging gdb llvm

我想用gdb调试我的LLVM传递。我已经使用默认的make构建了llvm,因此应该添加调试信息。

当我做gdb user / bin / opt时,它说:

从opt中读取符号...(未找到调试符号)...已完成。

这不应该发生,因为根据LLVM文档,&#opt;有很多调试信息'

http://llvm.org/docs/WritingAnLLVMPass.html#debughints

这是因为我还没有正确构建LLVM吗?任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:0)

找出完成此方法的完整方法: - >

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

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

我们要在llvm / lib / IR / Pass.cpp中设置一个断点

以下是如何操作:

步骤1 - >导航到build / bin并打开终端并键入gdb opt。如果您使用添加的调试符号编译llvm,则gdb将花费一些时间来加载调试符号,否则gdb将说加载调试符号...(未找到调试符号)。

步骤2 - >现在,我们需要在Pass.cpp中的void Pass :: preparePassManager(PMStack&)方法中设置一个断点。这可能是加载传递所涉及的第一个(或第一个)方法。 您可以通过在终端中键入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来跟踪执行。