cc682/NetRoc
http://netroc682.spaces.live.com/
调试器扩展
CDB、KD和WinDbg允许使用调试器扩展命令。这些扩展使得三个Microsoft调试器拥有强大的功能和适应性。
调试器扩展命令的使用很类似标准命令。但是,内置的调试器命令是由调试器的二进制文件本身实现的,而扩展命令是由调试器之外的DLL实现的。
这样就允许为特殊需要编写新的调试器命令。另外,调试工具本身带了很多调试器扩展DLL。
本节包含:
加载调试器扩展DLL
使用调试器扩展命令
编写新的调试器扩展
关于特定扩展命令的更多信息,查看调试器扩展命令参考节。
加载调试器扩展DLL
有很多办法用于加载调试器扩展DLL、控制默认调试器扩展DLL和默认的调试器扩展路径:
也可以通过完整的!module.extension语法在第一次运行某个扩展DLL中的命令时加载它。查看使用调试器扩展命令获得详细信息。
所使用的扩展DLL必须和目标机的操作系统相匹配。Windows调试工具包自带的扩展DLL都放在安装路径的不同子目录中:
- nt4fre 目录包含用在Microsoft Windows NT 4.0发行版中的扩展。
- nt4chk 目录包含使用在Windows NT 4.0调试版中的扩展。
- w2kfre 目录包含使用在Microsoft Windows 2000发行版中的扩展。
- w2kchk目录包含使用在Windows 2000调试版中的扩展。
- winxp 目录包含在Windows XP和之后版本Windows中的扩展。
- winext 目录包含能在所有Windows版本中使用的扩展。Windows调试工具包根目录下的dbghelp.dll 也包含这样的扩展。
如果编写了自己的调试器扩展,可以将他们放在任何目录下。但是建议将他们放到一个新目录中并将该目录加入调试器扩展路径中。
可以加载多达32个扩展DLL。
使用调试器扩展命令
使用调试器扩展命令和使用调试器命令非常类似。在调试器命令窗口中输入命令,会在该窗口中产生输出或改变目标程序或目标机。
一个实际的调试器扩展命令是由调试器调用的一个DLL入口点。
以如下语法调用调试器扩展:
![module.]extension [arguments]
module 名字不能包含.dll扩展名。如果module 包含完整路径,默认的字符串尺寸限制为255。
如果模块还没有被加载,调试器会使用LoadLibrary(module)调用来加载它。调试器加载了扩展库之后,会调用GetProcAddress 函数来定位扩展模块中的命令名。扩展命令名是大小写敏感的,并且必须和出现在扩展模块的.def 中的名字完全相同。如果找到了命令地址,则会调用该命令。
搜索顺序
如果没有指定模块名,调试器会在已加载的扩展模块中搜索。
默认的搜索顺序如下:
- 能在所有操作系统和两种调试模式中使用的扩展模块:dbghelp.dll 、winext\ext.dll。
- 在所有模式下可以使用,但是和特定操作系统相关的扩展模块。在Windows XP和之后版本的Windows中为winxp\exts.dll。Windows NT 4.0和Windows 2000没有对应的模块。
- 可以在所有操作系统中使用,但是和调试模式相关的扩展模块。内核模式下为winext\kext.dll。用户模式下为winext\uext.dll。
- 既和操作系统相关又和调试模式相关的扩展模块。下表列出了这些模块。
Windows 版本
|
用户模式
|
内核模式
|
Windows NT 4.0 (free build)
|
nt4fre \ ntsdexts.dll
|
nt4fre \ kdextx86.dll
|
Windows NT 4.0 (checked build)
|
nt4chk \ ntsdexts.dll
|
nt4chk \ kdextx86.dll
|
Windows 2000 (free build)
|
w2kfre \ ntsdexts.dll
|
w2kfre \ kdextx86.dll
|
Windows 2000 (checked build)
|
w2kchk \ ntsdexts.dll
|
w2kchk \ kdextx86.dll
|
Windows XP and later
|
winxp \ ntsdexts.dll
|
winxp \ kdexts.dll
|
如果某个扩展模块被卸载了,他会被从搜索链中移除。当一个扩展模块被加载,会被添加到搜索顺序的开始位置。.setdll (Set Default Extension DLL)命令可以用来将任何模块提升到搜索链的顶端。可以通过重复使用该命令来完全控制搜索链。
用.chain (List Debugger Extensions)命令来以当前搜索顺序显示所有加载的扩展模块列表。
如果执行不在任何已加载扩展模块中的命令,会得到一条Export Not Found 错误信息。
更多信息
关于特定的扩展命令的信息,查看调试器扩展命令参考节。
编写新的调试器扩展
可以通过编写扩展DLL来创建自己的调试命令。例如,可能想编写一条命令来显示复杂数据结构,或者根据特定变量或内存位置的值来停止或启动调试目标。
有两种不同的调试器扩展:
- DbgEng 扩展。它们基于 dbgeng.h 和wdbgexts.h头文件中的原型。
- WdbgExts 扩展。它们仅基于wdbgexts.h头文件中的原型。
关于如何编写调试器扩展的信息,查看编写DbgEng 扩展和编写WdbgExts扩展。