windows-debugging · git:20260813.54394c9 · 2026-08-13 · sha256 a670229c5ae97764

windows-debugging git:20260813.54394c9A

Immutable. This exact content is served forever at /api/v1/blob/a670229c5ae97764.

---
name: windows-debugging
description: Use the local Windows Debugging Tools (cdb / kd / adplus / umdh / dumpchk) bundled under windows-debugging\10.0.19041.5609 to analyze crash dumps (BSOD / .dmp), attach debuggers, capture process crashes with ADPlus, and hunt memory leaks with UMDH. Trigger when the user mentions WinDbg, analyzing a dump, blue screen, BugCheck, symbol path, ADPlus, or memory leak on Windows.
---

# Windows Debugging Tools (本地免安装版)

本技能封装位于 `windows-debugging\10.0.19041.5609\` 的 Windows 调试工具集(Debugging Tools for Windows,版本 10.0.19041.5609)。所有 `.exe` 均可直接运行,**无需安装、无需管理员**(内核调试除外)。

如果`windows-debugging\10.0.19041.5609\`什么都没有,请通知用户下载

## 关键路径

- 工具根目录(下文用 `$TOOLS` 指代):
  `windows-debugging\10.0.19041.5609\`
- 命令行用户态调试器:`$TOOLS\cdb.exe`
- 内核调试器:`$TOOLS\kd.exe` / `$TOOLS\ntkd.exe`
- 崩溃抓取:`$TOOLS\adplus.exe`
- 堆/内存泄漏:`$TOOLS\umdh.exe`
- dump 校验:`$TOOLS\dumpchk.exe` / `$TOOLS\dumpexam.exe`
- 符号校验:`$TOOLS\symchk.exe`
- 进程列表/终止:`$TOOLS\tlist.exe` / `$TOOLS\list.exe` / `$TOOLS\kill.exe`

## 符号服务器(最重要)

分析 dump 前必须配符号,否则堆栈全是 `???`。微软公共符号服务器:

```
srv*C:\Symbols*https://msdl.microsoft.com/download/symbols
```

- 在 WinDbg 图形界面里:`File > Symbol File Path` 填入上面字符串;或命令窗口执行 `.sympath srv*C:\Symbols*https://msdl.microsoft.com/download/symbols` 然后 `.reload`。
- 用 `cdb`/命令行时通过 `-y` 参数传入:`-y "srv*C:\Symbols*https://msdl.microsoft.com/download/symbols"`。
- 公司私有符号服务器把上面的 URL 换成内网 `srv*` 地址即可。

## 场景 1:分析蓝屏 / 崩溃 dump(`.dmp`)

最常用、最自动化的流程:

1. 用 WinDbg 打开 dump:
   ```
   & "$TOOLS\windbg.exe" -z "C:\path\to\memory.dmp"
   ```
2. 打开后自动执行自动分析命令:
   ```
   !analyze -v
   ```
   重点看输出里的 `BUGCHECK_CODE`、`BUGCHECK_STRING`、大概率 culprit(`Probably caused by`)、以及 `STACK_TEXT` 调用栈。
3. 若符号未加载,先设符号路径再 `.reload`,重跑 `!analyze -v`。
4. 常用辅助命令:
   - `k` / `kP` — 当前线程调用栈(含参数)
   - `lm` — 列出已加载模块及符号状态
   - `!thread` / `!process` — 线程/进程上下文(内核 dump)
   - `!irp` — 查 IRP(驱动相关 BSOD 常用)
   - `dt nt!_EPROCESS` — 查看结构体

**非交互(命令行)一次性分析**:用 `cdb` 把命令串通过 `-c` 传入,适合脚本批量:
```
& "$TOOLS\cdb.exe" -y "srv*C:\Symbols*https://msdl.microsoft.com/download/symbols" -z "C:\path\to\memory.dmp" -c "!analyze -v; q"
```
(末尾 `q` 表示分析完退出。)

## 场景 2:用 ADPlus 抓取进程崩溃 / 挂起

当目标程序**还没崩溃**、需要它在崩溃瞬间自动生成 dump 时:

- 崩溃(Crash)模式:
  ```
  & "$TOOLS\adplus.exe" -crash -pn <进程名.exe> -o "C:\dumps"
  ```
  或按 PID:`-p <PID>`。ADPlus 会挂一个调试器在进程上,进程一崩就写 mini/full dump 到 `-o` 目录。
- 挂起(Hang)模式(进程卡死无响应):
  ```
  & "$TOOLS\adplus.exe" -hang -pn <进程名.exe> -o "C:\dumps"
  ```
- 常见附加参数:`-fullonfirst` 第一次异常就抓 full dump;`-quiet` 静默(适合脚本)。
- 注意:ADPlus 运行期间会拖慢目标进程;抓完用 `kill`/结束调试器即可释放。

## 场景 3:用 UMDH 查用户态内存泄漏

UMDH 比较两次堆快照的差值,定位泄漏点(需 PDB 符号):

1. 用 `gflags.exe` 为目标进程开启用户态栈回溯(Umdh 依赖):
   ```
   & "$TOOLS\gflags.exe" -i <进程名.exe> +ust
   ```
2. 启动目标进程,抓第一份快照:
   ```
   & "$TOOLS\umdh.exe" -p:<PID> -f:"C:\dumps\snap1.txt"
   ```
3. 让程序跑一会儿(制造泄漏),抓第二份:
   ```
   & "$TOOLS\umdh.exe" -p:<PID> -f:"C:\dumps\snap2.txt"
   ```
4. 比较两次快照(需符号路径):
   ```
   & "$TOOLS\umdh.exe" -d:"C:\dumps\snap1.txt" -d:"C:\dumps\snap2.txt" -f:"C:\dumps\diff.txt" -y:"srv*C:\Symbols*https://msdl.microsoft.com/download/symbols"
   ```
   `diff.txt` 里按分配字节数排序,最上面的调用栈就是泄漏来源。
5. 排查完用 `gflags.exe -i <进程名.exe> -ust` 关闭。

## 场景 4:校验 dump / 查符号

- 校验 dump 文件是否完整:
  ```
  & "$TOOLS\dumpchk.exe" "C:\path\to\memory.dmp"
  ```
- 校验某模块符号是否匹配:
  ```
  & "$TOOLS\symchk.exe" /v "C:\path\to\module.dll" /s "srv*C:\Symbols*https://msdl.microsoft.com/download/symbols"
  ```

## 场景 5:进程/USB 辅助排查

- 列出进程:`& "$TOOLS\tlist.exe"` 或 `& "$TOOLS\list.exe"`
- 终止进程:`& "$TOOLS\kill.exe" <PID>`
- 查看 USB 设备树:`& "$TOOLS\usbview.exe"`
- API/操作记录与回放:`& "$TOOLS\logger.exe"` + `& "$TOOLS\logviewer.exe"`

## 注意事项

- 符号缓存目录(如 `C:\Symbols`)首次会下载很多文件,体积较大,属正常现象。
- 内核调试(`kd.exe`)需要目标机开启调试模式并用网络/USB/1394/`kdnet` 连接,普通 dump 分析用不到,非必要时不要碰。