gpt4 book ai didi

c++ - 尝试使用 gdb 调试 LLVM pass,gdb 说找不到调试符号?

转载 作者:太空宇宙 更新时间:2023-11-04 13:30:03 27 4
gpt4 key购买 nike

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

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

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

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

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

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

最佳答案

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

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

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

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

方法如下:

第 1 步 -> 导航至 build/bin 并打开终端并键入 gdb opt 。如果你编译 llvm 时添加了调试符号,那么 gdb 将需要一些时间来加载调试符号,否则 gdb 会说正在加载调试符号......(没有找到调试符号)。

Step 2 -> 现在,我们需要在 Pass.cpp 中的 void Pass::preparePassManager(PMStack &) 方法处设置一个断点。这可能是涉及加载通行证的第一个(或第一个)方法。您可以通过在终端中键入 break llvm::Pass::preparePassManager 来完成此操作。

第 3 步 -> 运行通行证。我有一个名为 trial.bc 的位码文件和相同的 LLVMHello.so pass 所以我用

运行它

运行 -load ~/llvm/build/lib/LLVMHello.so -hello < ~/llvmexamples/trial.bc >/dev/null

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

关于c++ - 尝试使用 gdb 调试 LLVM pass,gdb 说找不到调试符号?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31870471/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com