Vb.net WinForms中的内存不足异常

Vb.net WinForms中的内存不足异常,vb.net,winforms,Vb.net,Winforms,我在VisualStudio中创建了一个任务栏应用程序,它在系统托盘中最小化自身,并根据数据库更改向用户显示通知。每当分配给用户的新任务出现时,系统托盘会像气球弹出一样通知用户。但每当应用程序平均运行15小时时,我的应用程序就会突然崩溃并显示内存不足异常。所以我有一些问题,请回答 如何调试此问题?我不能等15个小时再检查这个问题 是否有任何工具可用于检查我的应用程序的内存泄漏,它可以直接指向我的问题 如何为程序生成内存不足异常,以便轻松快速地调试 我应该如何避免代码中的内存泄漏 我的应用程序的图

我在VisualStudio中创建了一个任务栏应用程序,它在系统托盘中最小化自身,并根据数据库更改向用户显示通知。每当分配给用户的新任务出现时,系统托盘会像气球弹出一样通知用户。但每当应用程序平均运行15小时时,我的应用程序就会突然崩溃并显示内存不足异常。所以我有一些问题,请回答

  • 如何调试此问题?我不能等15个小时再检查这个问题
  • 是否有任何工具可用于检查我的应用程序的内存泄漏,它可以直接指向我的问题
  • 如何为程序生成内存不足异常,以便轻松快速地调试
  • 我应该如何避免代码中的内存泄漏

  • 我的应用程序的图像:

    您可以按如下方式检查堆栈跟踪(作为答案发布,以便正确格式化):


    您可以按如下方式检查堆栈跟踪(作为答案发布,以便正确格式化):


    针对您提出的4个问题:

    1:您可以拦截事件以添加一些异常处理代码。请注意,启动事件处理程序的代码存储在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:您可以使用free来检查内存使用情况

    3:如果你想知道你的程序将如何处理它,你可以自己抛出异常


    4:一个有用的资源是。另一个是

    回答您的4个问题:

    1:您可以拦截事件以添加一些异常处理代码。请注意,启动事件处理程序的代码存储在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:您可以使用free来检查内存使用情况

    3:如果你想知道你的程序将如何处理它,你可以自己抛出异常


    4:一个有用的资源是。另一个是

    我假设,当您捕获错误时,您知道该错误发生在哪个代码块中?你可以发布代码,因为可能有一些明显的。你好,马特,谢谢你的回复。。。。但在我添加的每一种方法中,请尝试。。。接住最后在我的代码中阻塞,在执行我的程序后,它不会直接崩溃。。。但崩溃需要一些时间,我之所以写平均崩溃时间是15小时。。。。昨天我启动了我的应用程序,今天我看到了错误…@Rick Jackson:正如Matt逃避的那样,由于您已经捕获到异常,因此确定它来自哪个代码块应该相对容易。在错误消息中显示整个堆栈跟踪。这将准确地告诉您是什么调用触发了异常。另外,将其记录到一个文件中。然后,您甚至可以在停止程序后查看它。@NYSys ok。。。。你能告诉我如何在我的错误消息中显示整个堆栈跟踪,这样我就可以知道是什么调用触发了异常…标准答案:使用内存分析器。我假设当你捕获错误时,你知道这个错误发生在哪个代码块中?你可以发布代码,因为可能有一些明显的。你好,马特,谢谢你的回复。。。。但在我添加的每一种方法中,请尝试。。。接住最后在我的代码中阻塞,在执行我的程序后,它不会直接崩溃。。。但崩溃需要一些时间,我之所以写平均崩溃时间是15小时。。。。昨天我启动了我的应用程序,今天我看到了错误…@Rick Jackson:正如Matt逃避的那样,由于您已经捕获到异常,因此确定它来自哪个代码块应该相对容易。在错误消息中显示整个堆栈跟踪。这将准确地告诉您是什么调用触发了异常。另外,将其记录到一个文件中。然后,您甚至可以在停止程序后查看它。@NYSys ok。。。。你能告诉我如何在我的错误消息中显示整个堆栈跟踪,这样我就可以知道是什么调用触发了异常…标准答案:使用内存分析器。如果你只调用ex.ToString(),它将包含消息和堆栈跟踪,那么会短一点。如果你只调用ex.ToString(),它会短一点这将包括消息和堆栈跟踪。