Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Ошибки бояться дебаггера


Автор: d06osipov 7.9.2007, 21:24
Когда я запускаю программу с GDB (или откомпилированную для Debug в Visual Studio) она работает нормально. Ошибки (неправильная работа --- заезжание на чужую память и т. п.) начинаются только когда программа запущена без отладчика --- отследить их в этом случае затруднительно. Самое интересное, что программа использует исключительно стандартные средства. Может у кого нибудь есть информация о том, как может меняться поведение программы при запуске с отладчиком и без?

Автор: UnrealMan 7.9.2007, 21:32
Велика вероятность того, что имеет место некорректное обращение с памятью - в смысле логически программа написана неверно (допускается выход за границы массива, разыменование невалидных указателей и т.д.). Такие ошибки как раз могут приводить к глюкам или падению программы в одних случаях и быть незаметными в других... И дело тут не обязательно в отладчике. Возможно, при запуске на другом компе твоя прога упадёт и в дебаге.

Автор: d06osipov 7.9.2007, 21:41
Да, но при использовании отладчика, ничего подобного не проявляется. Как может отладчик влиять на выполнение программы, которая не использует ничего, кроме <stack>, <list>, <assert.h>, <fstream> и <iostream>.

Автор: UnrealMan 7.9.2007, 21:49
Да влиять может что угодно. Ошибки с памятью характерны непредсказуемостью своего проявления. Помню случай, когда одна прога месяцами успешно работала на одном компе, а при переносе на другой комп завалилась при первом же запуске smile

Автор: bsa 7.9.2007, 23:08
d06osipov, такое поведение еще возможно, когда у тебя какие-нибудь локальные указатели не инициализируются перед использованием. В режиме отладки они могут автоматически инициализироваться 0, а в релизе нет.

Автор: dizzy1984 10.9.2007, 10:17
Кроме того, отладчик может расставлять данные в памяти не так, как будет в релизе, скажем, в релизе некоторые переменные могут быть помещены в регистры.
Вообще релиз и дебаг версия много http://rsdn.ru/article/vcpp/survrls.xml различаются.

Автор: jonie 10.9.2007, 21:44
http://ru.wikipedia.org/wiki/Гейзенбаг

Автор: SaDFromSpb 11.9.2007, 18:44
d06osipov, под линух есть очень мощная штука. Valgrind  называется. Она показывает абсолютно любые баги с памятью (включая предполагаемые утечки). К ней еще желательно графическую обертку Valkyrie поставить. Поищи на эту тему. Меня не раз выручала.
Правда там с настройками слегка попариться придется.

Автор: bsa 11.9.2007, 19:16
SaDFromSpb, я пользую следующие: valgrind --tool=memcheck -v --leak-check=full --log-file=filename.log ./program

Автор: d06osipov 12.9.2007, 18:09
Всем спасибо, причина найдена. Часть памяти высвобождалась, или нет в зависимости от значения булевой переменной, которую я забыл инициализировать. Надо сказать, что мне повезло, потому как память на самом деле должна была высвобождаться при правильной работе, однако, при этом давала знать о себе следующая ошибка, так что программа работала неправильно и с дебагером, что мне удалось заметить. 

SaDFromSpb. У меня, к сожалению, Windows, правда с Cygwin. 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)