首页 > 解决方案 > 检测 Windows 中的堆损坏

问题描述

我正在研究一个由 Java 调用的 64 位 DLL。这使得使用调试器非常困难。它似乎在某个时候破坏了堆,然后崩溃了很多。这个dll是否可以调用一些函数来验证整个堆没有损坏?我想从程序中的关键位置进行此调用,并让它以某种形式报告任何问题。

标签: windowsheap-corruption

解决方案


我在微软库中找到了一个有效的函数 HeapWalk。当它确实遇到错误时,它进入循环而不是返回错误,但它仍然解决了问题。

代码如下。它的确切形式可能是无用的,但可能会给人一个想法。它被称为:

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

推荐阅读