WinDbg命令
一、内置帮助命令
命令 | 描述 |
? |
? 显示常规命令
? /D 通过 DML(Debugging Markup Language) 方式显示常规命令 |
.help |
.help 显示 . 系列命令 .help /D 通过 DML 方式显示 . 系列命令 .help /D a* 通过 DML 方式显示所有以 'a' 字母开头的 . 系列命令 |
.chain |
.chain 列出所有已加载的调试器扩展 .chain /D 通过 DML 方式列出所有已加载的调试器扩展 |
.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 的帮助文件 .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 显示有效作用的机器信息 |
.time | 显示系统记录的各种时间 |
.echo |
.echo String 输出字符串 |
四、符号加载命令
命令 | 描述 |
ld |
ld ModuleName 加载指定模块的符号 ld * 加载所有模块的符号 |
!sym |
!sym 获取符号加载状态 !sym noisy 让调试器显示符号搜索详细信息 !sym quiet 默认项,不显示符号搜索信息 |
.sympath |
.sympath 显示和设置符号搜索路径 .sympath+ PathName 增加符号搜索路径 |
.symopt |
.symopt 显示当前符号可选项 .symopt+ Flags 添加符号可选项 .symopt- Flags 移除符号可选项 |
.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 的所有栈的信息 |