ProcDump 学习笔记(6.14):在调试器中查看转储(WinDbg / Visual Studio 快速上手)
ProcDump 学习笔记(6.14):在调试器中查看转储(WinDbg / Visual Studio 快速上手)
- ProcDump 学习笔记(6.14):在调试器中查看转储(WinDbg / Visual Studio 快速上手)
- 1)打开前的三个要点
- 2)WinDbg(经典路径)
- 常用指令速查
- .NET 托管进程必备(SOS)
- 3)Visual Studio(图形化快速定位)
- 4)一键初始化脚本(WinDbg 粘贴即可)
- 5)三大场景的“最短路径”
- 6)常见坑位与规避
- 7)结语
ProcDump 学习笔记(6.14):在调试器中查看转储(WinDbg / Visual Studio 快速上手)
抓到 Dump 只是第一步,**在调试器里把证据“翻译成结论”**才是价值所在。本文给出 WinDbg/VS 的最短路径与常用指令清单,覆盖 Crash、Hang/高 CPU、OOM 三大高频场景。
1)打开前的三个要点
-
匹配位数:x64 进程用 WinDbg x64 打开;x86 进程用 WinDbg x86。位数不匹配会导致扩展/堆分析异常。
-
Dump 类型决定可见性:
MiniPlus:轻量,适合初判(栈/线程/模块/句柄);Full:包含全部用户态内存,适合大堆/OOM/泄漏深挖。
-
符号路径(强烈建议设置缓存):
srv*C:\Symbols*https://msdl.microsoft.com/download/symbols
2)WinDbg(经典路径)
-
File → Open Crash Dump 选择
.dmp; -
在命令窗口依次执行(可粘贴一整段):
.symfix; .sympath+ srv*C:\Symbols*https://msdl.microsoft.com/download/symbols .reload /f !analyze -v
常用指令速查
-
异常/崩溃
!analyze -v .ecxr ; 切到异常上下文 k/kp/kv ; 查看当前线程调用栈 lm ; 模块列表(看自家模块/PDB是否加载) -
Hang / 高 CPU
!runaway ; 统计各线程累计 CPU 时间 → 锁定最忙线程 ~* kb ; 所有线程栈 !locks ; 互斥/临界区死锁线索(exts 扩展) -
本机内存/OOM(原生)
!address -summary !heap -s !heap -flt s 400 ; 找 >= 0x190(400) 字节分配热点 !handle 0 7 ; 句柄分布(对象泄漏线索)
.NET 托管进程必备(SOS)
-
加载 SOS:
.loadby sos clr ; .NET Framework .load sos ; .NET Core/5+/需要定位 sos 路径时 -
托管堆/对象分析:
!eeheap -gc !dumpheap -stat !dumpheap -type System.String !gcroot <ObjAddr> !threads !clrstack !syncblk ; 锁等待/争用
经验:先
!runaway找最忙线程 → 看该线程!clrstack/kp;OOM 则优先!dumpheap -stat看大类对象、再!gcroot溯源。
3)Visual Studio(图形化快速定位)
- 直接双击
.dmp(或 VS:File → Open → File…); - 选择 Debug with Mixed/Managed/Native(按进程栈类型选择);
- 重点界面:Call Stack / Threads / Exception / Diagnostic Tools;
- 托管堆:VS 自带托管内存分析较弱,建议配合 WinDbg+SOS 做深挖。
VS 优点是低门槛与源码/断点联动;复杂场景(泄漏、大堆、锁)仍建议回到 WinDbg。
4)一键初始化脚本(WinDbg 粘贴即可)
.symfix; .sympath+ srv*C:\Symbols*https://msdl.microsoft.com/download/symbols
.reload /f
!analyze -v
.bp kernel32!RaiseException ; 若为异常类问题,可临时断在抛处(适用于活体调试)
.NET 追加(若是托管):
.loadby sos clr
!threads
!clrstack
!eeheap -gc
!dumpheap -stat
5)三大场景的“最短路径”
- Crash:
!analyze -v → .ecxr → kv/kp → 定位异常方法与参数 → 源码 & 复现 - Hang / 高 CPU:
!runaway → 锁定最忙线程 → ~#s 切换 → kb/!clrstack → !locks/!syncblk - OOM/泄漏:
(原生)!address -summary → !heap -s/!heap -flt
(托管)!eeheap -gc → !dumpheap -stat → !dumpheap -type X → !gcroot
6)常见坑位与规避
- 位数不匹配:x64 Dump 请用 x64 WinDbg,x86 同理。
- 无符号/PDB:设置好符号服务器与本地缓存;自家模块尽量产出 PDB。
- MiniPlus 不含大堆:看不到对象内容是正常现象,改用 Full Dump。
- SOS 版本不匹配:优先
.loadby sos clr;.NET Core/5+ 需对应 runtime 的 sos。 - 优化内联导致栈不完整:首选带符号的 Release,必要时临时禁用过激优化以复现。
7)结语
- Dump → 10 分钟得到方向:WinDbg 基本三板斧(
!analyze -v/ 栈 / 符号)即可排除 70% 的不确定性; - 形成团队模板:Crash/Hang/OOM 三类“指令清单 + 结论模版”,让排障从“个人技巧”变成“流程资产”。
