Depuración frente a publicación en .NET

Continuando con mi pregunta anterior , ¿hay un documento completo que enumere todas las diferencias disponibles entre los modos de depuración y liberación en una aplicación de C #, y particularmente en una aplicación web?

¿Qué diferencias hay?

“Depurar” y “Liberar” son solo nombres para configuraciones predefinidas de proyectos definidas por Visual Studio.
Para ver las diferencias, consulte la pestaña Comstackr en Propiedades del proyecto en Visual Studio.

Las diferencias en VS2005 incluyen:

  • Constante DEBUG definida en la configuración de depuración

  • Código optimizado habilitado en la configuración de la versión

así como otras diferencias que puede ver haciendo clic en el botón “Avanzado”

Pero puedes:

  • Cambie la configuración de comstackción para las configuraciones de depuración y liberación en Project Propeties / Build

  • Cree sus propias configuraciones personalizadas haciendo clic derecho en la solución en el Explorador de soluciones y seleccionando Configuration Manager

Creo que el comportamiento de la constante DEBUG es bastante claro (se puede hacer referencia en la directiva #if preprocessor o en ConditionalAttribute). Pero no conozco ninguna documentación exhaustiva sobre exactamente qué optimizaciones están habilitadas; de hecho, sospecho que Microsoft querría tener la libertad de mejorar su optimizador sin previo aviso.

No hay un documento que enumere las diferencias. Además de algunas de las diferencias ya enumeradas, la comstackción en modo de depuración desactiva la mayoría de las optimizaciones del comstackdor JIT que se realizan en el tiempo de ejecución y también emite información de depuración más completa en el archivo de base de datos de símbolos (.pdb).

Otra gran diferencia es que el comportamiento del GC es algo diferente en el sentido de que el comstackdor JIT insertará las llamadas a GC.KeepAlive () según sea apropiado / necesario para soportar las sesiones de depuración.

No conozco un documento conciso, pero:

  • Las llamadas Debug.Write se eliminan en la versión
  • En Release, su CallStack puede parecer un poco “extraño” debido a las optimizaciones, como lo describe Scott Hanselman

Debug and Release son solo tags para diferentes configuraciones de soluciones. Puede agregar otros si lo desea. Si lo desea, puede agregar más configuraciones desde el administrador de configuración.

http://msdn.microsoft.com/en-us/library/kwybya3w.aspx

Grandes diferencias –

1.En un dll de depuración, se agregan varias instrucciones adicionales para permitirle establecer un punto de interrupción en cada línea de código fuente en Visual Studio. Además, el código no se optimizará, ya que le permite depurar el código. En la versión de lanzamiento, estas instrucciones adicionales se eliminan.

2. El archivo PDB se crea solo en modo Depuración y no en modo relese.

3. En el modo de lanzamiento, cpde está optimizado por el optimizador integrado en el comstackdor JIT. Hace las siguientes optimizaciones:

• Inlineación del método: una llamada al método se reemplaza por la inyección del código del método.

• Asignación de registro de CPU: las variables locales y los argumentos de método pueden permanecer almacenados en un registro de CPU sin que nunca (o con menos frecuencia) se almacenen de nuevo en el marco de la stack.

• Eliminación de comprobación de índice de matriz: una optimización importante cuando se trabaja con matrices (todas las clases de colección .NET usan una matriz internamente). Cuando el comstackdor JIT puede verificar que un bucle nunca indexa una matriz fuera de límites, eliminará la verificación del índice.

• Loop unrolling - Short loops (up to 4) with small bodies are eliminated by repeating the code in the loop body. • Dead code elimination - A statement like if (false) { /.../ } gets completely eliminated. • Code hoisting- Code inside a loop that is not affected by the loop can be moved out of the loop. • Common sub-expression elimination. x = y + 4; z = y + 4; becomes z = x 

Un área de rendimiento importante si está utilizando cualquiera de los controles Ajax de ASP.NET: la información de depuración se elimina de la biblioteca de JavaScript cuando se ejecuta en versión, y he visto mejoras importantes de preformance en páginas complicadas. Otros recursos basados ​​en web pueden almacenarse en caché o no almacenarse en caché según esta configuración.

Además, recuerde que Depurar / Liberar en una aplicación web está dictado por el archivo web.config , no por su configuración en Visual Studio.

   

Más información:

  • No ejecute aplicaciones ASP.NET de producción con debug = “true” habilitado

Dibujar con GDI + es considerablemente más lento en el modo de depuración.

También puede administrar alguna parte del código que desee ejecutar solo en depuración o solo en versión con marcas de preprocesador:

  #if DEBUG // Some code running only in debug #endif 

o

  #if NOT DEBUG // Some code running only in release #endif 

Versión de lanzamiento:

  1. es considerablemente más rápido (más importante), optimizado

  2. no se puede debutar (paso a paso)

  3. y el código escrito en la directiva “debug” no está incluido

Vea ¿Cuál es la diferencia entre una comstackción de depuración frente a versión? .

Obtuve un mensaje de error cuando distribuyo el archivo ejecutable a otra máquina que indica que el sistema perdió MSVCP110D.dll.

La solución a este problema se indica en Stack Overflow pregunta Falta Visual Studio MSVCP110D.dll .

EN XXXXD.dll D significa que el archivo DLL es una versión de depuración del archivo DLL. Pero los paquetes MS Visual C ++ redistribuibles incluyen solo la versión de lanzamiento de los archivos DLL.

Eso significa que si necesita distribuir un progtwig desarrollado por Visual C ++ , necesita comstackrlo en modo Release. Y también debe instalar MS Visual C ++ Redistributable (versión correcta) en la máquina de destino.

Así que creo que esta es una de las principales diferencias entre el modo de depuración y el de liberación.