Las configuraciones de Debug y Release son abstracciones que 
realizan los IDEs para referenciar un conjunto de parámetros que se pasan al compilador para que genere el código de máquina.

Por lo general en las configuraciones de Debug se agrega más información en el ejecutable para que sea utilizada para depurar la aplicación con programas especialmente diseñados en cumplir este rol (ej: GDB). 
El ejecutable termina pesando más con este tipo de configuración.

En configuraciones de Release no se agregan estas información extra en el ejecutable y además se hacen optimizaciones del código para que funcione más rápido. Dichas optimizaciones son sobre el código en assembler y el programador no decide explícitamente que tipo de optimizaciones se realizan. El ejecutable pesa mucho menos y eso significa que se puede cachear una porción mayor del programa mientras se esté ejecutando.

En la configuración de Debug se pueden utilizar librerías dinámicas que se agregan al sistema operativo luego de la instalación del IDE (y difieren 
según la versiones del IDE).
La configuración de Release está pensada para poder distribuir el ejecutable mientras que la configuración de Debug no!. Ese es el principal motivo por el que un ejecutable funcione en algunas computadoras (por lo general tiene la misma versión del IDE instalada) y no en otras.

El debugger puede inicializar memoria con valores conocidos como "magic numbers". Dichos valores tienen significados propios y son fácilmente identificables cuando se está depurando una aplicación.
Algunos de estos valores son:
0xCCCCCCCC
0xCDCDCDCD
0xDEADBEEF
0xBADF00D
0xBADCAB1E

En Release ésto no pasa (generalmente no se inicializa la memoria), por lo que el funcionamiento con variables no inicializadas puede diferir entre Debug y Release.

Otra técnica utilizada en Debug es reservar sectores de memoria extra(casi siempre inicializada con magic numbers) antes o después de variables para poder determinar posibles accesos incorrectos a memoria.
Es un posible motivo por el que en Release una aplicación lance una excepción de Segmentation Fault y en Debug no se termina prematuramente la ejecución.

Espero que haya sido de utilidad esta información.
--
Mauricio Eguía - InCo 

Última modificación: lunes, 18 de febrero de 2013, 11:10