Depuración de código optimizado

Nota:

Los cuadros de diálogo y comandos de menú que se ven pueden diferir de los descritos en la Ayuda, en función de los valores de configuración o de edición activos. Para cambiar la configuración, elija la opción Importar y exportar configuraciones del menú Herramientas . Para obtener más información, vea Restablecer toda la configuración.

Nota:

La opción del compilador /Zo (Mejorar la depuración optimizada) (introducida en Visual Studio Update 3) genera información de depuración más enriquecida para código optimizado (proyectos que no se compilan con la opción de compilador /Od. Vea Opciones /O (Optimizar código). Esto incluye compatibilidad mejorada para la depuración de las variables locales y las funciones insertadas.

Editar y continuar está deshabilitado cuando se utiliza la opción del compilador /Zo.

Cuando el compilador optimiza el código, cambia de posición y reorganiza las instrucciones. Esto produce el código compilado más eficaz. Debido a esta reorganización, el depurador no siempre puede identificar el código fuente que corresponde a un conjunto de instrucciones.

La optimización puede afectar a:

  • Las variables locales, las cuales puede quitar el optimizador o moverlas a ubicaciones que el depurador no reconoce.

  • Las posiciones dentro de una función, que cambian cuando el optimizador combina bloques de código.

  • Nombres de función de los marcos en la pila de llamadas, que podrían ser incorrectos si el optimizador combina dos funciones.

    Sin embargo, los marcos que aparecen en la pila de llamadas casi siempre son correctos, suponiendo que se dispone de símbolos para todos los marcos. Los marcos de la pila de llamadas serán incorrectos si la pila está dañada, si tiene funciones escritas en lenguaje de ensamblado o hay marcos del sistema operativo sin su símbolo correspondiente en la pila de llamadas.

    Siempre se muestran correctamente las variables globales y estáticas. Igual sucede con el diseño de estructuras. Si hay un puntero que señala a una estructura y el valor del puntero es correcto, todas las variables miembro de la estructura mostrarán el valor correcto.

    Debido a estas limitaciones, se debería depurar con una versión sin optimizar del programa, siempre que sea posible. De forma predeterminada, la optimización está desactivada en la configuración Debug de un programa de C++ y activada en la configuración Release.

    Sin embargo, los errores solo aparecen en la versión optimizada de un programa. En ese caso, se debe depurar el código optimizado.

Para activar la optimización en una configuración de compilación Debug

  1. Cuando vaya a crear un proyecto nuevo, seleccione el destino Win32 Debug. Utilice como destino Win32 Debug hasta que el programa esté depurado por completo y pueda compilar un destino Win32 Release. El compilador no optimiza el destino Win32 Debug.

  2. Seleccione el proyecto en el Explorador de soluciones.

  3. En el menú Ver, haga clic en Páginas de propiedades.

  4. En el cuadro de diálogo Páginas de propiedades, asegúrese de que Debug está seleccionado en el cuadro de lista desplegable Configuración.

  5. En la vista de carpetas de la izquierda, seleccione la carpeta C/C++ .

  6. En la carpeta C++ , seleccione Optimization.

  7. En la lista de propiedades de la derecha, busque Optimization. El valor de configuración correspondiente probablemente indica Disabled (/Od). Elija una de las otras opciones (Minimum Size``(/O1), Maximum Speed``(/O2), Full Optimization``(/Ox) o Custom).

  8. Si elige la opción Custom para Optimization, puede definir opciones para cualquiera de las demás propiedades que se muestran en la lista de propiedades.

  9. Seleccione el nodo Propiedades de configuración, C/C++, Línea de comandos de la página de propiedades del proyecto y agregue (/Zo) al cuadro de texto Opciones adicionales.

    Advertencia

    Si se agrega /Zo, se deshabilitará Editar y continuar.

    Cuando depure el código optimizado, use la ventana Desensamblado para ver qué instrucciones se crean y se ejecutan realmente. Al establecer los puntos de interrupción, debe saber que un punto de interrupción se puede desplazar junto con una instrucción. Por ejemplo, considere el siguiente código:

for (x=0; x<10; x++)

Suponga que se establece un punto de interrupción en esta línea. Podría pensarse que el punto de interrupción se va a alcanzar 10 veces, pero, si el código está optimizado, el punto de interrupción sólo se ejecutará una vez. Esto se debe a que la primera instrucción establece el valor de x en 0. El compilador reconoce que esto sólo se tiene que hacer una vez y lo saca del bucle. El punto de interrupción se traslada con ella. Las instrucciones que comparan e incrementan x permanecen dentro del bucle. En la ventana Desensamblado, la unidad de incremento se establece automáticamente como Instrucción para obtener un mayor control, lo cual resulta útil cuando se ejecuta el código optimizado paso a paso.