程序崩溃时如何识别问题而不显示错误?

时间:2009-04-28 14:24:28

标签: c# debugging crash-dumps

请告诉我当我的应用程序崩溃并关闭时需要遵循的步骤,显示包含“请勿发送”和“发送错误报告”按钮的对话框。

除了查看事件查看器以解决此问题,我还能做些什么呢?

由于

6 个答案:

答案 0 :(得分:13)

  1. 您可以在try/catch/finally条目方法的正文周围添加Main()构造。

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

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

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

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

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

    < / LI>

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

答案 1 :(得分:2)

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

答案 2 :(得分:2)

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

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

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

答案 3 :(得分:1)

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

为你的线程的函数添加一个异常处理程序并从那里记录:

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

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

答案 4 :(得分:0)

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

答案 5 :(得分:0)

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