【问题标题】:Trying to debug an LLVM pass with gdb , gdb says no debugging symbols found ?尝试使用 gdb 调试 LLVM 通行证,gdb 说没有找到调试符号?
【发布时间】:2015-08-07 05:40:05
【问题描述】:

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

当我执行 gdb user/bin/opt 时,它会说:

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

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

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

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

【问题讨论】:

  • 它有调试信息,如“你可以让它在通过之前和之后输出 LLVM-IR”,以及其他各种类似的东西。如果您构建 LLVM 的调试版本,您还可以在 llvm 代码中进行调试。而且,您可能对您的 pass 最感兴趣,希望通过调试符号编译它。使用-DCMAKE_BUILD_TYPE=Debug 构建带有调试符号的llvm。

标签: c++ debugging gdb llvm


【解决方案1】:

想出了完整的方法:->

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

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

我们将在 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.so 通过,所以我用

运行它

运行 -load ~/llvm/build/lib/LLVMHello.so -hello /dev/null

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多