_heapwalk
힙을 이동하고 다음 항목에 대한 정보를 반환합니다.
Important
이 API는 디버그 빌드를 제외하고 Windows 런타임에서 실행되는 애플리케이션에서 사용할 수 없습니다. 자세한 내용은 유니버설 Windows 플랫폼 앱에서 지원되지 않는 CRT 함수를 참조하세요.
구문
int _heapwalk( _HEAPINFO *entryinfo );
매개 변수
entryinfo
힙 정보를 포함할 버퍼입니다.
반환 값
_heapwalk
는 Malloc.h에 정의된 다음 정수 매니페스트 상수 중 하나를 반환합니다.
반환 값 | 의미 |
---|---|
_HEAPBADBEGIN |
초기 헤더 정보가 잘못되었거나 없습니다. |
_HEAPBADNODE |
힙이 손상되었거나 잘못된 노드가 있습니다. |
_HEAPBADPTR |
구조체의 _HEAPINFO 필드에는 _pentry 힙 entryinfo 에 대한 유효한 포인터가 없거나 null 포인터입니다. |
_HEAPEND |
힙 끝에 성공적으로 도달했습니다. |
_HEAPEMPTY |
힙이 초기화되지 않았습니다. |
_HEAPOK |
지금까지 오류가 발생하지 않았습니다. 다음 힙 항목에 대한 정보로 entryinfo 가 업데이트됩니다. |
또한 오류가 발생하는 경우 _heapwalk
는 errno
를 ENOSYS
로 설정합니다.
설명
_heapwalk
함수를 통해 프로그램에서 힙 관련 문제를 디버그할 수 있습니다. 이 함수는 힙을 처리하여 호출당 한 항목을 이동하고 다음 힙 항목에 대한 정보가 포함된 _HEAPINFO
형식의 구조체 포인터를 반환합니다. Malloc.h에 정의된 _HEAPINFO
형식에는 다음 요소가 포함됩니다.
필드 | 의미 |
---|---|
int *_pentry |
힙 항목 포인터. |
size_t _size |
힙 항목의 크기. |
int _useflag |
힙 항목이 사용 중인지 여부를 나타내는 플래그. |
_HEAPOK
를 반환하는 _heapwalk
호출은 항목의 크기를 _size
필드에 저장하고 _useflag
필드를 _FREEENTRY
또는 _USEDENTRY
(둘 다 Malloc.h에 정의된 상수임)로 설정합니다. 힙의 첫 번째 항목에 대한 이 정보를 가져오려면 _heapwalk
를 NULL
인 _pentry
멤버가 포함된 _HEAPINFO
구조체 포인터에 전달합니다. 운영 체제에서 지원하지 _heapwalk
않는 경우 함수가 반환 _HEAPEND
되고 다음으로 설정 errno
됩니다 ENOSYS
.
이 함수는 해당 매개 변수의 유효성을 검사합니다. entryinfo
이 Null 포인터인 경우 매개 변수 유효성 검사에 설명된 대로 잘못된 매개 변수 처리기가 호출됩니다. 계속해서 실행하도록 허용된 경우 errno
는 EINVAL
로 설정되고 함수에서 _HEAPBADPTR
버전입니다.
요구 사항
루틴에서 반환된 값 | 필수 헤더 | 선택적 헤더 |
---|---|---|
_heapwalk |
<malloc.h> | <errno.h> |
호환성에 대한 자세한 내용은 호환성을 참조하세요.
예시
// crt_heapwalk.c
// This program "walks" the heap, starting
// at the beginning (_pentry = NULL). It prints out each
// heap entry's use, location, and size. It also prints
// out information about the overall state of the heap as
// soon as _heapwalk returns a value other than _HEAPOK
// or if the loop has iterated 100 times.
#include <stdio.h>
#include <malloc.h>
void heapdump(void);
int main(void)
{
char *buffer;
heapdump();
if((buffer = (char *)malloc(59)) != NULL)
{
heapdump();
free(buffer);
}
heapdump();
}
void heapdump(void)
{
_HEAPINFO hinfo;
int heapstatus;
int numLoops;
hinfo._pentry = NULL;
numLoops = 0;
while((heapstatus = _heapwalk(&hinfo)) == _HEAPOK &&
numLoops < 100)
{
printf("%8s block at %Fp of size %4.4X\n",
(hinfo._useflag == _USEDENTRY ? "USED" : "FREE"),
hinfo._pentry, hinfo._size);
numLoops++;
}
switch(heapstatus)
{
case _HEAPEMPTY:
printf("OK - empty heap\n");
break;
case _HEAPEND:
printf("OK - end of heap\n");
break;
case _HEAPBADPTR:
printf("ERROR - bad pointer to heap\n");
break;
case _HEAPBADBEGIN:
printf("ERROR - bad start of heap\n");
break;
case _HEAPBADNODE:
printf("ERROR - bad node in heap\n");
break;
}
}
USED block at 00310650 of size 0100
USED block at 00310758 of size 0800
USED block at 00310F60 of size 0080
FREE block at 00310FF0 of size 0398
USED block at 00311390 of size 000D
USED block at 003113A8 of size 00B4
USED block at 00311468 of size 0034
USED block at 003114A8 of size 0039
...
USED block at 00312228 of size 0010
USED block at 00312240 of size 1000
FREE block at 00313250 of size 1DB0
OK - end of heap