Visual C ++调试版本是否确定堆损坏错误?
我一直在努力检测我们产品中的内存损坏错误。 像valgrind这样的内存检测工具只会在崩溃时告诉问题,而不是实际发生损坏的时间。 我已经看到,在使用调试版本时,它将在块被释放之前和之后检查内存区域,并显示调试断言失败,说明发生了堆损坏。 那么我可以在调试模式下重建我的产品以在发生错误时捕获错误吗? 它是否也会捕获缓冲区溢出等? 我无法在互联网上找到任何有关调试版本的信息,这些信息是针对内存错误检测的。
您还可以使用每个版本的Windows上提供的“页面堆”。 您可以使用适用于Windows的调试工具的gflags为您的应用程序配置完整页面堆。 然后,您可以在调试器下运行应用程序,即使在零售模式下也是如此。 一旦遇到缓冲区溢出或访问释放的内存,调试器将停止。
我非常喜欢这个工具,因为它是建立在操作系统中的,甚至可以在客户网站上激活(gflags只设置注册表项,您可以简单地将这些密钥发送给您的客户)。
当我们提到时,有些人害怕(Windows调试工具)。 您可以使用Visual Studio来诊断问题。 您需要的唯一东西是与您的二进制文件相对应的PDB(即使对于发布版本,您也可以生成它们)。
我不清楚调试版本,但是对于内存损坏工具的一个很好的概述,您可以查看http://code.google.com/p/address-sanitizer/wiki/ComparisonOfMemoryTools。 它列出了Valgrind以及它应该能够检查的内容。
“C ++”不是编译器; 供应商根据标准规格制定他们自己的(或多或少)。
我只有微软的经验,我可以告诉你,它通过在每个new
或malloc
块周围分配“哨兵”(当然只在调试模式下)并用特殊模式填充它们来检查堆损坏(当我最后一次是0xCD
时使用它),然后它检查守卫围绕该位置的每个写入。 如果他们改变了,你会得到一个运行时错误,说堆已损坏。
顺便说一句,缓冲区溢出是堆腐败。
编辑以添加参考:http://msdn.microsoft.com/en-us/library/8wtf2dfz.aspx
链接地址: http://www.djcxy.com/p/82325.html上一篇: Does Visual C++ debug build identify heap corruption errors?