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 框架代码还是第三方库代码。