Esta documentación está archivada y no tiene mantenimiento.

Cómo: Depurar código optimizado

Este tema hace referencia a:

Edición de Visual Studio

Visual Basic

C#

C++

J#

Express

No

No

Nativo

No

Standard

No

No

Nativo

No

Professional/Team System

No

No

Nativo

No

NoteNota

Los cuadros de diálogo y comandos de menú que verá en Visual Studio pueden variar con respecto a los descritos en la Ayuda en función de su edición o configuración activa. Para cambiar su configuración, elija Importar y exportar configuraciones, en el menú Herramientas. Para obtener más información, vea Valores de configuración de Visual Studio.

Cuando el compilador optimiza el código, recoloca y reorganiza las instrucciones para obtener un código compilado más eficiente. 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.

  • Los nombres de función de los marcos de la pila de llamadas, que puede ser incorrecta si el optimizador combina dos funciones.

Los marcos que ve en la pila de llamadas casi siempre son correctos, sin embargo, suponiendo que 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 ensamblador 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, la depuración se debería realizar con una versión sin optimizar del programa, siempre que sea posible. De forma predeterminada, la optimización está desactivada en la configuración de depuración (Depurar) de un programa de Visual C++, y activada en la configuración de lanzamiento (Lanzamiento).

Sin embargo, a veces, los errores sólo 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 depuración (Depurar)

  1. Cuando vaya a crear un proyecto nuevo, seleccione el destino Win32 - Depurar. Utilice como destino Win32 - Depurar hasta que el programa esté completamente depurado y listo para generar la versión de lanzamiento (Win32 - Lanzamiento). El compilador no optimiza la generación de archivos para un destino de depuración (Win32 - Depurar).

  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 Depurar 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 Optimización.

  7. En la lista de propiedades de la derecha, busque Optimización. El valor de configuración correspondiente probablemente indica Deshabilitado (/Od). Seleccione una de las otras opciones (Minimizar tamaño (/O1), Maximizar velocidad (/O2), Optimización completa (/Ox) o Personalizado).

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

Cuando depure el código optimizado, observe la ventana Desensamblador para ver qué instrucciones se crean y se ejecutan realmente. Al establecer puntos de interrupción, debe tener en cuenta 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, sólo se ejecutará una vez. Esto se debe a que la primera instrucción establece el valor de x en 0. El compilador detecta que esto sólo es necesario hacerlo una vez y saca esa instrucción 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 Desensamblador, la unidad de incremento aparece definida automáticamente como Instrucción para obtener un mayor control, lo cual resulta de utilidad cuando se ejecuta código optimizado paso a paso.

Vea también

Mostrar: