0

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

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

有人有类似的问题吗?

4

2 回答 2

1

您是否已将其附加到应用程序的调试版本?如果问题没有出现在调试版本中,那么您应该检查哪些警告(在最高级别)生成您的代码,也许您会发现一些未初始化的变量。如果这里没有,那么您可能会使用一些静态分析工具来帮助查找错误 - 例如 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)

于 2012-04-25T01:27:51.460 回答
1

首先,两者都HeapAlloc分配VirtualAlloc虚拟内存。

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

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

于 2012-04-24T23:14:08.513 回答