windows - 检测 Windows 中的堆损坏
问题描述
我正在研究一个由 Java 调用的 64 位 DLL。这使得使用调试器非常困难。它似乎在某个时候破坏了堆,然后崩溃了很多。这个dll是否可以调用一些函数来验证整个堆没有损坏?我想从程序中的关键位置进行此调用,并让它以某种形式报告任何问题。
解决方案
我在微软库中找到了一个有效的函数 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);
推荐阅读
- tensorflow - ValueError:必须使用 SageMaker 支持的区域设置本地 AWS 配置
- angular - 如何从Angular中RXJS的可观察函数处理返回值
- mysql - MySQL 5.7 上的加密如何工作?
- oracle - 数据加载向导 - 转换规则不起作用
- javascript - 在 Highcharts 中,重新启用图表最右边的元素时,我的 dataLabels 消失了
- html - 单击 DIV 时在单选值之间切换
- json - 如何生成与数组和对象具有相同键和值的 JSON 请求有效负载?
- kotlin - ReceiveAll() 在 Corda 中的应用是什么?如何实施?
- java - 在 Java 11 上使用 Jetty Maven 插件 9.4.32.v20200930 获取类“FutureCallback”和“LazyList”的“NoClassDefFoundError”
- sql - 获取使用排序溢出的 SQL 语句