10

请让我知道当我的应用程序崩溃并关闭显示包含“不发送”和“发送错误报告”按钮的对话框时我需要执行哪些步骤。

除了查看事件查看器来解决这个问题,我还能做什么?

谢谢

4

6 回答 6

15
  1. 您可以在入口方法的主体周围添加一个try/catch/finally构造。Main()

  2. 对于 WinForms,您可以ThreadException在 Application.Run() 之前添加一个处理程序,以捕获在 WinForms UI 事件处理程序中引发的异常:

    Application.ThreadException +=
       new ThreadExceptionEventHandler(Application_ThreadException);
    
  3. 可以使用以下方法捕获所有其他未处理的异常:

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

    但值得一提的是,这只允许您记录/报告异常 - 一旦退出此最终处理程序,您无法阻止应用程序关闭。

  4. Visual Studio 也可以配置为在第一次机会异常时中断,外部调试器(如带有托管 SoS 扩展的 WinDbg)也可以捕获第一次机会异常(http://www.codeproject.com/KB/debug/windbg_part1.aspx) .

此外,使用 log4net 之类的日志框架向您的应用程序添加有用的日志记录,并在应用程序关闭之前转储异常信息。

于 2009-04-28T14:48:33.200 回答
2

询问您的用户是否可以重现错误以及如何重现。如果可以重现错误,请在 Visual Studio 中调试运行并按照导致崩溃的步骤操作。Visual Studio 将进入调试模式,在该模式下捕获错误。在那里,您将能够跟踪堆栈跟踪并查看导致错误的代码。Visual Studio 在大多数情况下使调试变得非常容易。

于 2009-04-28T14:35:02.500 回答
2

理想情况下,您应该使用诸如nLoglog4net之类的日志库来记录任何未处理的异常以及一般的异常,方法是在它们发生时将它们记录在您的代码中。

它还可以帮助在您的应用程序中设置不同级别的日志记录,以帮助您在开发机器上未运行时跟踪问题。使用 nLog,您可以将日志记录保留在生产代码中,并通过使用日志记录配置文件启用/禁用日志输出。

我没有使用过 log4net,所以我不知道它是否有类似的功能。

于 2009-04-28T14:39:40.197 回答
1

当您在后台线程中有未处理的异常时,往往会发生“发送/不发送”错误(主线程将显示带有堆栈跟踪的继续/退出 .NET 对话框)。

将异常处理程序添加到线程的函数并从那里记录:

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

这是高度简化的,可能不是您想要处理异常的方式。但希望这会让你朝着正确的方向前进。

于 2009-04-28T14:46:08.650 回答
0

使用 WinDBG 调试问题。当抛出异常时,您可以使其中断(如在断点处停止),然后检查堆栈跟踪...范围内的对象等...

于 2009-04-28T14:46:46.760 回答
0

如果它发生在客户站点,并且在开发人员调试器中不容易重现,您可以进行一些事后调试。我喜欢使用Userdump来收集内存转储文件 (.DMP)。然后我使用windbg进行分析。

于 2009-04-28T15:11:07.560 回答