WinDbg命令

一、内置帮助命令

命令 描述
?

?             显示常规命令

WinDbg命令

 

? /D            通过 DML(Debugging Markup Language) 方式显示常规命令

.help

.help        显示 . 系列命令

.help /D       通过 DML 方式显示 . 系列命令

.help /D a*   通过 DML 方式显示所有以 'a' 字母开头的 . 系列命令

WinDbg命令

.chain

.chain          列出所有已加载的调试器扩展

.chain /D      通过 DML 方式列出所有已加载的调试器扩展

WinDbg命令

.extmatch

格式:

.extmatch /e ExtDLL FunctionFilter      显示调试器扩展的所有导出函数

.extmatch /D /e ExtDLL FunctionFilter  通过 DML 方式显示调试器扩展所有导出函数

示例:

.extmatch /D /e ntsdexts *                       显示 uext 扩展中的所有导出函数

ExtDLL是.chain命令中找到的,如dbghelp、ext、exts、uext和ntsdexts

.hh

.hh         打开 WinDbg 的帮助文件

WinDbg命令

.hh Text  打开 WinDbg 的帮助文件,并自动搜索 Text 的内容

.hh dt     在 WinDbg 帮助文件中搜索 dt 命令

二、调试会话命令

命令 描述
.attach .attach PID 附加到指定ID的进程
.detach .detach      结束调试会话,被调试进程仍可继续运行
q

q/qq          结束调试会话,同时终止被调试进程的进行     

.restart .restart      重启被调试应用

三、信息命令

命令 描述
version

显示调试器版本信息和已加载的调试器扩展

显示内容相当于.chain加上版本信息

vercommand 显示调试器启动文件即WinDbg.exe所在的路径
vertarget 显示目标机器的版本
CTRL+ALT+V 打开或关闭 Verbose 模式开关,某些命令在此模式下可以给出更多详细信息
.formats

.formats Expression  显示数字的各种格式信息

.formats 5  会显示5的各种进制转换的值等

.cls 清理WinDbg的Command窗口
.last event 显示最新的异常信息或事件信息
.effmach

.effmach 显示有效作用的机器信息
.effmach . 
.effmach # 
.effmach x86 / AMD64 / ...

WinDbg命令

.time 显示系统记录的各种时间
.echo

.echo String  输出字符串

四、符号加载命令

命令 描述
ld

ld ModuleName  加载指定模块的符号

ld *                  加载所有模块的符号

!sym

!sym                获取符号加载状态

!sym noisy       让调试器显示符号搜索详细信息

!sym quiet        默认项,不显示符号搜索信息

.sympath

.sympath         显示和设置符号搜索路径

.sympath+ PathName      增加符号搜索路径

.symopt

.symopt            显示当前符号可选项

.symopt+ Flags  添加符号可选项

.symopt- Flags   移除符号可选项

WinDbg命令

.symfix

.symfix                              设置符号库路径

.sym+ PathName  添加符号库路径

x

x [Options] Module!Symbol    模式匹配符号信息

x /t ..            根据数据类型匹配

x /v ..            显示详细信息

x /a ..            按照地址排序

x /n ..            按照名称排序

x /z ..            按照大小排序

x *!               列出所有模块

x xxxx!*          列出xxxx模块

.reload

.reload                            重新加载符号信息

.reload [/f | /v]                /f 强制立即加载符号 /v 显示详细信息

.reload [/f | /v] Module     Module 为指定模块加载符号信息

示例:

.reload /f @"C:\WINNT\System32\verifier.dll"

五、模块加载命令

命令 描述
 lm

lm[ v | l | k | u | f ] [m Pattern] 显示已加载的模块

lm   显示所有加载和未加载的模块信息

lmv 显示已加载模块的详细信息

lml  同时显示加载的符号信息

lmk 显示内核模块信息

lmu 显示用户模块信息

lmf  显示镜像路径

lmm 匹配模块名称

lmD 使用 DML 方式显示

lmv m kernel32 显示 kernel32 模块详细信息

!dlls

!dlls         列出所有加载的模块和加载数量

!dlls -i      根据初始化顺序

!dlls -l      根据加载顺序(默认项)

!dlls -m    根据内存顺序

!dlls -v     显示更多详细信息

!dlls -c ModuleAddr  仅显示 ModuleAddr 地址的模块信息

!dlls -?     显示帮助

!dlls -v -c kernel32 显示 kernel32.dll 的信息

!lmi

!lmi Module    显示模块的详细信息,包括加载符号信息

!lmi kernel32  显示 kernel32.dll 模块的信息

六、异常分析命令

命令 描述
!analyze

!analyze -v       显示当前异常的详细信息

!analyze -hang  诊断线程调用栈上是否有任何线程阻塞了其他线程

!analyze -f        查看异常分析信息,尽管调试器并未诊断出异常

七、进程信息命令

命令 描述
!dml_proc

通过 DML 方式显示当前进程的信息

.tlist 显示当前所有进程

八、线程信息命令

命令 描述
~                              

~  显示线程信息

~* [Command]           所有线程

~. [Command]            当前线程

~# [Command]           引发当前事件或异常的线程

~Number [Command]  显示指定序号的线程

~~[TID] [Command]   显示指定线程ID的线程

~Ns                          切换到线程 N

~* k  显示所有线程的调用栈

~2 f   冻结2号线程

~# f  冻结引发异常的线程

~3 u  解除对3号线程的冻结

~2 k  显示2号线程的调用栈

~e

~* e CommandString            在所有线程上执行命令

~. e CommandString             在当前线程上执行命令

~# e CommandString            在引发异常的线程上执行命令

~Number e CommandString   在指定序号的线程上执行命令

~2e r; k; kd  相当于 ~2r; ~2k; ~2kd

~*e !gle       显示所有线程的最后一个错误信息

~f ~Thread f    冻结线程
~u ~Thread u   解除冻结线程
~n ~Thread n   挂起线程,增加线程挂起数量
~m ~Thread m  恢复线程,减少线程挂起数量
!teb 显示线程环境信息
!tls 

!tls -1          -1 为显示当前线程所有的 slot 信息

!tls SlotIdx   显示指定的 slot 信息

!tls [-1 | SlotIdx] TebAddr

.ttime 显示线程时间信息
!runaway

[Flags: 0 | 1 | 2] 显示每个线程消耗的时间,用于快速的查找 CPU 时间消耗最多的线程

0 用户态时间

1 内核态时间

2 自线程创建起的时间间隔

!gle

!gle         显示当前线程的最后错误

!gle -all    显示所有线程的最后错误

!error

!error ErrValue      解析错误信息

!error ErrValue 1   将错误值作为 NTSTATUS 代码

九、堆栈信息命令

命令 描述
k

k [n] [f] [L] [#Frames]  显示调用栈信息

kn      调用栈包含帧号

kf       临近帧的距离

kL       忽略源代码

kb ...  最开始的 3 参数

kp ...  所有的参数,包括参数类型、名称和值

kP ...  所有的参数

kv ...  FPO信息

kb 5   显示最开始的 5 个帧

kd kd [WordCnt]  显示原始栈数据和可能的符号信息
kM 使用 DML 格式显示堆栈信息
.kframes 设置栈长度,默认是20(0x14)
.frame

.frame            显示当前帧

.frame #         指定帧号

.frame 2         显示帧号 2 的信息

 

.frame /r [#]   显示寄存器信息

.frame /r 0d    显示 0 帧中寄存器信息

!uniqstack

!uniqstack                   显示所有线程的栈信息

!uniqstack [b|v|p] [n]   b=前3个参数;v=FPO信息;p=所有参数;n=帧号

!uniqstack -?               显示帮助

!findstack

!findstack Symbol              找到包含符号或模块的栈

!findstack Symbol [0|1|2]   0=仅显示线程ID;1=线程ID和帧;2=全部的线程栈;

!findstack -?                      显示帮助

!findstack clr 2                   显示包含 clr 的所有栈的信息