Debugging Tools for Windows |
!address 扩展显示目标进程或目标机使用的内存信息。
用户模式
!address -summary
!address -Filter
!address -?
内核模式
!address
下面这些可能的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一样。 |
Windows 2000 | Ext.dll |
Windows XP和之后 | Ext.dll |
不带任何参数时,!address 扩展命令显示整个地址空间和使用摘要的信息。!address -summary 命令仅显示摘要信息。
内核模式下,该命令仅搜索内核内存,即使使用了.process (Set Process Context)来指定某个进程的虚拟地址空间。用户模式下,!address 扩展总是引用目标进程拥有的内存。
用户模式下,!address Address 显示包含指定地址的区域的特征。不带参数时,!address 显示所有内存区域的特征。包括内存类型、内存状态和内存的使用方式。关于这些信息的含义,查看前面对Filter 进行说明的表格。
下面是!address的例子。
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的输出类似,但是包含的信息要少一些。下面是这种情况的例子。
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 (用户模式)。