我想用gdb调试我的LLVM传递。我已经使用默认的make构建了llvm,因此应该添加调试信息。
当我做gdb user / bin / opt时,它说:
从opt中读取符号...(未找到调试符号)...已完成。
这不应该发生,因为根据LLVM文档,&#opt;有很多调试信息'
http://llvm.org/docs/WritingAnLLVMPass.html#debughints
这是因为我还没有正确构建LLVM吗?任何帮助将不胜感激。
答案 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来跟踪执行。