_heapwalk
Durchläuft den Heap und gibt Informationen zum folgenden Eintrag zurück.
Wichtig
Diese API kann nicht in Anwendungen verwendet werden, die in Windows-Runtime ausgeführt werden. Dies gilt nicht für Debug-Builds. Weitere Informationen finden Sie im Artikel CRT functions not supported in Universal Windows Platform apps (In Apps für die universelle Windows-Plattform nicht unterstützte CRT-Funktionen).
Syntax
int _heapwalk( _HEAPINFO *entryinfo );
Parameter
entryinfo
Der Puffer, der die Heapinformationen enthält.
Rückgabewert
_heapwalk
gibt eine der folgenden ganzzahligen Manifestkonstanten zurück, die in Malloc.h definiert sind.
Rückgabewert | Bedeutung |
---|---|
_HEAPBADBEGIN |
Ursprüngliche Headerinformationen ungültig oder nicht gefunden. |
_HEAPBADNODE |
Heap beschädigt oder ungültiger Knoten gefunden. |
_HEAPBADPTR |
Das _pentry Feld der _HEAPINFO Struktur enthält keinen gültigen Zeiger in den Heap oder entryinfo ist ein Nullzeiger. |
_HEAPEND |
Ende des Heaps erfolgreich erreicht. |
_HEAPEMPTY |
Heap wurde nicht initialisiert. |
_HEAPOK |
Keine Fehler bisher; entryinfo wird mit Informationen zum nächsten Heapeintrag aktualisiert. |
Wenn ein Fehler auftritt, setzt _heapwalk
errno
zudem auf ENOSYS
.
Hinweise
Die _heapwalk
-Funktion hilft beim Debuggen heapbezogener Probleme in Programmen. Die Funktion durchläuft den Heap, durchsucht einen Eintrag pro Aufruf und gibt einen Zeiger auf eine Struktur vom Typ _HEAPINFO
zurück, die Informationen zum folgenden Heapeintrag enthält. Der in Malloc.h definierte _HEAPINFO
-Typ enthält die folgenden Elemente.
Feld | Bedeutung |
---|---|
int *_pentry |
Heapeintragszeiger. |
size_t _size |
Größe des Heapeintrags. |
int _useflag |
Kennzeichnung, die angibt, ob der Heapeintrag verwendet wird. |
Ein Aufruf von _heapwalk
, der _HEAPOK
zurückgibt, speichert die Größe des Eintrags im _size
-Feld und setzt das _useflag
-Feld auf _FREEENTRY
oder _USEDENTRY
(beide Konstanten sind in Malloc.h definiert). Zum Abrufen der Informationen über den ersten Eintrag im Heap übergeben Sie einen _heapwalk
-Zeiger auf eine _HEAPINFO
-Struktur, dessen _pentry
-Member NULL
ist. Wenn das Betriebssystem nicht unterstützt _heapwalk
wird, gibt die Funktion zurück _HEAPEND
und legt sie errno
auf ENOSYS
.
Diese Funktion überprüft seine Parameter. Wenn entryinfo
ein NULL-Zeiger ist, wird der Handler für ungültige Parameter aufgerufen, wie in Parameter Validation (Parameterüberprüfung) beschrieben. Wenn die weitere Ausführung zugelassen wird, wird errno
auf EINVAL
festgelegt, und die Funktion gibt _HEAPBADPTR
beschrieben.
Anforderungen
Routine | Erforderlicher Header | Optionaler Header |
---|---|---|
_heapwalk |
<malloc.h> | <errno.h> |
Weitere Informationen zur Kompatibilität finden Sie unter Kompatibilität.
Beispiel
// 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