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

Ric*_*ter 9 .net c# crash crash-reports event-log

我在一个名为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,并强调他的答案虽然没有直接回答我提出的问题,但我的代码库解决了更大的问题,即全局错误处理缺少一个重要组件.

Mic*_*ker 18

这就是我如何解决崩溃的最终用户的问题.

  1. 下载并安装适用于Windows的调试工具,网址http://www.microsoft.com/whdc/devtools/debugging/default.mspx

  2. 安装工具后(默认情况下它们最终会转到C:\ Program Files \)启动命令行窗口.

  3. 切换到包含adplus的目录(例如"C:\ Program Files\Debugging Tools for Windows(x86)").

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

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

创建崩溃转储后

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

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

加载SOS以进行调试

  • 预.NET 4.0
.loadby sos mscorwks
Run Code Online (Sandbox Code Playgroud)
  • .NET 4.0
.loadby sos clr
Run Code Online (Sandbox Code Playgroud)

要查看堆栈跟踪

!clrstack
Run Code Online (Sandbox Code Playgroud)

查看更有用的堆栈跟踪

!clrstack –p
Run Code Online (Sandbox Code Playgroud)

戳入一个对象..也许看看是什么导致了异常

!do <address>
Run Code Online (Sandbox Code Playgroud)

例如,这是应用程序因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 <<
Run Code Online (Sandbox Code Playgroud)


Ste*_*pel 5

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

你需要处理两个非UI线程异常和UI线程例外:

  • 对于前者,您需要实现一个CLR未处理的异常处理程序AppDomain.CurrentDomain.UnhandledException,它已经存在.

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

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