visual studio puede proyecto para modo este encuentra depurar depuracion debug configuracion compilar compilacion cambie archivo abrir c++ visual-studio optimization pdb-files

c++ - studio - para depurar este modulo cambie la configuracion de compilacion del proyecto a modo de depuracion



¿Pueden las optimizaciones afectar la capacidad de depurar una aplicación de VC++ utilizando su PDB? (4)

Para poder depurar correctamente las compilaciones de lanzamiento, se necesita un archivo PDB. ¿Puede el archivo PDB volverse menos útil cuando el compilador utiliza diferentes tipos de optimizaciones (FPO, PGO, funciones intrínsecas, alineación, etc.)? Si es así, ¿el efecto de la optimización es severo o simplemente causa que las líneas de código adyacentes se mezclen?

(Estoy usando VC2005, y siempre elegiré la capacidad de resolución sobre el rendimiento optimizado, pero la pregunta es general)


Además de las variables locales, el puntero "this" generalmente se optimiza en compilaciones optimizadas. A veces, esto puede resolverse subiendo lo suficiente en la pila de llamadas hasta el punto donde el puntero o referencia del objeto existe como variable no optimizada.

En general. Un solo paso en la compilación optimizada generalmente funciona más o menos y le permite a uno ver qué decisiones lógicas toma el código. Examinar los datos en los que se basan estas decisiones suele ser mucho más complicado.


La optimización puede tener un gran impacto en la depuración en cualquier plataforma (no solo en los archivos PDB de VC).

Exactamente por las razones que ha mencionado, la función de alineación puede, en algunos casos, confundir completamente qué instrucciones pertenecen a cada función (ya que a veces pertenecen a ambas).

También una optimización común es hacer marcos de pila "sucios" (-fomit-frame-pointer en GCC) que hace que el código no rastree la parte superior de la pila. Esto está bien, libera un registro adicional (ebp en x86) para otras operaciones. Pero hace casi imposible desenrollar la pila para ver qué está sucediendo realmente. También hace que sea casi imposible encontrar variables locales y parámetros de funciones en la pila.

En general: no espere obtener información de depuración útil de compilaciones "de publicación". Si la depuración es tan importante, incluso en la versión, entonces debería estar "liberando" compilaciones de depuración en su lugar.


Sí. A veces puede ser grave, aunque eso suele ser más el resultado de la creación o reordenación del código.

Las variables locales también pueden no mostrarse con precisión en la ventana de observación, ya que solo pueden existir en los registros y pueden no mostrarse correctamente cuando se cambian los marcos de pila.


Sí, el código optimizado es menos depurable. No solo falta información, alguna información será muy engañosa.

El mayor problema en mi opinión son las variables locales. El compilador puede usar la misma dirección de pila o registrarse para múltiples variables en una función. Como se menciona en otros carteles, a veces incluso averiguar qué es "este" puntero puede tomar un poco de tiempo. Al depurar el código optimizado, puede ver la línea actual saltando como un solo paso, ya que el compilador reorganizó el código generado. Si usas PGO, este salto probablemente empeore.

El FPO no debería afectar demasiado a la depuración, siempre que tenga un AP porque el PDB contiene toda la información necesaria para desenrollar la pila de tramas de FPO. El FPO puede ser un problema cuando se usan herramientas que necesitan tomar trazas de pila sin símbolos. Para muchos proyectos, el beneficio de perforación de FPO hoy en día no supera el éxito de diagnosticabilidad; por esta razón, MS decidió no construir Windows Vista con la optimización de FPO ( http://blogs.msdn.com/larryosterman/archive/2007/03/12/fpo.aspx ).

Prefiero depurar código no optimizado, pero esto no siempre es posible: algunos problemas solo reproducen con código optimizado, los volcados de cliente son de la compilación liberada y algunas veces no es posible obtener una depuración privada. A menudo, al depurar el código optimizado, utilizo la vista de desensamblaje. Dissembly nunca miente.

Todo esto se aplica al windbg ya que hago todo el código nativo de depuración con él. El depurador de Visual Studio podría manejar mejor algunos de estos casos.