請讓我知道我的應用程序崩潰時需要遵循哪些步驟,並關閉顯示包含「不發送」和「發送錯誤報告」按鈕的對話框。如何識別程序崩潰而不顯示錯誤的問題?
除了查看事件查看器來解決此問題之外,我還可以做些什麼?
謝謝
請讓我知道我的應用程序崩潰時需要遵循哪些步驟,並關閉顯示包含「不發送」和「發送錯誤報告」按鈕的對話框。如何識別程序崩潰而不顯示錯誤的問題?
除了查看事件查看器來解決此問題之外,我還可以做些什麼?
謝謝
您可以添加您的Main()
圍繞try/catch/finally
結構進入方法的正文。
有關的WinForms,你可以添加一個ThreadException
處理程序,就在Application.Run(),趕上拋出的WinForms UI事件處理程序異常:
Application.ThreadException +=
new ThreadExceptionEventHandler(Application_ThreadException);
所有其他未處理的異常,可以用被捕獲:
AppDomain.CurrentDomain.UnhandledException +=
new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);
但它是值得一提的是,這只是讓你日誌/報告的例外 - 你不能阻止應用程序,一旦你退出這個最後的處理程序關閉。
Visual Studio也可以配置爲break on first chance exceptions,並且外部調試器(如帶有託管SoS擴展的WinDbg)也可以捕獲第一次機會異常(http://www.codeproject.com/KB/debug/windbg_part1.aspx)。
另外,使用log4net之類的日誌框架爲應用程序添加有用的日誌記錄,並在應用程序關閉前轉儲異常信息。
問問你的用戶他們是否可以重現錯誤和如何。如果您可以重現該錯誤,請在Visual Studio中運行調試,然後按照以下步驟導致崩潰。 Visual Studio將進入調試模式,以捕獲錯誤。在那裏你將能夠跟蹤堆棧跟蹤並查看導致錯誤的代碼。 Visual Studio在大多數情況下都可以非常容易地進行調試。
當後臺線程中出現未處理的異常(主線程將顯示帶有堆棧跟蹤的繼續/退出.NET對話框)時,「發送/不發送」錯誤往往會發生。
添加一個異常處理程序到你的線程的功能,並從那裏登陸:
void RunMyThread()
{
try
{
// background thread code
}
catch (Exception ex)
{
// Log the exception
}
}
這是高度簡化,並且可能不是你想怎麼處理異常。但希望這會讓你朝着正確的方向前進。
使用WinDBG來調試該問題。你可以把它打破(如停止在斷點處)時,拋出一個異常,然後檢查堆棧跟蹤...範圍等物品......
如果發生在客戶站點,並且在開發人員調試器中不容易再現,您可以進行一些事後調試。我喜歡使用Userdump來收集內存轉儲文件(.DMP)。然後我使用windbg進行分析。
這基本上只是問:「我能做些什麼來阻止我的程序崩潰?」。答案就是「修復它!」。至於如何,請查看崩潰日誌並使用您的調試器。 – 2009-04-28 14:30:41