c# - 如何解决私有(private)字节( native 内存)泄漏?

标签 c# debugging memory-leaks pinvoke

我正在开发一个似乎有漏洞的 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/

相关文章:

c# - 是否可以在 PropertyGrid 中查看公共(public)属性以外的成员?

c# - 如何使用服务帐户通过 .NET C# 访问 Google Analytics API V3?

php - 程序无法启动,因为缺少 php5.dll

xCode 4.3 在暂停或断点处崩溃

c# - 模拟内存泄漏

Vue.js 3 卸载和内存泄漏

c# - WPF DataGrid 绑定(bind)性能问题

c# - 如何将 Azure CloudFileDirectory 移动到新的父 CloudFileDirectory?

c - 调试时无法按名称找到静态变量

memory - 是否可以在 valgrind 中列出泄漏内存的位置?