Nota
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
En este artículo se explican los modificadores del compilador que se van a establecer para que pueda depurar código optimizado mejor.
Hay disponible una mejor experiencia a partir de la versión 17.14 de Visual Studio 2022 que permite depurar código optimizado como si se compilara sin optimizar, a la vez que conservaba la velocidad del código optimizado. Para obtener más información, vea depuración dinámica de C++ (versión preliminar).
Nota:
Los cuadros de diálogo y los comandos de menú que vea pueden diferir de los descritos en Ayuda en función de la configuración activa o edición. Para cambiar la configuración, elija Importar y Exportar Configuración en el menú Herramientas. Para obtener más información, consulte Restablecer todas las opciones de configuración.
Nota:
La opción de compilador /Zo (Enhance Optimized Debugging) (introducida en Visual Studio Update 3) genera información de depuración más completa para código optimizado en proyectos que no se construyen 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 usa la opción del compilador /Zo.
Cuando el compilador optimiza el código, cambia la posición y reorganiza las instrucciones. Esto da como resultado 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:
El optimizador puede quitar variables locales o moverlas a ubicaciones que el depurador no entiende.
Posiciones dentro de una función, que se 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.
Las variables globales y estáticas siempre se muestran correctamente. Igual sucede con el diseño de estructuras. Si tiene un puntero 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 de depuración de un programa de C++ y está activada en la configuración de versión.
Sin embargo, un error puede aparecer solo en una 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
Cuando vaya a crear un proyecto nuevo, seleccione el destino
Win32 Debug
. Utilice como destinoWin32 Debug
hasta que el programa esté depurado por completo y pueda compilar un destinoWin32 Release
. El compilador no optimiza el destinoWin32 Debug
.Seleccione el proyecto en el Explorador de soluciones.
En el menú Ver, haga clic en Páginas de propiedades.
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.En la vista de carpetas de la izquierda, seleccione la carpeta C/C++.
En la carpeta C++, seleccione
Optimization
.En la lista de propiedades de la derecha, busque
Optimization
. El valor situado junto a él probablemente indicaDisabled (
/Od)
. Elija una de las otras opciones (Minimum Size``(
/O1)
,Maximum Speed``(
/O2)
,Full Optimization``(
/Ox)
oCustom
).Si eligió la opción
Custom
paraOptimization
, ahora puede establecer opciones para cualquiera de las otras propiedades que se muestran en la lista de propiedades.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
Agregar
/Zo
deshabilita Editar y continuar.Cuando depure el código optimizado, use la ventana Desensamblado para ver qué instrucciones se crean y se ejecutan. Al establecer puntos de interrupción, debe tener en cuenta que el punto de interrupción puede moverse junto con una instrucción. Por ejemplo, considere el código siguiente:
for (x=0; x<10; x++)
Supongamos que establece un punto de interrupción en esta línea. Es posible que espere que el punto de interrupción se alcance 10 veces, pero si el código está optimizado, el punto de interrupción solo se alcanza una vez. Esto se debe a que la primera instrucción establece el valor de x
en 0. El compilador reconoce que esto solo tiene que realizarse una vez y lo mueve fuera 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.