2014-04-21 45 views
7

假設我維護連接到外部系統的複雜應用程序。有一天,它開始返回某些輸入的意外結果,我需要找出原因。這可能是DNS問題,filesytem相關問題,外部系統更改,任何事情。haskell中的代碼工具

假設處理量很大,在我可以確定問題的可能位置之前,我需要獲取原始應用程序不會生成的詳細跟蹤信息。

如何對現有代碼進行測試,以便我可以(例如)提供非易失性證明(而非實時調試會話)某個組件或函數有錯誤。

+2

我不完全關注你,但[ekg](http://hackage.haskell.org/package/ekg)是一款非常棒的工具,可以在'IO'中設置任意的計數器和值。 – jberryman

+0

@jberryman這樣的聲音會是一個很好的答案。 –

回答

1

這聽起來更像是一個架構/最佳實踐類型的問題,而不是Haskell特有的問題,除非我誤解了某些東西。

這聽起來像您的應用程序需要使用日誌記錄系統,如hslogger。一般的方法是讓代碼的每個組件都創建具有附加優先級的日誌消息。然後,您可以讓應用程序以不同的方式處理不同的優先級,例如,可以在控制檯上顯示嚴重錯誤,而調試和信息級錯誤則轉到日誌文件。

使用Debug.Trace.traceEventDebug.Trace.traceEventIO代替日誌記錄系統有時會很有用,特別是如果您懷疑併發問題,因爲ghc事件日誌還會記錄有關線程產生/切換和垃圾回收的信息。但總的來說,它不是實際日誌框架的替代品。

此外,您可能希望利用assert作爲完整性檢查,確保「不可能」條件確實不會發生。