| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > 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 |
| Да влиять может что угодно. Ошибки с памятью характерны непредсказуемостью своего проявления. Помню случай, когда одна прога месяцами успешно работала на одном компе, а при переносе на другой комп завалилась при первом же запуске |
| Автор: 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. |