扩展命令(Extension Command)用于实现针对特定调试目标的调试功能. 与标准命令和元命令是内建在WinDBG程序文件中不同, 扩展命令式实现在动态加载的扩展模块(DLL)中的.
利用WinDBG的SDK, 用户可以自己编写扩展模块和扩展命令. WinDBG程序包中包含了常用的扩展命令模块. 存放在以下几个子目录中.
- NT4CHK: 调试目标为Windows NT 4.0 checked版本时的扩展命令模块.
- NT4FRE: 调试目标为Windows NT 4.0 free 版本时的扩展命令模块.
- W2KCHK: 调试目标为Windows 2000 checked 版本时的扩展命令模块.
- W2KFRE: 调试目标为Windows 2000 free 版本时的扩展命令模块.
- WINXP: 调试目标为Windows XP 或者更高版本时版本时的扩展命令模块.
- WINEXT: 适用于所有Windows版本的扩展命令模块.
扩展模块 |
路径 |
描述 |
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追踪有关的数据结构、缓冲区和日志文件 |
执行扩展命令式, 应该以叹号( ! )开始, 叹号在英文中被称为bang, 因此扩展名伶也被称为Bang Command. 执行扩展命令的完整格式是:
![扩展模块名].<扩展命令名> [参数]
其中, 扩展模块名可以省略, 如果省略, WinDBG会自动在已经加载的扩展模块中搜索指定的命令.
因为扩展命令是实现在动态加载的扩展模块(DLL)中的, 所以执行时需要加载对应的扩展模块. 当调试目标被激活(debuggee activation)时, WinDBG会根据调试目标的类型和当前的工作空间自动加载命令空间中指定的扩展模块. 用户也可以使用一下方法手动加载扩展模块.
- 使用.load命令加上扩展模块的名称或者完成路径来加载它. 如果没有指定路径, 那么WinDBG会在扩展模块搜索路径(EXTPATH)中寻找这个文件.
- 使用.loadby命令加上扩展模块的名称和一个已经加载的程序模块的名称. 这时WinDBG会在指定的程序模块文件所在目录中寻找和加载扩展命令模块. 例如, 在调试托管程序是, 可以使用.loadby sos mscorwks命令让WinDBG在mscorwks模块所在的目录中加载SOS扩展模块, 这样可以确保加载正确版本的sos模块.
当使用"!扩展模块名.扩展命令名"的方式执行扩展命令时, 如果指定的扩展模块还没有加载, 那么WinDBG会自动搜索和加载这个模块.
使用.chain命令可以列出当前加载的所有扩展模块, 使用.unload和.unloadall命令可以卸载指定的或者全部扩展模块. 大多数扩展模块都支持help命令来显示这个模块的基本信息和所包含的全部命令, 例如执行!ext.help可以显示ext模块中的所有扩展命令.