!힙
!heap 확장은 힙 사용 정보를 표시하거나, 힙 관리자에서 중단점을 제어하거나, 유출된 힙 블록을 검색하거나, 힙 블록을 검색하거나, 페이지 힙 정보를 표시합니다.
이 확장은 세그먼트 힙 및 NT 힙을 지원합니다. 매개 변수 없이 !heap을 사용하여 모든 힙과 해당 형식을 나열합니다.
!heap [HeapOptions] [ValidationOptions] [Heap]
!heap -b [{alloc|realloc|free} [Tag]] [Heap | BreakAddress]
!heap -B {alloc|realloc|free} [Heap | BreakAddress]
!heap -l
!heap -s [SummaryOptions] [StatHeapAddress]
!heap -i HeapAddress
!heap -x [-v] Address
!heap -p [PageHeapOptions]
!heap -srch [Size] Pattern
!heap -flt FilterOptions
!heap -stat [-h Handle [-grp GroupBy [MaxDisplay]]]
!heap [-p] -?
!heap -triage [Handle | Address]
세그먼트 및 NT 힙 매개 변수
이러한 매개 변수는 세그먼트 및 NT 힙에서 작동합니다.
-s
요약 정보가 요청되도록 지정합니다. SummaryOptions 및 StatHeapAddress를 생략하면 현재 프로세스와 연결된 모든 힙에 대한 요약 정보가 표시됩니다.
SummaryOptions
다음 옵션의 조합일 수 있습니다. SummaryOptions는 대/소문자를 구분하지 않습니다. !heap -s -? 추가 정보를 참조하세요.
옵션 | 효과 |
---|---|
-v |
모든 데이터 블록을 확인합니다. |
-b BucketSize |
버킷 크기를 지정합니다. 기본값은 1024비트입니다. |
-d DumpBlockSize |
버킷 크기를 지정합니다. |
-a |
모든 힙 블록을 덤프합니다. |
-c |
각 블록의 내용이 표시되도록 지정합니다. |
-triage [Handle | Address]
디버거가 프로세스의 힙에서 오류를 자동으로 검색하도록 합니다. 힙 핸들을 인수로 지정하면 해당 힙이 검사됩니다. 그렇지 않으면 모든 힙이 지정된 주소를 포함하는 힙을 검색하고, 힙이 발견되면 검사됩니다. -triage를 사용하는 것은 LFH(하위 조각화 힙) 손상의 유효성을 검사하는 유일한 방법입니다.
-x [-v]
디버거가 지정된 주소를 포함하는 힙 블록을 검색하도록 합니다. -v가 추가되면 명령은 현재 프로세스의 전체 가상 메모리 공간에서 이 힙 블록에 대한 포인터를 검색합니다.
-l
디버거가 유출된 힙 블록을 검색하도록 합니다.
-나는 Address -h HeapAddress
지정된 힙에 대한 정보를 표시합니다.
주소
검색할 주소를 지정합니다.
-?
디버거 명령 창에 이 확장에 대한 몇 가지 간단한 도움말 텍스트를 표시합니다. 일반 도움말에는 !heap -?을 사용하고 페이지 힙 도움말에는 !heap -p-?를 사용합니다.
NT 힙 매개 변수
이러한 매개 변수는 NT 힙에서만 작동합니다.
HeapOptions
다음 옵션의 조합일 수 있습니다. HeapOptions 값은 대/소문자를 구분합니다.
옵션 | 효과 |
---|---|
-v |
디버거가 지정된 힙의 유효성을 검사하도록 합니다.
참고 : 이 옵션은 LFH(낮은 조각화 힙) 손상을 검색하지 않습니다. 대신 -triage를 사용합니다.
|
-a |
지정된 힙에 대한 모든 정보가 표시되도록 합니다. 이 경우 크기는 힙 세분성으로 반올림됩니다. (-a 옵션을 사용하여 !heap 을 실행하는 것은 시간이 오래 걸릴 수 있는 세 가지 옵션 -h -f -m을 사용하여 실행하는 것과 같습니다.) |
-h |
지정된 힙에 대한 모든 비 LFH 항목을 표시합니다. |
-hl |
LFH 항목을 포함하여 지정된 힙에 대한 모든 항목이 디스플레이에 포함되도록 합니다. |
-f |
지정된 힙에 대한 모든 사용 가능한 목록 항목이 표시되도록 합니다. |
-m |
지정된 힙에 대한 모든 세그먼트 항목을 표시합니다. |
-t |
지정된 힙에 대한 태그 정보를 표시합니다. |
-T |
지정된 힙에 대한 의사 태그 항목을 표시합니다. |
-g |
표시에 전역 태그 정보가 포함되도록 합니다. 전역 태그는 태그가 지정되지 않은 각 할당과 연결됩니다. |
-s |
지정된 힙에 대한 요약 정보가 표시되도록 합니다. |
-k |
(x86 기반 대상만 해당) 표시에 각 항목과 연결된 스택 역 추적이 포함되도록 합니다. |
ValidationOptions
다음 옵션 중 하나일 수 있습니다. ValidationOptions는 대/소문자를 구분합니다.
옵션 | 효과 |
---|---|
-D |
지정된 힙에 대한 호출 유효성 검사를 사용하지 않도록 설정합니다. |
-E |
지정된 힙에 대한 호출 유효성 검사를 사용하도록 설정합니다. |
-d |
지정된 힙에 대한 힙 검사를 사용하지 않도록 설정합니다. |
-e |
지정된 힙에 대한 힙 검사를 사용하도록 설정합니다. |
-나는 힙 주소 또는 HeapAddress
지정된 힙에 대한 정보를 표시합니다.
BreakAddress
중단점을 설정하거나 제거할 블록의 주소를 지정합니다.
-b
디버거가 힙 관리자에서 조건부 중단점을 만들도록 합니다. -b 옵션 뒤에 할당, 재할당 또는 해제가 있을 수 있습니다. 이 옵션은 메모리 할당, 재할당 또는 해제를 통해 중단점을 활성화할지 여부를 지정합니다. BreakAddress를 사용하여 블록의 주소를 지정하는 경우 중단점 유형을 생략할 수 있습니다. 힙을 사용하여 힙 주소 또는 힙 인덱스 지정하는 경우 형식과 Tag 매개 변수를 포함해야 합니다.
태그
힙 내의 태그 이름을 지정합니다.
-B
디버거가 힙 관리자에서 조건부 중단점을 제거하도록 합니다. 중단점 유형(할당, 재할당 또는 자유)을 지정해야 하며 -b 옵션에 사용된 것과 동일해야 합니다.
StatHeapAddress
힙의 주소를 지정합니다. 0이거나 생략된 경우 현재 프로세스와 연결된 모든 힙이 표시됩니다.
-p
페이지 힙 정보가 요청되도록 지정합니다. PageHeapOptions 없이 이 힙을 사용하면 모든 페이지 힙이 표시됩니다.
PageHeapOptions
다음 옵션 중 하나일 수 있습니다. PageHeapOptions는 대/소문자를 구분합니다. 옵션을 지정하지 않으면 가능한 모든 페이지 힙 핸들이 표시됩니다.
옵션 | 효과 |
---|---|
-h 핸들 |
핸들 핸들이 있는 페이지 힙에 대한 자세한 정보가 디버거에 표시되도록 합니다. |
-a 주소 |
디버거가 블록에 주소가 포함된 페이지 힙을 찾도록 합니다. 이 주소가 전체 페이지 힙 블록과 어떻게 관련되어 있는지, 이 주소가 페이지 힙의 일부인지, 블록 내의 오프셋인지, 블록이 할당되었는지 또는 해제되었는지와 같은 전체 세부 정보가 포함됩니다. 스택 추적은 사용할 수 있을 때마다 포함됩니다. 이 옵션을 사용하면 크기가 힙 할당 세분성의 배수로 표시됩니다. |
-t[c|s] [추적] |
디버거가 무거운 힙 사용자의 수집된 추적을 표시하도록 합니다. 추적은 표시할 추적 수를 지정합니다. 기본값은 4입니다. 지정된 수보다 더 많은 추적이 있는 경우 가장 빠른 추적이 표시됩니다. -t 또는 -tc를 사용하는 경우 추적은 개수 사용량별로 정렬됩니다. -ts를 사용하는 경우 추적은 크기별로 정렬됩니다. (-tc 및 -ts 옵션은 Windows XP에서만 지원됩니다. -t 옵션은 Windows XP 및 이전 버전의 Windows에서만 지원됩니다.) |
-fi [추적] |
디버거가 가장 최근의 오류 주입 추적을 표시하도록 합니다. 추적은 표시할 수량을 지정합니다. 기본값은 4입니다. |
-모두 |
디버거가 모든 페이지 힙에 대한 자세한 정보를 표시하도록 합니다. |
-? |
디버거가 힙 블록 다이어그램을 포함하여 페이지 힙 도움말을 표시하도록 합니다. (이러한 다이어그램은 다음 설명 섹션에서도 볼 수 있습니다.) |
!heap -p 확장 명령을 사용하려면 먼저 대상 프로세스에 대해 페이지 힙을 사용하도록 설정해야 합니다. 다음 설명 섹션의 세부 정보를 참조하세요.
-srch
지정된 패턴에 대한 모든 힙을 검색합니다.
무늬
찾을 패턴을 지정합니다.
크기
다음 옵션 중 하나일 수 있습니다. 패턴의 크기를 지정합니다. '-'가 필요합니다.
옵션 | 효과 |
---|---|
-b |
패턴은 하나의 BYTE 크기입니다. |
-w |
패턴은 하나의 WORD 크기입니다. |
-d |
패턴은 하나의 DWORD 크기입니다. |
-q |
패턴은 크기가 하나의 QWORD입니다. |
위의 내용이 지정되지 않은 경우 패턴은 컴퓨터 포인터와 같은 크기로 간주됩니다.
-flt
지정된 크기 또는 크기 범위의 힙 할당만 포함하도록 디스플레이를 제한합니다.
FilterOptions
다음 옵션 중 하나일 수 있습니다. FilterOptions는 대/소문자를 구분합니다.
옵션 | 효과 |
---|---|
s 크기 |
단일 크기의 힙만 포함하도록 디스플레이를 제한합니다. |
r SizeMin SizeMax |
지정된 크기 범위 내의 힙만 포함하도록 디스플레이를 제한합니다. |
참고 항목
이후 버전의 !heap 옵션에서는 -flt
더 이상 존재하지 않을 수 있습니다. 명령줄 도움말을 사용하여 사용 가능한 옵션을 확인합니다.
-합계
지정된 힙에 대한 사용 통계를 표시합니다.
-h 핸들
핸들의 힙 에 대한 사용 통계만 표시되도록 합니다 . 핸들이 0이거나 생략되면 모든 힙에 대한 사용 통계가 표시됩니다.
-grp GroupBy
GroupBy에서 지정 한 대로 표시를 다시 정렬합니다. GroupBy에 대한 옵션은 다음 표에서 찾을 수 있습니다.
옵션 | 효과 |
---|---|
A |
할당 크기에 따라 사용 통계를 표시합니다. |
B |
블록 수에 따라 사용 통계를 표시합니다. |
S |
각 할당의 총 크기에 따라 사용 통계를 표시합니다. |
MaxDisplay
출력을 MaxDisplay 줄 수로만 제한합니다.
DLL
Windows XP 이상 |
Ext.dll Exts.dll |
추가 정보
힙에 대한 자세한 내용은 다음 리소스를 참조하세요.
책: 마크 루시노비치와 데이비드 솔로몬에 의해 마이크로 소프트 Windows 내부 .
힙 메모리 프로세스 로거 사용에 대한 자세한 내용은 예제 11: 프라이빗 추적 세션 시작
설명
이 확장 명령은 다양한 작업을 수행하는 데 사용할 수 있습니다.
표준 !heap 명령은 현재 프로세스에 대한 힙 정보를 표시하는 데 사용됩니다. (사용자 모드 프로세스에만 사용해야 합니다. 시스템 프로세스에 !pool 확장 명령을 사용해야 합니다.)
!heap -b 및 !heap -B 명령은 힙 관리자에서 조건부 중단점을 만들고 삭제하는 데 사용됩니다.
!heap -l 명령은 유출된 힙 블록을 검색합니다. 가비지 수집기 알고리즘을 사용하여 프로세스 주소 공간의 어느 곳에서도 참조되지 않는 힙에서 사용 중인 모든 블록을 검색합니다. 대규모 애플리케이션의 경우 완료하는 데 몇 분 정도 걸릴 수 있습니다. 이 명령은 Windows XP 이상 버전의 Windows에서만 사용할 수 있습니다.
!heap -x 명령은 지정된 주소를 포함하는 힙 블록을 검색합니다. -v 옵션을 사용하는 경우 이 명령은 현재 프로세스의 전체 가상 메모리 공간에서 이 힙 블록에 대한 포인터를 추가로 검색합니다. 이 명령은 Windows XP 이상 버전의 Windows에서만 사용할 수 있습니다.
!heap -p 명령은 다양한 형태의 페이지 힙 정보를 표시합니다. !heap -p를 사용하기 전에 대상 프로세스에 대해 페이지 힙을 사용하도록 설정해야 합니다. 이 작업은 gflags.exe(Global Flags) 유틸리티를 통해 수행됩니다. 이렇게 하려면 유틸리티를 시작하고, 이미지 파일 이름 텍스트 상자에 대상 애플리케이션의 이름을 입력하고, 이미지 파일 옵션 및 페이지 힙을 사용하도록 설정하고, 적용을 선택합니다. 또는 gflags /i xxx.exe +hpa를 입력하여 명령 프롬프트 창에서 Global Flags 유틸리티를 시작할 수 있습니다. 여기서 xxx.exe 대상 애플리케이션의 이름입니다.
!heap -p -t[c|s] 명령은 Windows XP 외에는 지원되지 않습니다. 디버거 패키지와 함께 제공되는 UMDH 도구를 사용하여 비슷한 결과를 얻을 수 있습니다.
!heap -srch 명령은 지정된 특정 패턴을 포함하는 힙 항목을 표시합니다.
!heap -flt 명령은 지정된 크기의 힙 할당으로만 표시를 제한합니다.
!heap -stat 명령은 힙 사용 통계를 표시합니다.
다음은 표준 !heap 명령의 예입니다.
0:000> !ntsdexts.heap -a
Index Address Name Debugging options enabled
1: 00250000
Segment at 00250000 to 00350000 (00056000 bytes committed)
Flags: 50000062
ForceFlags: 40000060
Granularity: 8 bytes
Segment Reserve: 00100000
Segment Commit: 00004000
DeCommit Block Thres:00000400
DeCommit Total Thres:00002000
Total Free Size: 000003be
Max. Allocation Size:7ffddfff
Lock Variable at: 00250b54
Next TagIndex: 0012
Maximum TagIndex: 07ff
Tag Entries: 00350000
PsuedoTag Entries: 00250548
Virtual Alloc List: 00250050
UCR FreeList: 002504d8
128-bit bitmap of free lists
FreeList Usage: 00000014 00000000 00000000 00000000
Free Free
List List
# Head Blink Flink
FreeList[ 00 ] at 002500b8: 002a4378 . 002a4378
0x02 - HEAP_ENTRY_EXTRA_PRESENT
0x04 - HEAP_ENTRY_FILL_PATTERN
Entry Prev Cur 0x10 - HEAP_ENTRY_LAST_ENTRY
Address Size Size flags
002a4370: 00098 . 01c90 [14] - free
FreeList[ 02 ] at 002500c8: 0025cb30 . 002527b8
002527b0: 00058 . 00010 [04] - free
0025cb28: 00088 . 00010 [04] - free
FreeList[ 04 ] at 002500d8: 00269a08 . 0026e530
0026e528: 00038 . 00020 [04] - free
0026a4d0: 00038 . 00020 [06] - free
0026f9b8: 00038 . 00020 [04] - free
0025cda0: 00030 . 00020 [06] - free
00272660: 00038 . 00020 [04] - free
0026ab60: 00038 . 00020 [06] - free
00269f20: 00038 . 00020 [06] - free
00299818: 00038 . 00020 [04] - free
0026c028: 00038 . 00020 [06] - free
00269a00: 00038 . 00020 [46] - free
Segment00 at 00250b90:
Flags: 00000000
Base: 00250000
First Entry: 00250bc8
Last Entry: 00350000
Total Pages: 00000080
Total UnCommit: 00000055
Largest UnCommit:000aa000
UnCommitted Ranges: (1)
002a6000: 000aa000
Heap entries for Segment00 in Heap 250000
0x01 - HEAP_ENTRY_BUSY
0x02 - HEAP_ENTRY_EXTRA_PRESENT
0x04 - HEAP_ENTRY_FILL_PATTERN
0x08 - HEAP_ENTRY_VIRTUAL_ALLOC
0x10 - HEAP_ENTRY_LAST_ENTRY
0x20 - HEAP_ENTRY_SETTABLE_FLAG1
0x40 - HEAP_ENTRY_SETTABLE_FLAG2
Entry Prev Cur 0x80 - HEAP_ENTRY_SETTABLE_FLAG3
Address Size Size flags (Bytes used) (Tag name)
00250000: 00000 . 00b90 [01] - busy (b90)
00250b90: 00b90 . 00038 [01] - busy (38)
00250bc8: 00038 . 00040 [07] - busy (24), tail fill (NTDLL!LDR Database)
00250c08: 00040 . 00060 [07] - busy (48), tail fill (NTDLL!LDR Database)
00250c68: 00060 . 00028 [07] - busy (10), tail fill (NTDLL!LDR Database)
00250c90: 00028 . 00060 [07] - busy (48), tail fill (NTDLL!LDR Database)
00250cf0: 00060 . 00050 [07] - busy (38), tail fill (Objects= 80)
00250d40: 00050 . 00048 [07] - busy (2e), tail fill (NTDLL!LDR Database)
00250d88: 00048 . 00c10 [07] - busy (bf4), tail fill (Objects>1024)
00251998: 00c10 . 00030 [07] - busy (12), tail fill (NTDLL!LDR Database)
...
002525c0: 00030 . 00060 [07] - busy (48), tail fill (NTDLL!LDR Database)
00252620: 00060 . 00050 [07] - busy (38), tail fill (NTDLL!LDR Database)
00252670: 00050 . 00040 [07] - busy (22), tail fill (NTDLL!CSRSS Client)
002526b0: 00040 . 00040 [07] - busy (24), tail fill (Objects= 64)
002526f0: 00040 . 00040 [07] - busy (24), tail fill (Objects= 64)
00252730: 00040 . 00028 [07] - busy (10), tail fill (Objects= 40)
00252758: 00028 . 00058 [07] - busy (3c), tail fill (Objects= 88)
002527b0: 00058 . 00010 [04] free fill
002527c0: 00010 . 00058 [07] - busy (3c), tail fill (NTDLL!LDR Database)
00252818: 00058 . 002d0 [07] - busy (2b8), tail fill (Objects= 720)
00252ae8: 002d0 . 00330 [07] - busy (314), tail fill (Objects= 816)
00252e18: 00330 . 00330 [07] - busy (314), tail fill (Objects= 816)
00253148: 00330 . 002a8 [07] - busy (28c), tail fill (NTDLL!LocalAtom)
002533f0: 002a8 . 00030 [07] - busy (18), tail fill (NTDLL!LocalAtom)
00253420: 00030 . 00030 [07] - busy (18), tail fill (NTDLL!LocalAtom)
00253450: 00030 . 00098 [07] - busy (7c), tail fill (BASEDLL!LMEM)
002534e8: 00098 . 00060 [07] - busy (44), tail fill (BASEDLL!TMP)
00253548: 00060 . 00020 [07] - busy (1), tail fill (Objects= 32)
00253568: 00020 . 00028 [07] - busy (10), tail fill (Objects= 40)
00253590: 00028 . 00030 [07] - busy (16), tail fill (Objects= 48)
...
0025ccb8: 00038 . 00060 [07] - busy (48), tail fill (NTDLL!LDR Database)
0025cd18: 00060 . 00058 [07] - busy (3c), tail fill (NTDLL!LDR Database)
0025cd70: 00058 . 00030 [07] - busy (18), tail fill (NTDLL!LDR Database)
0025cda0: 00030 . 00020 [06] free fill (NTDLL!Temporary)
0025cdc0: 00020 . 00258 [07] - busy (23c), tail fill (Objects= 600)
0025d018: 00258 . 01018 [07] - busy (1000), tail fill (Objects>1024)
0025e030: 01018 . 00060 [07] - busy (48), tail fill (NTDLL!LDR Database)
...
002a4190: 00028 . 00118 [07] - busy (100), tail fill (BASEDLL!GMEM)
002a42a8: 00118 . 00030 [07] - busy (18), tail fill (Objects= 48)
002a42d8: 00030 . 00098 [07] - busy (7c), tail fill (Objects= 152)
002a4370: 00098 . 01c90 [14] free fill
002a6000: 000aa000 - uncommitted bytes.
다음은 !heap -l 명령의 예입니다.
1:0:011> !heap -l
1:Heap 00170000
Heap 00280000
Heap 00520000
Heap 00b50000
Heap 00c60000
Heap 01420000
Heap 01550000
Heap 016d0000
Heap 019b0000
Heap 01b40000
Scanning VM ...
## Entry User Heap Segment Size PrevSize Flags
001b2958 001b2960 00170000 00000000 40 18 busy extra
001b9cb0 001b9cb8 00170000 00000000 80 300 busy extra
001ba208 001ba210 00170000 00000000 80 78 busy extra
001cbc90 001cbc98 00170000 00000000 e0 48 busy extra
001cbd70 001cbd78 00170000 00000000 d8 e0 busy extra
001cbe90 001cbe98 00170000 00000000 68 48 busy extra
001cbef8 001cbf00 00170000 00000000 58 68 busy extra
001cc078 001cc080 00170000 00000000 f8 128 busy extra
001cc360 001cc368 00170000 00000000 80 50 busy extra
001cc3e0 001cc3e8 00170000 00000000 58 80 busy extra
001fe550 001fe558 00170000 00000000 150 278 busy extra
001fe6e8 001fe6f0 00170000 00000000 48 48 busy extra
002057a8 002057b0 00170000 00000000 58 58 busy extra
00205800 00205808 00170000 00000000 48 58 busy extra
002058b8 002058c0 00170000 00000000 58 70 busy extra
00205910 00205918 00170000 00000000 48 58 busy extra
00205958 00205960 00170000 00000000 90 48 busy extra
00246970 00246978 00170000 00000000 60 88 busy extra
00251168 00251170 00170000 00000000 78 d0 busy extra user_flag
00527730 00527738 00520000 00000000 40 40 busy extra
00527920 00527928 00520000 00000000 40 80 busy extra
21 leaks detected.
이 예제의 테이블에는 찾은 21개의 누수가 모두 포함되어 있습니다.
다음은 !heap -x 명령의 예입니다.
0:011> !heap 002057b8 -x
## Entry User Heap Segment Size PrevSize Flags
002057a8 002057b0 00170000 00170640 58 58 busy extra
다음은 !heap -x -v 명령의 예입니다.
1:0:011> !heap 002057b8 -x -v
## 1:Entry User Heap Segment Size PrevSize Flags
002057a8 002057b0 00170000 00170640 58 58 busy extra
Search VM for address range 002057a8 - 002057ff : 00205990 (002057d0),
이 예제에서는 주소 0x00205990 이 힙 블록에 대한 포인터가 있습니다.
다음은 !heap -flt s 명령의 예입니다 .
0:001>!heap -flt s 0x50
이렇게 하면 크기 0x50 할당이 모두 표시됩니다.
다음은 !heap -flt r 명령의 예입니다.
0:001>!heap -flt r 0x50 0x80
크기가 0x50 및 0x7F 사이의 각 할당을 표시합니다.
다음은 !heap -srch 명령의 예입니다 .
0:001> !heap -srch 77176934
_HEAP @ 00090000
in HEAP_ENTRY: Size : Prev Flags - UserPtr UserSize - state
00099A48: 0018 : 0005 [01] - 00099A50 (000000B8) - (busy)
ole32!CALLFRAME_CACHE<INTERFACE_HELPER_CLSID>::`vftable'
_HEAP @ 00090000
in HEAP_ENTRY: Size : Prev Flags - UserPtr UserSize - state
00099B58: 0018 : 0005 [01] - 00099B60 (000000B8) - (busy)
ole32!CALLFRAME_CACHE<INTERFACE_HELPER_CLSID>::`vftable'
다음 다이어그램은 힙 블록의 배열을 보여 줍니다.
라이트 페이지 힙 블록 -- 할당됨:
+-----+---------------+---+
| | | |
+-----+---------------+---+
^ ^ ^
| | 8 suffix bytes (filled with 0xA0)
| User allocation (filled with E0 if zeroing not requested)
Block header (starts with 0xABCDAAAA and ends with 0xDCBAAAAA)
라이트 페이지 힙 블록 -- 해제됨:
+-----+---------------+---+
| | | |
+-----+---------------+---+
^ ^ ^
| | 8 suffix bytes (filled with 0xA0)
| User allocation (filled with F0 bytes)
Block header (starts with 0xABCDAAA9 and ends with 0xDCBAAA9)
전체 페이지 힙 블록 -- 할당됨:
+-----+---------+---+-------
| | | | ... N/A page
+-----+---------+---+-------
^ ^ ^
| | 0-7 suffix bytes (filled with 0xD0)
| User allocation (if zeroing not requested, filled
with C0)
Block header (starts with 0xABCDBBBB and ends with 0xDCBABBBB)
전체 페이지 힙 블록 -- 해제됨:
+-----+---------+---+-------
| | | | ... N/A page
+-----+---------+---+-------
^ ^ ^
| | 0-7 suffix bytes (filled with 0xD0)
| User allocation (filled with F0 bytes)
Block header (starts with 0xABCDBBA and ends with 0xDCBABBBA)
할당의 스택 추적 또는 힙 블록 또는 전체 페이지 힙 블록의 해제를 보려면 헤더 주소와 함께 dt DPH_BLOCK_INFORMATION 사용하고 블록의 StackTrace 필드가 있는 dd를 사용합니다.