Обнаружение повреждения кучи в Windows

#windows #heap-corruption

#Windows #повреждение кучи

Вопрос:

Я работаю над 64-разрядной DLL, вызываемой Java. Это очень затрудняет использование отладчика. В какой-то момент кажется, что куча повреждена, а затем происходит сбой намного позже. Есть ли какая-либо функция, которую эта dll может вызвать, чтобы убедиться, что вся куча не повреждена? Я хотел бы выполнить этот вызов из критических мест в программе и сообщить о любых проблемах в той или иной форме.

Ответ №1:

Я нашел функцию HeapWalk в библиотеке Microsoft, которая работала. Когда он обнаружил ошибку, он вошел в цикл вместо возврата ошибки, но все же решил проблему.

Код приведен ниже. Это, вероятно, бесполезно в своей точной форме, но может дать идею. Это называется:

 err=heap_check(__FILE__,__LINE__);

int heap_check(char *file,int line)
{//walks the heap to check for any errors
int return_val;
static HANDLE default_heap=NULL;
static int err_cnt=0;
static int entry_cnt=0;
clock_t start_time;
PROCESS_HEAP_ENTRY heap_entry;
return_val=0;
heap_entry.lpData=NULL;
if (err_cnt<100)
    {
    if ((entry_cnt 00)==0)Printf("n %s %d %d %d %s %d",__FILE__,__LINE__,err_cnt,entry_cnt,file,line);
    //Printf("n");
    start_time=clock();
    if (default_heap==NULL)
        default_heap=GetProcessHeap();
    if (default_heap!=NULL)
        for (int ia=0,return_val=TRUE;ia<1000000 amp;amp; return_val;ia  )
            {
            return_val=HeapWalk(default_heap,amp;heap_entry);
            //Printf(" %x",heap_entry.lpData);
            if ((ia000)==0)printf(" %d",ia);
            if (!return_val || ia==999999)
                {
                int err;
                err=GetLastError();
                if (err!=ERROR_NO_MORE_ITEMS)
                    {
                    Printf("n %s %d  HEAP_ERROR %d cnt %d",file,line,err,ia);
                    err_cnt  ;
                    }
                else 
                    if ((entry_cnt 00)==0)Printf(" cnt %d %d",ia,clock()-start_time);
                }
            }
        else
            Printf("n %s %d no heap handle",file,line);
    }
entry_cnt  ;
return(return_val);