代码之家  ›  专栏  ›  技术社区  ›  Daniel MoÅ¡mondor

Uncatchable.NET Runtime 2.0错误-用户机器-下一步怎么办?

  •  3
  • Daniel MoÅ¡mondor  · 技术社区  · 14 年前

    情况:

    我有一个广泛使用HTTP连接的应用程序(流翻录应用程序),它应该24/7工作。确实如此。

    但是,有时它会因运行时错误而崩溃,而运行时错误在任何位置都未被捕获,并将以下内容转储到事件日志中:

    Event Type: Error
    Event Source:   .NET Runtime 2.0 Error Reporting
    Event Category: None
    Event ID:   5000
    Date:       13.10.2010
    Time:       11:02:30
    User:       N/A
    Computer:   STREAM01
    Description:
    EventType clr20r3, P1 streamsink.exe, P2 1.0.0.42484, P3 4c880fd9, P4 mscorlib, P5 2.0.0.0, P6 4add54dc, P7 344a, P8 21c, P9 system.io.ioexception, P10 NIL.
    

    我的问题是:如何知道是哪行代码导致了崩溃。我正在用二进制文件部署.pdb,但是…怎么办?

    目标是Windows XP,框架是2.0

    编辑:

    我已经实施了:

        static public void InitializeExceptionHandler(string AppName) {
            Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException);
            Application.ThreadException += new System.Threading.ThreadExceptionEventHandler(Application_ThreadException);
            AppDomain currentDomain = AppDomain.CurrentDomain;
            currentDomain.UnhandledException+=new UnhandledExceptionEventHandler(currentDomain_UnhandledException);
            _appName=AppName;
        }
    

    不,不行!

    4 回复  |  直到 14 年前
        1
  •  3
  •   Nick Martyshchenko    14 年前

    也许这篇文章会有帮助 A Simple Class to Catch Unhandled Exceptions in WinForms

    更新:

    很奇怪……所以抓住 ProcDump ,编写批处理文件,并要求客户在看到错误消息时运行它。去垃圾场,试着通过 WinDbg 或VS 2010。 Here 更多信息。

    还检查: Creating and analyzing minidumps in .NET production applications . 如果您是新加入windbg的,请检查 Tess Ferrandez's blog

    另一种方法 Remote Debugging Setup

        2
  •  4
  •   Aliostad    14 年前

    在入口点(main()或…)中注册当前域的未处理异常:

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

    在处理程序中实现登录:

    static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
            {
                // log
            }
    

    应用程序仍将崩溃,但您将获得所发生的事情的完整日志记录和堆栈跟踪。

    更新

    根据您的更新,我建议您下载Windows的调试工具 http://www.microsoft.com/whdc/DevTools/Debugging/default.mspx 然后启用事后调试并确保创建了崩溃转储(请参阅windbg帮助文件中的启用事后调试部分) 并使用windbg调试转储文件,找出它崩溃的地方。

        3
  •  2
  •   Community Paul Sweatte    7 年前

    每当发生异常时,可以使用ADPLUS自动保存小型转储。有关详细信息,请参阅此问题: Fastest way to break in WinDbg for specific exception? .net 4.0 app.

        4
  •  1
  •   ulty4life    14 年前

    如果无法实现异常处理解决方案,可以实现一些跟踪日志记录,以缩小代码中的位置以及导致异常的流。