如何使用LLVM的OCaml接口获取调试信息(行号和列)?

时间:2018-04-21 09:41:53

标签: debugging location ocaml llvm

我试图找到一种方法,使用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绑定,是否有编程方法从调试信息中获取行和列?我已经在这个问题上工作了几天但却无法弄清楚如何去做。

0 个答案:

没有答案