Инструменты для борьбы с повреждением стека в C++
EDIT: из-за комментария, который был прав о моем примере, я удалил его и превратил это в общий вопрос:
несколько раз в моих проектах я сталкивался с коррупцией стека. Независимо от того, сколько я борюсь, чтобы написать код, чтобы избежать этого, иногда это просто неизбежно. Но когда это происходит, как с этим бороться?
Я нашел один макрос, данный хорошим парнем в этом блоге:http://rxwen.blogspot.com/2009/04/detect-stack-corruption.html которое читает значение регистра ebp для выявления коррупции.
но обязательно будут более сложные инструменты, которые помогут вам не стрелять в ногу. Я программирую в Windows, используя Codeblocks и компилятор gcc. Причина, по которой я задаю этот вопрос, заключается в том, чтобы найти инструменты, которые я могу использовать в моей среде программирования, чтобы помочь мне обнаружить такие ошибки и исправить их. Есть предложения?
Спасибо за любые ответы и за то, что нашли время, чтобы прочитать мой вопрос.
2 ответов
это далеко не неясно, что у вас есть стек коррупция. Но я признаю, что есть некоторая порча данных.
разумно эффективным методом является добавление полей защиты вокруг подозрительного поля(ов):
...
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.
}
затем перец код с вызовами к этому, особенно вблизи подозрительной логики. Если отладчик удобен, поместите точку останова в сообщение об ошибке. Распутывая стек, вы можете выяснить, что программа сделала в последнее время, и собрать подсказки о том, какой бит кода, вероятно, пишет за пределами надлежащих границ.
Valgrind находит все виды повреждения памяти.
GCC имеет брызговик (-fmudflap
и друзей) и -fstack-protector
чтобы поймать проблемы с доступом к памяти. Другие компиляторы, вероятно,тоже.