Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/joomla/2.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# 使用Visual Studio调试器查看/诊断内存转储中的逻辑.NET线程_C#_.net_Multithreading_Visual Studio 2010_Visual Studio - Fatal编程技术网

C# 使用Visual Studio调试器查看/诊断内存转储中的逻辑.NET线程

C# 使用Visual Studio调试器查看/诊断内存转储中的逻辑.NET线程,c#,.net,multithreading,visual-studio-2010,visual-studio,C#,.net,Multithreading,Visual Studio 2010,Visual Studio,我有一个报告大量逻辑线程的服务。从PerfMon开始: .NET CLR LocksAndThreads -> # of current logical threads: 663 .NET CLR LocksAndThreads -> # of current physical threads: 659 Process -> Thread Count: 15 这太高了,所以我捕获了一个内存转储(通过sysinternals procdump.exe)并从VisualStudi

我有一个报告大量逻辑线程的服务。从PerfMon开始:

.NET CLR LocksAndThreads -> # of current logical threads: 663
.NET CLR LocksAndThreads -> # of current physical threads: 659
Process -> Thread Count: 15
这太高了,所以我捕获了一个内存转储(通过sysinternals procdump.exe)并从VisualStudio打开它(使用混合调试)。加载完所有内容后,我查看了threads窗口,它只显示了15个OS线程,而不是.net物理线程或.net逻辑线程。该服务本身是一个windows服务,承载4个WCF服务(System.ServiceModel.ServiceHost)

如何找出这些线程是什么,以便修复代码并摆脱它们? 如何让VisualStudio识别和显示逻辑线程?
这是Visual Studio的问题还是转储本身的问题?

首先,需要获取内存转储。有多种方法可以做到这一点。我找到的最简单的一个是procdump.exe,它是SysInternals的一部分,可以从文档中获得

接下来,您需要下载并安装WinDbg,并使SOS正常工作(SOS是让您查看.net托管流程的模块)。有关设置的详细信息,请参阅。如果您从服务器获得转储文件(就像我的情况一样),那么.net版本可能会稍有偏差,SOS将无法正确处理转储文件。如果发生这种情况,您需要根据注释将一些相关文件从源.net版本复制到windbg安装

设置好所有内容并加载转储后,运行以下命令:

!threads
这将为您提供一个.net逻辑线程列表。另外值得注意的是,在线程列表之前,它将为您提供一个摘要。对于这个问题,DeadThread非常重要(600+)。这表示线程已完成,但它们所持有的内存(堆栈)无法释放


在我的特定案例中,我发现挂起的线程是WCF线程池中无法GC的线程,因为其他线程持有对它的引用。我将其他线程更改为在不再需要父线程时将其清空,这允许它正确地获得GC。

如果使用标准CLR主机,则逻辑线程和物理线程之间有1对1的映射。要获得更多帮助,您必须提供有关服务主机的更多信息。这是不可能的。你在什么时候做了这个小垃圾堆,可能时间不对。@HansPassant什么是不可能的?我直接从perfmon的实时提要读取值。这些数值一直在上升(虽然缓慢),并且在16个多小时内一直不低于400。几分钟前,我进行了另一次内存转储,visual studio中列出的线程与进程->线程计数中的计数相匹配。我已成功将转储加载到WinDbg中,并通过!线程命令。它列出了ThreadCount:696和DeadThread:687。大多数线程的“异常”列被列为“线程池完成端口”。我不知道这意味着什么-仍在研究你能回答自己的问题吗?我认为社区最好能简短地描述一下如何解决/调查这个问题。