我们有一个应用程序runnnig超过一年,并且从2个月前开始挂起。同时,我们可以获得挂起进程的两个转储,并且通过debugdiag分析了结果,告诉我们必须怀疑finalizer线程被阻塞。
从debugdiag提供的信息开始,借助windbg,我们在发生崩溃时检查了以下情况: -所有线程都处于抢占模式 -终结器的堆栈显示ntdll!NtWaitForMultipleObjects + a或ntdll!NtWaitForSingleObject + a
应用程序正在使用托管代码,但是在debugdiag结果的“以前的.NET异常报告(所有.NET Heaps中的异常)”部分上,我们可以看到System.ExecutionEngineException属于其他可疑的异常。例如,System.OutOfMemoryException和System.StackOverflowException。这些仅出现一次,但可能与阻止的终结器相关(或没有?)
一些关于环境的数据
最终器线程堆栈如下:
ntdll!NtWaitForSingleObject+0xa
KERNELBASE!WaitForSingleObjectEx+0x94
clr!CLREventWaitHelper2+0x38
clr!CLREventWaitHelper+0x1f
clr!CLREventBase::WaitEx+0x63
clr!SVR::WaitForFinalizerEvent+0x4e
clr!SVR::GCHeap::FinalizerThreadWorker+0x4a
clr!ManagedThreadBase_DispatchInner+0x2d
clr!ManagedThreadBase_DispatchMiddle+0x6c
clr!ManagedThreadBase_DispatchOuter+0x75
clr!SVR::GCHeap::FinalizerThreadStart+0xd7
clr!Thread::intermediateThreadProc+0x7d
kernel32!BaseThreadInitThunk+0x22
ntdll!RtlUserThreadStart+0x34
我们花了很多时间试图弄清楚这里发生的事情,但是没有成功,我们也关注了几篇相关的文章,一切都没有用。
有人可以给我们提示这个问题吗?
非常感谢