8

编辑:由于对我的示例的评论是正确的,我将其删除并将其变成了一个通用问题:

在我的项目中,有时我会遇到堆栈损坏。无论我如何努力编写代码来避免它,有时它只是不可避免的。但是当它发生时,有什么方法可以对抗它呢?

我在这个博客中找到了好人给出的一个宏:http ://rxwen.blogspot.com/2009/04/detect-stack-corruption.html ,它读取 ebp 寄存器值以检测损坏。

但是肯定会有更复杂的工具来帮助您避免自残。我正在使用 Codeblocks 和 gcc 编译器在 Windows 中编程。我提出这个问题的原因是为了找到可以在我的编程环境下使用的工具来帮助我检测和纠正这些错误。有什么建议么?

感谢您提供任何答案并花时间阅读我的问题。

4

2 回答 2

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.
}

然后在代码中加入对此的调用,尤其是在可疑逻辑附近。如果您对调试器感到满意,请在错误消息上放置一个断点。通过解开堆栈,您可以确定程序最近做了什么,并收集线索,说明哪些代码可能超出了适当的范围。

于 2011-01-18T05:30:30.833 回答
1

Valgrind 发现各种内存损坏。

GCC 有挡泥板(-fmudflap和朋友们)并-fstack-protector捕捉内存访问问题。其他编译器也可能这样做。

于 2011-01-18T05:38:54.527 回答