2009-08-06 19 views
12

Creo que entiendo la diferencia entre los modos de compilación Release y Debug. Las diferencias principales son que en el modo de depuración, el ejecutable producido no está optimizado (ya que esto podría dificultar la depuración) y se incluyen los símbolos de depuración.Modo de compilación: RelWithDebInfo

Al construir PCRE, una de las dependencias externas para WinMerge, noté un modo de compilación que no había visto antes: RelWithDebInfo.

La diferencia entre Debug y RelWithDebInfo se menciona aquí: http://www.cmake.org/pipermail/cmake/2001-October/002479.html. ejercicio: "RelwithDebInfo es bastante similar al modo Release. Produce código completamente optimizado, pero también crea la base de datos del programa e inserta información de línea de depuración para darle al depurador una buena oportunidad para adivinar dónde está en el código en cualquier momento. "

Esto suena como una muy buena idea, sin embargo, no es necesariamente obvio cómo configurarlo. Este enlace describe cómo habilitar esto para VC++: http://www.cygnus-software.com/papers/release_debugging.html

¿Me falta algo, o no tiene sentido compilar todos los códigos de versión como RelWithDebInfo?

Respuesta

4

Me estoy perdiendo algo, o tiene no tiene sentido para compilar todo el código de liberación como RelWithDebInfo?

Depende de cuánto confíe en su cliente la información de depuración.

Información adicional:

gcc codifica la información de depuración en el código objeto.

Aquí es el equivalente AP del gcc:

How to generate gcc debug symbol outside the build target?

Nota, que cmake no parece apoyar este enfoque fuera de la caja.

+1

No tiene que enviar información de depuración a sus clientes (ah, a menos que, como mencionó, para las plataformas donde está incrustado en los binarios) –

+0

Con el compilador poniendo la información de depuración _besides_ el ejecutable (como VC), esto no es un problema. – sbi

+1

Desarrollo de plataforma cruzada. Espero que las personas de Visual C++ entiendan las consecuencias del objetivo en otras plataformas. También recomiendo a los usuarios de cmake que utilicen la lista de correo de cmake, porque me parece que su documentación escrita está incompleta. – Juan

12

Por lo que a mí respecta, enviar código a los clientes sin tener los símbolos de depuración correspondientes almacenados en la empresa es una receta para la pérdida de cabello cuando se trata de problemas de producción de depuración.

Depuración Las compilaciones de versión con símbolos de depuración raras veces son diferentes de depurar compilaciones de depuración, por lo que recomiendo siempre hacerlo.

Dicho esto, no sé si hay algún inconveniente. Sería interesante escuchar, si es así.

+0

gcc (4.8?) Está agregando soporte para una información de depuración mucho mejor para compilaciones optimizadas, por lo que este consejo solo será más relevante. Ver -fvar-tracking y -fvar-tracking-assignments en [la documentación de gcc] (http://gcc.gnu.org/onlinedocs/gcc/Debugging-Options.html#Debugging-Options). En resumen, la información de depuración ahora puede rastrear el movimiento de datos entre la memoria y los registros, y dado un puntero de instrucción específico, puede saber dónde buscar una variable determinada. – doug65536

2

El código de producción no necesita la saturación de tamaño que lleva la información de depuración.

+0

¿La información de depuración aún deja una huella en el ejecutable? Pensé que el PDB llevaba toda la información ... –

+1

En Linux, la información está contenida en el código del objeto en sus bibliotecas binarias y compartidas. – Juan

5

Una vez que haya intentado depurar una versión de lanzamiento optimizada, sabrá por qué esto es algo que solo quiere hacer cuando no hay otra salida.

Básicamente, veo dos casos en los que necesitará esta:

  • tiene un problema que no aparece en versiones de depuración, así que hay que depurar un comunicado de construir
  • Usted tiene una bloquearse en un cliente y utilizar la información de depuración almacenada localmente para comprender el bloqueo.

No sé ustedes, pero tuve que depurar el código de lanzamiento dos o tres veces en la última década y pude trabajar en empresas donde los bloqueos en los clientes no fueron un problema.

Sí, probablemente también sea una buena idea tener información de depuración para las compilaciones de lanzamiento, pero VS no configura las cosas de esta manera y para los dos casos en cada década donde lo necesita no vale la pena establecerlo esto de forma manual todo el tiempo. Como CMake lo da gratis, hazlo.

+1

Supongo que depende del tipo de código en el que trabaje: he utilizado mucho para depurar símbolos de compilaciones optimizadas. No menos importante porque generamos un minivolcado en cualquier excepción inesperada, y eso junto con los símbolos nos da una pila de llamadas completa y legible para cada hilo. Es un buen lugar para comenzar a depurar de todos modos. –

+2

Kim, rara vez veo accidentes. Supongo que todo se reduce al estilo de codificación. En un proyecto grande que solía trabajar durante mucho tiempo (años), había partes donde los accidentes eran más comunes que en otras partes y había partes donde los choques encontrados durante las pruebas eran algo que sucedía solo una vez en cinco años. La probabilidad de fallas obviamente se correlaciona con la cantidad de administración manual de recursos. – sbi

+0

Si bien su respuesta se escribió en 2009, actualmente tengo VS2008 en mi escritorio y, de hecho, de forma predeterminada (es decir, crear los proyectos con el asistente), produce PDB en versión (tanto Win32 como aplicaciones de consola). – paercebal

0

Incluso cuando se genera información de depuración para la versión de lanzamiento, es mucho menos útil para la depuración que para la creación de depuración. El motivo es que muchas variables y expresiones intermedias se optimizan y, por lo tanto, no están disponibles en el depurador.

Cuestiones relacionadas