2011-06-18 69 views
3

我正在寫一個用OCaml編寫的編譯器。有時當執行出現錯誤時,它顯示錯誤行,但它不顯示上下文,例如,如何調用函數,使用哪些值...如何跟蹤OCaml程序的錯誤?

爲了幫助調試,任何人都知道一種方法來顯示執行的步驟,直到錯誤與相關變量的實際價值?

順便說一下,我使用Emacs作爲編輯器。

回答

7

Ocaml已編譯。您似乎習慣於解釋語言,其中運行時系統可以訪問完整的程序源代碼。使用編譯好的程序,運行時系統無法訪問很多信息。例如,變量名稱在編譯時消失,除了正常程序執行所需的內容外,沒有任何內容會跟蹤傳遞給每個函數的參數(這樣做會導致大量開銷)。

如果使用調試符號編譯程序(將-g選項傳遞給編譯器),如果程序死於未捕獲的異常,則可以獲取堆棧跟蹤。您將獲得函數名稱和一些程序位置,但不包含詳細的內存內容。使用調試信息進行編譯會生成更大的可執行文件,但不會更改運行時性能。運行程序時,需要將OCAMLRUNPARAM environment variable設置爲包含b

ocamlc -g -o foo foo.ml 
export OCAMLRUNPARAM=b 
./foo 

如果您需要更多信息,您需要在調試器中運行您的程序。

+0

非常感謝你,這是有效的。你知道默認情況下'OCAMLRUNPARAM'的價值是什麼,這樣我可以不時地將其設置回去嗎? – SoftTimur

+0

@SoftTimur:我不確定這是否是你要求的,但'OCAMLRUNPARAM'的默認值是空的(即沒有特別要求)。 – Gilles

+0

好的......謝謝......我只是在Emacs中創建了另一個關於回溯的線程:[traceback](http://stackoverflow.com/questions/6397571/how-to-realize-error-traceback-in-emacs) – SoftTimur