Создавал прогу в среде Microsoft Visual Studio 2008.
Разрабатывал и компилировал на Debug работает отлично, когда сделал полностю откомпелировал на Release прога начела некоректно атрабатывать некоторые функции вобще не отрабатывала, и выводет какойта бред.
Можно както исправить чтоб нормально работала когда компил... Release или нет???
Говорят перепроверить весь код. Но что искать сли на дебаг все работает нормально?
Наверное запорол всю прогу!
Модераторы: Duncon, Hawk, Romeo, Eugie
- Romeo
- Сообщения: 3126
- Зарегистрирован: 02 мар 2004, 17:25
- Откуда: Крым, Севастополь
- Контактная информация:
Искать места, где есть следующие упоминания.
1. Явная проверка макро-переменной _DEBUG (например #ifdef _DEBUG)
2. Места, где используется ASSERT (В случае ATL - ATLASSERT). Неаккуратное использование этого макроса может "спрятать" вообще вызов функции, хотя хотелось всего лишь проверить в Debug возвращаемое значение. В таком случае ASSERT должен быть заменён на VERIFY (ATLVERIFY)
А вообще можно поотлаживаться в Release, чтобы понять что произошло. Для этого достаточно добавить debug info и пересобрать проект.
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" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Да наверняка где-то какая-то переменная непроинициализирована (необнулена).
Насколько я слышал (про старые версии VC), в DEBUG-режиме все объявленные переменные неявно зануляются при инициализации. А в release-режиме такого не происходит. Вот вам и разница в функционировании.
"Старые добрые" грабли, в общем.
Насколько я слышал (про старые версии 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.
Насколько я помню, студии всех версий ведут себя в отношении локальны переменных одинаково.
Режим 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" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
нашли проблему
Сообщение от lennon
Скажу вот что. В сборке релиза есть некоторые аспекты которые слеуе учитывать... Я сам очень парился и не понимал почему проект в релизе вылетает. Попробуй отключить оптимизацию кода в свойствах проекта - C++ -> Optimization -> Optimization = Disabled(/od)
и прилинковать крт бибилиотеки
С++ -> Code Generation -> Runtime library = Multi - Thread (/MT).
Све работает нормально.
Совет на будуещее быть более внимательно к тому коду что пишеш.
Сообщение от lennon
а по большому счету это - не грамотно написаный код, который может искажаться оптимизатором. особенности оптимизации описаны в msdn, поищи там.
Сообщение от 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" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Не знал. Думал, что там по дефолту мусор. Но всёравно буду ставить им всем значения до первого использования." писал(а):глобальные переменные, согласно требований стандарта обнулена
--------------------------------------------------------------------------------
Добавлено сообщение
--------------------------------------------------------------------------------
Я тоже так делаю." писал(а):я предпочитаю в своих программах исправлять не только все error, но и все warning
Вопрос: "Почему вы все сионисты? Нельзя ли писать на чём то другом?".
Ответ: "Писать можно на чём угодно. Но зачем же так себя ограничивать? Пиши на С!".
Ответ: "Писать можно на чём угодно. Но зачем же так себя ограничивать? Пиши на С!".