是否有LLVM IR的调试器?

时间:2015-08-13 09:33:16

标签: llvm llvm-ir

我想介绍一下我生成的一些LLVM IR代码。就llc和lli而言,代码在语法和类型上是有效的,但结果不是我所期望的。

这些块很大,以至于我只是简单地读出了这个bug,而且我很难用相同的bug生成一个更小的例子。

我认为我可以使用类似调试器的东西,但是对于LLVM IR。换句话说,我希望能够逐步完成llvm代码,检查"无限"寄存器(给定LLVM IR文件中的名称)和内存位置,设置断点,直到找到我的代码出错的地方。

我查看了llilldb,但似乎都不是我要找的工具。 lli将运行我的代码,但不要让我一步一步走。 lldb似乎假设代码是由C前端生成的。

我对lldblli有误吗?有谁知道一个工具甚至可以达到我想要的50%?

3 个答案:

答案 0 :(得分:7)

我不知道这样的事情(我怀疑它不存在)。虽然我很乐意分享我对llvm生成的代码调试的观点。

  1. 调试生成的代码本身(在gdb中逐步调试)。
  2. 使用debugtrap内在函数(只生成int3或您架构上的任何等价物)。你可以用这个东西做断言,看看哪个失败了。
  3. 提供您的说明名称(因此它们不是%0%1,而是有意义的%names) - 它们在llc输出中显示为注释。
  4. 为您的函数构建CFG(控制流图):opt --dot-cfg 1.ll; dot cfg.funcname.dot -Tpng > 1.png
  5. 不要忘记禁用llvm优化(您可以使用后端-O3优化级别,但IR转换通道可能会使调试更加困难)。
  6. 所以我建议的工作流程如下。建立CFG(4​​.)和汇编(通过llc)。打破gdb中生成的代码并逐步执行它(或让它在你的一个asserions上陷阱)。将您在gdb中停止的点与llc输出相关联,读取注释,与CFG相关联。神交。

    您还可以从生成的代码中构建CFG表示。我知道IDA Pro(一种非常昂贵的构建CFG的方法)和Saga提供此类功能的工具。

    P.S。:这最初是一个评论,但它变得太长了。

答案 1 :(得分:4)

曾经有一个LLVM传递-debug-ir来做到这一点。请参阅this答案。

attempts,包括patch来恢复它。

我需要这样的工具来调试我正在生成的某些代码。因此,我将上面的补丁修改为一个独立的工具,该工具可以将行号信息附加到输入LLVM-IR文件中,并生成输出LLVM-IR,其调试信息引用输入文件。 https://github.com/vaivaswatha/debugir

答案 2 :(得分:1)

我正在寻找同样的事情,我找到了这个:Debugging JIT-ed Code With GDB

1)使用clang编译并发出字节码

clang++ -emit-llvm -D_GNU_SOURCE -D__STDC_LIMIT_MACROS -DDEBUG  -O0  -m64 -fomit-frame-pointer -c a.cpp -g -fno-use-cxa-atexit
clang++ -emit-llvm -D_GNU_SOURCE -D__STDC_LIMIT_MACROS -DDEBUG  -O0  -m64 -fomit-frame-pointer -c b.cpp -g -fno-use-cxa-atexit

2)与llvm-link链接

llvm-link -o all.bc a.bc b.bc

3)使用git和lli进行调试,使用jit

gdb --quiet --args lli -jit-kind=mcjit all.bc


(gdb) b initCloneLookups
Function "initCloneLookups" not defined.
Make breakpoint pending on future shared library load? (y or [n]) y
Breakpoint 1 (initCloneLookups) pending.

(gdb) r
Starting program: lli -jit-kind=mcjit all.bc
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".
......


Breakpoint 1, initCloneLookups () at a.cpp:66
66              clone_lookups = new BitBoard64[61];

回答' y'在设定的断点上。