我想介绍一下我生成的一些LLVM IR代码。就llc和lli而言,代码在语法和类型上是有效的,但结果不是我所期望的。
这些块很大,以至于我只是简单地读出了这个bug,而且我很难用相同的bug生成一个更小的例子。
我认为我可以使用类似调试器的东西,但是对于LLVM IR。换句话说,我希望能够逐步完成llvm代码,检查"无限"寄存器(给定LLVM IR文件中的名称)和内存位置,设置断点,直到找到我的代码出错的地方。
我查看了lli
和lldb
,但似乎都不是我要找的工具。 lli
将运行我的代码,但不要让我一步一步走。 lldb
似乎假设代码是由C前端生成的。
我对lldb
和lli
有误吗?有谁知道一个工具甚至可以达到我想要的50%?
答案 0 :(得分:7)
我不知道这样的事情(我怀疑它不存在)。虽然我很乐意分享我对llvm生成的代码调试的观点。
debugtrap
内在函数(只生成int3
或您架构上的任何等价物)。你可以用这个东西做断言,看看哪个失败了。 %0
,%1
,而是有意义的%names
) - 它们在llc
输出中显示为注释。 opt --dot-cfg 1.ll; dot cfg.funcname.dot -Tpng > 1.png
所以我建议的工作流程如下。建立CFG(4.)和汇编(通过llc)。打破gdb中生成的代码并逐步执行它(或让它在你的一个asserions上陷阱)。将您在gdb中停止的点与llc输出相关联,读取注释,与CFG相关联。神交。
您还可以从生成的代码中构建CFG表示。我知道IDA Pro(一种非常昂贵的构建CFG的方法)和Saga提供此类功能的工具。
P.S。:这最初是一个评论,但它变得太长了。
答案 1 :(得分:4)
曾经有一个LLVM传递-debug-ir
来做到这一点。请参阅this答案。
我需要这样的工具来调试我正在生成的某些代码。因此,我将上面的补丁修改为一个独立的工具,该工具可以将行号信息附加到输入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'在设定的断点上。