我正在开发一个在看似随机的时间崩溃的.NET应用程序。它引用了一个非托管的dll,我怀疑它正在抛出一个未处理的异常。当应用程序崩溃时,我没有附加调试器(编译为click-once)时收到此消息:
此时我可以将VS2012作为调试器附加并查看调用堆栈:
> ntdll.dll!77e015de() Unknown
[Frames below may be incorrect and/or missing, no symbols loaded for ntdll.dll]
ntdll.dll!77e015de() Unknown
ntdll.dll!77e8861b() Unknown
ntdll.dll!77eae656() Unknown
ntdll.dll!77eae6d3() Unknown
ntdll.dll!77e573bc() Unknown
ntdll.dll!77e57261() Unknown
ntdll.dll!77e3b459() Unknown
ntdll.dll!77e3b42b() Unknown
ntdll.dll!77e3b3ce() Unknown
ntdll.dll!77df0133() Unknown
msvcr100.dll!71fb0269() Unknown
msvcr100.dll!71fb0146() Unknown
mfc100.dll!6c9e3bef() Unknown
kernel32.dll!76ba14dd() Unknown
msvcr100.dll!71fb016a() Unknown
mfc100.dll!6cbbb734() Unknown
DataRayOcx.ocx!095fe026() Unknown
kernel32.dll!76ba14dd() Unknown
msvcr100.dll!71fb016a() Unknown
mfc100.dll!6cbbb734() Unknown
mfc100.dll!6c9e3e62() Unknown
DataRayOcx.ocx!096018c4() Unknown
DataRayOcx.ocx!09603679() Unknown
msvcr100.dll!71ffc556() Unknown
msvcr100.dll!71ffc600() Unknown
kernel32.dll!76ba33aa() Unknown
ntdll.dll!77e19ef2() Unknown
ntdll.dll!77e19ec5() Unknown
和主题:
Not Flagged 5732 0 Worker Thread msvcr100.dll thread
DataRayOcx.ocx!09664787 Highest
Not Flagged 5480 0 Main Thread Main Thread clr.dll!70903e82 Normal
Not Flagged 4408 0 Worker Thread MG17Comms.dll thread mfc100.dll!6cb8e160 Normal
Not Flagged > 4428 0 Worker Thread msvcr100.dll thread msvcr100.dll!71fb0269 Normal
Not Flagged 116 0 RPC Thread RPC Callback Thread 1714fee0 Normal
Not Flagged 5808 0 Worker Thread ntdll.dll thread ntdll.dll!77e01f26 Normal
Not Flagged 5372 0 Worker Thread clr.dll thread clr.dll!7082c3a6 Normal
Not Flagged 5112 0 Worker Thread clr.dll thread clr.dll!7099e9de Normal
Not Flagged 4928 0 Worker Thread clr.dll thread clr.dll!7090f1e3 Normal
Not Flagged 1380 0 Worker Thread clr.dll thread clr.dll!708219a3 Normal
Not Flagged 1632 0 Worker Thread OphirLMMeasurement.dll thread OphirLMMeasurement.dll!6ad4a94d Normal
Not Flagged 4324 0 Worker Thread MG17Core.dll thread MG17Motor.ocx!10034e20 Normal
Not Flagged 5048 0 Worker Thread clr.dll thread nipalu.dll!6459a78a Normal
Not Flagged 5028 0 Worker Thread clr.dll thread msvcr110_clr0400.dll!72a551ed Normal
Not Flagged 5556 0 Worker Thread clr.dll thread clr.dll!7099e9de Normal
Not Flagged 4708 0 Worker Thread clr.dll thread clr.dll!7099e9de Normal
Not Flagged 3352 0 Worker Thread clr.dll thread nipalu.dll!6459a78a Normal
Not Flagged 5256 0 Worker Thread clr.dll thread clr.dll!7099e9de Normal
Not Flagged 6032 0 Worker Thread clr.dll thread clr.dll!7099e9de Normal
Not Flagged 4692 0 Worker Thread OphirLMMeasurement.dll thread OphirLMMeasurement.dll!6add537a Normal
Not Flagged 6108 0 Worker Thread clr.dll thread clr.dll!7099e9de Normal
Not Flagged 1504 0 Worker Thread clr.dll thread clr.dll!7099e9de Normal
Not Flagged 1108 0 Worker Thread clr.dll thread clr.dll!7099e9de Normal
Not Flagged 4652 0 Worker Thread wdapi1031.dll thread wdapi1031.dll!11513a0b Normal
Not Flagged 2796 0 Worker Thread OphirLMMeasurement.dll thread OphirLMMeasurement.dll!6add5f80 Normal
Not Flagged 1036 0 RPC Thread RPC Callback Thread ole32.dll!76e7a44e Normal
Not Flagged 3424 0 Worker Thread clr.dll thread clr.dll!708d8274 Normal
Not Flagged 5424 0 Worker Thread clr.dll thread clr.dll!708f7bc5 Highest
Not Flagged 504 0 Worker Thread ntdll.dll thread ntdll.dll!77e0013d Normal
Not Flagged 2380 0 Worker Thread clr.dll thread clr.dll!70b10aed Normal
Not Flagged 3060 0 Worker Thread GdiPlus.dll thread GdiPlus.dll!7327795b Normal
Not Flagged 3672 0 Worker Thread clr.dll thread System.Windows.Forms.ni.dll!6ddfe8e1 Normal
Not Flagged 5268 0 Worker Thread msiltcfg.dll thread msiltcfg.dll!7371187a Normal
Not Flagged 1232 0 Worker Thread msvcr100.dll thread msvcr100.dll!71fb326f Normal
Not Flagged 5588 0 Worker Thread clr.dll thread clr.dll!7090fee1 Normal
Not Flagged 4080 0 Worker Thread clr.dll thread clr.dll!708598cd Normal
Not Flagged 5380 0 Worker Thread msvcr100.dll thread DataRayOcx.ocx!095cd1ed Normal
Not Flagged 5328 0 Worker Thread System.Data.dll thread System.Data.dll!7140b7fd Normal
Not Flagged 5744 0 Worker Thread AS5216.dll thread AS5216.dll!061d3e74 Normal
Not Flagged 2952 0 Worker Thread AS5216.dll thread AS5216.dll!061d01dd Above Normal
Not Flagged 3008 0 Worker Thread AS5216.dll thread AS5216.dll!061d8e2e Above Normal
Not Flagged 4728 0 Worker Thread clr.dll thread clr.dll!7090f1e3 Normal
Not Flagged 2972 0 Worker Thread clr.dll thread clr.dll!7099e9de Normal
Not Flagged 3804 0 Worker Thread nirpc.dll thread nirpc.dll!6460546a Normal
Not Flagged 6064 0 Worker Thread msvcr90.dll thread mxsout.dll!1b45be1b Normal
Not Flagged 3728 0 Worker Thread msvcr90.dll thread mxsout.dll!1b45bd23 Normal
Not Flagged 768 0 Worker Thread clr.dll thread clr.dll!7099e9de Normal
Not Flagged 6096 0 Worker Thread clr.dll thread clr.dll!70827f40 Normal
但我真的不知道如何阅读它们。
我看到第一行Not Flagged 5732 0 Worker Thread msvcr100.dll thread DataRayOcx.ocx!09664787 Highest
具有最高优先级,这使我对该组件产生怀疑。
有时我能够捕获异常并收到此消息:
'External component has thrown an exception.' in System.Windows.Forms.DispatchMessageW() as System.IntPtr
at System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG& msg)
at System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(IntPtr dwComponentID, Int32 reason, Int32 pvLoopData)
at System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context)
at System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context)
at System.Windows.Forms.Application.Run(Form mainForm)
at Utilities.StartupForm.Main() in C:\...\Utilities\Forms\StartupForm.vb:line 102
除了根据调试器信息猜测问题是什么外,调试此类异常的好方法是什么?我们正在使用第三方的软件,所以当他们的组件引发异常时,我需要能够提醒他们......但首先我需要准确地识别问题。
答案 0 :(得分:2)
调试器最好能够识别出这类问题 - 所以你所做的非常正确。唯一的问题是你有无效的符号,因此调用堆栈没有告诉你太多。
正如@Hans所指出的,首先需要做的是在调试器中配置Microsoft Symbol服务器(可以通过设置_NT_SYMBOL_PATH
全局系统变量来实现)。启用符号服务器后,调试器(例如Visual Studio)将自动下载系统模块(dll和exe文件)的.pdb文件。 PDB文件包含调试器如何解码堆栈中的原始地址的指令。这将转换您当前的调用堆栈:
ntdll.dll!77e015de() Unknown
ntdll.dll!77e8861b() Unknown
ntdll.dll!77eae656() Unknown
ntdll.dll!77eae6d3() Unknown
更有意义的事情。从上到下扫描堆栈,您应该发现错误方法(如果您有第三方库的PDB文件)和拥有它的模块(DLL)。此外,您可以在出现故障时创建一个小型转储(例如使用procdump)并将其发送给图书馆所有者进行检查。