《WinDbg 命令三部曲:(一)WinDbg 命令手册》

from:https://www.cnblogs.com/gaochundong/p/windbg_cheat_sheet.html

系列博文

  1. 《WinDbg 命令三部曲:(一)WinDbg 命令手册》
  2. 《WinDbg 命令三部曲:(二)WinDbg SOS 扩展命令手册》
  3. 《WinDbg 命令三部曲:(三)WinDbg SOSEX 扩展命令手册》

导航目录

调试准备

为了测试 WinDbg 中使用 SOS 扩展命令,我创建了应用程序 "MemoryLeakApp.exe",Visual Studio 程序选择为 64 位环境编译。

《WinDbg 命令三部曲:(一)WinDbg 命令手册》

《WinDbg 命令三部曲:(一)WinDbg 命令手册》

 "MemoryLeakApp.exe" 启动运行后可能占用内存600M。

《WinDbg 命令三部曲:(一)WinDbg 命令手册》

《WinDbg 命令三部曲:(一)WinDbg 命令手册》

此时,选择使用 64 位 WinDbg 来调试程序。我们先通过 Attach Process 方式来调试。

《WinDbg 命令三部曲:(一)WinDbg 命令手册》

《WinDbg 命令三部曲:(一)WinDbg 命令手册》

《WinDbg 命令三部曲:(一)WinDbg 命令手册》

当然,如果我们使用了 32 位的 WinDbg 去 Attach 进程,会直接报错。

《WinDbg 命令三部曲:(一)WinDbg 命令手册》

 

WinDbg 常用命令手册

内置帮助命令
命令 描述
?

?             显示常规命令

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

.help

.help        显示 . 系列命令

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

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

《WinDbg 命令三部曲:(一)WinDbg 命令手册》

.chain

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

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

《WinDbg 命令三部曲:(一)WinDbg 命令手册》

.extmatch

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

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

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

《WinDbg 命令三部曲:(一)WinDbg 命令手册》

.hh

.hh         打开 WinDbg 的帮助文件

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

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

调试会话命令
命令 描述
.attach

.attach PID 附加到指定ID的进程

.detach

.detach      结束调试会话,被调试进程仍可继续运行

《WinDbg 命令三部曲:(一)WinDbg 命令手册》

q

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

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

.restart

.restart      重启被调试应用

一般信息命令
命令 描述
version

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

《WinDbg 命令三部曲:(一)WinDbg 命令手册》

vercommand

显示调试器启动文件的路径

《WinDbg 命令三部曲:(一)WinDbg 命令手册》

vertarget

显示目标机器的版本

《WinDbg 命令三部曲:(一)WinDbg 命令手册》

CTRL+ALT+V

打开或关闭 Verbose 模式开关,某些命令在此模式下可以给出更多详细信息

.formats

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

.formats 5

《WinDbg 命令三部曲:(一)WinDbg 命令手册》

.cls

清理屏幕

.last event 显示最新的异常信息或事件信息
.effmach

.effmach 显示有效作用的机器信息
.effmach .
.effmach #
.effmach x86 | amd64 | ia64 | ebc

.time

显示系统记录的各种时间

《WinDbg 命令三部曲:(一)WinDbg 命令手册》

.echo

.echo String  输出字符串

.echo "String"

.echo "Hello World"

《WinDbg 命令三部曲:(一)WinDbg 命令手册》

符号加载命令
命令 描述
ld

ld ModuleName  加载指定模块的符号

ld *                  加载所有模块的符号

《WinDbg 命令三部曲:(一)WinDbg 命令手册》

!sym

!sym                获取符号加载状态

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

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

《WinDbg 命令三部曲:(一)WinDbg 命令手册》

.sympath

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

.sympath+       增加符号搜索路径

.sympath+ C:\Symbols

.symopt

.symopt            显示当前符号可选项

.symopt+ Flags  添加符号可选项

.symopt- Flags   移除符号可选项

.symfix

.symfix                           设置符号库路径

.sym+ DownstreamStore  添加符号库路径

x

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

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

x /v ..            显示详细信息

x /a ..            按照地址排序

x /n ..            按照名称排序

x /z ..            按照大小排序

x *!               列出所有模块

《WinDbg 命令三部曲:(一)WinDbg 命令手册》

x ntdll!*          列出 ntdll 模块

《WinDbg 命令三部曲:(一)WinDbg 命令手册》

x /t /v ntdll!*    列出 ntdll 模块数据类型和符号类型

《WinDbg 命令三部曲:(一)WinDbg 命令手册》

.reload

.reload                            重新加载符号信息

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

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

.reload /f @"ntdll.dll"

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

模块加载命令
命令 描述
 lm

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

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

《WinDbg 命令三部曲:(一)WinDbg 命令手册》

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

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

lmk 显示内核模块信息

lmu 显示用户模块信息

lmf  显示镜像路径

lmm 匹配模块名称

lmD 使用 DML 方式显示

《WinDbg 命令三部曲:(一)WinDbg 命令手册》

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

《WinDbg 命令三部曲:(一)WinDbg 命令手册》

!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 模块的信息

《WinDbg 命令三部曲:(一)WinDbg 命令手册》

异常分析命令
命令 描述
!analyze

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

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

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

《WinDbg 命令三部曲:(一)WinDbg 命令手册》

进程信息命令 线程信息命令~                              显示线程信息

 

《WinDbg 命令三部曲:(一)WinDbg 命令手册》

~* [Command]           所有线程

《WinDbg 命令三部曲:(一)WinDbg 命令手册》

~. [Command]            当前线程

《WinDbg 命令三部曲:(一)WinDbg 命令手册》

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

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

《WinDbg 命令三部曲:(一)WinDbg 命令手册》

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

~Ns                          切换到线程 N

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

~2 f   冻结2号线程

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

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

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

《WinDbg 命令三部曲:(一)WinDbg 命令手册》

~e

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

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

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

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

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

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

《WinDbg 命令三部曲:(一)WinDbg 命令手册》

~f

~Thread f    冻结线程

~u

~Thread u   解除冻结线程

~n

~Thread n   挂起线程,增加线程挂起数量

~m

~Thread m  恢复线程,减少线程挂起数量

!teb

显示线程环境信息

《WinDbg 命令三部曲:(一)WinDbg 命令手册》

!tls 

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

!tls SlotIdx   显示指定的 slot 信息

!tls [-1 | SlotIdx] TebAddr

《WinDbg 命令三部曲:(一)WinDbg 命令手册》

.ttime

显示线程时间信息

《WinDbg 命令三部曲:(一)WinDbg 命令手册》

!runaway

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

0 用户态时间

1 内核态时间

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

《WinDbg 命令三部曲:(一)WinDbg 命令手册》

!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 个帧

《WinDbg 命令三部曲:(一)WinDbg 命令手册》

kd

kd [WordCnt]  显示原始栈数据和可能的符号信息

kM

使用 DML 格式显示堆栈信息

.kframes

设置栈长度,默认是20(0x14)

.frame

.frame            显示当前帧

.frame #         指定帧号

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

.frame 2         显示帧号 2 的信息

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

《WinDbg 命令三部曲:(一)WinDbg 命令手册》

!uniqstack

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

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

!uniqstack -?               显示帮助

《WinDbg 命令三部曲:(一)WinDbg 命令手册》

!findstack

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

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

!findstack -?                      显示帮助

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

《WinDbg 命令三部曲:(一)WinDbg 命令手册》

扩展帮助命令

!Uext.help

用户态模式扩展命令帮助

《WinDbg 命令三部曲:(一)WinDbg 命令手册》

!Ntsdexts.help

用户态扩展命令帮助(OS相关)

《WinDbg 命令三部曲:(一)WinDbg 命令手册》

!logexts.help

日志相关扩展

《WinDbg 命令三部曲:(一)WinDbg 命令手册》

!clr10\sos.help

调试托管代码

!wow64exts.help

wow64调试器扩展

!Wdfkd.help

内核态驱动框架扩展

!Gdikdx.help

图形驱动扩展

!NAME.help

显示任何 NAME 名称的扩展命令的帮助
日志扩展命令
命令 描述

!logexts.help

 显示所有日志扩展命令

!loge

!loge [dir]  打开日志功能,可选配置输出目录

!logi

初始化日志功能

!logd

关闭日志功能

!logo

!logo                    列出日志配置信息

!logo [e|d] [d|t|v]  打开或关闭日志,d=调试器,t=文本文件,v=详细信息

!logc

!logc                        列出所有日志类型

!logc p #                  列出 # 中的日志类型

!logc [e|d] *              打开或关闭所有日志类型

!logc [e|d] # [#] [#]  打开或关闭日志类型 #

!logb

!logb p  打印缓冲区信息至调试器

!logb f   刷新缓冲区内容之日志文件

!logm

!logm                          显示模块的包含或屏蔽列表

!logm [i|x] [DLL] [DLL]  指定模块的包含或屏蔽列表

参考资料

本文为 Dennis Gao 原创技术文章,发表于博客园博客,未经作者本人允许禁止任何形式的转载。

系列博文

    1. 《WinDbg 命令三部曲:(一)WinDbg 命令手册》
    2. 《WinDbg 命令三部曲:(二)WinDbg SOS 扩展命令手册》
    3. 《WinDbg 命令三部曲:(三)WinDbg SOSEX 扩展命令手册》

《WinDbg 命令三部曲:(一)WinDbg 命令手册》

上一篇:mysql5.7 报错Got an error reading communication packets 关于Aborted connection告警日志的分析


下一篇:Javaweb 编解码流程