在一段时间之前我编写了我自己的小db编辑器程序,我使用Win API从零开始编码,所以它的项目不是很小。 它在所有操作系统上工作正常,直到现在,我有Win 7 x64所有最新更新和我的应用程序崩溃与0xC000005异常,因为一些堆功能(HeapAlloc或HeapFree,我没有使用其他),我尝试更换HeapAlloc&amp ; HeapFree与VirtualAlloc和VirtualFree,它一切都很好,但我不想使用虚拟内存.... 还有别的,我试着用调试器来追踪问题,但是当我连接调试器它没有崩溃时,我试图显示MessageBox来追踪它崩溃的地方,但是当我显示MessageBox时它也没有崩溃....
我的应用程序以32位进程运行。 用C编码。
有人有过类似的问题吗?
答案 0 :(得分:1)
首先,HeapAlloc
和VirtualAlloc
分配虚拟内存。
我对正在发生的事情的猜测是你正在写出已分配内存的边界。这不适用于HeapAlloc
的原因是它分配了您请求的内存量。使用VirtualAlloc
时,返回的大小是请求的大小,向上舍入到下一页边界。在你的情况下,这给了更多的余地(即使你的代码仍然做错了)。
就目前为止的工作原理而言:你很幸运。仔细查看访问已分配内存的代码,如果卡住,请在此处发布相关部分。如果调试器没有帮助并且错误很容易重现,只需注释掉部分代码,直到找到导致崩溃的行。
答案 1 :(得分:1)
您是否已将其附加到应用程序的调试版本?如果调试版本中没有出现问题,那么您应该检查哪些警告(在最高级别)生成代码,也许您会发现一些未初始化的变量。如果没有,那么你可以使用一些静态分析工具来帮助找到错误 - 比如PVS-Studio http://www.viva64.com/。
您也可以编译Release版本并启用调试信息,这样当问题出现时您应该能够使用调试器附加到您的应用程序并查看带有函数名称的callstack。为了便于调试,请禁用代码优化。
你也可以试试windows调试工具中的gflags,这个程序每次在缓冲区边界外写时都会触发断点。这是非常有用的工具,因为并非所有缓冲区溢出都会导致异常。在启用调试信息的应用程序上使用它,最好关闭代码优化。要为您的应用启用gflags,请使用:
gflags / p /启用myapp.exe / full (http://msdn.microsoft.com/en-us/library/windows/hardware/ff543097%28v=vs.85%29.aspx)