我们有一个应用程序运行了一年多,并且从 2 个月前开始它就挂了。与此同时,我们能够得到两个挂起进程的转储,并通过 debugdiag 分析结果,告诉我们必须怀疑终结器线程被阻塞。
从 debugdiag 提供的信息开始,通过 windbg,我们在 chrash 时检查了以下情况: - 所有线程都处于抢占模式 - 终结器的堆栈显示 ntdll!NtWaitForMultipleObjects+a 或 ntdll!NtWaitForSingleObject+a
应用程序正在使用托管代码,但在调试诊断结果的“以前的 .NET 异常报告(所有 .NET 堆中的异常)”部分,我们可以从另一个可疑异常中看到 System.ExecutionEngineException。例如 System.OutOfMemoryException 和 System.StackOverflowException。这些只出现一次,但可能与阻塞的终结器有关(或不是??)
一些环境数据
- CLR 版本 4.0.30319.36440
- 操作系统 Windows Server 2012 R2
- 处理器数量 4
- 处理位数 64 位
- 处理器类型 X64
终结器线程堆栈如下所示:
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
我们花了很多时间试图弄清楚这里发生了什么,但没有成功,我们也关注了几个相关的帖子,一切都没有用。
有人可以就这个问题给我们一个提示吗?
提前谢谢了