windebug 命令
1.标准命令
标准命令通常是一两个字符( version 除外)或者符号,用来提供适用于各种调试目标的最基本调试功能。标准命令是不分大小写的。以下是根据功能归纳的当前版本 WinDBG 所支持的所有标准命令:
控制调试目标执行,包括恢复运行的 g 命令、跟踪的 t 命令( trace into)和 p 命令( stepover);
观察和修改寄存器的 r 命令;
观察、编辑和搜索内存数据的 d 命令、 e 命令和 s 命令;
观察栈的 k 命令;
设置和维护断点的 BP(软件断点)、 BA(硬件断点)、 BL(列出所有断点)和 BC/BD/BE(清除、禁止和重新启用断点)命令;
显示和控制线程的~命令;
显示进程的|命令;
显示表达式的?命令和显示 C++表达式的??命令;
用于汇编的 a 命令和用于反汇编的 u 命令;
显示段选择子的 dg 命令;
执行命令文件的$命令;
设置调试事件处理方式的 sx 命令;
显示调试器和调试目标版本的 version 命令;
检查符号的 x 命令,搜索符号的 ln 命令,和显示模块列表的 lm 命令;
结束调试会话的 q 命令。
值得说明的是上面某些单字符的命令代表了一系列以这个字符开始的双字符命令,比如 d 命令后面通常带上第二个字符来指定数据的显示长度,比如 db(按字节显示)、 dd(按双字显示)等。
在命令行输入一个问号(?) 可以显示出一个标准命令的列表和简单介绍。
2.元命令
元命令( Meta-Command)用来提供标准命令没有提供的调试功能,与标准命令一样,元命令也是内建在调试器引擎或者 WinDBG 程序文件中的。
所有元命令都以一个点( .)开始,所以元命令也被称为点命令( Dot Command)。按照功能,可以把元命令分成如下几类:
显示或者设置调试会话或者调试器选项,比如
用于符号选项的.symopt,用于符号路径的.sympath 和.symfix,
用于源程序文件的.srcpath、 .srcnoise 和.srcfix,
用于扩展命令模块路径的.extpath,
用于匹配扩展命令的.extmatch,
用于可执行文件的.exepath,设置反汇编选项的.asm,控制表达式评估器的.expr 命令,等等。
控制调试会话或者调试目标,如重新开始调试会话的.restart,放弃用户态调试目标(进程)的.abandon,创建新进程的.create 命令和附加到存在进程的.attach 命令,打开转储文件的.opendump,分离调试目标的.detach,用于杀掉进程的.kill 命令,等等。
管理扩展命令模块,包括加载模块的.load 命令,卸载用的.unload 命令和.unloadall 命令,显示已经加载模块的.chain 命令等。
管理调试器日志文件,如.logfile (显示信息)、 .logopen (打开)、 .logappend (追加)、 .logclose5(关闭)。
远程调试,如用于启动 remote.exe 服务的.remote 命令,启动引擎服务器的.server,列出可用服务器的.servers 命令,用于向远程服务器发送文件的.send_file,用于结束远程进程服务器的.endpsrv,用于结束引擎服务器的.endsrv 命令,等等。
控制调试器,如让调试器睡眠一段时间的.sleep 命令,唤醒处于睡眠状态的调试器的.wake命令,启动另一个调试器来调试当前调试器的.dbgdbg 命令,等等。
编写命令程序,包括一系列类似 C 语言关键字的命令,如.if、 .else、 .elsif、 .foreach、 .do、 .while、 .continue、 .catch、 .break、 .continue、 .leave、 .printf、 .block 等。我们将在第 10 节介绍命令程序的编写方法。
显示或者转储调试目标数据,如产生转储文件的.dump 命令,将原始内存数据写到文件的.writemem 命令,显示调试会话时间的.time 命令,显示线程时间的.ttime 命令,显示任务列表的.tlist( task list)命令,以不同格式显示数据的.fromats 命令,等等。
输入.help 可以列出所有元命令和每个命令的简单说明。
3扩展命令
扩展命令( 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 或者更高版本的 Windows 的扩展模块。
WINEXT – 适用所有 Windows 版本的扩展模块。
表 30-1 列出了 WINEXT 和 WINXP 木立中的的扩展些模块的名称和简单描述。
表 30-1 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 | 用于调试网络有关驱动程序。 |
6
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 追踪有关的数据结构、缓冲区和日志文件。 |
WudfExt.dll | DDK 中* | 用于调试使用 UMDF 编写的用户态驱动程序。 |
*目前的 WinDBG 工具包尚未包含这个扩展模块。
执行扩展命令时,应该以叹号( !)开始,叹号在英文中被称为 bang,因此扩展命令也被称
为 Bang Command。
执行扩展命令的完整格式是:
![扩展模块名].<扩展命令名> [参数]
其中扩展模块名可以省略,如果省略, WinDBG 会自动在已经加载的扩展模块中搜索这个命
令的实现。
因为扩展命令是实现在动态加载扩展模块中的,所以执行时需要加载对应的扩展模块。当调
试目标被激活时, WinDBG 会根据调试目标的类型和当前的工作空间,自动加载某些扩展模块。
此外,也可以使用以下方法来加载扩展模块:
使用.load 命令加上扩展模块的完整路径来加载它。
使用.loadby 命令加上扩展模块的名称, WinDBG 会自动到当前配置中定义的扩展模块所
有路径中搜索匹配的模块。
当使用“ !扩展模块名.扩展命令名”的方式执行扩展命令时, WinDBG 会自动搜索和加
载指定的模块。
使用.chain 命令可以列出当前加载的所有扩展模块。使用.unload 和.unloadall 命令可以卸载指
定的或者全部扩展模块。