我可以让OCaml在未捕获异常上生成堆栈跟踪吗?

我可以让OCaml在未捕获异常上生成堆栈跟踪吗?,ocaml,Ocaml,在Java中,当一个异常从main()函数中转义时,一个stacktrace会打印到控制台。你能让OCaml程序做同样的事情吗?是的,用-g编译并设置OCAMLRUNPARM=b $ cat exc.ml let f () : int = raise End_of_file let g () = f () + 44 let _ = g() $ ocamlc -g -o exc exc.ml $ OCAMLRUNPARAM=b exc Fatal error: exceptio

在Java中,当一个异常从main()函数中转义时,一个stacktrace会打印到控制台。你能让OCaml程序做同样的事情吗?

是的,用-g编译并设置
OCAMLRUNPARM=b

$ cat exc.ml
let f () : int =
    raise End_of_file

let g () =
    f () + 44

let _ = g()
$ ocamlc -g -o exc exc.ml
$ OCAMLRUNPARAM=b exc
Fatal error: exception End_of_file
Raised at file "exc.ml", line 2, characters 10-21
Called from file "exc.ml", line 5, characters 4-8
Called from file "exc.ml", line 7, characters 8-11
感谢Daniel Bünzli指出,如果编译为本机代码,行为可能会有所不同。以下是我在系统(Mac OS X 10.9.1、OCaml 4.01.0)上看到的内容:

如果关闭内联,事情似乎运行得很好(至少对于这个非常简单的示例):


应该补充的是,如果编译为字节码,stacktraces往往更精确。您还可以使用
Printexc.record\u backtrace true
来避免设置shell环境变量的麻烦,例如一行
if!调试然后Printexc.record_backtrace true某处;和
ocamlbuild X.d.byte
ocamlbuild的目标,只是为了确保。@lukstafi,这非常有用,尤其是在使用
ocamlbuild
构建项目时。
$ ocamlopt -g -o exc exc.ml
$ OCAMLRUNPARAM=b exc
Fatal error: exception End_of_file
Raised by primitive operation at file "exc.ml", line 5, characters 4-8
Called from file "exc.ml", line 7, characters 8-11
$ ocamlopt -inline 0 -g -o exc exc.ml
$ OCAMLRUNPARAM=b exc
Fatal error: exception End_of_file
Raised at file "exc.ml", line 2, characters 10-21
Called from file "exc.ml", line 5, characters 4-8
Called from file "exc.ml", line 7, characters 8-11