Dot-Net

當 .net 程序由於未擷取的異常而退出時,作業系統級別會發生什麼?

  • November 28, 2011

實際問題:

當程序因未擷取的異常而崩潰時,“在 Windows 中”會發生什麼?

是否有一個我可以掛鉤的 dll 函式來記錄有關崩潰的一些基本資訊?

語境:

我打算編寫一個程序,該程序將收集有關在我的本地 PC 上崩潰的任何應用程序的一些非常基本的資訊。我希望我可以執行一個簡單的方法來記錄有關崩潰的一些資訊,其方式類似於 Visual Studio 生成對話框提供的方式,讓您在程序崩潰時對其進行調試。

託管異常是使用正常 Windows 結構化異常處理機制實現的。異常程式碼為 0xe0434f4d。Windows 會尋找願意處理異常的異常處理程序。如果程式碼在堆棧上沒有活動的 try 塊,或者沒有 catch 塊願意擷取託管異常,則託管程式碼中的最後一個喘息是 AppDomain.UnhandledException 事件。

如果除了異常處理切換到非託管處理之外,這也沒有實現,則使用 SetUnhandledExceptionFilter 設置的異常過濾器會得到一個機會。如果做不到這一點,Windows 總會提供一個預設處理程序。通常呼叫 WER,即 Windows 錯誤報告程序。這為使用者提供了一個將異常詳細資訊發送給 Microsoft 的對話框。不要期望有什麼結果。

當它超越 AppDomain.UnhandledException 時,有關託管異常的所有資訊都將失去。沒有堆棧跟踪,沒有異常消息。只是您已經知道的異常程式碼和一個您將沒有用的異常地址,因為程式碼是由 JIT 編譯器動態生成的。

確保在最後喘息階段擷取異常,為 AppDomain.UnhandledException 編寫事件處理程序。記錄 e.ExcdeptionObject.ToString() 的值並使用 Environment.Exit() 終止程序。還要注意 Windows 窗體程式碼中的 Application.ThreadException 事件和 WPF 程式碼中的 Dispatcher.UnhandledException 事件。它們是在處理 UI 執行緒上的事件時引發的異常的後盾。

引用自:https://stackoverflow.com/questions/2949410