Debugging 何时应使用-g在OCaml中打印堆栈跟踪?

Debugging 何时应使用-g在OCaml中打印堆栈跟踪?,debugging,exception,compilation,functional-programming,ocaml,Debugging,Exception,Compilation,Functional Programming,Ocaml,我正在尝试使用Printexc.get_backtrace获取堆栈跟踪,但出现错误: (程序未与-g链接,无法打印堆栈回溯) 我是这样编译的: ocamlc查找ocamlc-g-o foo$(FOO_OBJS) FOO_OBJS仅使用以下内容编译: ocamlc-c$OBJ 怎么了?是否应使用-g编译每个.cmo 如果在未编译-g的对象中发生异常,我将获得部分堆栈跟踪,还是根本没有堆栈跟踪 怎么了?是否应该使用-g编译每个.cmo 是的,您必须将-g选项添加到编译和链接中。您还可以使用ocaml

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

(程序未与-g链接,无法打印堆栈回溯)

我是这样编译的:

ocamlc查找ocamlc-g-o foo$(FOO_OBJS)

FOO_OBJS仅使用以下内容编译:
ocamlc-c$OBJ

怎么了?是否应使用
-g
编译每个
.cmo

如果在未编译
-g
的对象中发生异常,我将获得部分堆栈跟踪,还是根本没有堆栈跟踪

怎么了?是否应该使用-g编译每个.cmo

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

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


当然!我记得有几次我忘记了
-g
选项,回溯只是标准库的回溯。

顺便说一下,所有库(cma和cmxa)都应该使用-g编译,否则可怜的用户会得到不完整的堆栈回溯。你很幸运得到了部分回溯,有时混合使用带-g和不带-g的模块会使回溯完全错误-请参见PR#5074有一个
OCAMLRUNPARAM=b
环境变量可以设置,它与环境变量有什么关系?您可以只添加
let()=Printexc.record\u backtrace=true
在调用
OUnit.run\u test\u tt
之前的单元测试文件顶部。这样,编译后的测试二进制文件更加独立。