C# · 12月 26, 2021

c# – 检测“泄漏”的IDisposable对象

有很多问题,询问如何检测IDisposable对象泄漏.似乎答案是 “you can’t”.

我刚刚检查了最简单的测试用例,FxCop 10.0没有这样做,ReSharper 4与MSVS2010不这样做.

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

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

WinDBG SOS的魔术技巧怎么样?

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

想法?

注意这个问题的标题可能是误导性的.这里的真正问题应该是是否已经将Dispos()适当地放入IDisposable对象中. GC处理不算,因为我认为这是一个错误.

编辑:解决方案:.NET内存分析器做这个工作.我们只需要在程序结束时垃圾邮件发送几个GC.Collect(),以使我们的分析器能够正确地获取统计信息.

解决方法 你没有足够的搜索.有大量的.NET内存分析器,它会在程序运行时看到你的程序,并让你知道你的内存在哪里(如何泄漏).

我会检查以下任何一个:

Microsoft’s CLR Memory Profiler (free)
RedGate ANTS Memory Profiler
JetBrain’s DotTrace (includes code profiler as well)
SciTech .NET Memory Profiler

更新

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