WinForms中的内存异常

时间:2011-09-01 12:25:08

标签: vb.net winforms

我在Visual Studio中创建了一个TaskBar应用程序,它在系统托盘内最小化,并根据数据库更改向用户显示通知。每当分配给用户的新任务时,他将在系统托盘上通知,如气球弹出窗口。但是,每当应用程序平均运行15个小时时,我的应用程序崩溃并显示内存不足异常。所以我有一些问题请回答。

  1. 我该如何调试此问题?我不能等待15个小时并检查这个问题吗?
  2. 是否有可用的工具来检查我的应用程序的内存泄漏,这可以直接指向我的问题?
  3. 如何为程序生成内存不足异常,以便轻松快速地进行调试?
  4. 我应该怎么做以避免代码中的内存泄漏?
  5. 我的申请图片:enter image description here

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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