Часто задаваемые вопросы и ответы по C/C++/Visual C++
Последнее обновление: 27.08.2003
FAQ по C/C++/Visual C++
Работа с сетью
Debug против Release
Составители: SUnteXx, Leprecon
Debug против Release
A: (SUnteXx)
Оригинальная ссылка: Исходники.ru

В данной статье приведены различия 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, то тоже все ок.

Содержание Обсудить на форуме « Предыдущая статья | Следующая статья »
Перейти к FAQ:  
FAQ составлен по материалам Форума на Исходниках.Ру.
Copyright © 2002 by Sources.ru. All rights reserved.