2011-05-23 86 views
5

我想爲我的MonoTouch代碼實現一個有用的通用異常處理程序。MonoTouch堆棧跟蹤不詳細

如果我將一個處理程序附加到AppDomain.CurrentDomain.UnhandledException,則根本不存在堆棧跟蹤,即.StackTrace屬性爲空或空。

如果我換我UIApplication.Main(args)呼叫try {} catch {},堆棧跟蹤不包含任何有用的信息:

at MonoTouch.UIKit.UIApplication.Main (System.String[] args, System.String principalClassName, System.String delegateClassName) [0x00000] in <filename unknown>:0 
at MonoTouch.UIKit.UIApplication.Main (System.String[] args) [0x00000] in <filename unknown>:0 
at MyNamespace.MyProduct.MyProject.Application.Main (System.String[] args) [0x00000] in <filename unknown>:0 

也就是說,它並不比去,我捕捉到的異常在main()方法的更深。

任何想法如何在堆棧跟蹤中獲得一些更有用的信息,還是全部通過AOT編譯完全優化? (堆棧跟蹤與調試模式中的預期相同。)

回答

1

您將無法獲得行號或文件名在發佈代碼獲得的行號。該信息被刪除。但是,您仍應該能夠將完整的堆棧跟蹤到您的代碼中,以至少可以看到類/調用層次結構。

我猜你必須在事後看看這個,因爲你無法在發佈版本上調試或捕獲運行異常。我傾向於將我的例外記錄到日誌文件中以便稍後檢查。

這個過程開始於下面的代碼:

StackTrace trace = new StackTrace(true); 

    foreach(StackFrame frame in trace.GetFrames()) 
     ... log data to log file 

您也可以使用異常創建堆棧跟蹤的對象了。我會開始在那裏玩。請記住,在許多情況下,如果錯誤發生在事件的iOS部分深處,則無法獲取堆棧跟蹤,因爲Mono未暴露給該數據。發生的只發生在主要方法上的異常或崩潰通常表示較低級別的問題。

3

使用--debug命令行選項或在MonoDevelop中選擇配置「Debug | iPhone」。

請記住,此選項將導致較慢的執行,但你會在異常等

+0

就像問題所說,我知道這在調試模式下工作正常。我想在發佈的代碼中包含這個處理程序 - 但是如果所有的調試信息都被刪除了,那就沒有意義了。問題是 - 在發佈模式代碼中沒有辦法獲取堆棧跟蹤嗎? – tomfanning 2011-05-24 07:46:29