我正在开发一个 C# 应用程序,该应用程序似乎存在泄漏。
我使用过内存分析器并发现我的
私有字节继续增加但是所有堆中的字节数不,这意味着可能是本机内存泄漏
现在我陷入困境,如何找到本机代码中的内存泄漏?
首先,如果您有泄漏进程的转储,您可以在 WinDbg 中打开它并发出命令:
!地址-摘要
- 如果 RegionUsageHeap 很大,那么应该是本机内存泄漏
- 如果 RegionUsageIsVAD,那么它应该是 .NET 内存泄漏。
如果这是本机泄漏,那么您有 2 个选择:
使用 DebugDiag :出现提示时,选择“本机内存泄漏和处理泄漏”,选择要诊断的进程,然后开始使用应用程序,直到试验内存泄漏。完成后,生成应用程序的完整转储(右键单击泄漏规则并选择完整用户转储)。然后,您可以分析生成的转储(您需要正确配置符号才能使其有效工作):在“高级分析”选项卡上,选择“内存压力分析器”,打开转储文件并按“开始分析”。这会生成您可以分析的 html 报告。你可以参考这个page http://blogs.msdn.com/b/tess/archive/2010/01/14/debugging-native-memory-leaks-with-debug-diag-1-1.aspx详细的演练。
使用应用程序验证器/WinDbg。在应用程序验证程序中,选择您的应用程序 (.exe)。在测试页面中,确保选择了 Basics/Heaps。在下部窗格中,确保“Traces”设置为 true。保存配置后,重新运行应用程序并在发生泄漏时生成完整转储。不要忘记在生成转储后清除应用程序标志。然后,您可以从 WinDbg 中打开转储,并借助“!heap”命令调查泄漏。特别是,“!heap -l”将为您提供泄漏块的列表,“!heap -p -a”将显示块的详细信息,包括分配的调用堆栈。
如果这是 .NET 泄漏,可以使用第三方工具对其进行故障排除。从版本 1.2 开始,DebugDiag 还可以执行 .NET 内存泄漏分析(但从未尝试过)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)