1 《Undocumented Windows 2000 Secrets》翻译 --- 2

内核调试器的命令尽管调试器的命令已经注意了易记性,但有时总是难以回忆起它们 。因此,我把它们都整理到了附录A中 。表A-1是其快速参考 。这个表是调试器的help信息(使用?命令)的整理版 。命令所需参数的类型汇总在表A-2 。
前面提到过,内核调试器执行扩展命令时需要一个!号作为开始 。只要命令前有个!号,调试器就会到已加载的扩展DLL的导出列表中进行查找 。如果发现匹配的,就会跳转到相应的DLL中 。图1-7显示了内核调试器加载了kdextx86.dll、userkdx.dll和dbghelp.dll扩展DLL 。最后一个和i386kd.exe位于同一目录;前两个共有四个版本:针对Windows NT 4.0的free和checked版本(对应子目录为:nt4fr和nt4chk),针对Windows 2000的free和checked版本 。通常,调试器在搜寻扩展命令是会采用一个默认的搜索顺序 。然而,你可以改变这个默认设置,只需要在命令前指定模块名称即可,采用.符号作为分隔符 。例如,kedxtx86.dll和userkdx.dll都导出了help命令,键入!help,在默认情况下,你会得到kdextx86.dll的帮助信息 。要执行userdkx.dll的help命令,你必须输入!userkdx.help(或者!userkdx.help –V如果你想得到更详细的帮助信息的话) 。按照此方法,只要你知道规则,你也可以编写自己的扩展命令 。在The NT Insider(Open Systems Resources 1999a)中你能找到很棒的how-to文章 。不过其针对的是WinDbg.exe而不是i386kd.exe,但两者使用相同的扩展DLL,大多数信息对于i386kd.exe也是有效的 。
附录A中的表A-3和A-4分别列出了kdextx86.dll和userkdx.dll的help命令的输出信息 。为了便于阅读作了些修改和整编 。你会发现这些表中列出的命令多于Microsoft DDK文档中的,其中有些命令明显有DDK文档未提到的附加参数 。
10大调试命令
表A-1到A-4列出了内核调试器及其标准扩展DLL提供的巨多的命令 。因此,我将讨论其中一些常用命令的细节 。
u: 反编译机器码
在检查crash dump是否正确时,你已经用过了此命令,u命令有三种格式:
1.u 从地址开始反编译8个机器码 。
2.u 反编译到之间的所有机器码 。
3.u 不提供任何参数时,从上次u命令停止的位置开始反编译 。
当然,反编译打段代码是十分厌烦的,但如果你只想知道在特定地址发生的事情,那这是最便捷的方法 。或许u命令最令人感兴趣的特性是它可以解析代码引用到的符号----即使是目标模块没有导出的符号 。不过,使用本书光盘中的Multi-Format Visual Disassembler反编译完整的Windows 2000可执行体将是十分有趣的 。在随后章节中,会有关该产品的更多信息 。
db,dw和dd:Dump Memory BYTEs、Words和DWORDs
如果你当前感兴趣的内存数据是二进制的,那么调试器的16进制转储命令将能完成此任务 。根据你对源地址(source address)数据类型的判断,来选择dd(针对BYTES)、dw(针对WORDS)、dd(针对DWORDS) 。
l db 将指定内存范围里的数据显示为两个部分:左边是16进制表示(每2个8 bit一组),右边是对应的ASCI码 。
l dw 仅按照16进制显示(16 bit一组)
l dw 仅按照16进制显示(32 bit一组)
此组命令可以使用与u命令相同的参数 。注意,所指示的地址内容,也会被显示出来 。如果没有任何参数,将显示接下来的128个字节 。
x:检查符号
x命令非常重要 。它可以根据已安装的符号文件创建一个列表 。典型的使用方式如下:
1.x *!* 显示所有可用符号的模块 。在启动后,默认只有ntoskrnl.exe的符号是可用的 。其他模块的符号可以使用.reload命令来加载 。
2.x ! 显示模块

推荐阅读