前面介绍了Windbg的UI功能,也基本上能完成基本的调试任务,可是WinDBG主要是以命令方式工做的,这些命令在Command Window里输入。WinDBG共支持三类命令:标准命令、元命令和扩展命令。某些命令仅在实时调试中可用,其余命令仅在调试转储文件时可用。某些命令仅在用户模式调试期间可用,其余命令仅在内核模式调试期间可用。只有当目标在某些处理器上运行时,某些命令才可用。sass
1、标准命令安全
标准命令(standard command)用来提供适用于全部调试目标的基本调试功能.标准命令一般是一两个字符(version除外)或者符号,只有version等少数命令除外。标准命令的第一个字符是不分大小写的, 第二个字符可能区分大小写。全部标准命令都是实如今WinDBG内部的, 执行这些命令时不须要加载任何扩展模块。迄今为止, WinDBG调试器共实现了130多条标准命令, 分为60多个系列. 为了便于记忆, 能够根据功能将标准命令概括为以下18个子类。在命令编辑框中输入一个问号(?), 能够显示出主要的标准命令和每一个命令的简单介绍。服务器
功能 | 命令 | 描述/助记 | 补充信息 |
恢复运行 | g | Go | ~123g, ~#g, ~*g |
跟踪执行 | t | Trace | |
单步执行 | p | Step | |
追踪监视 | wt | Trace and Watch Data |
功能 | 命令 | 描述/助记 | 补充信息 |
观察和修改通用寄存器 | r | Registers | |
读写MSR寄存器 | rdmsr和wrmsr | Read MSR and Write MSR | |
设置寄存器显示掩码 | rm | Register Mask |
功能 | 命令 | 描述/助记 |
读IO端口 | ib, iw, id | Input from port (byte, word, double word) |
写IO端口 | ob, ow, od | Output to port (byte, word, double word) |
功能 | 命令 | 描述/助记 | 补充信息 |
观察内存 | d系列 | Display Memory | d, da, db, dc, dd, dD, df, dp, dq, du, dw, dW, dyb, dyd |
编辑内存 | e系列 | Enter Values | e, ea, eb, ed, eD, ef, ep, eq, eu, ew, eza, ezu |
搜索内存 | s | Search Memory | sb, sw, sd, sq, sa, su |
功能 | 命令 | 描述/助记 | 补充信息 |
观察栈 | k系列 | Display Stack Backtrace | k, kb, kc, kd, kp, kP, kv |
功能 | 命令 | 描述/助记 |
软件断点 | bp, bu, bm | Set Breakpoint, Set Unresolved Breakpoint, Set Symbol Breakpoint |
硬件断点 | ba | Break on Access |
管理断点 | bl | Breakpoint List |
清除,禁止,从新启用断点 | bc, bd, be | Breakpoint Clear, Breakpoint Disable, Breakpoint Enable |
功能 | 命令 | 描述/助记 |
显示控制线程 | ~ | Thread Status |
功能 | 命令 | 描述/助记 |
显示进程 | | | Process Status |
功能 | 命令 | 描述/助记 |
评估表达式 | ? | Evaluate Expression |
评估C++表达式 | ?? | Evaluate C++ Expression |
功能 | 命令 | 描述/助记 |
汇编 | a | Assemble |
反汇编 | u | Unassemble |
功能 | 命令 | 描述/助记 |
显示段的选择子 | dg | Display Selector: shows the segment descriptor for the specified selector |
功能 | 命令 | 描述/助记 | 补充信息 |
运行命令脚本文件 | $ | Run Script File | $<, $><,
<,
|
><, $$>a< |
功能 | 命令 | 描述/助记 | 补充信息 |
异常发生或者某事件发生时debuger的处理方式 | sx系列 | Set Exceptions | sx, sxd, sxe, sxi, sxn, sxr, sx- |
启用与禁止静默模式 | sq | Set Quiet Mode | sq |
设置内核debugging选项 | so | Set Kernel Debugging Options | |
设置符号后缀 | ss | Set Symbol Suffix | ss [a|w|n] |
功能 | 命令 | 描述/助记 |
显示调试器和调试目标版本 | version | Show Debugger Version |
显示调试目标所在系统的信息 | vertarget | Show Target Computer Version |
功能 | 命令 | 描述/助记 |
检查符号 | x | Examine Symbols |
功能 | 命令 | 描述/助记 | 补充信息 |
控制和显示源程序 | ls系列 | List Source Lines | ls, lsa, lsp, lsc, lsf |
功能 | 命令 | 描述/助记 |
加载调试符号 | ld | Load Symbols |
搜索相邻符号 | ln | List Nearest Symbols |
显示模块列表 | lm | List Loaded Modules |
功能 | 命令 | 描述/助记 |
结束调试会话 | q | Quit |
结束远程调试 | Quit | |
结束调试会话并分离调试目标 | qd | Quit and Detach |
2、元命令数据结构
元命令(Meta-Command)用来提供标准命令没有提供的经常使用调试功能, 与标准命令同样, 元命令也是内建在调试器引擎或者WinDBG程序文件中的. 全部元命令都已一个点(.)开始, 因此元命令也被称为点命令(Dot Command)。app
按照功能, 能够把元命令分红以下几类.ui
3、扩展命令lua
扩展命令(Extension Command)用于实现针对特定调试目标的调试功能,用于扩展某一方面的调试功能。与标准命令和元命令是内建在WinDBG程序文件中不一样, 扩展命令式实如今动态加载的扩展模块(DLL)中的。全部的扩展命令都以!开头。经过WinDBG的SDK,用户能够编写本身的扩展模块和扩展命令。执行扩展命令式, 应该以叹号( ! )开始, 叹号在英文中被称为bang, 所以扩展名伶也被称为Bang Command. 执行扩展命令的完整格式是:![扩展模块名].<扩展命令名> [参数]。其中, 扩展模块名能够省略, 若是省略, WinDBG会自动在已经加载的扩展模块中搜索指定的命令.spa
WinDBG程序包中包含了经常使用的扩展命令模块。存放在如下几个子目录中:线程
扩展模块 |
路径 |
描述 |
ext.dll |
WINEXT |
适用于各类调试目标的经常使用扩展命令 |
kext.dll |
WINEXT |
内核态调试时的经常使用扩展命令 |
uext.dll |
WINEXT |
用户态调试时的经常使用扩展命令 |
logexts.dll |
WINEXT |
用于监视和记录API调用(Windows API Logging Extensions) |
sos.dll |
WINEXT |
用于调试托管代码和.Net程序 |
ks.dll |
WINEXT |
用于调试内核流(Kernel Stream) |
wdfkd.dll |
WINEXT |
调试使用WDF(Windows Driver Foundation)编写的驱动程序 |
acpikd.dll |
WINXP |
用于ACPI调试,追踪调用ASL程序的过程,显示ACPI对象 |
exts.dll |
WINXP |
关于堆(!heap)、进程/线程结构(!teb/!peb)、安全信息(!token、!sid、!acl)和应用程序验证(!avrf)等的扩展命令 |
kdexts.dll |
WINXP |
包含了大量用于内核调试的扩展命令 |
fltkd.dll |
WINXP |
用于调试文件系统的过滤驱动程序(FsFilter) |
minipkd.dll |
WINXP |
用于调试AIC78xx小端口(miniport)驱动程序 |
ndiskd.dll |
WINXP |
用于调试网络有关驱动程序 |
ntsdexts.dll |
WINXP |
实现了!handle、!locks、!dp、!dreg(显示注册表)等命令 |
rpcexts.dll |
WINXP |
用于RPC调试 |
scsikd.dll |
WINXP |
用于调试SCSI有关的驱动程序 |
traceprt.dll |
WINXP |
用于格式化ETW信息 |
vdmexts.dll |
WINXP |
调试运行在VDM中的DOS程序和WOW程序 |
wow64exts.dll |
WINXP |
调试运行在64位Windows系统中的32位程序 |
wmitrace.dll |
WINXP |
显示WMI追踪有关的数据结构、缓冲区和日志文件 |
由于扩展命令是实如今动态加载的扩展模块(DLL)中的, 因此执行时须要加载对应的扩展模块. 当调试目标被激活(debuggee activation)时, WinDBG会根据调试目标的类型和当前的工做空间自动加载命令空间中指定的扩展模块。用户也可使用一下方法手动加载扩展模块。
当使用"!扩展模块名.扩展命令名"的方式执行扩展命令时, 若是指定的扩展模块尚未加载, 那么WinDBG会自动搜索和加载这个模块.使用.chain命令能够列出当前加载的全部扩展模块, 使用.unload和.unloadall命令能够卸载指定的或者所有扩展模块. 大多数扩展模块都支持help命令来显示这个模块的基本信息和所包含的所有命令, 例如执行!ext.help能够显示ext模块中的全部扩展命令。