walk through a heap, gathering debugging information
#include <malloc.h>
int _heapwalk( struct _heapinfo *entry );
int _bheapwalk( __segment seg,
struct _heapinfo *entry );
int _fheapwalk( struct _heapinfo *entry );
int _nheapwalk( struct _heapinfo *entry );
struct _heapinfo {
void __far *_pentry; /* heap pointer */
size_t _size; /* heap entry size */
int _useflag; /* heap entry
in-use flag */
};
#define _USEDENTRY 0
#define _FREEENTRY 1
The _heapwalk() functions, along with _heapchk() and _heapset() are provided for debugging heap-related problems in programs.
The _heapwalk() functions walk through the heap, one entry per call, updating the _heapinfo structure with information on the next heap entry. The structure is defined in <malloc.h>. You must initialize the _pentry field with NULL to start the walk through the heap.
Each function walks a particular heap, as listed below:
In a small data memory model, _heapwalk() is equivalent to _nheapwalk(); in a large data memory model, _heapwalk() is equivalent to _fheapwalk().
One of the following manifest constants, which are defined in <malloc.h>:
#include <stdio.h>
#include <malloc.h>
heap_dump()
{
struct _heapinfo h_info;
int heap_status;
h_info._pentry = NULL;
for(;;) {
heap_status = _heapwalk( &h_info );
if( heap_status != _HEAPOK ) break;
printf( " %s block at %Fp of size %4.4X\n",
(h_info._useflag == _USEDENTRY ? "USED" : "FREE"),
h_info._pentry, h_info._size );
}
switch( heap_status ) {
case _HEAPEND:
printf( "OK - end of heap\n" );
break;
case _HEAPEMPTY:
printf( "OK - heap is empty\n" );
break;
case _HEAPBADBEGIN:
printf( "ERROR - heap is damaged\n" );
break;
case _HEAPBADPTR:
printf( "ERROR - bad pointer to heap\n" );
break;
case _HEAPBADNODE:
printf( "ERROR - bad node in heap\n" );
}
}
void main()
{
char *p;
heap_dump(); p = (char *) malloc( 80 );
heap_dump(); free( p );
heap_dump();
}
On 16-bit 80x86 systems, output like the following is produced:
USED block at 000c:0c06 of size 0008 USED block at 000c:0c0e of size 0022 USED block at 000c:0c30 of size 0402 FREE block at 000c:1032 of size 1BCC OK - end of heap USED block at 000c:0c06 of size 0008 USED block at 000c:0c0e of size 0022 USED block at 000c:0c30 of size 0402 USED block at 000c:1032 of size 0052 FREE block at 000c:1084 of size 1B7A OK - end of heap USED block at 000c:0c06 of size 0008 USED block at 000c:0c0e of size 0022 USED block at 000c:0c30 of size 0402 FREE block at 000c:1032 of size 1BCC OK - end of heap
On 32-bit 80386/486 systems, output like the following is produced:
OK - heap is empty USED block at 0014:00002a7c of size 0204 USED block at 0014:00002c80 of size 0054 FREE block at 0014:00002cd4 of size 1D98 OK - end of heap USED block at 0014:00002a7c of size 0204 FREE block at 0014:00002c80 of size 1DEC OK - end of heap
WATCOM
| Safety: | |
|---|---|
| Interrupt handler | No |
| Signal handler | No |
| Thread | Yes |
_heapchk(), _heapenable(), _heapgrow(), _heapmin(), _heapset(), _heapshrink()