2009-10-21 11 views
56

Probablemente ya debería saber esto, pero no estoy seguro y no lo veo documentado.System.Diagnostics.Debug.WriteLine en el código de producción

Utilizo System.Diagnostics.Debug.WriteLine con bastante frecuencia durante el proceso de desarrollo para poder seguir los cambios a las variables o excepciones mientras depuro el código. Esto tiene como objetivo hacer que el desarrollo y la comprensión de lo que está sucediendo sea más fácil solo durante el desarrollo. Normalmente, o bien comento el código o lo elimino cuando voy a producción.

Me pregunto qué pasará si me olvido de comentar el código. Digamos, por ejemplo, que durante el ciclo de desarrollo, estoy rastreando la información de error que puede registrar una conexión en la ventana de salida usando Debug.Write Line. Esto obviamente está bien mientras se desarrolla, pero me pregunto si cuando entre en funcionamiento, si hay un riesgo aquí. ¿Alguien puede adjuntar un depurador a mi ejecutable en vivo y atrapar esta salida? ¿O es algo que solo produce resultados en Visual Studio?

¿Y qué pasa cuando pasamos de la depuración a la versión? ¿Este código es ignorado por el compilador si compilamos para el lanzamiento?

+1

Gracias a todos los que [email protected] Devaney, @Mitch Wheat y @ Agent_9191 dieron casi la misma respuesta en diferentes palabras, así que los votaré a todos, pero solo puedo aceptar una respuesta. Yo iría con quien respondió primero, pero eso parece ser un empate entre Mike y Phil, así que no te ofendas, Mitch, pero se lo voy a dar a Phil, cuyos puntos son más bajos. – David

+0

Para otros que busquen lo siguiente, [Debug.WriteLine in release build] (http://stackoverflow.com/questions/5419534/debug-writeline-in-release-build) también puede resultar interesante. –

Respuesta

66

Todos los miembros de la clase Debug están marcados con ConditionalAttribute, por lo que los sitios de llamada no se compilarán en una compilación de versión.

+23

Me gustaría tener un dólar por cada vez que un compañero de trabajo envió un instalador de producción con la compilación Debug en él. – MusiGenesis

17

System.Diagnostics.Debug llamadas de método solo están presentes cuando se define el símbolo de compilación condicional "DEBUG". De forma predeterminada, el símbolo "DEBUG" está definido solo para compilaciones de depuración.

compiladores que apoyan ConditionalAttribute ignoran las llamadas a estos métodos a menos que "DEBUG" es definido como un símbolo de la compilación condicional.

+1

+1 para salir 'ingresa el código aquí' :) –

11

Dado que los métodos de depuración tienen el atributo [Conditional ("DEBUG")], si cambia de Debug a Release no tendrá que preocuparse ya que las llamadas a esos métodos se eliminarán (junto con con las otras optimizaciones de una versión de lanzamiento).

+2

Más específicamente, no defina 'DEBUG'. Si crea una compilación "Release" (símbolos mínimos, código optimizado, etc.) pero define 'DEBUG', los métodos' Debug' seguirán siendo llamados, ¿verdad? –

2

Siempre que compila sin la opción /d:DEBUG o #define DEBUG, sus llamadas WriteLine no lo hará físicamente presente en su código de liberación; no hay forma de que un tercero recupere ninguna información de estas llamadas, ya que literalmente no están en la versión de lanzamiento.

Más detalles aquí: Debug Class (System.Diagnostics) on MSDN

6

información de depuración sólo es visible cuando se está ejecutando en el modo de depuración . En Release mode no, las declaraciones Debug estarán visibles (puede usar Trace en lugar de Debug si desea que estas declaraciones sean visibles en el modo Release).

http://support.microsoft.com/kb/815788

Cuestiones relacionadas