Objective Caml语言只有在特定的要求下才会生成堆栈跟踪 - 对于字节码和本地代码,这些要求是什么?
使用-g选项进行编译,并设置环境变量OCAMLRUNPARAM=b。
由于看起来只能在Unix上获取异常的跟踪信息,因此可以进行分叉并将异常抛出到第二个进程中。这样,主进程就可以继续运行:
export OCAMLRUNPARAM=b
# compile with -g
flush_all(); let r = Unix.fork() in if r == 0 then raise Exit
foo.ml
,则您的_tags
文件将有一行:<foo.ml>: package(bar), debug
在构建字节码/本地文件时,它会插入适当的-g
标志。但是,您仍然需要使用export OCAMLRUNPARAM = b
设置环境变量,如其他答案中所述。
正如其他答案中所指出的,您需要使用调试信息编译项目,并在运行时使用OCAMLRUNPARAM=b
环境变量。
一个方便的方法是让Ocamlbuild编译整个带有调试信息的项目,而不需要编辑_tags
文件,只需指定一个特殊的调试目标。来自manual:
编译适合使用
ocamldebug
进行调试或使用ocamlprof
对本地代码进行分析的代码的首选方式是使用相应的目标扩展名,.d.byte
用于调试或.p.native
。
我在命令行上使用这种技术进行快速编译和运行循环。例如,要运行foo.ml
:
export OCAMLRUNPARAM=b
ocamlbuild -no-links foo.d.byte && _build/foo.d.byte