我正在开发一个似乎有漏洞的 C# 应用程序。 我使用了内存分析器,发现我的
private bytes 不断增加,但是 所有 Heaps 中的字节数 没有,这意味着可能是 native 内存泄漏
现在我卡住了,我该如何找到 native 代码中的内存泄漏?
最佳答案
首先,如果您有泄漏进程的转储,您可以在 WinDbg 中打开它并发出命令: !地址-摘要
- 如果 RegionUsageHeap 很大,那么它应该是 native 内存泄漏
- 如果 RegionUsageIsVAD,则它应该是 .NET 内存泄漏。
如果这是 native 泄漏,那么您有 2 个选择:
使用 DebugDiag:出现提示时,选择“Native Memory leak and Handle leak”,选择您要诊断的进程,然后开始使用该应用程序,直到您试验内存泄漏。完成后,生成应用程序的完整转储(右键单击泄漏规则并选择完整用户转储)。然后你可以分析生成的转储(你需要正确配置符号才能有效地工作):在“高级分析”选项卡上,选择“内存压力分析器”,打开转储文件并按“开始分析”。这会生成您可以分析的 html 报告。可以引用这个page以获得详细的演练。
使用应用程序验证程序/WinDbg。在应用程序验证程序中,选择您的应用程序 (.exe)。在测试页面中,确保选择了 Basics/Heaps。在下方 Pane 中,确保“Traces”设置为 true。保存配置后,重新运行应用程序并在发生泄漏时生成完整转储。不要忘记在生成转储后清除应用程序标志。然后您可以从 WinDbg 中打开转储,并在“!heap”命令的帮助下调查泄漏。特别是,'!heap -l' 会给你一个泄漏 block 的列表,'!heap -p -a ' 会显示一个 block 的详细信息,包括分配的调用堆栈。
如果这是 .NET 泄漏,可以使用第三方工具对其进行故障排除。从 1.2 版开始,DebugDiag 也可以执行 .NET 内存泄漏分析(但是从未尝试过)。
关于c# - 如何解决私有(private)字节( native 内存)泄漏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7900433/