【问题标题】:HeapAlloc causes excpetion - Windows 7 x64HeapAlloc 导致异常 - Windows 7 x64
【发布时间】:2012-04-24 22:21:33
【问题描述】:

在我编写自己的小型数据库编辑器程序之前,我使用 Win API 从零开始对其进行编码,因此它不是一个非常小的项目。 到目前为止,它在所有操作系统上都运行良好,我有 Win 7 x64 和所有最新更新,我的应用程序由于某些堆函数(HeapAlloc 或 HeapFree,我什么都不用)而崩溃,出现 0xC000005 异常,我尝试替换 HeapAlloc & HeapFree 与 VirtualAlloc 和 VirtualFree,一切都很好,但我不想使用虚拟内存.... 别的东西,我试图用调试器附加来跟踪问题,但是当我附加调试器时它没有崩溃,然后我试图显示 MessageBox 来跟踪它崩溃的位置,但是当我显示 MessageBox 时它也没有崩溃....

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

有人遇到过类似的问题吗?

【问题讨论】:

    标签: windows exception 64-bit heap-memory wow64


    【解决方案1】:

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

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

    就目前为止它一直有效的原因而言:您很幸运。仔细查看访问分配内存的代码,如果遇到困难,请在此处发布相关部分。如果调试器没有帮助并且错误很容易重现,只需注释掉部分代码,直到找到导致崩溃的行。

    【讨论】:

    • 从评论行看来我真的写出了分配的内存,但对我来说似乎不可能,我增加了分配内存的大小,所以它足够前但仍然相同,它适用于所有操作系统,它适用于没有最新补丁的其他 Win7 x64,但它不适用于更新到最新补丁的我....
    • 如果不看一些代码,我们真的没有任何办法可以进一步帮助您。尝试继续注释较小的块,直到找到写出分配内存的行。不管怎样,听起来你已经很接近了。关于它在某些情况下的工作,你真的依赖于未定义的行为,所以任何事情都可能发生。
    【解决方案2】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-03-19
      • 1970-01-01
      • 1970-01-01
      • 2012-10-04
      • 1970-01-01
      • 2011-11-28
      相关资源
      最近更新 更多