如何解决私有字节(本机内存)泄漏?

时间:2011-10-26 08:40:16

标签: c# debugging memory-leaks pinvoke

我正在开发一个似乎有漏洞的C#应用​​程序。 我使用了内存分析器,发现了我的

私有字节继续增加,但所有堆中的字节不会,这意味着它可能是本机内存泄漏

现在我卡住了,如何在本机代码中发现内存泄漏?

5 个答案:

答案 0 :(得分:4)

首先,如果你有一个泄漏过程的转储,你可以在WinDbg中打开它并发出命令: !address -summary

  • 如果RegionUsageHeap很大,那么它应该是本机内存泄漏
  • 如果是RegionUsageIsVAD,那么它应该是.NET内存泄漏。

如果这是本机泄漏,那么您有两个选择:

  • 使用DebugDiag:在提示时,选择“本机内存泄漏和处理泄漏”,选择要诊断的进程,并开始使用应用程序,直到您尝试内存泄漏。完成后,生成应用程序的完整转储(右键单击泄漏规则并选择完全用户转储)。然后,您可以分析生成的转储(您需要正确配置符号才能使其高效工作):在“高级分析”选项卡上,选择“内存压力分析器”,打开转储文件并按“开始分析”。这会生成您可以分析的HTML报告。您可以参考此page获取详细的演练。

  • 使用Application Verifier / WinDbg。在应用程序验证程序中,选择您的应用程序(.exe)。在测试页面中,确保选择了Basics / Heaps。在下部窗格中,确保“Traces”设置为true。保存配置后,重新运行应用程序并在发生泄漏时生成完全转储。生成转储后,不要忘记清除应用程序标志。然后你可以从WinDbg中打开转储,并在'!heap'命令的帮助下调查泄漏。特别是,'!heap -l'将为您提供泄漏块的列表,'!heap -p -a'将显示块的详细信息,包括分配的调用堆栈。

如果这是.NET泄漏,可以使用第三方工具对其进行故障排除。从版本1.2开始,DebugDiag也可以执行.NET内存泄漏分析(但从未尝试过这种方法)。

答案 1 :(得分:3)

诊断托管应用程序中的本机内存泄漏(至少最初)非常类似于诊断任何其他本机应用程序中的内存泄漏。

我通常解决这些问题的方法是让进程泄漏大量内存,进行完整的进程转储,然后检查转储以查看使用最多内存的内容。例如,如果你的进程有一个~20MB的正常/初始私有字节,但你可以让你的进程泄漏内存,直到它有~200MB的私有字节,那么很可能会泄漏~180MB的内存 - 一般来说分配最多内存的是你应该开始寻找的地方。

Microsoft有一个非常有用的工具叫DebugDiag - 最初开发用于诊断IIS中的内存泄漏,它是一个非常多用途的工具,在处理内存问题时非常方便。如果你给它一个崩溃转储,它将执行一些分析,并且应该(至少)告诉你哪个模块已经分配了所有内存,然后你可以开始更具体地查看该模块的使用方式。

答案 2 :(得分:0)

如果没有更多信息,很难给你一个坚实的回复,但听起来你试图使用的lib有内存泄漏。您需要使用适当的工具来使用lib,具体取决于它所使用的语言。如果您没有lib的源代码,请联系开发人员并让他们修复泄漏。

如果您可以发布库的名称和一些源代码(以及本机方法签名),我们可能会给您一些更具体的建议。

答案 3 :(得分:0)

<。> .net框架管理的堆中的私有字节,您需要使用专业工具来分析您的源。比如使用红门内存分析器,查找已创建但未被处理的对象。

答案 4 :(得分:0)

通常使用ANTS Memory Profiler获取内存泄漏时,我获得了最佳效果。

Or other tools,我个人对ANTS有最好的经历)