optimisations peuvent affecter la capacité de déboguer une application VC ++ en utilisant son APB?

StackOverflow https://stackoverflow.com/questions/563000

Question

Afin de pouvoir correctement communiqué de debug un fichier PDB est nécessaire. le fichier PDB peut devenir moins utilisable lorsque le compilateur utilise différents types d'optimisations (OVF, PGO, fonctions intrinsèques, inline, etc.)? Si oui, est l'effet de l'optimisation sévère ou simplement provoquer des lignes adjacentes de code pour se mélanger?

(J'utilise VC2005, et sera toujours choisir debugability sur des performances optimisées - mais la question est générale)

Était-ce utile?

La solution

Oui, le code optimisé est moins débogable. Non seulement une information manquante, certaines informations seront très trompeuses.

Le plus gros problème à mon avis est des variables locales. Le compilateur peut utiliser la même adresse de pile ou registre à variables multiples à travers une fonction. Comme d'autres cités, parfois même comprendre ce que le pointeur « ce » est peut prendre un peu de temps. Lorsque le débogage du code optimisé, vous pouvez voir la ligne en cours de saut autour de vous une seule étape, car le compilateur a réorganisé le code généré. Si vous utilisez PGO, ce saut autour va probablement empirer.

Polynésie française ne devrait pas affecter debuggability trop à condition que vous avez un APB depuis l'APB contient toutes les informations nécessaires pour se détendre la pile pour les cadres FPO. Polynésie française peut être un problème lors de l'utilisation des outils qui ont besoin de prendre des traces de pile sans symboles. Pour de nombreux projets, la prestation de perf de nos jours ne FPO l'emporte pas sur le coup pour diagnosabilité; pour cette raison, MS a décidé de ne pas construire de Windows Vista avec l'optimisation FPO ( http://blogs.msdn.com/larryosterman/archive/2007/03/12/fpo.aspx ).

Je préfère déboguer le code unoptimized mais ce n'est pas toujours possible - certains problèmes que repro avec le code optimisé, les décharges crash du client sont de la construction publié, et d'obtenir privé déployé parfois un débogage est impossible. Souvent, lors du débogage du code optimisé, j'utilise le point de vue du démontage - est dissasembly jamais

.

Cela vaut tout WinDBg depuis que je fais tout le débogage de code natif avec elle. Le débogueur de Visual Studio peut gérer certains de ces cas mieux.

Autres conseils

Oui. Il peut être sévère parfois, bien que ce soit en général plus le résultat de inline ou réordonnancement de code.

Les variables locales ne peuvent pas être aussi avec précision affichées dans la fenêtre de la montre qu'ils ne peuvent exister dans les registres et ne peuvent pas être affichés correctement lorsque vous changez de cadres de pile.

L'optimisation peut sérieusement affecter le débogage sur une plate-forme (non seulement des fichiers PDB de VC).

Exactement pour les raisons que vous avez mentionnés, la fonction inline peut, dans certains cas, confondre complètement les instructions qui appartiennent à quelle fonction (car ils appartiennent en quelque sorte parfois les deux).

En outre une optimisation commune est de faire des cadres de pile « sale » (-fomit-frame-pointeur dans GCC) qui provoque le code de ne pas suivre le haut de la pile. Cela est bien, il libère un registre supplémentaire (ebp x86) pour d'autres opérations. Mais il rend presque impossible, pour se détendre la pile de voir ce qui se passe réellement. Il est également proche-impossible de trouver des variables locales et des paramètres de fonction sur la pile.

En général: Ne vous attendez pas à obtenir des informations de débogage utiles sur « release » construit. Si le débogage est si important que cela, même à la libération, alors vous devriez être « libérer » debug à la place.

En plus des variables locales, le pointeur « this » est typiquement optimisée loin dans optimisé construit. Cela peut parfois être travaillé autour en allant assez dans la pile d'appel au point où le pointeur d'objet ou de référence existe comme une variable non optimisée loin.

En général. un seul pas à pas dans la construction optimisée fonctionne généralement plus ou moins et on laisse de voir les décisions logiques du code fait. L'examen des données sur lesquelles ces décisions sont fondées est généralement beaucoup plus compliquée.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top