代码之家  ›  专栏  ›  技术社区  ›  Greg Nisbet

配置ocamlot以便gdb可以获取源位置信息

  •  0
  • Greg Nisbet  · 技术社区  · 6 年前

    本机OCAML编译器公开控制是否发出调试信息的选项。例如 -g 控制是否记录重建异常回溯所需的信息。是否有发出调试信息的选项 gdb 是否要将断点与源信息(如文件名和行号)相关联?

    我认为OCAML目前不是一种完全支持的语言 GDB 而且不可能对值进行美化或评估OCAML表达式。没关系,我只是想知道如何配置 ocamlopt 编译器或 GDB 以这样的方式 GDB 找不到源文件。理想情况下,我希望能够看到OCAML源文件和实现OCAML运行时的C源文件(即,当手工而不是通过OPAM构建编译器时)。

    例如,

    (* hello.ml *)
    
    let main () =
      Printf.printf "hi there\n%!";;
    
    let () = main ()
    

    编译使用 corebuild hello.native ,生成指向可执行文件的符号链接, hello.native .

    然后,开始时 GDB :

    (gdb) file hello.native
    Reading symbols from hello.native...done.
    (gdb) start
    Temporary breakpoint 1 at 0x405580: file main.c, line 32.
    Starting program: /home/g/ws/tmp/ocaml/hello/hello.native 
    [Thread debugging using libthread_db enabled]
    Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".
    
    Temporary breakpoint 1, main (argc=0x1, argv=0x7fffffffdaf8) at main.c:32 
    32  main.c: No such file or directory.
    

    我们可以看到它无法确定文件在哪里。

    当你击中 C-x a 和开关 GDB 到TUI模式,然后消息 [ No Source Available ] 在顶部窗格中可见。

    1 回复  |  直到 6 年前
        1
  •  1
  •   ivg    6 年前

    使用 dir 指令输入 gdb 指向OCAML运行时源代码所在的位置,例如,

    (gdb) dir ~/warehouse/ocaml/byterun/
    Source directories searched: /home/ivg/warehouse/ocaml/byterun:$cdir:$cwd
    (gdb) l
    27      #endif
    28
    29      CAMLextern void caml_main (char_os **);
    30
    31      #ifdef _WIN32
    32      CAMLextern void caml_expand_command_line (int *, wchar_t ***);
    33
    34      int wmain(int argc, wchar_t **argv)
    35      #else
    36      int main(int argc, char **argv)
    

    再多一点小贴士。您可以将程序与调试运行时链接,例如,

    ocamlopt -runtime-variant x -g hello.ml -o hello
    

    但它不会嵌入源代码。

    此外,ocaml对gdb有很好的支持,您可以单步执行、回溯甚至观察源代码。唯一的问题是,名称通常会出错,因此很难设置断点。但是,您可以使用 objdump 对文件进行反向工程。如果它是用 -g 选项:

    $ objdump -S hello | grep hello.ml -A 10
    (* hello.ml *)
    
    let main () =
      404a70:       48 8d 1d 81 a6 24 00    lea    0x24a681(%rip),%rbx        # 64f0f8 <camlHello__5>
      404a77:       48 8d 05 da b3 24 00    lea    0x24b3da(%rip),%rax        # 64fe58 <camlPervasives>
      Printf.printf "hi there\n%!";;
      404a7e:       48 8b 80 d0 00 00 00    mov    0xd0(%rax),%rax
      404a85:       e9 66 ae 01 00          jmpq   41f8f0 <camlPrintf__fprintf_1294>
      404a8a:       66 0f 1f 44 00 00       nopw   0x0(%rax,%rax,1)
    
    0000000000404a90 <camlHello__entry>: