В данной статье приведены различия Debug и Release версий программ... То есть, если программа в Debug версии работает хорошо и без ошибок, а в Release вылетает с ошибкой или без оной, то вы нарушили одно из нижеприведенных правил!
- В релиз версиях обязательно надо обнулять структуры
- Не забывать выделять память переменным
- Проверять возвращаемое значение той или иной функции на ошибки
- В MFC не забыть, что в релизе макросы ASSERT, ASSERT_VALID заменяются на пустое место
- Всякие стандартные математические функции (sin, cos, ...) в debug и release версиях могут при одинаковых аргументах возвращать немного разные значения
- В релизе есть оптимизация, которая ОЧЧЧЧЕНЬ редко добавляет баги в нормальный код
- Пусть объявлены глобальная и локальная переменные c одинаковыми именами. Далее, пусть в какой-нибудь функции используется одна из них. Так вот в релизе компилер может решить, что использовать надо одну переменную, а в дебаге - другую
- inline функции подставляются только в релизе
- Дебаг и релиз версии msvcrt.dll отличаются, и если вдруг (при использовании длл) new делается в длл, а delete в приложении (или наоборот), то гарантированны проблемы, потому что способы выделения/удаления (в дебаг и релиз версиях рантайма) будут разные, явный признак подобной ошибки: ссылка на файл dbgheap.h/dbgheap.cpp, а дальше что нибудь типа error line 1044. Для этого необходимо что бы везде (и в длл, и в приложении) стояли одинаковые версии Runtime Library (есть много вариантов: мультитреадед дебаг/мультитреадед/... ) - главное что бы они были одинаковые.
- inline функции подставляются только в релизе...
- Чтобы проверить результат функции в debug-версии можно пользоваться макросом VERIFY, в код, переданный макросу, исполняется, только "debug assertion" не выбрасывается.
- Еще, относительно inline-expantion. В release-версии могут быть раскрыты даже те методы, которые не помечены как inline (опция all suitable). Легко может привести к переполнению стека, если пользоваться макросами A2W, W2A и т.п., т.к. память, выделенная ими на стеке по alloca не будет вовремя освобождаться.
- Фишка относительно __declspec(naked): в debug-версии даже для таких функций генерируется фрейм стека, так что, если это не учитывать, после вызова такой функции стек "поедет".
- Опять же, из за оптимизации, могут по разному работать некоторые "зубодробительные" конструкции типа "cout << i ++ << ++ i << i ++"
- В релиз-версии catch(...) не ловит SEH исключения
- Дебаг-версия программы работает с минимумом необъяснимых глюков в том случае, если находится имеено в папке /debug. Так, например, если поток после выполнения некоторых действий сам себя вводит в состояние Suspend, а Release ему делает другой поток, то был замчен глюк: если дебаг-версия собирается в папке, отличной от /Debug, поток сам себя в Suspend не вводит, а продолжает выполнятся. Релиз работает нормально, если дебаг скопировать обратно в /Debug, то тоже все ок.
|