visual studio modo instalador generar entre ejecutable diferencia debug crear compilar .net visual-studio

.net - modo - diferencia entre debug y release android studio



¿Cuál es la diferencia entre Debug y Release en Visual Studio? (10)

Posible versión duplicada de Debug Visual Studio en .NET

¿Cuál es la diferencia entre Debug y Release en Visual Studio?


"Depurar" y "Liberar" son en realidad solo dos etiquetas para una gran cantidad de configuraciones que pueden afectar su compilación y depuración.

En el modo "Depuración", generalmente tiene lo siguiente:

  • Archivos de base de datos de depuración de programa, que le permiten seguir la ejecución del programa bastante de cerca en el origen durante el tiempo de ejecución.
  • Se desactivaron todas las optimizaciones, lo que le permite inspeccionar el valor de las variables y rastrearlas en funciones que de otro modo podrían haberse optimizado o alineado
  • Una definición del preprocesador _DEBUG que le permite escribir código que actúa de forma diferente en el modo de depuración en comparación con la versión, por ejemplo, para instrumentar ASSERT que solo deberían utilizarse al depurar
  • Vinculación a bibliotecas que también se han compilado con opciones de depuración, que normalmente no se implementan en clientes reales (por razones de tamaño y seguridad)

En las optimizaciones del modo "Versión" están activadas (aunque hay varias opciones disponibles) y la definición del preprocesador _DEBUG no está definida. Sin embargo, normalmente aún querrás generar los archivos PDB, porque es muy útil poder "depurar" en el modo de lanzamiento cuando las cosas se ejecutan más rápido.


Además, aparentemente, el modo de depuración crea una gran cantidad de subprocesos adicionales para ayudar con la depuración. Estos permanecen activos durante toda la vida del proceso, independientemente de si adjunta o no un depurador. Vea mi pregunta relacionada here .


En su mayoría, la depuración incluye mucha información adicional útil cuando se depura. En el modo de lanzamiento, todo esto se corta y cambia por el rendimiento.


La diferencia obvia que puede ver es el tamaño del binario. La compilación de depuración produce un binario más grande que la versión Release.

Al compilar en Debug, la tabla de símbolos se agrega al objeto compilado del archivo de código, que permite depurar programas para acceder a estos binarios y evaluar los valores de objetos y variables.

Otra diferencia observable es que, en modo Release, el binario simplemente se bloqueará en un error fatal mientras está en modo Debug, si comienza a depurar la aplicación en Visual Studio, puede verificar la pila de llamadas que le indica la ubicación exacta de la declaración errónea. .


Lo más importante es que en el modo de depuración no hay optimizaciones, mientras que en el modo de lanzamiento hay optimizaciones. Esto es importante porque el compilador es muy avanzado y puede hacer algunas mejoras de bajo nivel bastante complicadas de su código. Como resultado, es posible que algunas líneas de su código se queden sin ninguna instrucción o que algunas se mezclen. La depuración paso a paso sería imposible. Además, las variables locales a menudo se optimizan de maneras misteriosas, por lo que los Relojes y QuickWatches a menudo no funcionan porque la variable está "optimizada". Y también hay muchas otras optimizaciones. Intenta depurar el código .NET optimizado en algún momento y ya verás.

Otra diferencia clave es que, debido a esto, la configuración de versión predeterminada no se molesta en generar información extensa sobre símbolos de depuración. Ese es el archivo .PDB que quizás haya notado y le permite al depurador averiguar qué instrucciones de ensamblaje corresponden a qué línea de código, etc.


No sé cuáles son las diferencias exactas porque en realidad no hay información fácilmente disponible sobre eso.

Pero la principal diferencia observada es que la versión de lanzamiento a veces corrompe el archivo DLL resultante y, por lo tanto, hace que la aplicación web sea inutilizable.

Lamentablemente, tienes que poner la construcción de depuración en producción. Y sí, para publicar tienes que usar un buen viejo FTP.


Probablemente valga la pena mencionar lo obvio, que los indicadores de compilación permiten una lógica diferente que debe usarse solo para cambiar el registro y la "consola" de mensajes, pero se puede abusar y cambiar drásticamente no solo los bajos niveles, sino también la lógica comercial real.


Si revisas las opciones de compilación del proyecto y las comparas, verás cuáles son las diferencias.

Asumiendo que la pregunta es sobre el código nativo / C ++ (no está completamente claro desde el fraseo):

Básicamente, en Debug, todas las optimizaciones de generación de código están desactivadas. Algunas bibliotecas (por ejemplo, STL) tienen por defecto una comprobación de errores más estricta (por ejemplo, iteradores de depuración). Se genera más información de depuración (por ejemplo, para "Editar y Continuar"). Se generan más cosas en el código para detectar errores (los valores de las variables locales se establecen en un patrón no inicializado, se usa el montón de depuración).


También me llamó la atención esta pregunta cuando desarrollé una aplicación copiada de una configuración de versión de lanzamiento existente. Tengo un desarrollador que es interesante para usar esa aplicación en modo de depuración, así que me pregunté qué se necesitaría para hacer esta configuración de compilación que existe con un nombre de ReleaseMyBuild copiado de una configuración de Release (y por lo tanto debería tener todas las configuraciones orientadas a las optimizaciones de lanzamiento ) para cambiar de repente los equipos y convertirse en una versión de depuración a pesar del confuso nombre de configuración de compilación. Pensé que la configuración del proyecto era solo un nombre y una forma conveniente de seleccionar la "gran cantidad de configuraciones" que menciona Joris Timmermans. Quería saber lo esencial de las configuraciones que hacen que una configuración de compilación llamada función "FOO" funcione como una compilación optimizada de versiones .

Aquí hay un vistazo, creé un nuevo VCXPROJ a partir de la plantilla de proyecto vacía de VS2010. Luego copié y edité ambos, el primero para conservar los contenidos de depuración y el segundo los contenidos de la versión. Aquí está la diferencia centrada en las diferencias relevantes ...

LANZAMIENTO

<PropertyGroup> <WholeProgramOptimization>true</WholeProgramOptimization> <ClCompile> <Optimization>MaxSpeed</Optimization> <FunctionLevelLinking>true</FunctionLevelLinking> <IntrinsicFunctions>true</IntrinsicFunctions> <Link> <EnableCOMDATFolding>true</EnableCOMDATFolding> <OptimizeReferences>true</OptimizeReferences>

DEPURAR

<PropertyGroup> <UseDebugLibraries>true</UseDebugLibraries>` <ClCompile> <Optimization>Disabled</Optimization>

Es interesante que en la sección Enlace ambos tienen GenerateDebugInformation establecido en verdadero.


También tenga en cuenta que al usar MFC, por ejemplo, los proyectos de depuración se vinculan con versiones DLL no redistribuibles, como MFC90D.DLL mientras que el lanzamiento crea un vínculo con las versiones redistribuibles, como MFC90.DLL . Esto es probablemente similar con otros marcos.

Por lo tanto, probablemente no podrá ejecutar aplicaciones de depuración y compilación en máquinas sin desarrollo.