120 votes

Quelle est la différence entre Debug et Release dans Visual Studio ?

Duplicata possible Déboguer Visual Studio Release en .NET

Quelle est la différence entre Debug et Release dans Visual Studio ?

127voto

Vilx- Points 37939

La chose la plus importante est qu'en mode Debug il n'y a pas d'optimisations, alors qu'en mode Release il y en a. C'est important car le compilateur est très avancé et peut effectuer des améliorations de bas niveau assez délicates de votre code. En conséquence, certaines lignes de votre code peuvent se retrouver sans aucune instruction, ou certaines peuvent être mélangées. Le débogage étape par étape serait impossible. De plus, les variables locales sont souvent optimisées de manière mystérieuse, de sorte que les Watches et QuickWatches ne fonctionnent souvent pas parce que la variable est "optimisée". Et il existe une multitude d'autres optimisations. Essayez un jour de déboguer du code .NET optimisé et vous verrez.

Une autre différence importante est que, pour cette raison, les paramètres par défaut de la version ne prennent pas la peine de générer des informations détaillées sur les symboles de débogage. Il s'agit du fichier .PDB que vous avez peut-être remarqué et qui permet au débogueur de déterminer quelles instructions d'assemblage correspondent à quelle ligne de code, etc.

1 votes

"En conséquence, certaines lignes de votre code peuvent être laissées sans aucune instruction, ou certaines peuvent être mélangées". Oui, j'ai été victime de cela en utilisant les Stack frames pour obtenir le nom de la méthode/propriété courante - et beaucoup de propriétés ont été intégrées dans la version...

6 votes

"La chose la plus importante est qu'en mode débogage il n'y a pas d'optimisations" - c'est discutable. la chose la plus importante est qu'il y a des informations de débogage qui vous permettent de déboguer. bien que cela puisse exister aussi en release.

0 votes

Je ne sais pas quel est le mode par défaut (Debug/Release). Généralement, d'après mon expérience, tous les projets sont en mode debug et l'équipe d'installation s'occupe de cette version pour éviter les fichiers pdb et pour introduire des optimisations. Mais aujourd'hui, j'ai rencontré une situation où le mode a été changé en release et je ne suis pas en mesure de casser le code en utilisant le point de rupture. J'ai essayé pendant une heure de faire beaucoup de choses et finalement j'ai remarqué que c'est dû à un problème avec le mode de compilation actuel. @Vlix- Merci pour votre réponse.

55voto

Joris Timmermans Points 8075

"Debug" et "Release" ne sont en fait que deux étiquettes pour toute une série de paramètres qui peuvent affecter votre construction et votre débogage.

En mode "Debug", vous disposez généralement des éléments suivants :

  • Les fichiers de la base de données de débogage du programme, qui vous permettent de suivre de très près l'exécution du programme dans la source pendant l'exécution.
  • Toutes les optimisations sont désactivées, ce qui vous permet d'inspecter la valeur des variables et de suivre les fonctions qui, autrement, auraient été optimisées ou intégrées.
  • Une définition du préprocesseur _DEBUG qui vous permet d'écrire du code qui agit différemment en mode de débogage et en mode de publication, par exemple pour instrumenter des ASSERTs qui ne doivent être utilisés qu'en mode de débogage.
  • Liaison avec des bibliothèques qui ont également été compilées avec des options de débogage, mais qui ne sont généralement pas déployées chez les clients (pour des raisons de taille et de sécurité).

En mode "Release", les optimisations sont activées (bien qu'il y ait plusieurs options disponibles) et la définition du préprocesseur _DEBUG n'est pas définie. En général, vous voudrez quand même générer les fichiers PDB, car il est très utile de pouvoir "déboguer" en mode "Release" lorsque les choses tournent plus vite.

5 votes

"juste deux étiquettes" -- en fait, Visual Studio vous donne la possibilité de créer plus ! Cela peut être exceptionnellement utile pour tester un programme. Par exemple, j'ai récemment écrit un programme pour mon travail qui acceptait les noms de fichiers de la ligne de commande. J'ai testé l'analyse syntaxique de la ligne de commande, mais une fois que cela a été fait, je n'ai pas voulu m'embêter avec CMD et des listes de noms de fichiers tous les jours ; j'ai créé une configuration avec laquelle je pouvais utiliser la compilation conditionnelle pour fournir des valeurs de ligne de commande factices et tester la logique du programme, ce qui m'a permis d'accélérer considérablement le cycle d'itération du développement du programme.

10voto

Rik Points 12802

La plupart du temps, debug comprend un grand nombre d'informations supplémentaires utiles lors du débogage. En mode release, tout cela est coupé et échangé pour les performances.

0 votes

1) Qu'en est-il des questions suivantes ? Il y a 3 configs dans un projet ASP.NET MVC : base (web), debug (web.debug), release (web.release). Supposons que nous définissions les chaînes de connexion debug et release par transformation dans la configuration correspondante (debug et release). Lors de la publication, nous pouvons publier en fonction de notre sélection dans le dialogue de publication. Mais, lors de l'exécution de l'application, bien que je sélectionne Debug, elle utilise la configuration release (parce que j'ai défini la configuration debug dans la configuration base et debug), est-ce normal ?

0 votes

2) Lors de l'exécution de l'application en mode Debug ou Release, VS utilise-t-il la web config de base ou la web config correspondante (web.debug.confg ou web.release.config) ?

9voto

NeARAZ Points 4365

Si vous passez en revue les options de compilation du projet et les comparez, vous verrez quelles sont les différences.

En supposant que la question porte sur le code natif/C++ (la formulation n'est pas tout à fait claire) :

Fondamentalement, dans Debug, toutes les optimisations de génération de code sont désactivées. Certaines bibliothèques (par exemple STL ) permettent par défaut une vérification plus stricte des erreurs (par exemple, les itérateurs de débogage). Plus d'informations de débogage sont générées (par exemple pour "Edit and Continue"). Plus de choses sont générées dans le code pour attraper les erreurs (les valeurs des variables locales sont définies sur un modèle non initialisé, et le tas de débogage est utilisé).

2 votes

@Vilx : quand j'ai répondu, il n'y avait pas encore de tag .net, seulement visualstudio. J'ai donc supposé qu'il s'agissait de C++.

6voto

foraidt Points 2460

Notez également que lorsque vous utilisez MFC par exemple, les projets de débogage se lient à des versions de DLL non redistribuables telles que MFC90D.DLL tandis que les constructions de version se lient aux versions redistribuables comme MFC90.DLL . Ceci est probablement similaire à d'autres cadres.

Par conséquent, vous ne serez probablement pas en mesure d'exécuter des applications de débogage et de construction sur des machines autres que des machines de développement.

0 votes

Très vrai. J'ai eu des problèmes avec ça une fois chez un client. Fonctionne sur Ma Machine (TM).

0 votes

Vous pouvez les distribuer (je ne sais pas si vous êtes autorisé à le faire). Ils doivent être dans un sous-dossier de votre application portant le même nom.

0 votes

@Andreas En ce qui concerne mon exemple, "non-redistribuable" signifie que Microsoft n'a pas permettre les distribuer.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X