【问题标题】:Techniques for finding/avoiding unmanaged leaks in managed code在托管代码中查找/避免非托管泄漏的技术
【发布时间】:2010-01-07 22:28:10
【问题描述】:

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

似乎有很多优秀的资源可用于跟踪托管泄漏,但我在托管应用程序中跟踪非托管泄漏的资源并不多。

This question 是相关的,但从纯粹非托管的角度提出问题,因此许多答案都假设您可以访问非托管代码,并且没有提到任何特定于 .NET 的陷阱或技术。

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

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

我应该提到,我能够使用上面的分析器成功地分析另一个托管应用程序(它正在泄漏非托管内存)。如果您有未受管理的泄漏,请尝试一下。

【问题讨论】:

    标签: .net memory-leaks


    【解决方案1】:

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

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

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

    使用 DebugDiag 时,请务必查看 SOS 扩展。也许更好的问题是问为什么 DebugDiag 和 PurifyPlus 会在您的特定应用程序中崩溃?无论您尝试什么,这似乎都会导致问题...

    【讨论】:

    • 你是对的:找到一种使用这些分析器的方法是一个非常好的主意。尽管我的整个应用程序在通过分析器运行时崩溃了,但我已经成功地分析了一个小型的、泄漏的 repro 应用程序。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-09-07
      • 2011-08-22
      • 2023-03-05
      • 2012-01-30
      • 2010-12-03
      • 1970-01-01
      • 1970-01-01
      • 2020-07-11
      相关资源
      最近更新 更多