目前我正在修复.NET应用程序中的应用程序挂起。经过一些研究后,我发现windbg可以提供有关应用程序挂起时的信息。
在用户系统挂起应用程序之后,我使用windbg来收集更多信息。
首先,我确定了GUI / STA线程(寻找CorExeMain)
0:011> ~*
0 Id: 1488.314 Suspend: 1 Teb: 7ffdf000 Unfrozen
Start: mscoree!_CorExeMain_Exported (79004ddb)
Priority: 0 Priority class: 32 Affinity: 3
我注意到以下内容:
0:000> k
ChildEBP RetAddr
0012eb2c 7c90df2c ntdll!KiFastSystemCallRet
0012eb30 7c809574 ntdll!NtWaitForMultipleObjects+0xc
0012ebcc 7e4195f9 KERNEL32!WaitForMultipleObjectsEx+0x12c
0012ec28 7752ebd6 USER32!RealMsgWaitForMultipleObjectsEx+0x13e
0012ec50 77557237 ole32!CCliModalLoop::BlockFn+0x80
0012ecc4 79f9e14d ole32!CoWaitForMultipleHandles+0xcf
0012ece4 79f9e0b4 mscorwks!NT5WaitRoutine+0x51
0012ed50 79f9e018 mscorwks!MsgWaitHelper+0xa5
0012ed70 79f4c664 mscorwks!Thread::DoAppropriateAptStateWait+0x28
0012edf4 79f4c6f9 mscorwks!Thread::DoAppropriateWaitWorker+0x13c
0012ee44 79f15a68 mscorwks!Thread::DoAppropriateWait+0x40
我对windbg的经验是有限的,但是从我进行的研究中我得到的结果是WaitForMultipleObjects表明它可能正在等待一个事件。谁能告诉我这是否可能是原因?
我收到的一些警告让我想知道我是否没有正确设置环境:
0012ee44 79f15a68 mscorwks!Thread::DoAppropriateWait+0x40
*** WARNING: Unable to verify checksum for C:\WINDOWS\assembly\NativeImages_v2.0.50727_32\mscorlib\6d667f19d687361886990f3ca0f49816\mscorlib.ni.dll
0012ef48 792b68af mscorwks!WaitHandleNative::CorWaitOneNative+0x156
和
0012f2ac 03af4dea USER32!DispatchMessageW+0xf
WARNING: Frame IP not in any known module. Following frames may be wrong.
0012f2c8 7b1d8d2e 0x3af4dea
任何人都可以建议我是否有任何理由认为申请等待某项活动,或者是否有人对可能的原因或可能值得调查的领域有任何直接的想法?
我也想知道跟罢工之子是否值得跟进?
答案 0 :(得分:3)
您正在查看托管线程的本机调用堆栈。等待是.NET内部的一部分。您可能会深入挖掘出正在发生的事情,但您真正关心的是应用程序的托管状态。
您可以通过将sos扩展名加载到windbg中来完成此操作。它弥补了windbg和.NET的原生性之间的差距。
加载此扩展的命令在.NET框架的版本之间是不同的,但它将类似于:
.loadby sos clr
......或者可能......
.loadby sos mscorwks
从那里,您可以使用exports sos为您调试.NET应用程序。作为起点,您将需要托管的callstack。这应该指向代码中挂起的位置。
!clrstack
MSDN对sos扩展提供的内容有很好的参考。 http://msdn.microsoft.com/en-us/library/bb190764.aspx