尝试使用 gdb 调试 LLVM pass,gdb 说找不到调试符号?
Trying to debug an LLVM pass with gdb , gdb says no debugging symbols found ?
我想用 gdb 调试我的 LLVM pass。我已经使用默认 make 构建了 llvm,因此应该添加调试信息。
当我执行 gdb user/bin/opt 时,它说:
正在从 opt 读取符号...(未找到调试符号)...完成。
这不应该发生,因为根据 LLVM 文档,'opt has a lot of debugging info'
http://llvm.org/docs/WritingAnLLVMPass.html#debughints
这是因为我没有正确构建 LLVM 吗?任何帮助将不胜感激。
找出完成此操作的完整方法:->
首先确保 LLVM 是使用调试选项编译的,这基本上是默认设置。如果您没有使用非默认选项编译 LLVM,那么您当前的构建应该没问题。
所有 LLVM 传递都是 运行 使用 LLVM 的 opt(优化器)工具。通行证被编译成共享对象文件,即 build/lib 中的 LLVMHello.so 文件,然后由 opt 工具加载。要调试或单步执行传递,我们必须在 LLVM 开始执行 .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 的位码文件和相同的 LLVMHello.so 传递所以我 运行 它与
运行 -load ~/llvm/build/lib/LLVMHello.so -hello < ~/llvmexamples/trial.bc > /dev/null
gdb 现在将在 Pass::preparePassManager 停止,从这里我们可以使用 step 和 next 来跟踪执行。
我想用 gdb 调试我的 LLVM pass。我已经使用默认 make 构建了 llvm,因此应该添加调试信息。
当我执行 gdb user/bin/opt 时,它说:
正在从 opt 读取符号...(未找到调试符号)...完成。
这不应该发生,因为根据 LLVM 文档,'opt has a lot of debugging info'
http://llvm.org/docs/WritingAnLLVMPass.html#debughints
这是因为我没有正确构建 LLVM 吗?任何帮助将不胜感激。
找出完成此操作的完整方法:->
首先确保 LLVM 是使用调试选项编译的,这基本上是默认设置。如果您没有使用非默认选项编译 LLVM,那么您当前的构建应该没问题。
所有 LLVM 传递都是 运行 使用 LLVM 的 opt(优化器)工具。通行证被编译成共享对象文件,即 build/lib 中的 LLVMHello.so 文件,然后由 opt 工具加载。要调试或单步执行传递,我们必须在 LLVM 开始执行 .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 的位码文件和相同的 LLVMHello.so 传递所以我 运行 它与
运行 -load ~/llvm/build/lib/LLVMHello.so -hello < ~/llvmexamples/trial.bc > /dev/null
gdb 现在将在 Pass::preparePassManager 停止,从这里我们可以使用 step 和 next 来跟踪执行。