gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 10:43:37 25 4
gpt4 key购买 nike

我有一个报告大量逻辑线程的服务。来自 PerfMon:

.NET CLR LocksAndThreads -> # of current logical threads: 663
.NET CLR LocksAndThreads -> # of current physical threads: 659
Process -> Thread Count: 15

这太高了,所以我捕获了一个内存转储(通过 sysinternals procdump.exe)并从 Visual Studio(混合调试)打开它。加载完所有内容后,我查看了线程窗口,它只显示了 15 个操作系统线程,而不是 .net 物理线程或 .net 逻辑线程。该服务本身是一个 Windows 服务,承载 4 个 WCF 服务 (System.ServiceModel.ServiceHost)。

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

最佳答案

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

接下来,您需要下载并安装 WinDbg 并让 SOS 正常工作(SOS 是让您查看 .net 托管进程的模块)。有关设置的更多信息可用 here .如果您从服务器获取转储(如我的情况),那么 .net 版本可能会略有偏差,并且 SOS 将无法正确处理转储文件。如果发生这种情况,您需要根据 this 将一些相关文件从源 .net 版本复制到您的 windbg 安装中。评论。

一旦一切都设置好并加载了转储,运行命令:

!threads

这应该为您提供 .net 逻辑线程列表。还要注意的是,在线程列表之前,它会给你一个总结。对于这个问题的重要性,DeadThread 非常高(600+)。这表明线程已经完成,但是他们持有的内存(堆栈)无法释放。

在我的具体案例中,我发现挂起的线程是来自 WCF 线程池的线程,它们无法进行 GC,因为其他线程持有对它的引用。当其他线程不再需要父线程时,我将其更改为清空父线程,这样它就可以正确地进行 GC。

关于c# - 使用 Visual Studio 调试器查看/诊断内存转储中的逻辑 .NET 线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24314002/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com