Le soucis du jour concerne le mode de compilation sous Visual Studio 2005. J’ai une solution qui contient plusieurs projets de classe librairie et un projet web. Avant de passer à la compilation, je choisis mon mode Debug ou Release. Le problème c’est qu’en Release, je retrouve toujours mes fichiers pdb.
Et chose des plus étrange, c’est qu’en lisant ca et là, il semblerait que les différences entre Release/Debug sont variables celon ces sources.
soit le debug/release est identique à l’exception que la release ne permet de décompiler correctement les dll.
soit le release ne génère pas les fichier .pdb
que le release effectue une optimisation de code en plus de virer les .pdb
Bref, qui dit vrai ? Y a t il réellement une différence et lequel.
Sinon, j’ai un projet qui ne veut absolument pas etre compilé en Release. Qu’est ce que je fais ?
Alors, il y’a quelque chose qui est souvent mal compris au niveau des pdb… Ce sont des fichiers de symboles qui ne sont là que pour donner des informations aux debuggers sur le layout d’une dll (en gros, celà permet en examinant l’espace mémoire d’un processus de savoir qui fait quoi, qui appelle quoi, etc.). Dans le cas de la compilation en mode debug, ces pdb permettent aussi de faire la relation entre le code éxécuté et le code source d’origine, et faire du step by step, etc.
Dans le cas d’une compilation en mode release, le compilateur s’autorise certaines optimisations de code (inlining, etc.), qui font que la séquence des opérations véritablement effectuée à l’éxécution n’est pas forcément exactement la même que ce qui était prévu dans le code source (par exemple, au lieu de faire un appel de méthode, dans certains cas, le code de les instructions de la méthode appelée est recopiée dans la méthode appelante, c’est ca en gros l’inlining). Faire du step by step en mode debug est donc proscrit…
Une autre chose importante, le fait de compiler un projet en mode release n’empêche pas certaines tâches de debugging (on peut três bien s’attacher au process avec windbg, faire un break on exception, explorer la pile des appels, les valeurs des paramêtres, explorer le graphe des objets instanciés, etc. Pour ceci (et encore pas pour tout) les pdb sont requis :).
Dernière chose, en mode debug, ASP.Net désactive le multithreading (pour simplifier le debugging step by step), les informations de mise en cache (pour être sûr que le navigateur redemande la page quand on la rafraichie), et il faut donc faire super gaffe de ne jamais jamais jamais laisser un dans un web.config en prod ^^.
Donc en gros, la présence des pdb même en Release est tout à fait normal sous Visual Studio 2005 ? Si on a pensé à cocher l’option d’optimisation de code dans le Gestionnaire de configuration et mettre le debug=false dans le web.config, le pdb n’implique pas de problème de performance ?
Bon, je sais qu’il n’est pas obligatoire de fournir les pdb, l’appli fonctionne correctement tant qu’il a ces dll.
C’est comme ca que tu peux debugger le framework lui meme ou avoir des infos de modules dans win avec le serveur de symbole, PDB et release sont pas exclusifs.