Comment rendre les versions de débogage MSVC plus rapides

Nous avons une grande application C ++, que nous devons parfois exécuter en tant que construction de débogage afin de rechercher 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 que les versions Debug MSVC s’exécutent plus rapidement sans trop sacrifier la capacité de débogage?

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

Fonctionne bien s’il ne s’agit que de quelques fichiers pour chasser le bogue.

Pourquoi n’activez-vous pas simplement les informations de débogage dans votre configuration de version?

Nous avons désactivé le débogage Iterator avec les symboles du préprocesseur:

 _HAS_ITERATOR_DEBUGGING=0 _SCL_SECURE=0 

Cela a aidé un peu, mais n’était toujours pas aussi rapide que nous le voudrions. Nous avons également fini par rendre notre version de débogage plus semblable à une version en définissant NDEBUG au lieu de _DEBUG. Nous avons également changé quelques autres options, mais je ne m’en souviens pas.

Il est regrettable que nous ayons dû faire tout cela, mais notre application nécessite un certain travail à effectuer toutes les 50 ms ou son inutilisable. VS2008 prêt à l’emploi nous donnerait environ 60 ms pour le débogage et environ 6 ms pour la publication. Avec les réglages mentionnés ci-dessus, nous pourrions obtenir un débogage à environ 20 ms, ce qui est au moins utilisable.

Profil de l’application et voir ce qui prend le temps. vous devriez alors pouvoir voir quel débogage doit être ajusté.

Créez une configuration ReleaseWithSymbols , définissant NDEBUG et aucune optimisation activée. Cela vous donnera de meilleures performances tout en maintenant des symboles précis pour le débogage.

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

Vous voudrez peut-être créer une troisième configuration de solution et jouer avec ces parameters. Par exemple, l’ajout d’informations de débogage à une version validée ne diminue pas réellement les performances, mais vous obtenez déjà une trace de stack sensible pour vous indiquer la fonction dans laquelle vous vous trouvez. Seules les informations de ligne ne sont pas fiables en raison des optimisations du compilateur.

Si vous voulez des informations de ligne fiables, activez et désactivez les optimisations. Cela ralentira un peu l’exécution, mais ce sera toujours plus rapide que le débogage normal tant que le paramètre _DEBUG n’est pas encore défini. Ensuite, vous pouvez faire un très bon débogage, seulement tout ce qui a “#ifdef _DEBUG” ou similaire autour ne sera pas là (par exemple, les appels à affirmer, etc.).

J’espère que cela t’aides,

Jan

Utilisez-vous le MFC?

D’après mon expérience, la principale chose qui peut ralentir une version de débogage est la routine de validation de classe, qui est généralement désactivée dans la version. Si la structure de données ressemble à une arborescence, elle peut valider de nouveau la validation des sous-arbres des centaines de fois.

Quoi qu’il en soit, si elle est, par exemple, 10 fois plus lente que la version finale, cela signifie qu’elle consacre 1/10 de son temps à faire le nécessaire et 9/10 à faire autre chose. Si, pendant que vous l’attendez, vous appuyez simplement sur le bouton “Pause” et consultez la stack d’appels, il y a 9/10 chances de voir exactement quel est le problème.

C’est un moyen rapide et sale, mais efficace, de trouver des problèmes de performances.

Quel VS utilisez-vous? Nous sums passés récemment de VS.net à VS2008 et j’ai connu la même lenteur lors du débogage sur une machine haut de gamme avec un projet> 500k LOC. Il semble que la base d’Intellisense soit corrompue et se mette à jour en permanence, mais rest bloquée quelque part. La suppression du fichier .ncb a résolu le problème.