2011-09-01 106 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