【问题标题】:When -g should be used to print stack traces in OCaml ?什么时候应该使用 -g 在 OCaml 中打印堆栈跟踪?
【发布时间】:2012-02-23 17:42:15
【问题描述】:

我正在尝试使用 Printexc.get_backtrace 获取堆栈跟踪,但出现错误:

(Program not linked with -g, cannot print stack backtrace)

我是这样编译的:

ocamlfind ocamlc -g -o foo ... $(FOO_OBJS)

FOO_OBJS 只编译: ocamlc -c $OBJ

怎么了?每个.cmo 都应该用-g 编译吗?

如果在没有-g 的情况下编译的对象中发生异常,我会得到部分堆栈跟踪,还是根本没有堆栈跟踪?

【问题讨论】:

    标签: debugging exception compilation functional-programming ocaml


    【解决方案1】:

    怎么了?每个 .cmo 都应该用 -g 编译吗?

    是的,您必须在编译和链接中添加-g 选项。您还可以使用ocamldebug 在启用此选项的情况下单步执行程序。此外,环境变量OCAMLRUNPARAM 必须设置为b

    如果在没有 -g 的情况下编译的对象中发生异常,我会得到一个 部分堆栈跟踪,还是根本没有堆栈跟踪?

    你打赌!我记得有几次我忘记了-g 选项,而回溯只是标准库的。

    【讨论】:

    • 顺便说一下,所有库(cma 和 cmxa)都应该用 -g 编译,否则可怜的用户会得到不完整的堆栈回溯。
    • 你很幸运能得到部分回溯,有时混合使用和不带 -g 的模块会使回溯完全错误 - 请参阅 PR#5074
    • 有一个OCAMLRUNPARAM=b环境变量可以设置,有什么关系?
    • 您可以在调用OUnit.run_test_tt之前在单元测试文件的顶部添加let () = Printexc.record_backtrace = true,而不是指定OCAMLRUNPARAM=b。这样,您编译的测试二进制文件就更加独立了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-09-18
    • 1970-01-01
    • 2018-07-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-26
    相关资源
    最近更新 更多