!for_each_module
!for_each_module 扩展为每个加载的模块执行一次调试器命令。
!for_each_module ["CommandString"]
!for_each_module -?
<参数
CommandString
指定要对调试器模块列表中的每个模块执行一次的调试器命令。 如果 CommandString 包含多个命令,则必须用分号 (;) 隔开,并将 CommandString 用引号 (") 括起来。 如果包含多个命令,CommandString 中的单个命令不能包含引号。
可以在 CommandString 或 CommandString 中的命令执行的任何脚本中使用以下别名。
别名 | 数据类型 | 值 |
---|---|---|
@#FileVersion |
string |
模块的文件版本。 |
@#ProductVersion |
string |
模块的产品版本。 |
@#ModuleIndex |
ULONG |
模块编号。 模块从零开始连续枚举。 |
@#ModuleName |
string |
模块名。 此名称通常是不带文件扩展名的文件名。 在一些情况下,模块名称与文件名明显不同。 |
@#ImageName |
string |
可执行文件的名称,包括文件扩展名。 通常,完整路径包含在用户模式下,但不包含在内核模式下。 |
@#LoadedImageName |
string |
除非存在 Microsoft CodeView 符号,否则此别名与图像名称相同。 |
@#MappedImageName |
string |
在大多数情况下,此别名为 NULL。 如果调试器正在映射映像文件(例如,在小型转储调试期间),则此别名是映射映像的名称。 |
@#SymbolFileName |
string |
符号文件的路径和名称。 如果尚未加载任何符号,则此别名是可执行文件的名称。 |
@#ModuleNameSize |
ULONG |
模块名称字符串的字符串长度加一。 |
@#ImageNameSize |
ULONG |
镜像名称字符串的字符串长度加一。 |
@#LoadedImageNameSize |
ULONG |
已加载镜像名称字符串的字符串长度加一。 |
@#MappedImageNameSize |
ULONG |
映射镜像名称字符串的字符串长度加一。 |
@#SymbolFileNameSize |
ULONG |
符号文件名字符串的字符串长度加一。 |
@#Base |
ULONG64 |
映像的开头地址。 |
@#Size |
ULONG |
图像的大小(以字节为单位)。 |
@#End |
ULONG64 |
图像的末尾地址。 |
@#TimeDateStamp |
ULONG |
图像的时间和日期戳。 如果要将此日期和时间戳扩展到可读日期,请使用 .formats(显示数字格式)命令。 |
@#Checksum |
ULONG |
模块的校验和。 |
@#Flags |
ULONG |
模块标志。 有关 DEBUG_MODULE_Xxx 值的列表,请参阅 Dbgeng.h。 |
@#SymbolType |
USHORT |
符号类型。 有关 DEBUG_SYMTYPE_Xxx 值的列表,请参阅 Dbgeng.h。 |
在为每个模块执行 CommandString之前以及发生任何其他分析之前,将全部替换这些别名。 这些别名区分大小写。 即使别名括在括号中,也必须在别名前后各添加一个空格。 如果使用 C++ 表达式语法,则必须将这些别名引用为 @@( @#alias)。
这些别名仅在调用 !for_each_module 的生存期内可用。 不要将它们与伪寄存器、固定名称别名或用户命名别名混淆。
-?
在“调试器命令”窗口中显示此扩展的一些帮助文本。
DLL
Ext.dll
其他信息
有关如何定义和使用别名作为输入字符串的快捷方式(包括使用 ${ } 令牌)的详细信息,请参阅使用别名。
注解
如果未指定任何参数,!for_each_module 扩展将显示有关已加载模块的常规信息。 此信息类似于以下命令显示的信息。
!for_each_module .echo @#ModuleIndex : @#Base @#End @#ModuleName @#ImageName @#LoadedImageName
有关已加载和卸载模块的详细信息,请使用 lm(列出加载模块)命令。
如果启用了详细调试器输出,调试器将在调用扩展时显示已加载和卸载模块的总数,调试器会显示有关每个模块(包括每个可用别名的值)的详细信息,然后再为该模块执行 CommandString 。
以下示例演示如何使用 !for_each_module 扩展。 以下命令显示全局调试标志。
!for_each_module x ${@#ModuleName}!*Debug*Flag*
!for_each_module x ${@#ModuleName}!g*Debug*
以下命令使用 !chkimg 扩展检查每个加载模块中的二进制损坏情况:
!for_each_module !chkimg @#ModuleName
以下命令在每个加载的图像中搜索模式“MZ”。
!for_each_module s-a @#Base @#End "MZ"
以下示例演示了对每个模块名称使用 @#FileVersion 和 @#ProductVersion 的情况:
0:000> !for_each_module .echo @#ModuleName fver = @#FileVersion pver = @#ProductVersion
USER32 fver = 6.0.6000.16438 (vista_gdr.070214-1610) pver = 6.0.6000.16438
kernel32 fver = 6.0.6000.16386 (vista_rtm.061101-2205) pver = 6.0.6000.16386
ntdll fver = 6.0.6000.16386 (vista_rtm.061101-2205) pver = 6.0.6000.16386
notepad fver = 6.0.6000.16386 (vista_rtm.061101-2205) pver = 6.0.6000.16386
WINSPOOL fver = 6.0.6000.16386 (vista_rtm.061101-2205) pver = 6.0.6000.16386
COMCTL32 fver = 6.10 (vista_rtm.061101-2205) pver = 6.0.6000.16386
SHLWAPI fver = 6.0.6000.16386 (vista_rtm.061101-2205) pver = 6.0.6000.16386
msvcrt fver = 7.0.6000.16386 (vista_rtm.061101-2205) pver = 7.0.6000.16386
GDI32 fver = 6.0.6000.16386 (vista_rtm.061101-2205) pver = 6.0.6000.16386
RPCRT4 fver = 6.0.6000.16525 (vista_gdr.070716-1600) pver = 6.0.6000.16525
SHELL32 fver = 6.0.6000.16513 (vista_gdr.070626-1505) pver = 6.0.6000.16513
ole32 fver = 6.0.6000.16386 (vista_rtm.061101-2205) pver = 6.0.6000.16386
ADVAPI32 fver = 6.0.6000.16386 (vista_rtm.061101-2205) pver = 6.0.6000.16386
COMDLG32 fver = 6.0.6000.16386 (vista_rtm.061101-2205) pver = 6.0.6000.16386