如何调试.net垃圾收集?

如何调试.net垃圾收集?,.net,debugging,garbage-collection,.net,Debugging,Garbage Collection,是否可以查看调用GC.Collect()时收集的所有.net对象? 我需要查看哪些对象仍在内存中且未被回收,这样我就可以找到手动回收对象的地方,但程序员忘记了。 我不想调用GC.Collect,因为某个地方有人忘记处理一个阻止某些句柄的对象。我发现最好的方法是使用windbg和SOS(strike之子)扩展。它有一个相当神秘的命令行,但它非常强大。它能够转储堆并将其除以GC代堆。一旦通过了初始学习曲线,就很容易跟踪堆的哪个部分中哪些对象是活动的。以下是一些使用SOS的网站示例 编辑OP

是否可以查看调用GC.Collect()时收集的所有.net对象?

我需要查看哪些对象仍在内存中且未被回收,这样我就可以找到手动回收对象的地方,但程序员忘记了。

我不想调用GC.Collect,因为某个地方有人忘记处理一个阻止某些句柄的对象。

我发现最好的方法是使用windbg和SOS(strike之子)扩展。它有一个相当神秘的命令行,但它非常强大。它能够转储堆并将其除以GC代堆。一旦通过了初始学习曲线,就很容易跟踪堆的哪个部分中哪些对象是活动的。以下是一些使用SOS的网站示例

编辑OP询问sos.dll的位置。它包含在.Net Framework的安装中。它位于

%WINDIR%\Microsoft.Net\Framework\V2.0.50727\sos.dll

但一旦加载了windbg,就不需要完整路径。只有我们使用.loadby方法

.loadby sos mscorwks.dll


它将在与我使用的mscorwks(CLR)当前版本相同的目录中查找sos版本。即时使用有点复杂,但是有一些很好的教学视频。它可以让您查看哪些对象没有被正确处理,它们是在哪一代收集的。如果没有它,就无法调试内存泄漏…

“应该[收集]”是GCI的一个奇怪短语,我经常听到人们这么说!Dev说“它超出了范围,为什么不收集?”并假设GC将自动完成所有工作。虽然这是一件了不起的作品,但并不完美。你对GC了解得越多,你就越知道如果你不小心的话,你会泄漏内存。“应该有…”不是指GC,而是指手动处理对象-对不起,混淆了语言使用!FXCOP可以帮助确定一个代码是否忽略了给定类型的IDISPISPOLL。我不能加载SOS.DLL——这不适用于托管(混合)C++吗?只要CLR加载,它就可以用于任何托管代码。尝试使用.load和sos.dll的完整路径。我尝试了,我得到:'调用LoadLibrary(C:\Windows\Microsoft.NET\Framework\v2.0.50727\sos.dll)失败,Win32错误0n193'CLR应该加载。我很晚才打开程序,windbg告诉我它加载了很多.net dll,比如:“ModLoad:71fb0000 72540000 C:\Windows\Microsoft.net\Framework\v2.0.50727\mscorwks.dll”@Sam,你在64位机器上吗?如果是,请使用framework64版本C:\Windows\Microsoft.NET\framework64\v2.0.50727\SOS.DLL