什么可能导致损坏:正常块错误后?
Posted
技术标签:
【中文标题】什么可能导致损坏:正常块错误后?【英文标题】:What could cause DAMAGE: after normal block error? 【发布时间】:2009-04-27 12:57:13 【问题描述】:在我的应用程序运行 2 天后,我不断收到此错误。
有人告诉我这是某种缓冲区溢出,但这是唯一的选择吗?
该应用程序是使用 Visual C++ 6.0 以 C++ 编写的。
【问题讨论】:
【参考方案1】:在调试中,当您通过new
获取动态缓冲区时,会在缓冲区前后插入一个特殊代码来保护缓冲区。
例如:
<Guard>=====buffer allocated on heap of required size=======<Guard>
如果您溢出缓冲区,插入的保护会损坏,当您尝试删除缓冲区时,调试器将在检测到缓冲区溢出后断言。
在大型代码库中查找缓冲区溢出有点困难。我会建议几种方法来帮助您检测这种情况:
使用Rational Purify: 等工具 它是检测内存损坏的好工具。 Windbg 使用 GFlags 调试 启用: 在此处将我的answer 转至类似问题【讨论】:
请参考我对其他答案的评论。感谢您的帮助。【参考方案2】:最简单的重现方法是这样的:
//Allocate space for holding 10 ints
int *p = new int[10];
//Overwrite the memory.. doesn't crash here
p[10] = 8;
//Try to delete..crashes..
delete[] p;
检查您是否正在写入超出其分配空间的内存位置。
【讨论】:
【参考方案3】:使用正确的选项,Visual C++ 会在每个缓冲区的末尾抛出一个保护值。当您释放缓冲区时,它会检查这是否仍然有效。如果不是,它会引发您看到的错误。
此错误的最常见原因是缓冲区溢出。但是,它可能(理论上)是由随机指针写入引起的(毕竟,它可能写入保护值)。
不过,赔率是超支。
【讨论】:
以上是关于什么可能导致损坏:正常块错误后?的主要内容,如果未能解决你的问题,请参考以下文章
Linux非正常关机后系统文件错误,导致无法进入系统。如何修正这些错误?