C++ C++ C# C# ASP.NET Security ASP.NET Security ASM ASM Скачать Скачать Поиск Поиск Хостинг Хостинг  
  Программа для работы с LPT портом...
Язык: .NET — ©Alexey...
  "ASP.NET Atlas" – AJAX в исполнении Micro...
Язык: .NET — ©legigor@mail.ru...
  "Невытесняющая" Многопоточность...
Язык: C/C++ — ©...
  01.05.2010 — Update World C++: Сборник GPL QT исходников
  15.12.2007 — Весь сайт целиком можно загрузить по ссылкам из раздела Скачать
Хостинг:
Windows 2003, ASP.NET 2.0
бесплатный и от 80 руб./мес


   Отправить письмо
Кулабухов Артем, Беларусь




 Debug против Release / Статьи / Visual C++

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, то тоже все ок.