Debugging Tools for Windows

!address

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

语法

用户模式

!address Address 
!address -summary 
!address -Filter 
!address -? 

内核模式

!address Address 
!address 

参数

Address
只显示地址空间中包含Address的区域。
-summary
仅显示摘要信息。
Filter
只显示指定的区域。Filter 的值不区分大小写。

下面这些可能的Filter 值按照目标进程使用内存的方式来指定内存区域。

Filter 显示的内存区域
RegionUsageIsVAD "busy" 区域。包括所有 虚拟分配块、SBH堆、自定义内存分配器(custom allocators)的内存、以及地址空间中所有属于其他分类的内存块。
RegionUsageFree 目标的虚拟地址空间中所有可用内存。包括所有非提交(committed)和非保留(reserved)的内存。
RegionUsageImage 用来映射二进制映像的内存区域。
RegionUsageStack 用作目标进程的线程的堆栈的内存区域。
RegionUsageTeb 用作目标进程中所有线程的线程环境块(TEB)的内存区域。
RegionUsageHeap 用作目标进程的堆的内存区域。
RegionUsagePageHeap 用作目标进程的整页堆(full-page heap)的内存区域。
RegionUsagePeb 目标进程的进程环境块(PEB)的内存区域。
RegionUsageProcessParametrs 用作目标进程启动参数的内存区域。
RegionUsageEnvironmentBlock 用作目标进程的环境块的内存区域。

下面这些Filter值按照内存类型来指定内存。

Filter 显示的内存类型
MEM_IMAGE 映射的文件属于可执行映像一部分的内存。
MEM_MAPPED 映射的文件不属于可执行映像一部分的内存。这种内存包含哪些从页面文件映射的内存。
MEM_PRIVATE 私有的(即不和其他进程共享)并且未用来映射任何文件的内存。

下面的Filter 值按照状态来指定内存:

Filter 显示的内存状态
MEM_COMMIT 当前已提交给目标使用的所有内存。已经在物理内存或者页面文件中为这些内存分配了物理的存储空间。
MEM_RESERVE 所有为目标以后的使用保留的内存。这种内存还没有分配物理上的存储空间。
MEM_FREE 目标虚拟地址空间中所有可用内存。包括所有未提交并且未保留的内存。该Filter 值和RegionUsageFree一样。

-?
调试器命令窗口中显示该命令的简短帮助。

DLL

Windows 2000 Ext.dll
Windows XP和之后 Ext.dll

注释

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

内核模式下,该命令仅搜索内核内存,即使使用了.process (Set Process Context)来指定某个进程的虚拟地址空间。用户模式下,!address 扩展总是引用目标进程拥有的内存。

用户模式下,!address Address 显示包含指定地址的区域的特征。不带参数时,!address 显示所有内存区域的特征。包括内存类型、内存状态和内存的使用方式。关于这些信息的含义,查看前面对Filter 进行说明的表格。

下面是!address的例子。

0:000> !address 7c571234
    7c570000 : 7c571000 - 00059000
                    Type     01000000 MEM_IMAGE
                    Protect  00000020 PAGE_EXECUTE_READ
                    State    00001000 MEM_COMMIT
                    Usage    RegionUsageImage
                    FullPath C:\WINNT\system32\KERNEL32.dll

该例子使用的Address 值为0x7C571234。输出表明这是以地址0x7C570000开头的一个大的内存区域。 该区域中包含一个以0x7C571000 开头,大小为0x59000的小一些的区域。因此,这个小区域是从0x7C571000 到0x7C5C9FFF。它的内存类型为MEM_IMAGE、状态为 MEM_COMMIT、使用方式为RegionUsageImage。 (这些值的含义,查看前面的表格。) 此外,该内存是可读可执行,但是不可写的。最后,该内存是在属于Kernel32.dll 模块的空间中的。

一般要查看某个地址的信息,使用方式的信息常常是最重要的。知道使用方式后,可以用其他的扩展命令来查看更多信息。例如,如果使用方式是 RegionUsageHeap,可以用!heap 扩展命令来查看更多。

内核模式下!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

"usage"的含义和用户模式下一样。"ImageName"表示该地址关联的模块、"KernelStack"中会显示线程的ETHREAD块的地址(0x817B4DA0)、 进程ID (0x324)、以及线程ID(0x368)。

附加信息

关于如何显示和搜索内存的更多信息,查看读写内存。显示内存属性的其他扩展命令,查看!vm (内核模式) 和!vprot (用户模式)。

Build machine: CAPEBUILD