2009-06-24 6 views
9

Nous avons une grande application C++, que nous devons parfois exécuter en tant que build de débogage afin d'étudier les bogues. La version de débogage est beaucoup plus lente que la version finale, au point d'être presque inutilisable. Quelles sont les astuces disponibles pour rendre MSVC Les versions de débogage s'exécutent plus rapidement sans sacrifier trop au débugability?Comment faire pour que les versions de débogage de MSVC s'exécutent plus rapidement

+0

pourquoi est-ce un wiki communautaire? – Aamir

+0

On m'a déjà dit de faire toutes les questions "wiki communautaire". Je ne sais pas vraiment ce que l'option fait. – pauldoo

+0

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

Répondre

11

Utilisez #pragma optimize("", off) en haut des fichiers sélectionnés que vous souhaitez déboguer dans la version. Cela donne une meilleure trace/variable de la pile.

Fonctionne bien si ce n'est que quelques fichiers dont vous avez besoin pour chasser le bogue.

+0

C'est exactement l'astuce que nous avons découverte plus tard et que nous utilisons maintenant depuis un moment. (J'ai oublié de revenir et mettre à jour SO). La syntaxe correcte est '#pragma optimize (" ", off)', qui peut ensuite être suivie par '#pragma optimize (" ", on)' pour remettre le compilateur à la normale, permettant ainsi d'utiliser cette astuce sur fonctions uniques à la fois. – pauldoo

+0

Merci d'avoir signalé l'erreur. Je l'ai mis à jour. – Macke

3

profil l'application et voir ce que ti prend le temps. vous devriez alors être en mesure de voir quel débogage doit être réglé.

+0

Comment cela est-il fait? Et qu'est-ce que cela a à voir avec le fait de rendre les builds de débogage plus rapides? – Owl

1

Il existe plusieurs différences entre les versions de débogage et les versions de version qui influencent à la fois le débogage et la vitesse. Les plus importants sont les définitions _DEBUG/NDEBUG, les optimisations du compilateur et la création d'informations de débogage.

Vous pouvez créer une troisième configuration de solution et jouer avec ces paramètres. Par exemple, l'ajout d'informations de débogage à une version de release ne diminue pas vraiment les performances mais vous obtenez déjà une trace de pile sensible pour savoir dans quelle fonction vous vous trouvez. Seules les informations de ligne ne sont pas fiables à cause des optimisations du compilateur.

Si vous voulez des informations de ligne fiables, continuez et désactivez les optimisations. Cela ralentira un peu l'exécution mais cela sera toujours plus rapide que le débogage normal tant que la définition _DEBUG n'est pas encore définie. Ensuite, vous pouvez faire un bon débogage, seulement tout ce qui a "#ifdef _DEBUG" ou similaire autour de lui ne sera pas là (par exemple, les appels à affirmer etc.).

Hope this helps,

Jan

4

Pourquoi ne pas vous juste passer des informations de débogage dans la configuration de votre libération?

+2

Les informations de débogage sont déjà activées dans la version. Le problème est que de nombreuses variables sont illisibles dans le débogueur en raison de l'optimisation agressive. – pauldoo

0

Quels VS utilisez-vous? Nous sommes passés de VS.net à VS2008 récemment et j'ai expérimenté la même lenteur lors du débogage sur une machine haut de gamme sur un projet LOC> 500k. Il s'avère que la base d'Intellisense s'est corrompue et se mettrait à jour constamment mais rester coincé quelque part. La suppression du fichier .ncb a résolu le problème.

1

Utilisez-vous MFC? Dans mon expérience, la principale chose qui peut rendre une version de débogage lente est les routines de validation de classe, qui sont généralement désactivées dans la version. Si la structure de données est semblable à celle d'un arbre, elle peut finir par re-valider des sous-arborescences des centaines de fois. Quoiqu'il en soit, si c'est, disons, 10 fois plus lent que la version finale, cela signifie qu'il passe 1/10 de son temps à faire ce qui est nécessaire, et 9/10 à faire autre chose. Si, pendant que vous l'attendez, vous cliquez simplement sur le bouton "pause" et regardez la pile des appels, il y a de fortes chances pour que vous voyiez exactement quel est le problème.

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

4

Nous avons tourné le débogage Iterator avec les symboles de préprocesseur:

_HAS_ITERATOR_DEBUGGING=0 
_SCL_SECURE=0 

Il a aidé un peu, mais était toujours pas aussi vite que nous le souhaiterions. Nous avons également fini par rendre notre version de débogage plus semblable à une version en définissant NDEBUG au lieu de _DEBUG. Il y avait quelques autres options que nous avons changées, mais je ne m'en souviens pas.

Il est regrettable que nous devions faire tout cela, mais notre application a un certain travail à faire toutes les 50ms ou c'est inutilisable.VS2008 hors de la boîte nous donnerait ~ 60ms fois pour le débogage et ~ 6ms fois pour la libération. Avec les réglages mentionnés ci-dessus, nous pourrions obtenir un débogage de ~ 20 ms environ, ce qui est au moins utilisable.

+0

Laissez-le simplement fonctionner à fond (c'est-à-dire en continu, pas déclenché par minuterie). Ce débogage 10: 1: le ralentissement de la diffusion que vous voyez est juste le genre de chose qui est vraiment facile à trouver avec cette technique: http://stackoverflow.com/questions/375913/what-can-i-use-to -profile-c-code-in-linux/378024 # 378024 –

+0

... même au ralentissement de 20: 6, cela signifie que 70% du temps est gaspillé. Donc, si vous prenez 10 échantillons, vous verrez la raison sur la pile sur 7 +/- 1,45 échantillons, et la pile vous dira pourquoi elle le fait, et ce sera une mauvaise raison, que vous pouvez trouver une solution de rechange . –

+0

J'ai effectivement couru un profileur dessus. Le problème a été étendu à beaucoup de méthodes et il a semblé que les en-têtes de fonction mangeaient tout le temps pas le corps. J'ai conclu que c'était dû à des contrôles supplémentaires que Visual Studio faisait en mode debug. – MrSlippers

2

Créer une ReleaseWithSymbols configuration, qui définit NDEBUG et n'a pas permis Optimisations. Cela vous donnera de meilleures performances tout en conservant des symboles précis pour le débogage.

Questions connexes