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

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


person Mark Hubelbank    schedule 30.11.2020    source источник


Ответы (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 %1000)==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 && return_val;ia++)
            {
            return_val=HeapWalk(default_heap,&heap_entry);
            //Printf(" %x",heap_entry.lpData);
            if ((ia%10000)==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 %1000)==0)Printf(" cnt %d %d",ia,clock()-start_time);
                }
            }
        else
            Printf("\n %s %d no heap handle",file,line);
    }
entry_cnt++;
return(return_val);
person Mark Hubelbank    schedule 01.12.2020