使用Windows GFlags应用程序检测堆损坏

时间:2017-03-15 08:30:26

标签: c++ crash-dumps heap-corruption

我正在尝试使用GFlags为小型应用程序启用页面堆,但由于某种原因它无效。

我编写了一个小型C ++应用程序,它所做的就是破坏堆内存:

int* a;
a= (int*)malloc(1);
*a= 8888800;
return 0;

运行此代码时,应用程序不会崩溃。 但是在启用页面堆的情况下,我会期望它在第三行。

我怀疑我没有正确激活GFlags,但无法弄清楚问题。在图像文件选项卡中运行GFlags exe后,我将路径复制到我的exe并标记了启用页面堆并停止了异常选项。我检查了CMD并看到页面堆已启用。可能是什么问题?

1 个答案:

答案 0 :(得分:2)

页面堆意味着在您的变量所在的页面之后有一个受保护的页面。这也意味着您必须访问该受保护页面中的内存才能使其崩溃。您没有写足够的数据来到达页面末尾。

这样的东西
int* a;
a= (int*)malloc(1);
*(a+4096)= 8888800;
return 0;

应该有效(未经测试)。

请记住,当打开页堆时,堆上的每个变量都需要8 kB的内存:变量所在的可访问页面为4 kB,后续受保护页面为4 kB。

总而言之,页面堆对于生产中的应用程序来说不是一个好主意,但可能适用于小型测试应用程序。你需要确定缓冲区溢出(或欠载)。