今天我们收到了一个挂起的应用程序的CrashDump。通过DebugDiag运行它我们得到了以下信息:
分析摘要
错误
说明建议
此WordHangs.dmp中的终结器线程5被阻止查看 Finalizer线程的callstack,看看终结器是什么 封锁了。 Finalizer线程上长时间运行的代码可以增加 准备好最终确定的对象数量,对整体而言是不利的 进程的内存消耗
查看线程5,我们无法确定线程正在做什么。 callstack是以下一个:
主题5 - 系统ID 13636
入口点clr!Thread :: intermediateThreadProc创建时间
19/04/2017 9:32:59在用户模式下花费的时间0天00:00:00.093 在内核模式下花费的时间0天00:00:00.078此线程未完全解析,可能存在问题,也可能不存在问题。 可能需要对这些线程进行进一步分析。
.NET调用堆栈
[[DebuggerU2MCatchHandlerFrame]]
完整调用堆栈
来源
ntdll!NtWaitForSingleObject + 15 KERNELBASE!WaitForSingleObjectEx + 98 KERNEL32!WaitForSingleObjectExImplementation + 75
clr!CLREventBase ::重置+ 145 clr!CLREventBase ::重置+ 18d
clr!CLREventBase :: WaitEx + 152 clr!CLREventBase :: Wait + 1a
CLR!主题:: WaitSuspendEventsHelper + 8A
CLR!主题:: WaitSuspendEvents + 14个
CLR!主题:: RareEnablePreemptiveGC + 8E
CLR!主题:: RareDisablePreemptiveGC + 102
CLR!WKS :: GCHeap :: FinalizerThreadWorker + 1B5
CLR!主题:: DoExtraWorkForFinalizer + 1BD
CLR!主题:: DoExtraWorkForFinalizer + 240
CLR!主题:: DoExtraWorkForFinalizer + 5f0
[[DebuggerU2MCatchHandlerFrame]]
CLR!WKS :: GCHeap :: FinalizerThreadStart + 1A0
CLR!主题:: intermediateThreadProc + 4D
kernel32!BaseThreadInitThunk + e ntdll!__ RtlUserThreadStart + 70
NTDLL!_RtlUserThreadStart + 1b的
我们已经执行了Windb并加载了SOSEX以识别任何死锁而没有成功。这是生成的输出:
0:000> !dlk检查SyncBlocks ...扫描
ReaderWriterLock(Slim)实例...扫描
的持有者ReaderWriterLock锁定...扫描ReaderWriterLockSlim的持有者
锁定...检查CriticalSections ...扫描等待的线程
SyncBlocks ...扫描等待ReaderWriterLock的线程
锁定...扫描等待ReaderWriterLocksSlim的线程
锁定...扫描等待CriticalSections ...
的线程***错误:找不到符号文件。默认导出MSO.DLL的符号 -
***错误:找不到符号文件。默认导出VSTOLoader.dll的符号 -
***错误:找不到符号文件。默认导出WWLIB.DLL的符号 -
***错误:找不到符号文件。默认导出WINWORD.EXE的符号 -
***错误:找不到符号文件。默认导出Csi.dll的符号 -
***警告:无法验证aetpkss1.dll的校验和
***错误:找不到符号文件。默认导出aetpkss1.dll的符号 -
未检测到死锁。
有人能告诉我们在哪里查找终结器线程被阻止的原因吗?
答案 0 :(得分:0)
在代码中,我们进行了以下调用:
GC.Collect();
GC.WaitForPendingFinalizers();
GC.Collect();
GC.WaitForPendingFinalizers();
由于我们在此问题后删除了它:
Is correct to use GC.Collect(); GC.WaitForPendingFinalizers();?
问题已经消失,所以我猜不知道这涉及到了(可能这不是单独的罪魁祸首,其他代码也是相关的。)