>我试图在我们的一个应用程序中查找内存泄漏,但它非常难以捉摸。
我用 Ants 内存分析器分析了该程序,发现泄漏在非托管代码中,而 Ants 内存分析器不适合:http://www.red-gate.com/supportcenter/content/ANTS_Memory_Profiler/help/7.4/amp_unmanaged_use 我检查了"图形缓冲区"和"非托管代码中的对象处置问题"部分中的内容,但没有给出任何结果。
然后,我使用了Windows调试诊断工具并进行了内存压力分析。大部分内存使用都在本机堆中:堆 6 0x01ee0000(不是默认进程堆)。泄漏分析中的虚拟分配摘要内存较低,未完成的分配摘要内存较低:所有模块的内存使用率都不高。
如何找到内存泄漏现在的位置?
内存泄漏诊断是 Microsoft CRT 的内置功能,_CrtDumpMemoryLeaks() 函数提供报告。 使用它需要在本机代码中编写单元测试,以便您可以启用调试分配器以使此函数正常工作。 这反过来又要求您必须为此非托管代码提供源代码,以便可以使用 <crtdbg.h>
头文件启用调试分配器,并可以生成单元测试。 基本指南在这里。
通常的症结是你无法访问原生源代码。 在这种情况下,您需要与此代码的供应商或作者合作来解决此问题。 通过为他提供一个演示问题的小型重现项目来推动球的发展。
如果你想要一个真正的内存分析器工具,请查看 http://memprofiler.com/support.aspx。 到目前为止,我用过的最好的内存泄漏工具之一。 .NET 与非托管代码到处都是互操作。 仅仅因为泄漏出现在非托管代码中并不意味着代码中没有某处的保留引用问题。 如果您提供一些您认为存在内存泄漏问题的原因的详细信息以及有关您的解决方案的更多信息,也许我们可以提供更多解决方案。