目录
WinDbg、KD 和 CDB 都支持使用调试器扩展命令。这些扩展赋予了这三款微软调试器强大的功能和极高的灵活性。
调试器扩展命令的使用方式与标准调试器命令非常相似。然而,内置调试器命令是调试器二进制文件的一部分(译注:即调试器本身的一部分),而调试器扩展命令则通过独立于调试器的 DLL 文件展现。
这使得你可以编写满足特定需求的全新调试器命令。此外,调试工具本身也附带了一些调试器扩展 DLL 文件。
1. 加载调试器扩展 DLL文件
加载调试器扩展 DLL 的方法有很多种,还可以控制默认调试器扩展 DLL 和默认调试器扩展路径:
(注意:扩展 DLL 搜索路径的默认值包含调试器已知的所有扩展路径,对于 32 位调试器,则为%LOCALAPPDATA%\dbg\EngineExtensions 或 %LOCALAPPDATA%\dbg\EngineExtensions32,以及 %PATH% 环境变量中的所有路径。)
(1) (启动调试器之前)使用 _NT_DEBUGGER_EXTENSION_PATH 环境变量为扩展 DLL 设置自定义路径。这可以是多个目录路径,路径之间用分号分隔。
(2) 使用 .load命令加载新的 DLL。
(3) 使用 .unload命令卸载一个DLL。
(4) 使用 .unloadall命令卸载所有调试器扩展。
(5) ( 启动调试器之前;仅限 CDB )使用 tools.ini 文件设置默认扩展 DLL。
(6) (启动调试器之前)使用 -a 命令行选项设置默认扩展 DLL。
(7) 使用 .extpath命令设置扩展 DLL 搜索路径。
(8) 使用 .setdll(设置默认扩展 DLL)命令设置默认扩展 DLL。
(9) 使用 .chain(列出调试器扩展)命令按默认搜索顺序显示所有已加载的调试器扩展模块。
也可以在首次从该模块发出命令时,使用完整的 `!module.extension` 语法来加载扩展 DLL。有关详细信息,请参阅“使用调试器扩展命令”。
使用的扩展 DLL 必须与目标计算机的操作系统匹配。Windows 调试工具包中包含的扩展 DLL 分别位于安装目录的不同子目录中:
(1) winxp 目录包含可用于 Windows XP 及更高版本 Windows 的扩展程序。
(2) winext 目录包含可用于任何 Windows 版本的扩展程序。位于 Windows 调试工具根目录下的 dbghelp.dll 模块也包含此类扩展程序。
如果你编写了自己的调试器扩展,可以将其放置在任何目录中。但是,建议你将其放置在一个新目录中,并将该目录添加到调试器扩展路径中。
最多可以加载 32 个扩展 DLL。
2. 使用调试器扩展命令
调试器扩展命令的使用方式与调试器命令非常相似。命令在调试器命令窗口中输入,输出结果要么显示在该窗口中,要么会改变目标应用程序或目标计算机的运行状态。
实际的调试器扩展命令是调试器调用的 DLL 中的入口点。
调试器扩展通过下列语法调用:
![module.]extension [arguments]
模块名称后不应跟 .dll 文件扩展名。如果模块包含完整路径,则默认字符串长度限制为 255 个字符。
如果模块尚未加载,调试器会调用 `LoadLibrary(module)` 函数将其加载。调试器加载扩展库后,会调用 `GetProcAddress` 函数在扩展模块中查找扩展名称。扩展名称区分大小写,必须与扩展模块的 `.def` 文件中的名称完全一致。如果找到扩展地址,则会调用该扩展。
2.1 搜索顺序
如果未指定模块名称,调试器将在已加载的扩展模块中搜索此导出项。
默认搜索顺序如下:
(1) 适用于所有操作系统和两种模式的扩展模块:Dbghelp.dll 和 winext\ext.dll。
(2) 适用于所有模式但特定于操作系统的扩展模块。对于 Windows XP 及更高版本的 Windows,此模块为 winxp\exts.dll。
(3) 适用于所有操作系统但特定于模式的扩展模块。对于内核模式,此模块为 winext\kext.dll。对于用户模式,此模块为 winext\uext.dll。
(4) 既特定于操作系统又特定于模式的扩展模块。下表列出了此模块。
| 用户模式 | 内核模式 |
| winxp \ ntsdexts.dll | winxp \ kdexts.dll |
当一个扩展模块被卸载时,它会从搜索链中移除。当一个扩展模块加载时,它会被添加到搜索顺序的开头。.setdll(设置默认扩展 DLL)命令可用于将任何模块提升到搜索链的顶部。通过重复使用此命令,你可以完全控制搜索链。
使用 .chain(列出调试器扩展)命令可以按当前搜索顺序显示所有已加载的扩展模块列表。
如果你尝试执行一个不在任何已加载扩展模块中的扩展命令,则会收到“ Export Not Found ”错误消息。
3. 写新的调试器扩展
可以通过编写扩展 DLL 来创建自己的调试命令。例如,可以编写一个命令来显示复杂的数据结构,或者编写一个命令,根据某些变量或内存位置的值来停止和启动目标程序。
有两种不同的调试扩展:
(1) DbgEng 扩展。这些扩展基于 dbgeng.h 头文件中的原型,以及 wdbgexts.h 头文件中的原型。
(2) WdbgExts 扩展。这些扩展仅基于 wdbgexts.h 头文件中的原型。
891

被折叠的 条评论
为什么被折叠?



