Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 完成队列卡住_C#_.net_Garbage Collection_Windbg_Finalizer - Fatal编程技术网

C# 完成队列卡住

C# 完成队列卡住,c#,.net,garbage-collection,windbg,finalizer,C#,.net,Garbage Collection,Windbg,Finalizer,最近,我们发现我们的一个服务器应用程序(即windows服务)出现OutOfMemory异常而失败。我们试图找出到底发生了什么,结果是finalize队列中的对象没有被最终确定,所以不能对它们进行垃圾收集。我们试图通过使用Windbg找出哪个终结器会导致这种行为,但我们无法找出到底是哪个对象导致了这种行为 通过使用!finalizeequeue命令我们可以发现: 0:053> !finalizequeue PDB symbol for clr.dll not loaded Syn

最近,我们发现我们的一个服务器应用程序(即windows服务)出现OutOfMemory异常而失败。我们试图找出到底发生了什么,结果是finalize队列中的对象没有被最终确定,所以不能对它们进行垃圾收集。我们试图通过使用Windbg找出哪个终结器会导致这种行为,但我们无法找出到底是哪个对象导致了这种行为

通过使用!finalizeequeue命令我们可以发现:

0:053> !finalizequeue PDB symbol for clr.dll not loaded SyncBlocks to be cleaned up: 0 Free-Threaded Interfaces to be released: 0 MTA Interfaces to be released: 0 STA Interfaces to be released: 0 ---------------------------------- generation 0 has 28 finalizable objects (050eab4c->050eabbc) generation 1 has 15 finalizable objects (050eab10->050eab4c) generation 2 has 658 finalizable objects (050ea0c8->050eab10) Ready for finalization 3027 objects (050eabbc->050edb08) ... 0:053> !最后定案 未加载clr.dll的PDB符号 要清理的同步块:0 要发布的自由线程接口:0 要发布的MTA接口:0 要发布的STA接口:0 ---------------------------------- 第0代有28个可终结对象(050eab4c->050eabbc) 第1代有15个可终结对象(050eab10->050eab4c) 第2代有658个可终结对象(050ea0c8->050eab10) 准备完成3027个对象(050eabbc->050edb08) ... 3027是一个难以置信的高数字(经过几分钟的运行,这个数字还在增长,而且从未下降)。我试图找出哪个对象在地址050eabbc上,但它总是不同的类型,所以我认为这不是原因

如果我试图打印终结器线程的本机调用堆栈,我会得到以下结果:

0:053> ~2k *** ERROR: Symbol file could not be found. Defaulted to export symbols for C:\Windows\SYSTEM32\KERNELBASE.dll - ChildEBP RetAddr WARNING: Stack unwind information not available. Following frames may be wrong. 032ef09c 772f10b4 ntdll!ZwWaitForSingleObject+0xc *** ERROR: Symbol file could not be found. Defaulted to export symbols for C:\Windows\SYSTEM32\combase.dll - 032ef0b0 755ff0b5 KERNELBASE!WaitForSingleObject+0x12 032ef0e4 7554b22a combase!NdrOleDllGetClassObject+0x1399 032ef108 755ff10c combase!PropVariantCopy+0x177b 032ef224 75511724 combase!NdrOleDllGetClassObject+0x13f0 032ef27c 7558115d combase!DcomChannelSetHResult+0x17c7 032ef2d8 755fd39a combase!CoRegisterSurrogateEx+0x3494 *** ERROR: Symbol file could not be found. Defaulted to export symbols for C:\Windows\SYSTEM32\RPCRT4.dll - 032ef2f4 76a9e4a0 combase!NdrExtStubInitialize+0x21a9 032ef71c 755fc779 RPCRT4!NdrComplexArrayUnmarshall+0xcac 032ef738 75510d77 combase!NdrExtStubInitialize+0x1588 032ef748 755816d5 combase!DcomChannelSetHResult+0xe1a 032ef7dc 75587aa5 combase!CoRegisterSurrogateEx+0x3a0c *** ERROR: Symbol file could not be found. Defaulted to export symbols for C:\Windows\Microsoft.NET\Framework\v4.0.30319\clr.dll - 032ef82c 748ab680 combase!StringFromIID+0x28d 032ef92c 748ab758 clr!PreBindAssemblyEx+0x259d 032ef964 7487960d clr!PreBindAssemblyEx+0x2675 032ef980 748ab55a clr!GetMetaDataInternalInterfaceFromPublic+0x2162a 032ef9dc 74878915 clr!PreBindAssemblyEx+0x2477 032efa2c 7487887c clr!GetMetaDataInternalInterfaceFromPublic+0x20932 032efa44 7478a5e2 clr!GetMetaDataInternalInterfaceFromPublic+0x20899 032efa8c 74777d71 clr!GetPrivateContextsPerfCounters+0x968 0:053>~2k ***错误:找不到符号文件。默认为导出C:\Windows\SYSTEM32\KERNELBASE.dll的符号- ChildEBP-RetAddr 警告:堆栈展开信息不可用。下面的框架可能是错误的。 032ef09c 772f10b4 ntdll!ZwWaitForSingleObject+0xc ***错误:找不到符号文件。默认为导出C:\Windows\SYSTEM32\combase.dll的符号- 032EF0B0755FF0B5内核库!WaitForSingleObject+0x12 032ef0e4 7554b22a战斗基地!NDRODELLGetClassObject+0x1399 032ef108 755ff10c combase!PropVariantCopy+0x177b 032EF22475511724战斗!NDRODELLGetClassObject+0x13f0 032ef27c 7558115d combase!DCOMChannel SetHRESULT+0x17c7 032ef2d8 755fd39a combase!CoreRegisterSubrogateX+0x3494 ***错误:找不到符号文件。默认为导出C:\Windows\SYSTEM32\RPCRT4.dll的符号- 032ef2f4 76a9e4a0组合底座!NdrExtStubInitialize+0x21a9 032ef71c 755fc779 RPCRT4!NdrComplexArrayUnmarshall+0xcac 032ef738 75510d77战斗基地!NdrExtStubInitialize+0x1588 032ef748 755816d5战斗基地!DCOMChannel Sethresult+0xe1a 032ef7dc 75587aa5战斗基地!CoreRegisterSubrogateX+0x3a0c ***错误:找不到符号文件。默认为导出C:\Windows\Microsoft.NET\Framework\v4.0.30319\clr.dll的符号- 032ef82c 748ab680 combase!StringFromIID+0x28d 032ef92c 748ab758 clr!PreBindAssemblyEx+0x259d 032ef964 7487960d clr!PreBindAssemblyEx+0x2675 032ef980 748ab55a clr!GetMetadataInternalInterfaceCompublic+0x2162a 032ef9dc 74878915 clr!PreBindAssemblyEx+0x2477 032efa2c 7487887c clr!GetMetadataInternalInterfaceCompublic+0x20932 032EFA4 7478a5e2 clr!GetMetadataInternalInterfaceCompublic+0x20899 032efa8c 74777d71 clr!GetPrivateContextsPerfCounters+0x968 终结器线程总是卡在ZwWaitForSingleObject上,所以这是终结器线程被卡的另一个线索

所以我的问题是,如何找出哪个对象导致终结器队列卡住?有趣的是,我根本不使用终结器:-(

我的“心理调试”猜测是,在STA线程上运行的一些代码创建了一个COM对象,但STA线程不遵循COM规则重新发送消息(可能线程完全消失了).我这么说只是因为我们在终结器的调用堆栈上看到combase。显然,您需要适当的符号,并查看本机和托管调用堆栈:

.symfix C:\localsymbolcache
重新加载
~2s
kb
!clrstack


如果要重新提出此问题,请将结果发回。

堆栈跟踪的质量太差。您需要设置调试器以使用Microsoft Symbol server,以便无法找到这些“符号文件”消息消失。某些东西正在使用终结器。您正在使用第三方库吗?如果是,我将开始对这些库进行代码检查。终结器很可能由于在终结器中引发异常而崩溃。我尝试将StatThread属性切换为MTAThread属性,但它再次开始工作!不知道原因,因为我们没有使用任何COM。此处的类似情况包含更多堆栈信息: