windbg-!address、!vadump、!vprot(读取内存状态)
来源:互联网 发布:ubuntu 查看机器配置 编辑:程序博客网 时间:2024/06/06 06:38
!address
!address 扩展显示目标进程或目标机使用的内存信息
这个学习起来比较简单:我们直接使用!address -?就可以找到它的使用说明:
- 0:000> !address -?
- !address - prints information on the entire address space
- !address -? - prints this help
- !address <address> - prints available information about the region
- of the address space containing this address
- !address -summary - prints only summary information
- !address -RegionUsageXXX - fiters the output limiting the dispaly to one
- of the following types:
- RegionUsageIsVAD - `busy` region that could be charcterized better
- this includes Virtual-Alloc-ed blocks, SBH heap,
- memory from custom allocators, etc
- RegionUsageFree - availalble (neither committed nor reserved) region
- RegionUsageImage - region used by mapped images of binaries
- RegionUsageStack - stack of threads
- RegionUsageTeb - TEB of threads
- RegionUsageHeap - region in used by a heap
- RegionUsagePageHeap - region in use by full page-heap
- RegionUsagePeb - PEB of the process
- RegionUsageProcessParametrs - parameters of the process
- RegionUsageEnvironmentBlock - environment block
那么一个个说明吧:
!address显示整个地址空间和使用摘要的信息
这个太长了,它会把从0-7ffefff的全打印出来,熟悉核心编程的应该知道,正常的2G用户地址空间是这样划分的:0-ffff为64K空指针区,10000-7ffeffff为用户模式分区
之后64K为禁入分区,之后就是内核模式分区,要看它们的信息,需要用到以下的表,
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一样。比如一般30000不会被分配:
- 0:000> !address 30000
- TEB 7efdd000 in range 7efdb000 7efde000
- TEB 7efda000 in range 7efd8000 7efdb000
- TEB 7efd7000 in range 7efd5000 7efd8000
- ProcessParametrs 00641a40 in range 00640000 00648000
- Environment 00640810 in range 00640000 00648000
- 00030000 : 00030000 - 00010000
- Type 00000000
- Protect 00000001 PAGE_NOACCESS
- State 00010000 MEM_FREE
- Usage RegionUsageFree
表示输出表明这是以地址0x30000开头的一个大的内存区域,该区域中包含一个以0x30000 开头,大小为0x10000的小一些的区域。因此,这个小区域是从0x30000 到0x40000。它的内存类型为0、状态为 MEM_FREE、使用方式为RegionUsageFree。 (这些值的含义,查看前面的表格。) 我们调用.dvalloc来强制分配
- 0:000> .dvalloc /b 30000 100
- Allocated 1000 bytes starting at 00030000
- 0:000> !address 30000
- TEB 7efdd000 in range 7efdb000 7efde000
- TEB 7efda000 in range 7efd8000 7efdb000
- TEB 7efd7000 in range 7efd5000 7efd8000
- ProcessParametrs 00641a40 in range 00640000 00648000
- Environment 00640810 in range 00640000 00648000
- 00030000 : 00030000 - 00001000
- Type 00020000 MEM_PRIVATE
- Protect 00000040 PAGE_EXECUTE_READWRITE
- State 00001000 MEM_COMMIT
- Usage RegionUsageIsVAD
!vadump
这个会显示所有的虚拟内存区域和它的保护属性
- 0:000> !vadump
- BaseAddress: 00000000
- RegionSize: 00010000
- State: 00010000 MEM_FREE
- Protect: 00000001 PAGE_NOACCESS
-
- BaseAddress: 00010000
- RegionSize: 00010000
- State: 00001000 MEM_COMMIT
- Protect: 00000004 PAGE_READWRITE
- Type: 00040000 MEM_MAPPED
-
- BaseAddress: 00020000
- RegionSize: 00010000
- State: 00010000 MEM_FREE
- Protect: 00000001 PAGE_NOACCESS
!vprot
!vprot扩展命令显示虚拟内存保护信息。可以用于活动调试和dump文件调试。
- 0:001> x test1!g_char
- 00a67004 test1!g_char = 0x00a6573c "I am string"
- 0:001> !vprot 00a67004
- BaseAddress: 00a67000
- AllocationBase: 00a50000
- AllocationProtect: 00000080 PAGE_EXECUTE_WRITECOPY
- RegionSize: 00002000
- State: 00001000 MEM_COMMIT
- Protect: 00000004 PAGE_READWRITE
- Type: 01000000 MEM_IMAGE
- 0:001> !vprot 30000
- BaseAddress: 00030000
- AllocationBase: 00000000
- RegionSize: 00010000
- State: 00010000 MEM_FREE
- Protect: 00000001 PAGE_NOACCESS