WinDbg的扩展,也可以叫插件。它用于实现针对特定调试目标的调试功能,用于扩展某一方面的调试功能。扩展的实现是通过扩展模块(DLL)实现的。Windbg本身已经包含了很多扩展命令,这些扩展为这Windbg调试器提供了强大的功能和灵活性。调试器扩展命令的使用与标准调试器命令非常相似。但是,虽然内置调试程序命令本身是调试程序二进制文件的一部分,但调试程序扩展命令是由与调试程序不同的DLL公开的。windbg可以添加扩展功能,用户可以自己实现一组功能并添加到windbg中,把包含扩展功能的dll文件放到windbg目录下的winext子目录 ,windbg就会自动加载扩展模块。这允许您编写新的调试器命令,这些命令是根据您的特定需求定制的。
加载调试器扩展DLL
有几种方法可以加载调试器扩展DLL,以及控制默认调试器扩展DLL和默认调试器扩展路径:
- 在启动调试程序之前,使用u nt u debugger u extension u path环境变量设置扩展DLL的默认路径。这可以是多个目录路径,用分号分隔。
- 使用.load(加载扩展dll)命令加载新的dll。
- 使用.unload(卸载扩展dll)命令卸载dll。
- 使用.unload all(卸载所有扩展DLL)命令卸载所有调试器扩展。
- 启动调试器之前,使用-a命令行选项设置默认扩展dll。
- 使用.extpath(设置扩展路径)命令设置扩展dll搜索路径。
- 使用.set dll(设置默认扩展dll)命令设置默认扩展dll。
- 使用.chain(list debugger extensions)命令以默认搜索顺序显示所有加载的调试器扩展模块。
- winxp目录包含可用于Windows XP和更高版本的Windows的扩展。
- winext目录包含可与任何版本的Windows一起使用的扩展。dbghelp.dll模块位于Windows调试工具的基本目录中,也包含此类型的扩展。
如果编写自己的调试器扩展,则可以将它们放在任何目录中。但是,建议您将它们放在新目录中,并将该目录添加到调试器扩展路径中。最多可以加载32个扩展DLL。
使用调试器扩展命令
调试器扩展命令的使用与调试器命令的使用非常相似。该命令在调试器命令窗口中键入,在该窗口中生成输出,或者在目标应用程序或目标计算机中生成更改。实际的调试器扩展命令是调试器调用的DLL中的入口点。
![module.]extension [arguments]
模块名后面不应跟.dll文件扩展名。如果模块包含完整路径,则默认字符串大小限制为255个字符。如果模块尚未加载,则将使用对LoadLibrary(模块)的调用将其加载到调试器中。调试器加载扩展库后,调用getprocAddress函数在扩展模块中查找扩展名。扩展名区分大小写,输入时必须与扩展模块的.def文件中显示的完全一致。如果找到扩展地址,则调用该扩展。
- 在所有操作系统和两种模式下工作的扩展模块:dbghelp.dll和winextext.dll。
- 可在所有模式下工作但特定于操作系统的扩展模块。对于Windows XP和更高版本的Windows,这是winxpexts.dll。Windows 2000没有相应的模块。
- 与所有操作系统一起工作但特定模式的扩展模块。对于内核模式,这是winextkext.dll。对于用户模式,这是winextuext.dll。
- 操作系统特定和模式特定的扩展模块。下表指定了此模块。
Windows Build User Mode Kernel Mode 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
编写新的调试器扩展
- dbgeng扩展。这些是基于dbgeng.h头文件和wdbgexts.h头文件中的原型。
- WDBGexts扩展。这些都是基于wdbgexts.h头文件中的原型。