2012-06-28 9 views
28

Tengo que depurar un proyecto de C++, pero como una dependencia no se compila en modo de depuración y no he podido solucionar ese problema hasta ahora, me gustaría intentar depurar el proyecto en modo de lanzamiento.¿Cómo depurar en modo de lanzamiento?

Actualmente la aplicación se bloquea debido a un puntero nulo, pero no tengo el código que está causando el error. Como aparentemente se ignoran los puntos de quiebre en el modo de lanzamiento, me gustaría saber cuál es la mejor forma de encontrar el error.

Respuesta

52

En VS, haga clic con el botón derecho en su proyecto, seleccione "Propiedades".

  1. Haga clic en el/C++ nodo C. Establezca el Formato de información de depuración en C7 compatible (/ Z7) o Base de datos del programa (/ Zi).

  2. Ampliar el enlazador y haga clic en el nodo General. Establezca Habilitar vinculación incremental a No (/ INCREMENTAL: NO).

  3. Seleccione el nodo Depuración. Establezca Generar información de depuración en Sí (/ DEPURAR).

  4. Seleccione el nodo Optimización. Establezca Referencias a Sí (/ OPT: REF).

    si/OPT: REF se especifica,/OPT: ICF está activado por defecto.

Eso es arrancado directamente de la documentación de Microsoft:

hago esto todo el tiempo y casi nunca se depurar en modo de depuración más. Como usted sabe, muchos errores que ocurren en una compilación de lanzamiento pueden no ocurrir en una compilación de depuración (casi con certeza los errores que surgen al invocar a UB).

También, trabajar en un proyecto que utiliza una tonelada de procesamiento de imágenes y realiza una gran cantidad de compresión/descompresión de imágenes grandes. Usar una compilación de depuración lenta simplemente no es práctico.

+0

gracias resuelto!No sé mucho sobre los efectos de todas estas configuraciones, por lo que es mejor usarlas solo para depurarlas y eliminarlas nuevamente al compilar una versión de lanzamiento real. – Pedro

+5

@Pedro: Sí, probablemente sea mejor revertirlos y dejar activados los valores predeterminados para la versión. Normalmente creo un nuevo tipo de compilación para esta configuración, es decir, "liberar w/symbols". Dicho eso, no tiene sentido estudiar qué hacen realmente esos conmutadores. –

4

No siempre se puede simplemente cambiar la configuración del proyecto y volver a compilar.
Algunas veces tiene una versión lanzada que le gustaría depurar, o un archivo de volcado enviado por un cliente.

Al compilar un proyecto de C++ en la versión con optimizaciones, el depurador veces no es suficiente para demostrar la información del objeto correcto.

Las variables locales son generalmente los primeros en desaparecer, y muchas veces, la información del objeto de esta se pierde en el depurador.

La razón es que el compilador utiliza los registros de hardware disponibles para contener la información y utiliza las optimizaciones para evitar la asignación de variables locales.

he sugerido una manera de encontrar la información que falta aquí: problema

Debugging Release Projects in C++ - Finding the Lost Object Information

+0

La respuesta de @Ed es excelente si tiene acceso al código y al IDE. La respuesta de Yochai vale la pena leerla. –

Cuestiones relacionadas