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


Автор: Paint_in_black 24.12.2007, 14:23
  В большом проекте под Visual Studio собираю релиз. При прохождении процедур загрузки программы на некоторых компах всё отлично, на других падает. Если запускать релиз из-под студии то всегда программа работает отлично, а просто из дирректории падает, все нужные dll вроде на месте. 
   Экспериментально замечено, что если добавлять или убирать какие-либо функции, т.е. менять код, релиз может вдруг заработать или начать неожиданно падать. Опять же замечено, путем создания файла, куда прописываются успешно завершённые этапы загрузки, что падение происходит в разных местах программы.  smile 
  Может кто-нибудь с подобным сталкивался? Что предпринимать? 

Автор: 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, Спасибо за ссылку ! smile 

Автор: Earnest 24.12.2007, 15:58
Цитата(Andrey44 @  24.12.2007,  16:27 Найти цитируемый пост)
unreferenced

это "неиспользуемая" переменная, а вовсе не неинициализированная.
Конечно, в простых случаях компилятор предупреждает и о неинициализированных переменных (что-то вроде warning "переменная используется до инициализации"). Но это вряд ли автоматическая переменная (т.к. падает в разных местах), а, скорее, неинициализированный член класса (а об этом компилятор не предупреждает), а во-вторых, это может быть некорректно написанный класс. Например, я как-то нарвалась с элементарным MFC-шным CSize: была абсолютно уверена, что конструктор по-умолчанию инициализирует его нулями. Щас!  

Автор: Paint_in_black 24.12.2007, 16:12
Смущает больше всего то, что где-то программа запускается, где-то нет. Пробовал влиять на ход загрузки (где происходит падение - это можно сделать редактируя ini-файл) в результате программа может упасть на том же месте, при этом уже успешно его миновав пару-тройку раз (в ходе загрузки функция вызывается неоднократно для разных классов)...  smile 

Автор: Andrey44 24.12.2007, 16:43
Да, извиняюсь не то написал.
Выдает другое

warning C4700: uninitialized local variable 'var' used
 smile 

Автор: Earnest 24.12.2007, 16:54
Цитата(Paint_in_black @  24.12.2007,  17:12 Найти цитируемый пост)
Смущает больше всего то, что где-то программа запускается
 Совершенно нормальное поведение для глючной программы...  smile Не пытайся понять логику падений, а ищи ошибку в коде.
Если падает при запуске, то круг подозреваемых сужается...

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

Добавлено через 1 минуту и 32 секунды
 smile 

Автор: Andrey44 27.12.2007, 18:32
archimed7592, 
Цитата

Andrey44, прям всегда? Или на всех hello-world'ах? 


Если, честно, то не понял вопроса smile 

Автор: archimed7592 27.12.2007, 19:18
Цитата(Andrey44 @  27.12.2007,  18:32 Найти цитируемый пост)
Если, честно, то не понял вопроса smile  

Есть туева хуча случаев, когда студия будет молчать как партизан. Студия рапортует только о примитивных случаях уровня "hello world".

Автор: Andrey44 28.12.2007, 09:40
 smile 
Понятно. Спасибо за информацию. Теперь буду знать.
Хотя при объявлении локальной переменной и не присвоив ей никакого значения студия предупреждает.
А вот если я не проинициализирую в конструкторе класса какую-нибудь переменную член класса,
компилятор спокойно все это скушает и будет молчать.

Автор: archimed7592 28.12.2007, 13:08
Цитата(Andrey44 @  28.12.2007,  09:40 Найти цитируемый пост)
Хотя при объявлении локальной переменной и не присвоив ей никакого значения студия предупреждает.

Это и есть hello-world'ный случай. Есть ещё очень трудно отлаживаемая проблема с красивым названием static initialization order fiasco(http://www.parashift.com/c++-faq-lite/ctors.html#faq-10.12).

Автор: Andrey44 28.12.2007, 13:50
 smile Да-а-а!
Такие ошибки допускать нельзя.
Потом сложно найти.

Автор: archimed7592 28.12.2007, 14:30
Цитата(Andrey44 @  28.12.2007,  13:50 Найти цитируемый пост)
Такие ошибки допускать нельзя.

Красиво говоришь smile. Ошибки вообще допускать нельзя... Только вот, на практике всё немного сложнее smile.

Автор: Andrey44 28.12.2007, 15:14
Это точно smile все сложнее.
Хотя иногда лучше запоминается ,то что нашел и исправил сам.
А не то , что тебе указали.

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