首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >HeapAlloc导致激活-Windows7 x64

HeapAlloc导致激活-Windows7 x64
EN

Stack Overflow用户
提问于 2012-04-25 06:21:34
回答 2查看 2.7K关注 0票数 0

在一段时间之前,我编写了自己的小数据库编辑器程序,我使用Win API从零开始编写它,所以它不是很小的项目。到目前为止,它在所有操作系统上都工作得很好,我有Win 7 x64和所有最新的更新,我的应用程序因为一些堆函数( HeapAlloc或HeapFree,我不使用其他函数)而崩溃0xC000005异常,我尝试用VirtualAlloc和VirtualFree替换HeapAlloc和HeapFree,一切都很好,但我不想使用虚拟内存...另外,我试图连接调试器来跟踪问题,但是当我连接调试器时,它没有崩溃,然后我试图显示MessageBox来跟踪它崩溃的地方,但是当我显示MessageBox时,它也没有崩溃……

我的应用程序作为32位进程运行。用C编写的代码。

有没有人有类似的问题?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-04-25 07:14:09

首先,HeapAllocVirtualAlloc都分配虚拟内存。

我对正在发生的事情的猜测是,您正在写入已分配内存的边界。这不适用于HeapAlloc的原因是它准确地分配了您所请求的内存量。对于VirtualAlloc,返回的大小是向上舍入到下一页边界的请求大小。在您的例子中,这给了您更多的回旋余地(即使您的代码仍然在做错误的事情)。

至于为什么它一直有效:你只是走运了。仔细查看访问已分配内存的代码,如果遇到问题,请在此处发布相关部分。如果调试器没有帮助,而且bug很容易重现,那么只需注释掉部分代码,直到找到导致崩溃的代码行。

票数 1
EN

Stack Overflow用户

发布于 2012-04-25 09:27:51

你有没有把它附加到你的应用程序的Debug版本?如果问题没有出现在调试版本中,那么你应该检查什么警告(在最高级别)生成你的代码,也许你会发现一些未初始化的变量。如果这里什么都没有,那么您可以使用一些静态分析工具来帮助查找bugs比如PVS-Studio http://www.viva64.com/

你也可以编译启用了调试信息的发布版本,这样当问题出现时,你应该能够使用调试器附加到你的应用程序,并看到带有函数名称的调用堆栈。若要使调试更容易,请禁用代码优化。

你也可以尝试使用windows调试器工具中的gflag,这个程序会在你每次写出缓冲区边界的时候触发断点。这是一个非常有用的工具,因为并不是所有的缓冲区溢出都会导致异常。在启用调试信息的应用程序上使用它,最好关闭代码优化。要为您的应用程序使用启用gflag:

gflags /p /enable myapp.exe /full (http://msdn.microsoft.com/en-us/library/windows/hardware/ff543097%28v=vs.85%29.aspx)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10306870

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档