如何在 OCaml 中获取堆栈跟踪



Objective Caml 语言只有在您要求它们恰到好处的情况下才会生成堆栈跟踪 - 字节码和本机代码的要求是什么?

使用 -g 编译并设置环境变量 OCAMLRUNPARAM=b

某些 Printexc 函数允许您以编程方式执行此操作。

因为看起来你只能在 unix 上获取异常的跟踪,所以你可以在第二个进程中分叉并抛出异常。这样主进程可以继续:

export OCAMLRUNPARAM=b
# compile with -g
flush_all(); let r = Unix.fork() in if r == 0 then raise Exit

如果您使用的是Ocamlbuild而不是直接调用编译器,则可以使用debug标签。从手册:

使用 OCamlbuild,您可以简单地将调试标记添加到程序的目标中,它将确定何时插入 -g 标志。

例如,如果要使用包bar构建文件foo.ml_tags文件将有一行:

<foo.ml>: package(bar), debug

这将在构建字节码/本机文件时插入相应的-g标志。但是,您仍然需要使用其他答案中提到的export OCAMLRUNPARAM=b设置环境变量。

如其他答案中所述,您需要使用调试信息编译项目并使用OCAMLRUNPARAM=b环境变量运行它。

让 Ocamlbuild 使用调试信息编译整个项目但不编辑_tags文件的便捷方法是指定一个特殊的调试目标。从手册:

编译适合使用 ocamldebug 调试或使用 ocamlprof 分析本机代码的代码的首选方法是使用适当的目标扩展,.d.byte用于调试或.p.native

我使用这种技术在命令行上快速编译运行周期。例如,要运行foo.ml

export OCAMLRUNPARAM=b
ocamlbuild -no-links foo.d.byte && _build/foo.d.byte

最新更新