!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