debugging - validacion - ¿Hay algún problema con la liberación de software en modo de depuración?
tipos de depuradores en informatica (20)
la información adicional de depuración hace que el mantenimiento futuro sea un poco más fácil.
Depende de lo que quiere decir con "información de depuración adicional".
Si se refiere a mensajes de depuración, probablemente debería utilizar Trace
, no Debug
, y utilizar los conmutadores de seguimiento y los detectores de seguimiento definidos en el archivo de configuración para controlar el comportamiento de registro en tiempo de ejecución.
Si quiere decir conocer el nombre del miembro y el número de línea cuando hay una excepción, no necesita distribuir compilaciones de depuración para obtener esa información; simplemente distribuya los archivos .pdb
con su ejecutable. La clase Exception
usa información del archivo .pdb
, independientemente de si ha establecido o no constantes de compilación.
Todos sabemos que el "Modo de depuración" se debe usar para el desarrollo porque el compilador produce más información de depuración y el "Modo de publicación" se debe usar para las versiones de producción porque el compilador produce un código optimizado.
Sin embargo, digamos que si está creando un software que solo se usa internamente dentro de la organización y el rendimiento del código no es un gran problema, ya que el software necesita realizar muchas consultas de E / S de archivos y bases de datos. Estaré muy tentado de lanzar el software en "Modo de depuración" en este escenario porque esa información de depuración adicional hace que el mantenimiento futuro sea un poco más fácil.
¿Hay alguna razón convincente para lanzar el software en modo de lanzamiento en este caso?
¿Estás liberando el software? (Esta es una pregunta "Sí", "No", "Sí, pero ..." no cuenta)
Si es así, ¿por qué no hacerlo correctamente y convertirlo en un lanzamiento real para que no tenga que confiar en que los símbolos de depuración estén disponibles para sus usuarios ...?
Creo que es importante seguir buenos estándares, prácticas y procedimientos. Solo porque la aplicación solo se use internamente no es una buena razón para permitirse ser flojo. Aunque tengo fuertes sentimientos acerca de la "forma correcta" de hacer las cosas, creo que los hábitos de escribir un buen software superan los beneficios, a largo plazo, de hacer trampas mediante el uso de una versión de depuración. Agregue un manejo de excepciones, conozca las trampas de los sistemas contra los que está codificando: hará que todo el código que escriba sea mejor.
Dos preocupaciones que puedo pensar:
Las compilaciones de depuración suelen agregar relleno a los almacenamientos intermedios. Es por eso que a veces obtienes programas que parecen funcionar en la depuración pero fallan en el lanzamiento. Seem es la palabra clave aquí, ya que los desbordamientos de buffer son solo un accidente esperando a suceder.
Cosas extrañas suceden en compilaciones de depuración. Una vez trabajé en una aplicación de larga ejecución que se bloqueaba cada veinte días más o menos. Resulta que en el tiempo de ejecución C un contador (usado para ayudar a la depuración) se incrementaba cada vez que se realizaba un malloc / free. Si el contador se desbordó, ¡kaboom! Por esta razón, nunca recomendaría a nadie que implemente binarios de depuración; nunca se sabe qué sorpresas podría estar esperando su cliente.
La compilación de cualquier aplicación en el modo de depuración agrega código a la aplicación que es utilizada (casi) exclusivamente por el compilador o IDE para depurar, recorrer su código, etc. Estas funciones de depuración prácticamente no tienen uso en la vida real. Si desea lanzar una aplicación al público, su mejor opción es compilarla en modo de lanzamiento. Además, las aplicaciones liberadas son ...
- Mucho más rápido y estable
- Optimizado para la máquina
- Menor tamaño
- Más seguro (más difícil de descompilar / piratear)
- Más eficiente y más fácil en el hardware
Si tiene la opción de un modo de lanzamiento, ¿por qué no usarlo? Siempre tendrá la versión de depuración para el desarrollo, o si algo sale mal, y siempre puede empaquetar la aplicación creada con Debug y / o el código fuente con su versión editada.
Además, también puede tener la opción de crear la aplicación para ciertas plataformas. La compilación utilizando el modo de lanzamiento racionalizará la aplicación para dicha plataforma, lo que la hace mucho más estable.
Incluso si la velocidad no es un problema, no hay ninguna razón para no utilizar el modo de lanzamiento cuando compila.
Mi árbol de decisiones es así:
¿El programa está escrito en Java?
Sí, entonces la versión en modo de depuración está bien. El JIT se encargará de las optimizaciones
De lo contrario: ¿el programa CPU es intensivo?
No - Release en modo de depuración está bien.
Sí, entonces compila solo el punto caliente en el modo de lanzamiento.
El razonamiento subyacente: es mucho más fácil mantener el código cuando los informes de errores se generan a partir del programa exacto que se está ejecutando en su IDE. En el IDE, utiliza una versión de depuración, por lo que debe esforzarse por liberarla en el modo de depuración.
No tengo ninguna objeción personal para enviar internamente la compilación Debug, siempre que funcione (algunas versiones de Debug no funcionarán en máquinas que no sean de desarrollo sin instalar también las bibliotecas de depuración correspondientes ... se encontraron con eso cuando programé C ++ / Código MFC).
Un enfoque un poco más sofisticado es utilizar un servidor de símbolos , uno que se actualiza con símbolos automáticamente por su proceso de construcción.
Si estaba depurando un problema de la máquina de un cliente, apunte el depurador liviano a su servidor de símbolos (asegúrese de que las versiones coincidan) y luego comience la depuración.
Posibles razones:
- La depuración normalmente no se compila para el rendimiento
- El tamaño de la aplicación de depuración (normalmente) es mucho mayor que las compilaciones de versiones.
- Si alguien intenta realizar una ingeniería inversa de su aplicación (por el motivo que sea), se vuelve mucho más fácil.
ACTUALIZACIÓN: 4. Como se señaló, el rendimiento del enlazador, pero yo hubiera pensado que estaría muy abajo en la lista: p ¿Cuántas veces lanza un producto en comparación con hacer compilaciones de depuración?
Si está dispuesto a renunciar a lo anterior, entonces no hay una razón real por la que no.
Recuerdo vagamente que si llevas los binarios compilados en Debug a una computadora que no tiene instaladas las bibliotecas de tiempo de ejecución de depuración (lo que generalmente significa que no tiene un IDE, por lo que la mayoría de los usuarios entran en esta categoría), lo hará barf con un mensaje de error. No sé si eso es específico de Windows y / o C ++. También puedo estar recordando mal ... pero ciertamente debes verificar si esto sucede, como si tuviera razón sería una razón importante para compilar en modo de lanzamiento.
Si se trata de un sitio web o servicio y el rendimiento no es un problema, entonces libérelo en modo depuración. Si se trata de una aplicación de escritorio, considere si la versión del modo de depuración es fácil de usar en la forma en que maneja los errores. Si es así, también lanzaría la versión de depuración.
Supongo que hay mucho más código de depuración instalado que nosotros (los desarrolladores) estamos dispuestos a admitir.
Personalmente, conozco muchos sistemas de producción que se implementan en clientes con código compilado en modo de depuración.
Tengo principalmente dos problemas con la versión de depuración:
- La información de depuración puede ser una verificación de seguro grande e innecesaria para el mantenimiento futuro que puede evitarse por otros medios.
- El diagnóstico es un aspecto de su aplicación que no debería tener relación o dependencia con la configuración de compilación que está construyendo
Creo que es importante diseñar y mantener la lógica de instrumentación y diagnóstico en su aplicación como un aspecto o una preocupación transversal. Si confía demasiado en la información proporcionada por la versión de depuración de su código:
- ¿Puede garantizar que será la versión de depuración que se lanzará cada vez que se lance una nueva versión de su aplicación? documentación deficiente, alguien más que lo hace, etc.
- Las aplicaciones tienen una tendencia a crecer en funcionalidad y complejidad. Mientras que el rendimiento y el tamaño de su aplicación debido a la versión de depuración pueden no ser un problema en este momento. Las cosas pueden sumarse y dar lugar a posibles problemas. En caso de problemas de rendimiento, ni siquiera puede atribuirlos a la versión de depuración.
Todavía puede recopilar información valiosa en la versión de lanzamiento. El rastreo de pila aún debería estar disponible en caso de excepciones. Es posible que no vea el archivo de origen y los números de línea, pero aún puede ver qué métodos se llaman. Sin embargo, aún debe producir y mantener símbolos de depuración para su versión de lanzamiento. Estos símbolos le permitirán depurar su versión de lanzamiento (incluso puede configurar un servidor de símbolos). Debido a la optimización del código, es muy probable que la información de depuración no coincida con el 100% del código, por ejemplo, la información de depuración referente a una declaración optimizada, etc., pero aún así debería poder depurar la mayor parte de ella. Para otra información, como datos de entrada de usuario, datos intermedios, código de base de datos ejecutada, etc., la liberación de depuración no le ayudará de todos modos, ya que no captura esa información. Usted necesita mantener un registro de esos por su cuenta.
Si está utilizando .NET, puede echar un vistazo a Seguimiento e Instrumentación . También puede considerar usar un marco existente como Microsoft Enterprise Library o log4net. Si se trata de una aplicación .NET, también puede solicitar el compilador JIT para generar información de seguimiento para la versión de lanzamiento de su aplicación como una opción. Echa un vistazo a este artículo de MSDN .
Usted era independiente de la plataforma en la pregunta, pero este consejo sobre por qué no poner el modo de depuración en producción en ASP.Net demuestra algunas de las razones (por cierto relacionadas con el rendimiento) para no hacer esto.
1) La compilación de páginas ASP.NET lleva más tiempo (ya que algunas optimizaciones de lotes están desactivadas)
2) El código puede ejecutarse más lentamente (dado que algunas rutas de depuración adicionales están habilitadas)
3) Se usa mucha más memoria dentro de la aplicación en tiempo de ejecución
4) Las secuencias de comandos y las imágenes descargadas desde el controlador WebResources.axd no se almacenan en caché
El último punto es un poco asesino de perf para ciertos tipos de controles que son funcionalidades ''esperadas'' en un mundo web2.0, incluso para aplicaciones internas. Vea el artículo de ScottGu para más detalles sobre los costos del último punto.
Quizás la mejor manera de resumir el contraargumento es "depende de cómo se defina el rendimiento del código".
Depende del usuario
Si el usuario es técnico , el suministro de un paquete de depuración adicional para los símbolos puede ayudarlos a depurar en su nombre o enviar más información técnica de errores ... ahorrándole dinero / tiempo .
Si el usuario es un usuario doméstico ... probablemente no le importe si la información de depuración está allí o no. Siempre que elimines todo tu rastro de cruces :)
Si se trata de una empresa que busca una máquina de hinchamiento sin grasa, entonces dale una versión desnuda.
Depende de dónde se encuentren sus objetivos / limitaciones de comunicación / negocios.
El solo hecho de que pregunte sugiere que hay un beneficio del Modo de depuración que desea aprovechar. Si estos beneficios superan tu culpabilidad moral, entonces digo "adelante" y hazlo. Estos beneficios son probablemente mecánicos e informativos y relevantes para su trabajo, mientras que la falta de culpabilidad realmente no lo ayuda a producir un mejor software. Puede ayudarte a dormir mejor, pero ¿a quién le importa?
Aparte del rendimiento, el tamaño y la descompilación ya mencionados ...
Seguridad: las construcciones de depuración y la depuración (por ejemplo, archivos pdb) contienen mucha información sobre el código fuente que no solo facilita el descompilado, sino que también permite que los usuarios conozcan detalles internos, como nombres de archivos y rutas de red. Muchas empresas pueden considerar que esta información es muy sensible.
Esto es lo que normalmente hago con el software que necesita tener presente la información de depuración (generalmente herramientas de tipo de desarrollo): compilo mi código optimizado, pero con información de símbolos, y un enlace tal que guardo información de símbolos. De esa forma, cuando el software se cuelga, al menos puedo obtener una stacktrace a la mitad decente y una idea de dónde comenzar a poner información de registro adicional para cuando envíe al cliente una compilación de depuración completa.
A veces, el optimizador causa errores, a veces los oscurece, pero al menos tiene la capacidad de reducir su problema. Esto me ha funcionado en entornos de blackbox como Raytheon, donde era imposible obtener un volcado de memoria, y el seguimiento de la pila se enviaba por fax con un gran marcador negro por todas partes.
Utilice el modo de lanzamiento, pero compile con toda la información de depuración habilitada e implemente los archivos pdb con los archivos ejecutables. Puede depurar los archivos binarios de la versión de la misma manera que los de depuración: no hay diferencia, solo tiene que generar los archivos pdb al compilar.
Liberar y ejecutar la compilación de depuración puede ser peligroso porque oculta erros en su código que vendrán solo en modo de lanzamiento.
lanzar dos versiones, una etiquetada si aparecen errores use esta ...
Pero dependiendo de los datos confidenciales, bloquee la versión de depuración.
Personalmente creo en una solución mediana entre la depuración y la versión, es decir, usted registra lo suficiente para que pueda reproducir el error si ocurre. Cuando su aplicación sea lo suficientemente estable, apague su registro adicional picante con un parámetro en su archivo de configuración. Sin embargo, me doy cuenta de que no se puede hacer todo el tiempo. Muy a menudo cuando tienes tu aplicación ejecutándose en un solo lugar.
Además, una regla de oro que he tratado de implementar en mi lugar de trabajo (y aún no lo he logrado): nunca deje que se muestre su código. Si el usuario es conocedor de la tecnología, él sabrá lo que está pasando y lo mal que piense. Si tu usuario no lo está, él pensará que su computadora está poseída por el demonio, y piensa mal de ti.