编辑:由于我的例子的评论是正确的,我将其删除并将其转换为一般问题:
有些时候,在我的项目中,我遇到了堆栈损坏。无论我多么努力编写代码来避免它,有时候这是不可避免的。但是当它发生时,有什么方法可以对抗呢?
我在这个博客中发现了一个好人给出的一个宏:http://rxwen.blogspot.com/2009/04/detect-stack-corruption.html,它读取ebp寄存器值以检测损坏。
但是必然会有更复杂的工具来帮助你不要徒步射击自己。我使用Codeblocks和gcc编译器在Windows中编程。我提出这个问题的原因是找到我可以在我的编程环境下使用的工具来帮助我检测这些错误并纠正它们。有什么建议?
感谢您的回答和花时间阅读我的问题。
答案 0 :(得分:4)
目前还不清楚您是否有堆叠损坏。但我接受有一些数据损坏。
一种相当有效的技术是在可疑字段周围添加保护字段:
...
long namecheck1;
Artist artist;
long namecheck2;
...
让构造函数初始化这些对大多数事情,但不知道腐败的性质,非零似乎更令人满意。
myclass::myclass() : namecheck1(0x12345678), namcheck2(0x12345678) ...
添加一致性检查成员函数:
void myclass::isokay()
{
if (namecheck1 != namecheck2 ||
namecheck2 != 0x12345678)
cerr << "the object is corrupted";
... // maybe wait for input, cause core dump, etc.
}
然后对代码进行调用,特别是在可疑逻辑附近。如果您对调试器感到满意,请在错误消息上放置断点。通过解开堆栈,您可以确定程序最近做了什么,并收集有关可能在正确边界之外写入的代码位的线索。
答案 1 :(得分:1)
Valgrind发现各种内存损坏。
GCC有mudflap(-fmudflap
和朋友)和-fstack-protector
来捕获内存访问问题。其他编译器也可能这样做。