WinDbg用法总结:命令分类与常用命令详解
一、WinDbg命令类型概述
WinDbg的命令主要分为三大类:
- 内置命令:基本调试命令
- 元命令(以
.开头):控制调试器行为
- 扩展命令(以
!开头):由扩展模块提供的高级功能
二、按功能分类的常用命令
1. 执行控制命令
| 命令 |
用法 |
说明 |
| g |
g |
继续执行程序 |
| p |
p |
单步执行(跳过函数调用) |
| t |
t |
单步执行(进入函数调用) |
| gu |
gu |
执行到当前函数返回 |
| Ctrl+Break |
- |
中断程序执行 |
2. 断点管理命令
| 命令 |
用法 |
说明 |
| bp |
bp [address/module!function] |
在指定地址设置断点 |
| bu |
bu [address] |
设置未解析断点(符号加载后才生效) |
| bl |
bl |
列出所有断点 |
| bc |
bc [id] |
清除指定断点 |
| bd |
bd [id] |
禁用指定断点 |
| be |
be [id] |
启用指定断点 |
| bm |
bm [pattern] |
使用通配符设置多个断点 |
3. 寄存器操作命令
| 命令 |
用法 |
说明 |
| r |
r |
显示所有寄存器 |
| r |
r eax=0x1234 |
修改指定寄存器值 |
| r? |
r? |
显示浮点寄存器 |
4. 内存操作命令
| 命令 |
用法 |
说明 |
| db |
db [address] L[length] |
以字节格式显示内存 |
| dd |
dd [address] L[length] |
以双字格式显示内存 |
| dq |
dq [address] L[length] |
以四字格式显示内存 |
| du |
du [address] |
显示Unicode字符串 |
| da |
da [address] |
显示ANSI字符串 |
| ed |
ed [address] [value] |
编辑双字内存 |
| lm |
lm |
列出所有模块 |
WinDbg提供了多种内存命令用于查看和分析内存内容,这对调试内存相关问题非常关键。
5. 堆栈分析命令
| 命令 |
用法 |
说明 |
| k |
k |
显示完整调用堆栈 |
| kb |
kb |
显示调用堆栈及前三个参数 |
| kp |
kp |
显示调用堆栈及所有参数 |
| kc |
kc |
显示紧凑格式的调用堆栈 |
| kn |
kn |
显示调用堆栈及帧号 |
6. 符号管理命令
| 命令 |
用法 |
说明 |
| .sympath |
.sympath [path] |
设置符号路径 |
| .reload |
.reload [/f] |
重新加载符号,/f强制加载 |
| ld |
ld [module] |
加载指定模块的符号 |
要强制实际加载符号,可以使用/f选项,或使用ld(Load Symbols)命令。
7. 扩展命令(!开头)
通用扩展命令
| 命令 |
用法 |
说明 |
| !analyze |
!analyze -v |
自动分析崩溃原因,是处理dump文件最常用的命令 |
| !process |
!process 0 0 |
列出所有进程信息 |
| !thread |
!thread |
显示当前线程详细信息 |
| !heap |
!heap -s |
查看所有堆的摘要信息 |
SOS扩展(.NET调试)
| 命令 |
用法 |
说明 |
| !dumpheap |
!dumpheap -stat |
统计堆中对象 |
| !dumpheap |
!dumpheap -type [type] |
dump特定类型的所有对象 |
| !dumpobj |
!dumpobj [address] |
显示对象详细信息 |
| !clrstack |
!clrstack |
显示.NET调用堆栈 |
| !threads |
!threads |
显示所有.NET线程 |
| !eeheap |
!eeheap -gc |
查看GC堆信息 |
WinDbg提供了SOS扩展用于分析.NET内存,包括dump所有对象、获取内存统计信息、查看堆摘要等功能。
8. 元命令(.开头)
| 命令 |
用法 |
说明 |
| .help |
.help |
显示内置命令帮助 |
| .logopen |
.logopen [filename] |
开始记录调试会话到日志文件 |
| .logclose |
.logclose |
关闭日志文件 |
| .effmach |
.effmach [machine] |
设置有效机器类型 |
| .excr |
.excr |
显示异常记录 |
9. 进程和线程管理
| 命令 |
用法 |
说明 |
| | |
| |
显示所有调试会话和进程 |
| ~ |
~ |
显示所有线程 |
| ~n |
~0s |
切换到指定线程(0s表示第一个线程) |
| ~* |
~* e !clrstack |
在所有线程上执行命令 |
三、常用场景命令组合
1. 分析崩溃转储
.symfix ; 自动设置符号路径
.reload /f ; 强制重新加载符号
!analyze -v ; 自动分析崩溃原因
k ; 查看调用堆栈
r ; 查看寄存器状态
dv ; 查看局部变量
2. .NET内存泄漏分析
.loadby sos clr ; 加载SOS扩展
!dumpheap -stat ; 统计堆中对象
!dumpheap -type [type] ; 分析特定类型对象
!gcroot [object] ; 查找对象根引用
!finalizequeue ; 查看待 finalize 对象
四、实用技巧
- 使用
?进行表达式求值:? 0n10 + 0x10
- 脚本中带空格的路径或参数需要加引号,参数间以空格分开,分号是命令的分割符
- 使用
windbgx -I命令注册WinDbg作为自动系统调试器,应用程序崩溃时会自动启动
- 使用
.logopen记录调试过程以便后续分析
- 使用
!ext.help查看扩展命令帮助