小弟最近要用Win32 API 里的HeapWalk函数,可是那个结构PROCESS_HEAP_ENTRY的内部几个数据的解释 在MSDN上非常语焉不详。搜遍了Google也没有找到这几个数据到底是啥意思的详细的解释,那位有这个资料,或者以前用过HeapWalk函数的帮帮忙。

解决方案 »

  1.   


    BOOL HeapWalk(    HANDLE hHeap, // handle to the heap to enumerate
        LPPROCESS_HEAP_ENTRY lpEntry  // points to structure that maintains enumeration state information
       );Example/* 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.
     */#include <stdio.h>
    #include <malloc.h>void heapdump( void );void main( void )
    {
       char *buffer;   heapdump();
       if( (buffer = malloc( 59 )) != NULL )
       {
          heapdump();
          free( buffer );
       }
       heapdump();
    }void heapdump( void )
    {
       _HEAPINFO hinfo;
       int heapstatus;
       hinfo._pentry = NULL;
       while( ( heapstatus = _heapwalk( &hinfo ) ) == _HEAPOK )
       { printf( "%6s block at %Fp of size %4.4X\n",
            ( hinfo._useflag == _USEDENTRY ? "USED" : "FREE" ),
              hinfo._pentry, hinfo._size );
       }   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;
       }
    }
    Output  USED block at 002C0004 of size 0014
      USED block at 002C001C of size 0054
      USED block at 002C0074 of size 0024
      USED block at 002C009C of size 0010
      USED block at 002C00B0 of size 0018
      USED block at 002C00CC of size 000C
      USED block at 002C00DC of size 001C
      USED block at 002C00FC of size 0010
      USED block at 002C0110 of size 0014
      USED block at 002C0128 of size 0010
      USED block at 002C013C of size 0028
      USED block at 002C0168 of size 0088
      USED block at 002C01F4 of size 001C
      USED block at 002C0214 of size 0014
      USED block at 002C022C of size 0010
      USED block at 002C0240 of size 0014
      USED block at 002C0258 of size 0010
      USED block at 002C026C of size 000C
      USED block at 002C027C of size 0010
      USED block at 002C0290 of size 0014
      USED block at 002C02A8 of size 0010
      USED block at 002C02BC of size 0010
      USED block at 002C02D0 of size 1000
      FREE block at 002C12D4 of size ED2C
    OK - end of heap
      

  2.   

    该函数只用于调试目的。它使你能够遍历堆栈的内容。可以多次调用该函数。
    在循环调用HeapWalk的时候,必须使用HeapLock和HeapUnlock函数,这样,当遍历堆栈时,其他线程将无法分配和释放堆栈中的内存块。
      

  3.   

    谢谢楼上的各位,但是各位说我我都已经看到过了。但是没什么帮助澄清两点:
    1. 我要用的是WIN32 API HeapWalk, 原型如下:
    HeapWalkThe HeapWalk function enumerates the memory blocks in a specified heap.
    BOOL HeapWalk(
      HANDLE hHeap,
      LPPROCESS_HEAP_ENTRY lpEntry
    );
    2。我想要知道的不是MSDN上已经写了的东西。主要是:
    每次得到一个PROCESS_HEAP_ENTRY后,这个结构里数据的意义。比如说,我向统计整个Heap有多大,到底commit了多少physical memory, 保留了多少virtual memory. 我应该怎么根据这些标志和数据来计算。我已经有的计算方法好像不对。谢谢那位大人能够指点迷津拉