Je ne suis pas aussi familier avec la façon dont cela est fait avec CLR, mais c'est probablement très similaire à la façon dont cela est fait avec du code natif. Lorsque le compilateur génère des instructions machine, il ajoute des entrées au pdb qui disent en gros que "l'instruction à l'adresse actuelle, X, provient de la ligne 25 de foo.cpp".
Le débogueur connaît l'adresse du programme en cours d'exécution. Il recherche donc une adresse, X, dans le fichier pdb et voit qu'elle provient de la ligne 25 de foo.cpp. En utilisant cela, il est capable de "passer" à travers votre code source.
Ce processus est identique quel que soit le mode de débogage ou de libération (à condition qu'un pdb soit généré en mode de libération). Vous avez raison, cependant, que souvent en mode release en raison d'optimisations, le débogueur ne va pas "linéairement" à travers le code. Il pourrait sauter de manière inattendue vers différentes lignes. Cela est dû au fait que l'optimiseur a modifié l'ordre des instructions, mais il ne modifie pas le mappage entre l'adresse et la source, de sorte que le débogueur est toujours capable de le suivre.
Ty pour votre réponse détaillée. Les choses sont claires maintenant pour moi. –