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