Special Command—Peeking Memory Addresses Using !address
Let’s say that you get a memory address and you want to know if it’s from the heap, the stack, or someplace else. Or yet, let’s say you have a .NET application consuming lots of memory, and you want to get a better understanding of this memory consumption.
The !address command is helpful in both situations mentioned above and probably others not mentioned in this article.
Usage:
!address <address> ß gives you information about the address type.
!address –summary ß displays all addresses and a summary at the end.
To interpret the results follow this table:
RegionUsageIsVAD |
The "busy" region. This region includes all virtual allocation blocks, the SBH heap, memory from custom allocators, and all other regions of the address space that fall into no other classification. |
RegionUsageFree |
The available memory in the target's virtual address space. This memory includes all memory that has not been committed or reserved. |
RegionUsageImage |
The memory region that mapped images of binaries use. |
RegionUsageStack |
The memory region that is used for the stacks owned by the threads in the target process. |
RegionUsageTeb |
The memory region that is used for the thread environment blocks (TEBs) for all threads in the target process. |
RegionUsageHeap |
The memory region that is used for the heaps that the target process owns. |
RegionUsagePageHeap |
The memory region that is used for the full-page heap that the target process owns. |
RegionUsagePeb |
The memory region that is used for the process environment block (PEB) of the target process. |
RegionUsageProcessParametrs |
The memory region that is used for the startup parameters of the target process. |
RegionUsageEnvironmentBlock |
The memory region that is used for the environment block of the target process. |
Examples:
!address <address>
!address –summary
ProcessParameters 003e1860 in range 003e0000 004b0000
Environment 003e0808 in range 003e0000 004b0000
-------------------- Usage SUMMARY --------------------------
TotSize ( KB) Pct(Tots) Pct(Busy) Usage
3b09000 ( 60452) : 02.88% 41.28% : RegionUsageIsVAD ß Location where .NET allocates heaps.
770f1000 ( 1950660) : 93.02% 00.00% : RegionUsageFree ß Not committed memory or not reserved memory.
46ff000 ( 72700) : 03.47% 49.65% : RegionUsageImage
6ff000 ( 7164) : 00.34% 04.89% : RegionUsageStack ß Used for stacks.
7000 ( 28) : 00.00% 00.02% : RegionUsageTeb ß Used for Thread Environment Block.
5f0000 ( 6080) : 00.29% 04.15% : RegionUsageHeap ß Heaps from native code allocations.
0 ( 0) : 00.00% 00.00% : RegionUsagePageHeap
1000 ( 4) : 00.00% 00.00% : RegionUsagePeb
0 ( 0) : 00.00% 00.00% : RegionUsageProcessParametrs
0 ( 0) : 00.00% 00.00% : RegionUsageEnvironmentBlock
Tot: 7fff0000 (2097088 KB) Busy: 08eff000 (146428 KB)
-------------------- Type SUMMARY --------------------------
TotSize ( KB) Pct(Tots) Usage
770f1000 ( 1950660) : 93.02% : <free>
46ff000 ( 72700) : 03.47% : MEM_IMAGE
181f000 ( 24700) : 01.18% : MEM_MAPPED
2fe1000 ( 49028) : 02.34% : MEM_PRIVATE
-------------------- State SUMMARY --------------------------
TotSize ( KB) Pct(Tots) Usage
5d48000 ( 95520) : 04.55% : MEM_COMMIT
770f1000 ( 1950660) : 93.02% : MEM_FREE
31b7000 ( 50908) : 02.43% : MEM_RESERVE
Largest free region: Base 04950000 - Size 5ee50000 (1554752 KB)