8

我试图得到一个堆栈跟踪与Printexc.get_backtrace,但我得到一个错误:当-g应该用于在OCaml中打印堆栈轨迹?

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

我编译如下:

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

FOO_OBJS与编译只是: ocamlc -c $OBJ

怎么了?是否每.cmo编译与-g

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

回答

9

What's wrong? Should every .cmo be compiled with -g?

是的,您必须将-g选项添加到编译和链接。您也可以使用ocamldebug来启用该选项。此外,环境变量OCAMLRUNPARAM必须设置为b

If exception occurs in an object compiled without -g will I get a partial stacktrace, or no stacktrace at all?

你打赌!我记得有几次,我忘记了-g选项,并且后退仅仅是标准库。

+4

顺便说一句,所有库(cma和cmxa)都应该用-g编译,否则穷用户会得到不完整的堆栈回溯。 – 2012-02-23 18:41:58

+0

你很幸运能够获得部分回溯,有时混合使用和不使用-g的模块会使回溯完全错误 - 请参阅PR#5074 – ygrek 2012-02-24 08:56:16

+1

有一个可以设置的“OCAMLRUNPARAM = b”环境变量,这与如何相关? – Ptival 2012-02-24 11:56:44