如何解决事件日志中的.NET 2.0错误报告消息?

时间:2009-05-02 09:55:07

标签: c# .net crash event-log crash-reports

我处理一个名为EVEMon的开源产品,用C#编写,面向.NET 2.0平台,我有一个用户遇到了一个我们无法解决的奇怪的.NET崩溃。

Event Type: Error
Event Source: .NET Runtime 2.0 Error Reporting
Event Category: None
Event ID: 5000
Date: 4/29/2009
Time: 10:58:10 PM
User: N/A
Computer: removed this
Description:
EventType clr20r3, P1 evemon.exe, P2 1.2.7.1301, P3 49ea37c8, P4
system.windows.forms, P5 2.0.0.0, P6 4889dee7, P7 6cd3, P8 18, P9
system.argumentexception, P10 NIL.

Data:
//hex representation of the above Description

应用程序本身崩溃但没有显示错误(尽管有错误处理UI),上述消息被复制出Windows事件日志。最终用户已重新安装.NET并更新到最新版本。 .PDB文件随程序的每个发行版本一起分发,以帮助调试和测试,有问题的用户可以获得正确版本的EVEMon的完整PDB文件。

是否有特定的,经过试验和测试的技术来分析和诊断此类崩溃?如果有的话,有哪些工具和技术可以帮助调试?

特别感谢

我要特别感谢Steffen Opel并强调his answer虽然没有直接回答我提出的问题,但我的代码库解决了更大的问题,即全局错误处理缺少一个重要组件。

8 个答案:

答案 0 :(得分:18)

这是我为崩溃的最终用户解决问题的方法。

  1. http://www.microsoft.com/whdc/devtools/debugging/default.mspx

  2. 下载并安装适用于Windows的调试工具
  3. 安装工具后(默认情况下它们最终会转到C:\ Program Files \)启动命令行窗口。

  4. 更改为包含adplus的目录(例如“C:\ Program Files \ Windows调试工具(x86)”)。

  5. 运行follwing命令。这将启动应用程序并附加adplus。

  6.   

    adplus -crash -o C:\debug\ -FullOnFirst -sc C:\path\to\your\app.exe

    创建崩溃转储后

    应用程序崩溃后启动WinDbg并加载在C:\ debug中创建的.dmp文件。 (文件 - >打开崩溃转储)

    执行这些命令以查看堆栈跟踪,并希望找到问题。

    加载SOS以进行调试

    • Pre .NET 4.0
    .loadby sos mscorwks
    
    • .NET 4.0
    .loadby sos clr
    

    查看堆栈跟踪

    !clrstack
    

    查看更有用的堆栈跟踪

    !clrstack –p
    

    在一个对象内部戳..可能会看到导致异常的原因

    !do <address>
    

    例如,这是应用程序因IO异常而随机出错的结果。 WinDbg指出了被引用的路径不正确。

    0:009> !do 017f2b7c    
    Name: System.String    
    MethodTable: 790fd8c4    
    EEClass: 790fd824    
    Size: 124(0x7c) bytes    
     (C:\WINDOWS\assembly\GAC_32\mscorlib\2.0.0.0__b77a5c561934e089\mscorlib.dll)    
    String: \\server\path\not_here.txt
    Fields:    
          MT    Field   Offset                 Type VT     Attr    Value Name    
    79102290  4000096        4         System.Int32  1 instance       54 m_arrayLength    
    79102290  4000097        8         System.Int32  1 instance       53 m_stringLength    
    790ff328  4000098        c          System.Char  1 instance       5c m_firstChar    
    790fd8c4  4000099       10        System.String  0   shared   static Empty    
        >> Domain:Value  00161df8:790d884c <<    
    7912dd40  400009a       14        System.Char[]  0   shared   static WhitespaceChars    
        >> Domain:Value  00161df8:014113e8 <<
    

答案 1 :(得分:5)

窥视您的源代码(主干)表示您的未处理异常处理在Windows窗体应用程序方面似乎不完整:

您需要处理两个非UI线程异常和UI线程异常:

  • 对于前者,您需要通过AppDomain.CurrentDomain.UnhandledException实现CLR未处理的异常处理程序,该处理程序已经就绪。

  • 对于后者,您需要通过 Application.ThreadException 实现Windows窗体未处理的异常处理程序,这似乎缺失;这确实可以准确地产生你正在目睹的那些问题。有关实现示例,请参阅Application.ThreadException Event的MSDN文档。

请注意,现在您明确禁止通过Application.SetUnhandledExceptionMode(UnhandledExceptionMode.ThrowException)捕获未处理的Windows窗体例外,您需要将其更改为UnhandledExceptionMode.CatchException以启用到Application.ThreadException的处理程序的路由,如Jehof已正确建议。

答案 2 :(得分:3)

用户使用哪种操作系统(Windows XP,Windows Vista等)?

如果Windows Vista尝试禁用“问题报告和解决方案功能”(控制面板 - &gt;问题报告和解决方案 - &gt;更改设置 - &gt;高级设置 - &gt;关闭我的程序,问题报告)

或尝试设置

  Application.SetUnhandledExceptionMode( UnhandledExceptionMode.CatchException );

这将始终将异常路由到ThreadException处理程序。

答案 3 :(得分:2)

简而言之:应用程序中存在未处理的异常。

如果您有权访问本机(通过远程访问等),请尝试安装Visual Studio Express并启动该应用程序。您应该看到一个对话框,提供了使用Visual Studio的新实例调试应用程序的机会。

也可能存在阻止Windows窗体正确初始化的内容。我已经看到论坛帖子提示字体问题可能导致这种情况 - 确保用户安装了您的应用程序所需的字体加上常见的默认值,如MS SansSerif,Arial,Tahoma,Times等。

失败了...尝试在PC上牺牲一只鸡。每次都有魅力!

答案 4 :(得分:2)

我们遇到过Thread-Code中的例外问题。如果你生成一个新线程而忘记在线程方法中处理异常,那么应用程序只是“停止” - 没有错误消息,没有任何内容,只有事件日志中的条目。甚至不会触发UnhandledExceptionHandler

也许这样的事情是原因?

答案 5 :(得分:1)

...如果您能够联系该受苦用户,请参阅

想法:记录预执行阶段

不要使用program.exe的快捷方式,而是设置program.bat的快捷方式,

echo "Pre-start" > stage.txt
start program.exe

Program.cs的第一行将是

File.WriteAllLines("stage.txt", "Program execution started.");

AppDomain.UnhandledException的处理程序中,第一行将是

File.WriteAllLines("stage.txt", "Unhandled exception has been caught.");

此外,请确保处理程序不分配内存或资源 - 在程序启动时预先分配它们。处理程序仅触发写入日志。

评论

stage.txt(由用户发送)很可能包含“预启动”。这种情况发生在第三方.dll中引发异常 - 甚至在程序启动之前。

在这种情况下,您需要一个简单的检查程序,它不会引用您program.exe所做的程序集,而是Assembly.Load(...)它们。

P.S。

stage.txt应放在%APPDATA%下,而不是程序文件中。

我找到了an interesting case on Server 2003another nice discussion

答案 6 :(得分:0)

您应该通过将该特定版本的.pdb文件发送给用户(放在.exe旁边)并让它们重现崩溃来获得更详细的堆栈跟踪。

答案 7 :(得分:0)

您应该在代码中处理AppDomain.UnhandledException

有人询问similar question。另见相关内容。