查找/避免托管代码中的非托管泄漏的技术

时间:2010-01-07 22:28:10

标签: .net memory-leaks

.NET开发人员在托管应用中寻找(并避免)非托管泄漏的最佳方法是什么?

似乎有许多优秀的资源可用于跟踪托管泄漏,但我在托管应用中跟踪非托管泄漏方面的情况并不多。

This question是相关的,但是从纯粹的非托管的角度来问这个问题,所以很多答案都假设您可以访问非托管代码,并且没有提到任何特定于.NET的陷阱或技术。< / p>

以下是我尝试过的一些(非常基本的)事情:

  • DebugDiag。它看起来非常有前途,它可能适合你,但它碰巧崩溃我的特定应用程序。
  • Rational PurifyPlus。可悲的是,也崩溃了我的应用程序。
  • AQTime(根据@Reed和@Caelum的推荐)。这个程序看起来很棒,但是,就像@Caelum提到的问题的海报一样,AQTime也会崩溃我的应用程序。
  • 暂时删除创建我知道使用非托管内存的对象的代码。
  • 确保应用程序正在处置实施IDisposable
  • 的所有对象

我应该提一下,我能够使用上面的分析器成功分析另一个托管应用程序(泄漏非托管内存)。如果你有一个无法管理的泄漏,请试一试。

2 个答案:

答案 0 :(得分:0)

我认为你已经找到了大多数选项,我发现的最好的方法就是从一开始就考虑我如何使用和调度非托管资源。

正如您所说,确保充分利用IDisposable并考虑终结器以及它们如何影响您的应用程序是我发现的最好的方法,以避免泄漏:)。

DebugDiag是Microsoft性能团队在查找应用程序问题时将使用的内容,我相信为其获取内存转储甚至可以集成到Win 7和Visual Studio 2010中的任务管理器中。

使用DebugDiag时一定要查看SOS扩展。也许更好的问题是问为什么DebugDiag和PurifyPlus会崩溃你的特定应用程序?因为这似乎会导致问题,无论你尝试什么......

答案 1 :(得分:0)

就个人而言,我使用的代码分析器同时支持托管和非托管(以及混合模式)代码:AQTime。它将处理来自托管和非托管代码的跟踪内存,因此它使混合项目中的跟踪泄漏变得更加简单