C# 终结器阻塞了应用程序
今天我们收到一个挂起的应用程序的崩溃。通过DebugDiag运行,我们得到以下信息: 分析总结 错误 说明建议 此WordHangs.dmp中的终结器线程5被阻止,请查看 用于终结器线程的调用堆栈,以查看终结器是什么 封锁了。终结器线程上长时间运行的代码会增加 准备完成的对象数,这对整个系统不利 进程的内存消耗 查看线程5,我们无法识别线程正在做什么。调用堆栈如下所示: 线程5-系统ID 13636 入口点clr!线程::intermediateThreadProc创建时间C# 终结器阻塞了应用程序,c#,multithreading,deadlock,crash-dumps,finalizer,C#,Multithreading,Deadlock,Crash Dumps,Finalizer,今天我们收到一个挂起的应用程序的崩溃。通过DebugDiag运行,我们得到以下信息: 分析总结 错误 说明建议 此WordHangs.dmp中的终结器线程5被阻止,请查看 用于终结器线程的调用堆栈,以查看终结器是什么 封锁了。终结器线程上长时间运行的代码会增加 准备完成的对象数,这对整个系统不利 进程的内存消耗 查看线程5,我们无法识别线程正在做什么。调用堆栈如下所示: 线程5-系统ID 13636 入口点clr!线程::intermediateThreadProc创建时间 2017年4月19日
2017年4月19日9:32:59在用户模式下花费的时间0天00:00:00.093 在内核模式下花费的时间0天00:00:00.078 此线程未完全解决,可能是问题,也可能不是问题。 可能需要对这些螺纹进行进一步分析 .NET调用堆栈 [[DebuggerU2MCatchHandlerFrame]] 完整调用堆栈 来源 ntdll!NtWaitForSingleObject+15内核库!WaitForSingleObjectEx+98 内核32!WaitForSingleObjectExImplementation+75
clr!CLREventBase::重置+145 clr!CLREventBase::重置+18d
clr!CLREventBase::WaitEx+152 clr!CLREventBase::等待+1a
clr!线程::WaitSuspendEventHelper+8a
clr!线程::WaitSuspendEvents+14
clr!线程::RareEnablePreemptiveGC+8e
clr!线程::RareDisablePreemptiveGC+102
clr!WKS::GCHeap::FinalizerThreadWorker+1b5
clr!线程::DoExtraWorkForFinalizer+1bd
clr!线程::DoExtraWorkForFinalizer+240
clr!线程::DoExtraWorkForFinalizer+5f0
[[debuggeru2mcachhandlerframe]]
clr!WKS::GCHeap::FinalizerThreadStart+1a0
clr!线程::intermediateThreadProc+4d
内核32!BaseThreadInitThunk+e ntdll__RtlUserThreadStart+70
ntdll_RtlUserThreadStart+1b 我们已在加载SOSEX的情况下执行Windb,以识别任何死锁,但没有成功。这是生成的输出: 0:000>!dlk正在检查同步块。。。扫描 ReaderWriterLock(精简)实例。。。扫描身份证持有人 ReaderWriterLock锁。。。扫描ReaderWriterLockSlim的固定器 锁。。。正在检查关键部分。。。扫描等待的线程 同步块。。。扫描等待ReaderWriterLock的线程 锁。。。扫描等待ReaderWriterLocksSlim的线程 锁。。。正在扫描等待关键节的线程 ***错误:找不到符号文件。默认为导出MSO.DLL的符号- ***错误:找不到符号文件。默认为VSTOLoader.dll导出符号- ***错误:找不到符号文件。默认为导出WWLIB.DLL的符号- ***错误:找不到符号文件。默认为导出WINWORD.EXE的符号- ***错误:找不到符号文件。默认为为Csi.dll导出符号- ***警告:无法验证aetpkss1.dll的校验和 ***错误:找不到符号文件。默认为导出aetpkss1.dll的符号- 未检测到死锁。
有人能告诉我们在哪里查找以确定终结器线程被阻止的原因吗?在代码中,我们进行了以下调用:
GC.Collect();
GC.WaitForPendingFinalizers();
GC.Collect();
GC.WaitForPendingFinalizers();
因为我们在这个问题之后删除了它:
问题已经过去了,所以我想这可能是其中的原因(可能这不是唯一的原因,其他代码也与此相关)。在代码中,我们有以下调用:
GC.Collect();
GC.WaitForPendingFinalizers();
GC.Collect();
GC.WaitForPendingFinalizers();
因为我们在这个问题之后删除了它:
问题消失了,所以我想这可能是其中的原因(可能这不是罪魁祸首,其他代码也与此相关)。它被阻止,但不是死锁。完全正常的状态,它正在等待一些完成工作。很难猜测为什么DebugDiag会生成此诊断,可能它只是找到了错误的线程。死锁使用COM服务器(如Word)的线程非常容易,您必须查看拥有应用程序对象的STA线程。你问了很多关于这件事的问题,似乎什么都没有得到。是时候请Microsoft支持人员帮忙了。谢谢Hans。转储可能会显示一个被阻塞的线程,但实际上应用程序在挂起时处于死锁状态。关于Microsoft支持,您是对的,我现在正在收集所有信息。当这场噩梦结束时,我会回答我自己的问题(希望如此)。它被阻止了,但没有陷入僵局。完全正常的状态,它正在等待一些完成工作。很难猜测为什么DebugDiag会生成此诊断,可能它只是找到了错误的线程。死锁使用COM服务器(如Word)的线程非常容易,您必须查看拥有应用程序对象的STA线程。你问了很多关于这件事的问题,似乎什么都没有得到。是时候请Microsoft支持人员帮忙了。谢谢Hans。转储可能会显示一个被阻塞的线程,但实际上应用程序在挂起时处于死锁状态。关于Microsoft支持,您是对的,我现在正在收集所有信息。当这场噩梦结束时,我会回答我自己的问题(希望如此)。