我试图找到一种方法,使用LLVM的OCaml接口从bitcode文件中获取调试信息。
我使用clang
和参数-O0 -g
来获取输出bitcode文件中的调试信息。编译命令类似于:clang -c -emit-llvm -O0 -g hello.c
而且,这是我从函数获取调试信息的函数:
let visit_instruction inst =
let llctx = Llvm.global_context () in
let md_dbg = Llvm.metadata inst (Llvm.mdkind_id llctx "dbg") in
match md_dbg with
| None -> ()
| Some dbg ->
print_endline("dbg: " ^ (Llvm.string_of_llvalue dbg));
let num_oprs = Llvm.num_operands dbg in
print_endline("dbg num operands: " ^ (string_of_int num_oprs));
let opr0 = Llvm.operand dbg 0 in
print_endline("dbg oprand 0: " ^ (Llvm.string_of_llvalue opr0));
()
以下是print_endline("dbg: " ^ (Llvm.string_of_llvalue dbg));
dbg:< 0x14c29d8> =!DILocation(第10行,第9列,范围:< 0x14bf3f0>)
这是最后两个打印语句打印的输出。此输出对应于scope: <0x14bf3f0>
的操作数DILocation
。
dbg num操作数:1
dbg oprand 0:&lt; 0x14bf3f0&gt; = distinct!DISubprogram(名称:&#34; main&#34;,范围: &lt; 0x14ba398&gt ;, file:&lt; 0x14ba398&gt;,line:5,type:&lt; 0x14bf160&gt;,isLocal:false,isDefinition:true,scopeLine:5,flags:DIFlagPrototyped,isOptimized:false,unit:&lt; 0x14bf478&gt;,变量:&lt; 0x14ba8b0&gt;)
由于打印的操作数数量为1
,因此无法访问line
的前两个参数(column
和!DILocation(line: 10, column: 9, scope: <0x14bf3f0>)
)。
使用LLVM的OCaml绑定,是否有编程方法从调试信息中获取行和列?我已经在这个问题上工作了几天但却无法弄清楚如何去做。