Question

Est-il possible pour le débogueur (ou le gestionnaire d'exceptions CLR) pour montrer la ligne où l'exception est passé en mode de sortie en utilisant le PDB?

Le code, en mode de libération, est optimisé et ne pas toujours suivre l'ordre et la logique du code « original ».

Il est également surprenant que le débogueur peut naviguer dans mon étape de code pas à pas, même en mode de sortie. L'optimisation doit rendre la navigation très inconfortable.

Pourriez-vous s'il vous plaît préciser ces deux points pour moi?

Était-ce utile?

La solution

Je ne suis pas aussi familier avec la façon dont cela se fait avec CLR, mais il est probablement très similaire à la façon dont il est fait avec du code natif. Lorsque le compilateur génère des instructions de la machine, il ajoute des entrées à la pdb qui disent essentiellement « l'instruction à l'adresse actuelle, X, est venu de la ligne 25 dans foo.cpp ».

Le débogueur sait ce que l'adresse programme est en cours d'exécution. Donc, il recherche une certaine adresse, X, dans le pdb et voit qu'il est venu de la ligne 25 en foo.cpp. Avec cela, il est capable de « étape » dans votre code source.

Ce processus est le même quel que soit le mode de débogage ou de sortie (à condition qu'un pdb est généré tout en mode sortie). Vous avez raison, cependant, que souvent en mode de libération en raison d'optimisations du débogueur ne pas « linéaire » dans le code. Il pourrait sauter autour de différentes lignes de façon inattendue. Cela est dû à l'optimiseur changer l'ordre des instructions, mais il ne change pas le mappage adresse source à la ligne, de sorte que le débogueur est encore capable de le suivre.

Autres conseils

[@ ne suis pas sûr] a presque raison. compilateur fait un meilleur effort à identifier un numéro de ligne appropriée qui correspond étroitement à l'instruction en cours de code machine.

L'APB et le débogueur ne sais pas quoi que ce soit au sujet des optimisations; le fichier PDB cartes essentiellement des emplacements d'adresse dans le code de la machine à des numéros de ligne de code source. Dans le code optimisé, il est pas toujours possible de faire correspondre exactement une instruction d'assemblage à une ligne spécifique du code source, de sorte que le compilateur écrire à l'APB, la chose la plus proche, il a à portée de main. Cela pourrait être « la ligne de code source avant » ou « la ligne de code source du contexte englobante (boucle, etc) » ou autre chose.

Peu importe, le débogueur trouve essentiellement l'entrée dans le plus proche carte PDB (comme dans « avant ou égaux ») à l'adresse IP actuelle (pointeur d'instruction) et met en évidence cette ligne.

Parfois, le match est pas très bon, et c'est quand vous voyez la zone en surbrillance de sauter dans tous les sens.

Le débogueur fait une estimation plus effort où le problème est survenu. Il n'est pas garanti d'être précis à 100%, et avec le code entièrement optimisé, il sera souvent inexact -. J'ai trouvé les erreurs variant entre quelques lignes hors d'avoir une pile d'appel tout à fait faux

Quelle est la précision du débogueur est avec le code optimisé dépend vraiment du code lui-même et qui vous optimisations faire.

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