Ответ 1
Отладочные сборки будут содержать отладочные символы, которые могут использоваться отладчиком. Релиз сборки часто не содержат отладочных символов, поэтому, если вы получаете дамп сбоя, все, что вы получите, это куча шестнадцатеричных адресов вместо полезных имен символов.
Отладочные сборки не скомпилированы с оптимизацией (-O0
с gcc), тогда как сборки релизов скомпилированы с оптимизацией (обычно -O2
или -O3
). Оптимизация делает отладку намного сложнее. Если вы попытаетесь отладить приложение для выпуска, отладчик будет очень запутан, так как инструкции сборки больше не совпадают с операторами HLL, операторы получают переупорядоченные функции, функции становятся inlined, петли становятся разворачиваемыми и т.д.
Отладочные и выпускные сборки также определяют разные символы препроцессора, и некоторый код условно компилируется на основе этих (например, проверок границ массивов, утверждений и т.д.), хотя это сильно зависит от приложения. Типичным примером может быть #define NDEBUG
для режима выпуска, что приводит к удалению утверждений.