2011-09-01 130 views
1

我在Visual Studio中創建了一個TaskBar應用程序,它可以在系統托盤中最小化自身,並根據數據庫更改向用戶顯示通知。無論何時分配給用戶的新任務,他都會像系統彈出窗口一樣在系統托盤中進行通知。但是,每當應用程序平均運行15小時,突然我的應用程序崩潰,並顯示內存不足異常。所以我有一些問題請回答。WinForms中的內存不足異常

  1. 我該如何調試此問題?我不能等待15個小時,並檢查這個問題?
  2. 是否有任何工具可用來檢查我的應用程序的內存泄漏,可以直接指向我的問題?
  3. 如何生成內存不足異常,以便我的程序輕鬆快速地進行調試?
  4. 我該怎麼做才能避免我的代碼中發生內存泄漏?

圖片我的應用程序的:enter image description here

+0

我認爲,當你捕捉錯誤,那麼你知道在哪個代碼塊中發生這個錯誤?你可以發佈該代碼,因爲可能有些顯而易見的事情。 –

+0

馬特感謝您的回覆....但在每一個方法我加入嘗試...趕上...終於阻止我的代碼,並執行我的程序後,它不直接崩潰...但它需要一些時間崩潰,我寫平均時間崩潰的原因是15小時....昨天我開始我的應用程序,今天我看到了錯誤.... –

+0

@Rick傑克遜:正如馬特躲避,因爲你已經趕上了例外,確定它來自哪個代碼塊應該相對容易。在錯誤消息中顯示整個堆棧跟蹤。這會告訴你到底是什麼呼叫引發了異常。另外,將其記錄到文件中。然後,即使在停止該程序後,也可以查看它。 – NYSystemsAnalyst

回答

2

您可以檢查堆棧跟蹤如下(發佈作爲回答所以它會正確地格式化):

Try 
    Dim s As String = "1234".Substring(3, 5) 'some code that throws an exception 
Catch ex As Exception 
    MsgBox("Error: " + ex.Message + vbCrLf + vbCrLf + "Stack Trace: " + ex.StackTrace, MsgBoxStyle.Exclamation) 
End Try 
+3

如果你只是調用ex.ToString(),它會包含消息和堆棧跟蹤,這會稍微短一些。 –

7

在回答你的4個問題:

1:您可以攔截My.Application.Startup事件以添加一些異常處理代碼。請注意,Startup事件處理程序的代碼存儲在默認情況下隱藏的ApplicationEvents.vb文件中。下面是一些C#代碼(VB幾乎相同),將設置您的異常處理程序:

// Event handler for handling UI thread exceptions. 
Application.ThreadException += 
    new ThreadExceptionEventHandler(App_UiThreadException); 

// Force all Windows Forms errors to go through our handler. 
// NB In .NET 4, this doesn't apply when the process state is corrupted. 
Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException); 

// Event handler for handling non-UI thread exceptions. 
AppDomain.CurrentDomain.UnhandledException += new 
    UnhandledExceptionEventHandler(App_NonUiThreadException); 

// Run the application. 

2:您可以使用免費的CLR Profiler檢查內存使用情況。

3:如果您想查看程序如何處理它,您可以自己拋出OutOfMemory異常。

4:一個有用的資源是Debug Leaky Apps。另一個是Identify CLR Memory Leaks