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
这就是我如何解决崩溃的最终用户的问题.
下载并安装适用于Windows的调试工具,网址为http://www.microsoft.com/whdc/devtools/debugging/default.mspx
安装工具后(默认情况下它们最终会转到C:\ Program Files \)启动命令行窗口.
切换到包含adplus的目录(例如"C:\ Program Files\Debugging Tools for Windows(x86)").
运行follwing命令.这将启动应用程序并附加adplus.
adplus -crash -o C:\debug\ -FullOnFirst -sc C:\path\to\your\app.exe
应用程序崩溃后启动WinDbg并加载在C:\ debug中创建的.dmp文件.(文件 - >打开崩溃转储)
执行这些命令以查看堆栈跟踪并希望找到问题.
加载SOS以进行调试
Run Code Online (Sandbox Code Playgroud).loadby sos mscorwks
Run Code Online (Sandbox Code Playgroud).loadby sos clr
要查看堆栈跟踪
!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)
窥视您的源代码(主干)表示您的未处理异常处理在Windows窗体应用程序方面似乎不完整:
你需要处理两个非UI线程异常和UI线程例外:
对于前者,您需要实现一个CLR未处理的异常处理程序AppDomain.CurrentDomain.UnhandledException,它已经存在.
对于后者,您需要实现一个Windows窗体未处理的异常处理程序Application.ThreadException,这似乎缺失; 这确实可以准确地产生你正在目睹的那些问题.有关实现示例,请参阅Application.ThreadException事件的 MSDN文档.
请注意,现在您明确禁止捕获未处理的Windows窗体异常Application.SetUnhandledExceptionMode(UnhandledExceptionMode.ThrowException),您需要将其更改UnhandledExceptionMode.CatchException为启用路由到您的处理程序Application.ThreadException,正如Jehof已正确建议的那样.
| 归档时间: |
|
| 查看次数: |
13287 次 |
| 最近记录: |