终结器将应用程序挂起

时间:2017-04-21 10:38:21

标签: c# multithreading deadlock crash-dumps finalizer

今天我们收到了一个挂起的应用程序的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的符号 -

     

未检测到死锁。

有人能告诉我们在哪里查找终结器线程被阻止的原因吗?

1 个答案:

答案 0 :(得分:0)

在代码中,我们进行了以下调用:

        GC.Collect();
        GC.WaitForPendingFinalizers();
        GC.Collect();
        GC.WaitForPendingFinalizers();

由于我们在此问题后删除了它:

Is correct to use GC.Collect(); GC.WaitForPendingFinalizers();?

问题已经消失,所以我猜不知道这涉及到了(可能这不是单独的罪魁祸首,其他代码也是相关的。)