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