如何调试.net垃圾收集?

时间:2009-02-17 14:35:01

标签: .net debugging garbage-collection

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

我需要查看哪些对象仍在内存中而不是回收,所以我可以找到回收对象应该手动完成的地方,但程序员已经忘记了这一点。
我不想调用GC.Collect,因为有人在某个地方忘记了处理阻塞某些句柄的对象。

2 个答案:

答案 0 :(得分:8)

我发现最好的方法是使用windbg和SOS(罢工之子)扩展。它有一个相当神秘的命令行,但它非常强大。它具有转储堆并由GC生成堆分割的能力。一旦超过初始学习曲线,就可以很容易地跟踪堆的哪个部分中存在的对象。以下是一些网站,其中包含使用SOS的示例

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

  

%WINDIR%\ Microsoft.Net \框架\ V2.0.50727 \ sos.dll

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

  

.loadby sos mscorwks.dll

它将在与当前版本的mscorwks(CLR)相同的目录中查找sos的版本

答案 1 :(得分:1)

我使用SciTech's Memory profiler。使用蝙蝠有点复杂,但有一些很好的教学视频。它可以让你看看哪些对象没有正确处理,它们被收集在哪一代。没有它就无法调试内存泄漏...