【问题标题】:How can I tell if my managed code is leaking memory due to native library calls?如何判断我的托管代码是否由于本机库调用而泄漏内存?
【发布时间】:2010-09-19 15:48:22
【问题描述】:

我有一个调用本机库的托管 dll。这个本机库通常返回 IntPtrs。这些可以传递给本机库中的其他方法来执行操作,或者告诉库释放与 IntPtr 关联的实例。但只有一些实例需要以这种方式释放,其他实例由库管理。问题是文档并不总是清楚地说明哪些实例必须被释放,哪些不能。

我想知道是否有一种方法可以判断我的代码是否保留了对任何必须释放的指针的引用,从而导致内存泄漏?

【问题讨论】:

  • 我假设您知道您需要在托管类中执行此操作,您正在实现 IDisposable 并正确处理您的对象及其资源。

标签: .net memory-management memory-leaks native


【解决方案1】:

您可能希望考虑使用SafeHandles 来包装从本机代码返回的句柄。它为 IntPtr 提供了一些额外的价值。

【讨论】:

    【解决方案2】:

    我使用 WinDbg(可用 here)。它的命令行驱动,但提供了很多很好的报告,包括堆栈信息、对象数量和占用的大小(这可以帮助指出没有被处理的项目)。

    还有调试诊断工具,它具有内存和句柄泄漏的特定报告。它的here

    【讨论】:

      【解决方案3】:

      最简单的方法可能是使用内存分析器。一个快速的谷歌找到了一个链接到MemProfiler。我已经使用过一次(作为试用版),并且能够找到我没有正确处理 DirectoryEntries 的地方。我敢肯定还有其他人,包括 RedGate 的 one。

      【讨论】:

        猜你喜欢
        • 2011-11-15
        • 1970-01-01
        • 2014-08-09
        • 1970-01-01
        • 2012-01-04
        • 1970-01-01
        • 2010-12-03
        • 2011-09-20
        • 1970-01-01
        相关资源
        最近更新 更多