1

我们有一个应用程序运行了一年多,并且从 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

我们花了很多时间试图弄清楚这里发生了什么,但没有成功,我们也关注了几个相关的帖子,一切都没有用。

有人可以就这个问题给我们一个提示吗?

提前谢谢了

4

0 回答 0