如何在OCaml中获取堆栈跟踪?

39

Objective Caml语言只有在特定的要求下才会生成堆栈跟踪 - 对于字节码和本地代码,这些要求是什么?

5个回答

46

使用-g选项进行编译,并设置环境变量OCAMLRUNPARAM=b。


1
对于本地代码,我相信这仅适用于OCaml v3.10或更高版本。 - Chris Conway

11

一些Printexc函数可以让你以编程方式实现此操作。


5
具体来说,Printexc.record_backtrace true - Mike Samuel

5

由于看起来只能在Unix上获取异常的跟踪信息,因此可以进行分叉并将异常抛出到第二个进程中。这样,主进程就可以继续运行:

export OCAMLRUNPARAM=b
# compile with -g

flush_all(); let r = Unix.fork() in if r == 0 then raise Exit

3
如果您使用Ocamlbuild而不是直接调用编译器,可以使用“debug”标签。从手册中了解更多信息:
“使用OCamlbuild,您可以将debug标签简单地添加到程序的目标中,它会确定何时插入-g标志。”
例如,如果您正在使用包“bar”构建文件foo.ml,则您的_tags文件将有一行:
<foo.ml>: package(bar), debug

在构建字节码/本地文件时,它会插入适当的-g标志。但是,您仍然需要使用export OCAMLRUNPARAM = b设置环境变量,如其他答案中所述。


0

正如其他答案中所指出的,您需要使用调试信息编译项目,并在运行时使用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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接