我正在寫一個用OCaml編寫的編譯器。有時當執行出現錯誤時,它顯示錯誤行,但它不顯示上下文,例如,如何調用函數,使用哪些值...如何跟蹤OCaml程序的錯誤?
爲了幫助調試,任何人都知道一種方法來顯示執行的步驟,直到錯誤與相關變量的實際價值?
順便說一下,我使用Emacs作爲編輯器。
我正在寫一個用OCaml編寫的編譯器。有時當執行出現錯誤時,它顯示錯誤行,但它不顯示上下文,例如,如何調用函數,使用哪些值...如何跟蹤OCaml程序的錯誤?
爲了幫助調試,任何人都知道一種方法來顯示執行的步驟,直到錯誤與相關變量的實際價值?
順便說一下,我使用Emacs作爲編輯器。
Ocaml已編譯。您似乎習慣於解釋語言,其中運行時系統可以訪問完整的程序源代碼。使用編譯好的程序,運行時系統無法訪問很多信息。例如,變量名稱在編譯時消失,除了正常程序執行所需的內容外,沒有任何內容會跟蹤傳遞給每個函數的參數(這樣做會導致大量開銷)。
如果使用調試符號編譯程序(將-g
選項傳遞給編譯器),如果程序死於未捕獲的異常,則可以獲取堆棧跟蹤。您將獲得函數名稱和一些程序位置,但不包含詳細的內存內容。使用調試信息進行編譯會生成更大的可執行文件,但不會更改運行時性能。運行程序時,需要將OCAMLRUNPARAM
environment variable設置爲包含b
。
ocamlc -g -o foo foo.ml
export OCAMLRUNPARAM=b
./foo
如果您需要更多信息,您需要在調試器中運行您的程序。
此鏈接Debugging in Ocaml 應該回答你的問題。
非常感謝你,這是有效的。你知道默認情況下'OCAMLRUNPARAM'的價值是什麼,這樣我可以不時地將其設置回去嗎? – SoftTimur
@SoftTimur:我不確定這是否是你要求的,但'OCAMLRUNPARAM'的默認值是空的(即沒有特別要求)。 – Gilles
好的......謝謝......我只是在Emacs中創建了另一個關於回溯的線程:[traceback](http://stackoverflow.com/questions/6397571/how-to-realize-error-traceback-in-emacs) – SoftTimur