试图用gdb调试一个LLVM, gdb说没有找到调试符号

Trying to debug an LLVM pass with gdb , gdb says no debugging symbols found ?

本文关键字:gdb 调试 符号 LLVM 一个      更新时间:2023-10-16

我想用gdb调试我的LLVM pass。我用默认的make来构建llvm,所以应该添加调试信息。

当我执行gdb user/bin/opt时,它显示:

从opt中读取符号(没有找到调试符号)…

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

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

这是因为我没有正确构建LLVM吗?

找到了完整的方法:->

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

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

我们将在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 ->运行pass。我有一个位码文件叫trial。bc和相同的LLVMHello。所以我输入

run -load ~/llvm/build/lib/LLVMHello。所以-你好<~/llvmexamples/审判。/dev/null

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