| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Общие вопросы > Падение релиза |
| Автор: Paint_in_black 24.12.2007, 14:23 |
| В большом проекте под Visual Studio собираю релиз. При прохождении процедур загрузки программы на некоторых компах всё отлично, на других падает. Если запускать релиз из-под студии то всегда программа работает отлично, а просто из дирректории падает, все нужные dll вроде на месте. Экспериментально замечено, что если добавлять или убирать какие-либо функции, т.е. менять код, релиз может вдруг заработать или начать неожиданно падать. Опять же замечено, путем создания файла, куда прописываются успешно завершённые этапы загрузки, что падение происходит в разных местах программы. Может кто-нибудь с подобным сталкивался? Что предпринимать? |
| Автор: zkv 24.12.2007, 14:29 |
| http://rsdn.ru/article/vcpp/survrls.xml |
| Автор: Earnest 24.12.2007, 15:19 |
| Однозначно - где-то в коде ошибка. В дополнение к приведенной статье могу посоветовать использовать для поиска ошибки OutputDebugString + DebugView (утилита Марка Руссиновича, www.sysinternals.com, сейчас это вроде под мелкософт ушло). Несмотря на имена, эта связа используется для отладки именно релиз-версии. Исходя из своего опыта могу предположить, что это неинициализированная переменная - эта гадость именно так чаще всего и проявляется (в среде и в дебаге работает, вне среды - как получится). |
| Автор: Andrey44 24.12.2007, 15:27 |
| А еще смотря от версии VS . Если 8я версия, обязательно выдаст: warning C4101: 'var' : unreferenced local variable |
| Автор: DigitSphinx 24.12.2007, 15:45 |
| Andrey44, Не обязательно ! у меня было такое что не инициализирована переменная (точнее указатель в никуда), ВС 2005 ничего не говорил, в дебаге работало, в релизе падало ! Добавлено @ 15:48 zkv, Спасибо за ссылку ! |
| Автор: Earnest 24.12.2007, 15:58 |
это "неиспользуемая" переменная, а вовсе не неинициализированная. Конечно, в простых случаях компилятор предупреждает и о неинициализированных переменных (что-то вроде warning "переменная используется до инициализации"). Но это вряд ли автоматическая переменная (т.к. падает в разных местах), а, скорее, неинициализированный член класса (а об этом компилятор не предупреждает), а во-вторых, это может быть некорректно написанный класс. Например, я как-то нарвалась с элементарным MFC-шным CSize: была абсолютно уверена, что конструктор по-умолчанию инициализирует его нулями. Щас! |
| Автор: Paint_in_black 24.12.2007, 16:12 |
| Смущает больше всего то, что где-то программа запускается, где-то нет. Пробовал влиять на ход загрузки (где происходит падение - это можно сделать редактируя ini-файл) в результате программа может упасть на том же месте, при этом уже успешно его миновав пару-тройку раз (в ходе загрузки функция вызывается неоднократно для разных классов)... |
| Автор: Andrey44 24.12.2007, 16:43 |
| Да, извиняюсь не то написал. Выдает другое warning C4700: uninitialized local variable 'var' used |
| Автор: Lotrex 27.12.2007, 09:18 |
| Не знаю, имеет ли смысл мой совет в твоем случае. Если это возможно, попытайся написать тест для каждого из классов в отдельности (ежели они у тебя не сильно связаны), и для каждого из тестов прогнать release-версию... Занятие муторное, но ходить по дизассембленной программе в отладчике - занятие, имхо, не лучше. |
| Автор: archimed7592 27.12.2007, 16:50 |
| Paint_in_black, до выполнения main дело доходит? Andrey44, прям всегда? Или на всех hello-world'ах? |
| Автор: Paint_in_black 27.12.2007, 17:40 |
| Уважаемые коллеги! Всем спасибо за советы, с проблемой справился. Профайлер показал неинициализированную переменную, которая сходу использовалась в цикле как верхний предел, теперь вроде работает Добавлено через 1 минуту и 32 секунды |
| Автор: Andrey44 27.12.2007, 18:32 | ||
archimed7592,
Если, честно, то не понял вопроса |
| Автор: archimed7592 27.12.2007, 19:18 |
Есть туева хуча случаев, когда студия будет молчать как партизан. Студия рапортует только о примитивных случаях уровня "hello world". |
| Автор: Andrey44 28.12.2007, 09:40 |
| Понятно. Спасибо за информацию. Теперь буду знать. Хотя при объявлении локальной переменной и не присвоив ей никакого значения студия предупреждает. А вот если я не проинициализирую в конструкторе класса какую-нибудь переменную член класса, компилятор спокойно все это скушает и будет молчать. |
| Автор: archimed7592 28.12.2007, 13:08 | ||
Это и есть hello-world'ный случай. Есть ещё очень трудно отлаживаемая проблема с красивым названием static initialization order fiasco(http://www.parashift.com/c++-faq-lite/ctors.html#faq-10.12). |
| Автор: Andrey44 28.12.2007, 13:50 |
| Такие ошибки допускать нельзя. Потом сложно найти. |
| Автор: archimed7592 28.12.2007, 14:30 |
Красиво говоришь |
| Автор: Andrey44 28.12.2007, 15:14 |
| Это точно Хотя иногда лучше запоминается ,то что нашел и исправил сам. А не то , что тебе указали. |