检测"泄露"的IDisposable对象

kiz*_*zx2 11 .net c# memory-leaks idisposable

有很多问题要求如何检测IDisposable对象泄漏.似乎答案是"你不能".

我刚刚用最琐碎的测试用例检查过,FxCop 10.0没有这样做,带有MSVS2010的ReSharper 4没有这样做.

这对我来说似乎不对,比C中的内存泄漏更糟糕(至少我们已经建立了检测工具).

我在想:是否有可能使用反射和其他模糊的高级技术,我可以在运行时注入一个检查,在终结器中查看是否Dispose已被调用?

WinDBG + SOS的魔术技巧怎么样?

即使没有现成的工具,我也想知道这在理论上是否可行(我的C#不是很尖锐).

想法?

注意这个问题的标题可能会产生误导.这里真正的问题应该是一个是否IDisposable对象已Disposed()正确.由于我认为这是一个错误,因此由GC处理并不重要.

编辑:解决方案:.NET Memory Profiler完成工作.我们只需要GC.Collect()在程序结束时发送几个垃圾邮件,以使我们的探查器能够正确地获取统计数据.

Jus*_*ner 12

你搜索不够努力.有很多.NET内存配置文件可以在程序运行时查看你的程序,并让你知道你的内存使用的位置和方式(以及泄漏的内容).

我会检查以下任何一项:

微软的CLR内存分析器(免费)
RedGate ANTS内存分析器
JetBrain的DotTrace(包括代码分析器)
SciTech .NET内存分析器

更新

SciTech的.NET内存分析器具有一个名为"Dispose Tracker"的功能,该功能符合OP的要求,即仅在其应用程序中跟踪Dispose调用.

  • .NET Memory Profiler恰好具有名为"Dispose Tracker"的功能,它完全符合我的要求.不幸的是,现在这个答案对任何人都没有用,因为它只是列出了谷歌的搜索结果(并不是没有用的 - 它迫使我下去试试每一个都证明至少有一个是相关的).你能编辑它至少包括关于.NET Memory Profiler的"Dispose Tracker",这至少可以提供信息吗? (2认同)