¿Cuál es la diferencia entre depurar y publicar en Visual Studio?

Respuestas:

114

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

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

Vilx-
fuente
1
"Como resultado, es posible que algunas líneas de su código se queden sin ninguna instrucción, o algunas pueden confundirse". YUP, no cumplió con esto al usar Stack frames para obtener el nombre del método / propiedad actual, y muchas de las propiedades se incluyeron en el lanzamiento ...
kpollock
4
"Lo más importante es que en el modo de depuración no hay optimizaciones", eso es discutible. lo más importante es que hay información de depuración que le permite depurar. aunque eso también puede existir en el lanzamiento.
shoosh
No sé cuál es el modo predeterminado (depuración / liberación). Generalmente, en mi experiencia, todos los proyectos están en modo de depuración y el equipo de instalación se encargará de esta versión para evitar el archivo pdb e introducir la optimización. Pero hoy me encontré con una situación en la que el modo se cambió para liberar y no puedo romper el código usando el punto de interrupción. Intenté una hora larga haciendo muchas cosas y finalmente me di cuenta de que se debe al problema con el modo de compilación actual. @ Vlix- Gracias por tu respuesta.
kbvishnu
1
Esto realmente me ayudó a resolver el problema "El nombre 'variable' no existe en el contexto actual" que encontré al intentar analizar un símbolo dentro de la ventana inmediata mientras depuraba una aplicación que cumplía con la configuración de lanzamiento predeterminada. ¡Muchas gracias!
M463
1) ¿Qué pasa con los siguientes problemas? Hay 3 configuraciones en un proyecto ASP.NET MVC: base (web), debug (web.debug), release (web.release). Supongamos que configuramos la cadena de conexión de depuración y liberación mediante transformación a la configuración correspondiente (depuración y liberación). Al publicar, podemos publicar de acuerdo con nuestra selección en el diálogo de publicación. Pero, al ejecutar la aplicación, a pesar de que selecciono Depurar, usa la configuración de lanzamiento (porque configuro la configuración de depuración en la base y la configuración de depuración), ¿es eso normal?
Jason
52

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

En el modo "Depurar" normalmente tienes lo siguiente:

  • Archivos de base de datos de depuración del programa, que le permiten seguir la ejecución del programa con bastante detenimiento en la fuente durante el tiempo de ejecución.
  • Todas las optimizaciones están desactivadas, lo que le permite inspeccionar el valor de las variables y rastrear funciones que de otro modo podrían haberse optimizado o alineado
  • Una definición de preprocesador _DEBUG que le permite escribir código que actúa de manera diferente en el modo de depuración en comparación con la versión, por ejemplo, para instrumentos ASSERT que solo deben usarse durante la depuración
  • Vinculación a bibliotecas que también se han compilado con opciones de depuración activadas, que generalmente no se implementan en clientes reales (por razones de tamaño y seguridad)

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

Joris Timmermans
fuente
5
"solo dos etiquetas"; de hecho, Visual Studio le ofrece la posibilidad de crear más. Esto puede resultar excepcionalmente útil al probar un programa. Por ejemplo, recientemente escribí un programa para mi trabajo que aceptaba nombres de archivo desde la línea de comandos. Probé mi análisis de la línea de comandos, pero una vez hecho eso, no quería meterme con CMD y listas de nombres de archivos todos los días; Creé una configuración con la que podía usar la compilación condicional para proporcionar valores de línea de comandos ficticios y probar la lógica comercial del programa, lo que me dio un ciclo de iteración mucho más rápido en el desarrollo del programa.
Brian S
9

Principalmente, la depuración incluye mucha información adicional útil al depurar. En el modo de lanzamiento, todo esto se corta y se intercambia por rendimiento.

Rik
fuente
1) ¿Qué pasa con los siguientes problemas? Hay 3 configuraciones en un proyecto ASP.NET MVC: base (web), debug (web.debug), release (web.release). Supongamos que configuramos la cadena de conexión de depuración y liberación mediante transformación a la configuración correspondiente (depuración y liberación). Al publicar, podemos publicar de acuerdo con nuestra selección en el diálogo de publicación. Pero, al ejecutar la aplicación, a pesar de que selecciono Depurar, usa la configuración de lanzamiento (porque configuro la configuración de depuración en la base y la configuración de depuración), ¿es eso normal?
Jason
2) Al ejecutar la aplicación en modo Debug o Release, ¿VS usa la configuración web base o la configuración web correspondiente (web.debug.confg o web.release.config)?
Jason
7

Si revisa las opciones de compilación del proyecto y las compara, verá cuáles son las diferencias.

Suponiendo que la pregunta es sobre código nativo / C ++ (no está del todo claro en la redacción):

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 y se usa el montón de depuración).

CERCA
fuente
2
@Vilx: cuando respondí, todavía no había una etiqueta .net, solo visualstudio. Entonces asumí que es C ++.
NeARAZ
6

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

Matt Jacobsen
fuente
¿Pero solo para .NET (no C ++)?
Peter Mortensen
6

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

Annakata
fuente
"... cambiar drásticamente ... la lógica empresarial real", ¡me suena como un error! Tenemos mucho código condicional y lo hace realmente difícil de entender. Además, cada combinación de indicadores de código condicional es esencialmente una versión diferente de su software que debe probarse para garantizar la corrección y la integridad básica. Según "Code Complete", mi Biblia de la construcción de software, nuestra "Directiva principal" es la gestión de la complejidad. (Es nuestro problema número uno para resolver). ¡Piense detenidamente antes de agregar indiscriminadamente más banderas condicionales!
MicroservicesOnDDD
Mi comentario anterior no estaba dirigido a esta respuesta en particular en lo que respecta a la última oración ... eso era solo una cosa adicional que pensé que los lectores que vienen aquí deberían leer.
MicroservicesOnDDD
6

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

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

foraidt
fuente
muy cierto. Encontré esto una vez mientras estaba en un cliente. Funciona en My Machine (TM).
Matt Jacobsen
Puede distribuirlos ... (no sé si está permitido). Deben estar en una subcarpeta con los nombres adecuados de su aplicación.
Andreas Reiff
@Andreas Con respecto a mi ejemplo, "no redistribuible" significa que Microsoft no permite distribuirlos.
foraidt
4

También sentí curiosidad por esta pregunta cuando desarrollé una aplicación copiada de una configuración de compilación de versión existente.

Tengo un desarrollador que está interesado en 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 Lanzamiento (y por lo tanto debería tener todas las configuraciones orientadas a liberar optimizaciones ) para cambiar repentinamente de equipo y convertirse en una compilación de depuración a pesar del confuso nombre de la 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 el meollo de la cuestión de cuáles pueden ser esas configuraciones que hacen que una configuración de compilación llamada "FOO" funcione como una compilación de lanzamiento optimizada .

Aquí hay un vistazo. Creé un nuevo VCXPROJ a partir de la plantilla de proyecto vacía de Visual Studio 2010. Luego lo copié y edité ambos, el primero para conservar el contenido de depuración y el segundo el contenido de la versión. Aquí está la diferencia centrada en las diferencias relevantes ...

Vacío VCXPROJs Debug vs Release diff

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 Vínculo ambos se hayan GenerateDebugInformationestablecido en verdadero.

jxramos
fuente
3

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

Al compilar en Debug, la tabla de símbolos se agrega al objeto compilado del archivo de código, lo que permite que los programas de depuración aprovechen estos binarios y accedan a los valores de objetos y variables.

Otra diferencia observable es que, en el modo de lanzamiento, el binario simplemente se bloqueará en un error fatal mientras que en el modo de depuración, 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. .

fasih.rana
fuente
-15

No sé cuáles son las diferencias exactas porque en realidad no hay información disponible al respecto.

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

Lamentablemente, debe poner la compilación de depuración en producción. Y sí, para publicar tienes que usar el viejo FTP.

f470071
fuente
7
¿Cómo responde esto a la pregunta? Y preste atención cuando esté escribiendo.
mmking
Tuve un problema similar, el código funciona en modo de depuración, pero tiene un problema en el modo de lanzamiento. Resulta que el problema está en mi código. Hay un gran artículo sobre problemas comunes en la versión de lanzamiento. Espero que esto también pueda ayudar a otros.
Weihui Guo