Наверное запорол всю прогу!

Общие вопросы, не зависящие от языка реализации.

Модераторы: Duncon, Hawk, Romeo, Eugie

Ответить
evgenrpo
Сообщения: 12
Зарегистрирован: 31 май 2009, 21:26
Контактная информация:

Создавал прогу в среде Microsoft Visual Studio 2008.
Разрабатывал и компилировал на Debug работает отлично, когда сделал полностю откомпелировал на Release прога начела некоректно атрабатывать некоторые функции вобще не отрабатывала, и выводет какойта бред.

Можно както исправить чтоб нормально работала когда компил... Release или нет???

Говорят перепроверить весь код. Но что искать сли на дебаг все работает нормально?
Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

Искать места, где есть следующие упоминания.

1. Явная проверка макро-переменной _DEBUG (например #ifdef _DEBUG)

2. Места, где используется ASSERT (В случае ATL - ATLASSERT). Неаккуратное использование этого макроса может "спрятать" вообще вызов функции, хотя хотелось всего лишь проверить в Debug возвращаемое значение. В таком случае ASSERT должен быть заменён на VERIFY (ATLVERIFY)

А вообще можно поотлаживаться в Release, чтобы понять что произошло. Для этого достаточно добавить debug info и пересобрать проект.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
BBB
Сообщения: 1298
Зарегистрирован: 27 дек 2005, 13:37

Да наверняка где-то какая-то переменная непроинициализирована (необнулена).
Насколько я слышал (про старые версии VC), в DEBUG-режиме все объявленные переменные неявно зануляются при инициализации. А в release-режиме такого не происходит. Вот вам и разница в функционировании.

"Старые добрые" грабли, в общем.
Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

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

Насколько я помню, студии всех версий ведут себя в отношении локальны переменных одинаково.

Режим Debug как раз предназначен для отлова подобных ошибок, поэтому в Debug в неинициализированных локальных переменные хранится 0xcccccc (некая попытка написать слово clear), а при вызове delete для поинтера в поинтер прописывается 0xfefefefe (некая попытка написать слово free).

В режиме Release в локальную переменную просто ничего не прописывается, потому после того, как была выполнена команда sub esp, sizeof_variable, то есть было выделено место под локальную переменную, после этого в переменной будет хранится то, что до этого лежало по этому адресу в стеке, а так, как лежать могло что угодно, то фактически там лежит мусор.

Хотя BBB был не совсем точен, тем не менее мы видим, что поведение в Debug и Release в случае отсутствии инициализации действительно отличается и это может стать причиной некорректной работы программы. Вообще такие ошибки ищутся достаточно просто, так как студия пишет warning, если локальная переменная будет использована для чтения до того, как мы её проинизиализировали. Именно поэтому я предпочитаю в своих программах исправлять не только все error, но и все warning :)

Есть причина, по котороя я сомневаюсь, что дело в неинициализированных данных, хотя это всего лишь сомнения - уверенности нет. Причина проста. Неинициализированные данные, как правило, выливаются в краш. Здесь же мы краша не наблюдаем. Если перестала вызываться какая-то функция, то скорее всего она была взята в ASSERT, в то время, как правильно её было взять в VERIFY.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
evgenrpo
Сообщения: 12
Зарегистрирован: 31 май 2009, 21:26
Контактная информация:

нашли проблему

Сообщение от lennon
Скажу вот что. В сборке релиза есть некоторые аспекты которые слеуе учитывать... Я сам очень парился и не понимал почему проект в релизе вылетает. Попробуй отключить оптимизацию кода в свойствах проекта - C++ -> Optimization -> Optimization = Disabled(/od)
и прилинковать крт бибилиотеки
С++ -> Code Generation -> Runtime library = Multi - Thread (/MT).

Све работает нормально.

Совет на будуещее быть более внимательно к тому коду что пишеш.

Сообщение от lennon
а по большому счету это - не грамотно написаный код, который может искажаться оптимизатором. особенности оптимизации описаны в msdn, поищи там.
Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

О чём я и говорил :) Не оптимизацию нужно отключать (без оптимизации нельзя, если продукт серьёзный), а код править надо.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
atavin-ta
Сообщения: 585
Зарегистрирован: 30 янв 2009, 06:38

&quot писал(а):глобальные переменные, согласно требований стандарта обнулена
Не знал. Думал, что там по дефолту мусор. Но всёравно буду ставить им всем значения до первого использования.
--------------------------------------------------------------------------------
Добавлено сообщение
--------------------------------------------------------------------------------
&quot писал(а):я предпочитаю в своих программах исправлять не только все error, но и все warning
Я тоже так делаю.
Вопрос: "Почему вы все сионисты? Нельзя ли писать на чём то другом?".
Ответ: "Писать можно на чём угодно. Но зачем же так себя ограничивать? Пиши на С!".
Ответить