因此有很多问题问如何检测IDisposable对象泄漏。答案似乎是"you can't"。
我只是用最简单的测试用例进行了检查,即FxCop 10.0没有做到这一点,带有MSVS2010的ReSharper 4没有做到这一点。
这对我来说似乎是错误的,比C中的内存泄漏更糟(至少我们已经为此建立了检测工具)。
我当时在想:是否可以使用反射和其他晦涩的高级技术在运行时注入(inject)终结器中的检查,以查看是否已调用Dispose
?
WinDBG + SOS的魔术技巧如何?
即使没有现成的工具,我也想知道这在理论上是否可行(我的C#不够敏锐)。
有想法吗?
注意这个问题的标题可能会引起误解。这里真正的问题应该是IDisposable
对象是否已经正确地成为Disposed()
。由于我认为这是一个错误,因此被GC处理不算在内。
编辑:解决方案:.NET Memory Profiler可以完成这项工作。我们只需要在程序末尾发送一些GC.Collect()
垃圾邮件,以使我们的探查器能够正确获取统计信息。
最佳答案
您搜索的不够努力。有很多.NET Memory Profilers可以在程序运行时对其进行查看,并让您知道内存的使用位置/方式(以及泄漏的原因)。
我将检查以下任何一项:
Microsoft's CLR Memory Profiler (free)
RedGate ANTS Memory Profiler
JetBrain's DotTrace (includes code profiler as well)
SciTech .NET Memory Profiler
更新
SciTech的.NET Memory Profiler具有称为“Dispose Tracker”的功能,该功能可满足OP仅跟踪其应用程序中的Dispose调用的要求。
关于c# - 检测 "leaked"IDisposable对象,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4737056/