#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);