!address

!address 扩展显示有关目标进程或目标计算机使用的内存的信息。

用户模式

!address Address
!address -summary 
!address [-f:F1,F2,...] {[-o:{csv | tsv | 1}] | [-c:"Command"]}
!address -? | -help

内核模式

!address Address 
!address

参数

Address
仅显示包含 Address 的地址空间的区域。

-summary
仅显示摘要信息。

-f:F1, F2, ...
仅显示筛选器 F1F2 等指定的区域。

以下筛选器值通过目标进程使用它们的方式指定内存区域。

筛选器值 显示的内存区域

VAR

繁忙区域。 这些区域包括所有虚拟分配块、SBH 堆、自定义分配器的内存,以及地址空间的所有其他不属于其他分类的区域。

免费

可用内存。 这包括尚未保留的所有内存。

映像

映射到可执行映像一部分的文件的内存。

Stack

用于线程堆栈的内存。

Teb

用于线程环境块 (TEB) 的内存。

Peb

用于进程环境块 (PEB) 的内存。

用于堆的内存。

PageHeap

用于完整页堆的内存区域。

CSR

CSR 共享内存。

Actx

用于激活上下文数据的内存。

NLS

用于国家语言支持 (NLS) 表的内存。

FileMap

用于内存映射文件的内存。 此筛选器仅在实时调试期间适用。

以下筛选器值按内存类型指定内存区域。

筛选器值 显示的内存区域

MEM_IMAGE

映射到可执行映像一部分的文件的内存。

MEM_MAPPED

映射到非可执行映像一部分的文件的内存。 这包括映射到分页文件的内存。

MEM_PRIVATE

专用内存。 此内存不由任何其他进程共享,也不会映射到任何文件。

以下筛选器值按内存状态指定内存区域。

筛选器值 显示的内存区域

MEM_COMMIT

已提交的内存。

MEM_FREE

可用内存。 这包括尚未保留的所有内存。

MEM_RESERVE

保留的内存。

以下筛选器值按应用于内存的保护指定内存区域。

筛选器值 显示的内存区域

PAGE_NOACCESS

无法访问的内存。

PAGE_READONLY

可读但不可写且不可执行的内存。

PAGE_READWRITE

可读且可写但不可执行的内存。

PAGE_WRITECOPY

具有写入时复制行为的内存。

PAGE_EXECUTE

可执行但不可读且不可写的内存。

PAGE_EXECUTE_READ

可执行且可读但不可写的内存。

PAGE_EXECUTE_READWRITE

可执行、可读且可写的内存。

PAGE_EXECUTE_WRITECOPY

可执行且具有写入时复制行为的内存。

PAGE_GUARD

充当保护页的内存。

PAGE_NOCACHE

未缓存的内存。

PAGE_WRITECOMBINE

启用了写入合并访问的内存。

-o:{csv | tsv | 1}
根据以下选项之一显示输出。

选项 输出格式

csv

将输出显示为逗号分隔值。

tsv

将输出显示为制表符分隔值。

1

以空格式显示输出。 将 !address 用作 .foreach 的输入时,此格式非常有效。

-c:"Command"
为每个内存区域执行自定义命令。 可以使用命令中的以下占位符来表示 !address 扩展的输出字段。

占位符 输出字段

1%

基址

%2

结束地址 + 1

%3

区域大小

%4

类型

%5

State

6%

保护

%7

使用情况

例如,!address -f:Heap -c:".echo %1 %3 %5" 显示 Heap 类型每个内存区域的基址、大小和状态。

命令中的引号前面必须有反斜杠 (\")。 例如,!address -f:Heap -c:"s -a %1 %2 \"pad\"" 将在 Heap 类型的每个内存区域中搜索字符串 "pad"。

不支持用分号分隔的多个命令。

-?
“调试器命令”窗口中显示此扩展的最少帮助文本。

DLL

Ext.dll

其他信息

有关如何显示和搜索内存的详细信息,请参阅读取和写入内存。 有关显示内存属性的其他扩展,请参阅 !vm(内核模式)和 !vprot(用户模式)。

注解

没有使用任何参数时,!address 扩展会显示有关整个地址空间的信息。 !address -summary 命令仅显示摘要。

在内核模式下,即使使用 .process(设置进程上下文)指定给定进程的虚拟地址空间,此扩展也仅搜索内核内存。 在用户模式下,!address 扩展始终引用目标进程拥有的内存。

在用户模式下,!addressAddress 显示指定地址所属区域的特征。 如果没有使用参数,!address 将显示所有内存区域的特征。 这些特征包括内存使用情况、内存类型、内存状态和内存保护。 有关此信息的含义的详细信息,请参阅 -f 参数说明中的早期表。

以下示例使用 !address 检索映射到 kernel32.dll 的内存区域的相关信息。

0:000> !address 75831234
Usage:                  Image
Base Address:           75831000
End Address:            758f6000
Region Size:            000c5000
Type:                   01000000MEM_IMAGE
State:                  00001000MEM_COMMIT
Protect:                00000020PAGE_EXECUTE_READ
More info:              lmv m kernel32
More info:              !lmi kernel32
More info:              ln 0x75831234

此示例使用 Address 值 0x75831234。 显示将显示此地址位于以地址 0x75831000 开头并以地址 0x758f6000 结尾的内存区域中。 盖区域具有使用情况 Image、类型 MEM_IMAGE、状态 MEM_COMMIT 和保护 PAGE_EXECUTE_READ。 (有关这些值的含义的详细信息,请参阅前面的表。)该显示还列出了其他三个调试器命令,可用于获取有关此内存地址的详细信息。

如果从地址开始并尝试确定相关信息,则使用情况信息通常最有价值。 了解使用情况后,可以使用其他扩展了解有关此内存的详细信息。 例如,如果使用情况为 Heap,则可以使用 !heap 扩展了解详细信息。

以下示例使用 s(搜索内存)命令,在类型 Image 的每个内存区域中搜索宽字符字符串“Note”。

!address /f:Image /c:"s -u %1 %2 \"Note\""

*** Executing: s -u 0xab0000 0xab1000 "Note"
*** Executing: s -u 0xab1000 0xabc000 "Note"
00ab2936  004e 006f 0074 0065 0070 0061 0064 0000  N.o.t.e.p.a.d...
00ab2f86  004e 006f 0074 0065 0070 0061 0064 005c  N.o.t.e.p.a.d.\.
00ab32e4  004e 006f 0074 0065 0070 0061 0064 0000  N.o.t.e.p.a.d...
*** Executing: s -u 0xabc000 0xabd000 "Note"
. . .

在内核模式下,!address 的输出类似于用户模式输出,但包含的信息更少。 以下示例显示了内核模式输出。

kd> !address
  804de000 - 00235000                           
 Usage       KernelSpaceUsageImage
          ImageName   ntoskrnl.exe

  80c00000 - 001e1000
          Usage       KernelSpaceUsagePFNDatabase

....

  f85b0000 - 00004000
          Usage       KernelSpaceUsageKernelStack
          KernelStack 817b4da0 : 324.368

 f880d000 - 073d3000
          Usage       KernelSpaceUsageNonPagedPoolExpansion

“使用情况”的含义与用户模式下的含义相同。 “ImageName”指示与此地址关联的模块。 “KernelStack”显示此线程的 ETHREAD 块 (0x817B4DA0)、进程 ID (0x324) 和线程 ID (0x368) 的地址。