【问题标题】:Debugging an llvm pass with gdb使用 gdb 调试 llvm pass
【发布时间】:2010-02-09 01:17:35
【问题描述】:

是否可以使用 gdb 调试 llvm 通道?我在 llvm 网站上找不到任何文档。

【问题讨论】:

    标签: debugging llvm


    【解决方案1】:

    是的。以非发布模式(默认)构建 LLVM。它比发布版本需要更长的时间,但您可以使用 gdb 来调试生成的目标文件。

    注意一点:我必须将我的 Linux 机器升级到 3GB 内存,以使 LLVM 调试模式链接时间合理。

    【讨论】:

    • 但是我可以调试 llvm pass 吗? LLVM 通行证通常使用 opt 运行,所以我不知道如何使用 gdb 运行它。你能告诉我命令吗?
    • 你可以运行例如“gdb /usr/local/bin/opt”并输入“运行”。
    【解决方案2】:

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

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

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

    这是怎么做的:

    1. 导航到 build/bin 并打开终端并输入 gdb opt。如果你在编译 llvm 时添加了调试符号,那么 gdb 将需要一些时间来加载调试符号,否则 gdb 会显示 loading debugging symbols ... (no debugging symbols found)

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

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

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

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

    【讨论】:

    • 嗨,我想我在构建 LLVM 时没有添加调试符号。我还可以使用 gdb 进行调试吗?这对调试有什么限制吗?
    • 应该没有问题。
    【解决方案3】:

    遵循 Richard Penningtons 的建议 + 添加反引号对我有用:

    gdb /usr/local/bin/opt
    

    然后输入

    run `opt -load=/pathTo/LLVMHello.so  -hello < /pathTo/your.bc > /dev/null`
    

    注意:我会发表评论,但不能(缺少代表)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-09
      • 2017-03-17
      相关资源
      最近更新 更多