2009-04-28 30 views
7

請讓我知道我的應用程序崩潰時需要遵循哪些步驟,並關閉顯示包含「不發送」和「發送錯誤報告」按鈕的對話框。如何識別程序崩潰而不顯示錯誤的問題?

除了查看事件查看器來解決此問題之外,我還可以做些什麼?

謝謝

+0

這基本上只是問:「我能做些什麼來阻止我的程序崩潰?」。答案就是「修復它!」。至於如何,請查看崩潰日誌並使用您的調試器。 – 2009-04-28 14:30:41

回答

11
  1. 您可以添加您的Main()圍繞try/catch/finally結構進入方法的正文。

  2. 有關的WinForms,你可以添加一個ThreadException處理程序,就在Application.Run(),趕上拋出的WinForms UI事件處理程序異常:

    Application.ThreadException += 
        new ThreadExceptionEventHandler(Application_ThreadException); 
    
  3. 所有其他未處理的異常,可以用被捕獲:

    AppDomain.CurrentDomain.UnhandledException += 
        new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException); 
    

    但它是值得一提的是,這只是讓你日誌/報告的例外 - 你不能阻止應用程序,一旦你退出這個最後的處理程序關閉。

  4. Visual Studio也可以配置爲break on first chance exceptions,並且外部調試器(如帶有託管SoS擴展的WinDbg)也可以捕獲第一次機會異常(http://www.codeproject.com/KB/debug/windbg_part1.aspx)。

另外,使用log4net之類的日誌框架爲應用程序添加有用的日誌記錄,並在應用程序關閉前轉儲異常信息。

2

問問你的用戶他們是否可以重現錯誤和如何。如果您可以重現該錯誤,請在Visual Studio中運行調試,然後按照以下步驟導致崩潰。 Visual Studio將進入調試模式,以捕獲錯誤。在那裏你將能夠跟蹤堆棧跟蹤並查看導致錯誤的代碼。 Visual Studio在大多數情況下都可以非常容易地進行調試。

2

理想情況下,您應該使用日誌庫(例如nLoglog4net)記錄任何未處理的異常以及一般情況下的異常,方法是在發生代碼時將它們記錄在代碼中。

它還可以幫助您在應用程序中具有不同級別的日誌記錄,以幫助您在開發計算機上未運行時追蹤問題。使用nLog,您可以將日誌記錄保留在生產代碼中,並通過使用日誌配置文件啓用/禁用日誌輸出。

我還沒有使用log4net,所以我不知道它是否有類似的功能。

+0

Log4Net提供相同的功能 - 通常日誌記錄粒度至少是級別級別,然後您可以決定僅爲該類使用調試日誌。日誌級別也可以在應用程序運行時更改。 – weismat 2009-04-28 15:37:37

1

當後臺線程中出現未處理的異常(主線程將顯示帶有堆棧跟蹤的繼續/退出.NET對話框)時,「發送/不發送」錯誤往往會發生。

添加一個異常處理程序到你的線程的功能,並從那裏登陸:

void RunMyThread() 
{ 
    try 
    { 
     // background thread code 
    } 
    catch (Exception ex) 
    { 
     // Log the exception 
    } 
} 

這是高度簡化,並且可能不是你想怎麼處理異常。但希望這會讓你朝着正確的方向前進。

0

使用WinDBG來調試該問題。你可以把它打破(如停止在斷點處)時,拋出一個異常,然後檢查堆棧跟蹤...範圍等物品......

0

如果發生在客戶站點,並且在開發人員調試器中不容易再現,您可以進行一些事後調試。我喜歡使用Userdump來收集內存轉儲文件(.DMP)。然後我使用windbg進行分析。

相關問題