# 使用DebugDiag工具排查内存问题 DebugDiag下载网址:https://www.microsoft.com/en-us/download/details.aspx?id=103453 **使用 DebugDiag 进行深入分析(特别是内存泄漏检测):** - **创建内存泄漏规则 (Leak Rule):** 要定位泄漏源头,最好使用 DebugDiag 的内存泄漏跟踪功能。 - 打开 DebugDiag Collection。 - 选择 "Memory and Handle Leak" 规则类型。 - 选择你的 .NET 进程。 - 配置规则: - **Tracking Duration:** 设置一个足够长的时间以便观察到明显的内存增长(例如,几小时甚至一天,取决于泄漏速度)。 - **Generate Userdump:** 设置在内存使用达到某个阈值时(比如 4GB)或者在跟踪结束时生成 dump 文件。建议同时勾选 "Generate final userdump..."。 - **Stack Tracking:** 在 "Advanced Settings" -> "Leak Rule" -> "Options" 中,确保 `StackTraceDepth` 设置得足够大(例如 16 或 32),并启用 `StackTrace` 跟踪。这对于定位分配来源至关重要。 - 激活规则,让它运行。 - **分析泄漏 Dump 文件:** - 当规则触发并生成了 dump 文件后,使用 DebugDiag Analysis 进行分析。 - 选择 "Memory Pressure Analysis" 脚本(通常会自动推荐)。 - **关键看点:** - **"Memory Analysis"** 部分:这里会详细列出各个堆的信息。 - **关注 Heap 0x70db0000:** 找到这个堆的详细分析。 - **"Top Allocators" 或 "Virtual Allocation Summary":** DebugDiag 会尝试识别哪些模块(DLL)和函数(如果符号可用)进行了大量的本机内存分配。查看与你的应用程序代码、.NET 运行时库(如 clr.dll, mscorlib.ni.dll 等)或任何可疑的第三方库相关的分配。 - **检查分配堆栈 (Allocation Stacks):** 对于最大的内存分配块,DebugDiag (如果配置了堆栈跟踪) 会显示分配它们时的调用堆栈。仔细检查这些堆栈,它们会直接指向触发本机内存分配的代码路径,无论是你的代码、.NET 框架代码还是第三方库代码。