2009-06-24 10 views
9

Tenemos una gran aplicación de C++, que a veces necesitamos ejecutar como una depuración para investigar los errores. La compilación de depuración es mucho más lenta que la compilación de lanzamiento, hasta el punto de ser casi inutilizable.Cómo hacer que las compilaciones de depuración de MSVC se ejecuten más rápido

¿Qué trucos hay disponibles para hacer que las compilaciones MSVC Debug se ejecuten más rápido sin sacrificar demasiado en la capacidad de debilidad?

+0

Por qué es un wiki de la comunidad? – Aamir

+0

Me han dicho en el pasado que hiciera todas las preguntas "wiki de la comunidad". Realmente no sé lo que hace la opción. – pauldoo

+0

............ lol – demoncodemonkey

Respuesta

11

Use #pragma optimize("", off) en la parte superior de los archivos seleccionados que desea depurar en la versión. Esto proporciona una mejor vista de seguimiento/variable de pila.

funciona bien si es sólo unos pocos archivos que necesita para perseguir el fallo. De

+0

Este es exactamente el truco que descubrimos más tarde y que llevamos usando desde hace un tiempo. (Olvidé volver y actualizar SO). La sintaxis correcta es '#pragma optimize (" ", off)', que luego puede ir seguida de un '#pragma optimize (" ", on)' para volver a poner el compilador en normal, lo que permite usar este truco en funciones individuales a la vez. – pauldoo

+0

Gracias por señalar el error. Lo he actualizado – Macke

3

perfila la aplicación y mira lo que ti te toma el tiempo. entonces debería ser capaz de ver qué depuración debe ajustarse.

+0

¿Cómo se hace eso? ¿Y qué tiene eso que ver con hacer que las compilaciones de depuración sean más rápidas? – Owl

1

hay varias diferencias entre compilaciones de depuración y compilaciones de versiones que influyen tanto en la capacidad de resolución como en la velocidad. Los más importantes son la definición _DEBUG/NDEBUG, las optimizaciones del compilador y la creación de información de depuración.

Es posible que desee crear una tercera configuración de solución y jugar con esta configuración. Por ejemplo, agregar información de depuración a una compilación de lanzamiento realmente no disminuye el rendimiento, pero ya se obtiene un rastreo de pila sensible para saber en qué función se encuentra. Solo la información de línea no es confiable debido a las optimizaciones del compilador.

Si desea información de línea confiable, continúe y apague las optimizaciones. Esto ralentizará la ejecución un poco, pero aún así será más rápido que la depuración normal, siempre y cuando la definición de _DEBUG aún no esté establecida. Entonces puedes hacer bastante buena depuración, solo todo lo que tenga "#ifdef _DEBUG" o similar no estará allí (por ejemplo, llamadas para afirmar, etc.).

Espero que esto ayude,

Ene

4

¿Por qué no acaba de encender la información de depuración en su configuración de liberación?

+2

La información de depuración ya está habilitada en la versión. El problema es que muchas variables son ilegibles en el depurador debido a la optimización agresiva. – pauldoo

0

¿Qué VS estás usando? Pasamos de VS.net a VS2008 recientemente y experimenté la misma lentitud mientras depuraba en una máquina de gama alta en un proyecto de 500kCG. Resulta que la base de Intellisense se corrompió y se actualizaba constantemente, pero se quedaba atascada en algún lugar. Eliminar el archivo .ncb resolvió el problema.

1

¿Está utilizando MFC?

En mi experiencia, lo principal que puede hacer que una versión de depuración sea lenta son las rutinas de validación de clase, que generalmente están deshabilitadas en la versión. Si la estructura de datos es similar a un árbol, puede volver a validar los subárboles cientos de veces.

De todos modos, si es, por ejemplo, 10 veces más lento que la versión de lanzamiento, eso significa que está gastando 1/10 de su tiempo haciendo lo necesario y 9/10 haciendo algo más. Si, mientras lo estás esperando, solo presiona el botón "pausa" y observa la pila de llamadas, es probable que veas exactamente cuál es el problema.

It's a quick & dirty, but effective way to find performance problems.

4

Apagamos iterador depuración con los símbolos del preprocesador:

_HAS_ITERATOR_DEBUGGING=0 
_SCL_SECURE=0 

que ayudó un poco, pero todavía no era tan rápido como nos gustaría. También terminamos haciendo que nuestra versión de depuración sea más parecida a la versión de lanzamiento al definir NDEBUG en lugar de _DEBUG. Hubo un par de otras opciones que también cambiamos, pero no las recuerdo.

Es lamentable que tuviéramos que hacer todo esto, pero nuestra aplicación requiere una cierta cantidad de trabajo cada 50ms o es inutilizable.VS2008 fuera de la caja nos daría ~ 60ms de veces para la depuración y ~ 6ms veces para la versión. Con los ajustes mencionados anteriormente, podríamos depurar hasta aproximadamente 20 ms, que es al menos utilizable.

+0

Simplemente déjelo funcionar completamente (es decir, continuamente, no activado por temporizador). Esa depuración 10: 1: desaceleración de liberación que está viendo es el tipo de cosa que es realmente fácil de encontrar con esta técnica: http://stackoverflow.com/questions/375913/what-can-i-use-to -profile-c-code-in-linux/378024 # 378024 –

+0

... incluso a una ralentización de 20: 6, eso significa que se desperdicia el 70% del tiempo. Entonces, si tomas 10 muestras, verás la razón en la pila en 7 +/- 1.45 muestras, y la pila te dirá por qué lo está haciendo, y será una mala razón, que puedes encontrar una solución alternativa. . –

+0

De hecho, ejecuté un generador de perfiles en él. El problema se extendió a muchos métodos y parecía que los encabezados de las funciones se estaban comiendo todo el tiempo, no el cuerpo. Llegué a la conclusión de que esto se debía a comprobaciones adicionales que Visual Studio estaba haciendo en modo de depuración. – MrSlippers

2

Crear un ReleaseWithSymbols configuración, que define NDEBUG y no tiene optimizaciones habilitadas. Esto le dará un mejor rendimiento mientras mantiene símbolos precisos para la depuración.

Cuestiones relacionadas