_heapwalk
Percorre o heap e retorna informações sobre a próxima entrada.
Importante
Esta API não pode ser usada em aplicativos executados no Windows Runtime, exceto em builds de depuração. Para obter mais informações, confira Funções do CRT sem suporte em aplicativos da Plataforma Universal do Windows.
Sintaxe
int _heapwalk( _HEAPINFO *entryinfo );
Parâmetros
entryinfo
Buffer que conterá informações do heap.
Valor retornado
_heapwalk
retorna uma das seguintes constantes de manifesto de inteiro definidas em Malloc.h.
Valor retornado | Significado |
---|---|
_HEAPBADBEGIN |
As informações do cabeçalho inicial são inválidas ou não foram encontradas. |
_HEAPBADNODE |
Heap danificado ou nó inválido encontrado. |
_HEAPBADPTR |
O _pentry campo da _HEAPINFO estrutura não contém um ponteiro válido para o heap ou entryinfo é um ponteiro nulo. |
_HEAPEND |
Fim do heap alcançado com êxito. |
_HEAPEMPTY |
Heap não inicializado. |
_HEAPOK |
Nenhum erro até o momento; entryinfo é atualizado com informações sobre a próxima entrada do heap. |
Além disso, se ocorrer um erro, _heapwalk
definirá errno
como ENOSYS
.
Comentários
A função _heapwalk
ajuda a depurar problemas relacionados ao heap em programas. A função percorre o heap, passando por uma entrada por chamada e retorna um ponteiro para uma estrutura do tipo _HEAPINFO
que contém informações sobre a entrada de heap seguinte. O tipo _HEAPINFO
, definido em Malloc.h, contém os seguintes elementos.
Campo | Significado |
---|---|
int *_pentry |
Ponto de entrada do heap. |
size_t _size |
Tamanho da entrada do heap. |
int _useflag |
Sinalizador que indica se a entrada do heap está sendo utilizada. |
Uma chamada para _heapwalk
que retorna _HEAPOK
armazena o tamanho da entrada no campo _size
e define o campo _useflag
como _FREEENTRY
ou _USEDENTRY
(ambos são constantes definidas em Malloc.h). Para obter essas informações sobre a primeira entrada no heap, passe _heapwalk
um ponteiro para uma estrutura _HEAPINFO
cujo membro _pentry
é NULL
. Se o sistema operacional não for compatível com _heapwalk
, a função retornará _HEAPEND
e será definida errno
como ENOSYS
.
Esta função valida seu parâmetro. Se entryinfo
for um ponteiro nulo, o manipulador de parâmetro inválido será chamado, conforme descrito em Validação de parâmetro. Se a execução tiver permissão para continuar, errno
será definido como EINVAL
e a função retornará _HEAPBADPTR
.
Requisitos
Rotina | Cabeçalho necessário | Cabeçalho opcional |
---|---|---|
_heapwalk |
<malloc.h> | <errno.h> |
Para obter informações sobre compatibilidade, consulte Compatibilidade.
Exemplo
// 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