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

Réponses:

114

Le plus important est qu'en mode Débogage, il n'y a pas d'optimisation, alors qu'en mode Release, il y a des optimisations. Ceci est important car le compilateur est très avancé et peut faire des améliorations de bas niveau assez délicates de votre code. En conséquence, certaines lignes de votre code peuvent être laissées 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 montres et les QuickWatches ne fonctionnent souvent pas parce que la variable est "optimisée". Et il existe également une multitude d'autres optimisations. Essayez parfois de déboguer du code .NET optimisé et vous verrez.

Une autre différence clé est que, pour cette raison, les paramètres de version par défaut ne se soucient pas de générer des informations détaillées sur les symboles de débogage. C'est le fichier .PDB que vous avez peut-être remarqué et il permet au débogueur de déterminer quelles instructions d'assemblage correspondent à quelle ligne de code, etc.

Vilx-
la source
1
"En conséquence, certaines lignes de votre code peuvent être laissées sans aucune instruction du tout, ou certaines peuvent être mélangées". YUP, a échoué en utilisant des cadres de pile pour obtenir le nom de la méthode / propriété actuelle - et beaucoup de propriétés ont été incorporées dans la version ...
kpollock
4
"Le plus important est qu'en mode Debug, il n'y a pas d'optimisation" - c'est discutable. la chose la plus importante est qu'il existe des informations de débogage qui vous permettent de déboguer. bien que cela puisse également exister dans la version.
shoosh
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 débogage et l'équipe d'installation se chargera de cette version pour éviter le fichier pdb et pour introduire l'optimisation. Mais aujourd'hui, je suis tombé sur une situation où le mode est changé pour libérer et je ne suis pas en mesure de casser le code en utilisant le point d'arrêt. J'ai essayé une longue heure à faire beaucoup de choses et finalement je remarque que cela est dû au problème avec le mode de compilation actuel. @ Vlix- Merci pour votre réponse.
kbvishnu
1
Cela m'a aidé à résoudre le problème "Le nom 'variable' n'existe pas dans le contexte actuel" que j'ai rencontré en essayant d'analyser un symbole dans la fenêtre immédiate lors du débogage d'une application conforme à la configuration Release par défaut. Merci beaucoup!
M463
1) Qu'en est-il des problèmes suivants? Il existe 3 configurations dans un projet ASP.NET MVC: base (web), debug (web.debug), release (web.release). Supposons que nous définissions la chaîne de connexion de débogage et de libération par transformation vers la configuration correspondante (débogage et publication). Lors de la publication, nous pouvons publier selon notre sélection dans la boîte de dialogue de publication. Mais, lors de l'exécution de l'application, bien que je sélectionne Déboguer, elle utilise la configuration de version (car j'ai défini la configuration de débogage dans la configuration de base et de débogage), est-ce normal?
Jason
52

«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 "Débogage", vous disposez généralement des éléments suivants:

  • Fichiers de la base de données de débogage du programme, qui vous permettent de suivre de 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 auraient autrement pu être optimisées à distance ou en ligne
  • Une définition de préprocesseur _DEBUG qui vous permet d'écrire du code qui agit différemment en mode débogage par rapport à la version, par exemple pour instrumenter les ASSERT qui ne doivent être utilisés que lors du débogage
  • Liens vers des bibliothèques qui ont également été compilées avec des options de débogage activées, qui ne sont généralement pas déployées auprès de clients réels (pour des raisons de taille et de sécurité)

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

Joris Timmermans
la source
5
"juste deux étiquettes" - en fait, Visual Studio vous donne la possibilité de créer plus! Cela peut être extrêmement utile lors du test d'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é mon analyse de ligne de commande, mais une fois que cela a été fait, je ne voulais pas jouer avec CMD et les listes de noms de fichiers tous les jours; J'ai créé une configuration avec laquelle je pourrais utiliser la compilation conditionnelle pour fournir des valeurs de ligne de commande factices et tester la logique métier du programme, ce qui m'a donné un cycle d'itération beaucoup plus rapide sur le développement du programme.
Brian S
9

La plupart du temps, le débogage comprend de nombreuses informations supplémentaires utiles lors du débogage. En mode sortie, tout est coupé et échangé contre la performance.

Rik
la source
1) Qu'en est-il des problèmes suivants? Il existe 3 configurations dans un projet ASP.NET MVC: base (web), debug (web.debug), release (web.release). Supposons que nous définissions la chaîne de connexion de débogage et de libération par transformation vers la configuration correspondante (débogage et publication). Lors de la publication, nous pouvons publier selon notre sélection dans la boîte de dialogue de publication. Mais, lors de l'exécution de l'application, bien que je sélectionne Déboguer, elle utilise la configuration de version (car j'ai défini la configuration de débogage dans la configuration de base et de débogage), est-ce normal?
Jason
2) Lors de l'exécution de l'application en mode Debug ou Release, VS utilise-t-il la configuration Web de base ou la configuration Web correspondante (web.debug.confg ou web.release.config)?
Jason
7

Si vous parcourez les options de compilation du projet et que vous les comparez, vous verrez quelles sont les différences.

En supposant que la question concerne le code natif / C ++ (ce n'est pas tout à fait clair d'après le libellé):

Fondamentalement, dans Debug, toutes les optimisations de génération de code sont désactivées. Certaines bibliothèques (par exemple, STL ) utilisent par défaut une vérification d'erreur plus stricte (par exemple, les itérateurs de débogage). Plus d'informations de débogage sont générées (par exemple pour "Modifier et continuer"). D'autres éléments sont générés dans le code pour détecter les erreurs (les valeurs des variables locales sont définies sur un modèle non initialisé et le tas de débogage est utilisé).

NeARAZ
la source
2
@Vilx: quand j'ai répondu, il n'y avait pas encore de balise .net, seulement visualstudio. J'ai donc supposé que c'était C ++.
NeARAZ
6

De plus, apparemment, le mode de débogage crée beaucoup de threads supplémentaires pour aider au débogage. Ceux-ci restent actifs tout au long de la vie du processus, que vous attachez un débogueur ou non. Voir ma question connexe ici .

Matt Jacobsen
la source
Mais uniquement pour .NET (pas C ++)?
Peter Mortensen
6

Cela vaut probablement la peine de mentionner le très évident, que les indicateurs de construction permettent une logique différente qui devrait être utilisée juste pour changer la journalisation et la messagerie "console", mais cela peut être abusé et changer radicalement non seulement les bas niveaux, mais la logique métier réelle.

Annakata
la source
"... changer radicalement ... la logique métier actuelle" - me semble être un bug! Nous avons beaucoup de code conditionnel et cela le rend vraiment difficile à comprendre. En outre, chaque combinaison d'indicateurs de code conditionnel est essentiellement une version différente de votre logiciel qui doit être testée pour garantir l'exactitude et l'intégrité de base. Selon "Code Complete", ma Bible de la construction de logiciels, notre "Prime Directive" est la gestion de la complexité. (C'est notre problème n ° 1 à résoudre). Réfléchissez longuement avant d'ajouter sans discernement d'autres indicateurs conditionnels!
MicroservicesOnDDD
Mon commentaire ci-dessus ne visait pas cette réponse en particulier en ce qui concerne la dernière phrase ... c'était juste une chose supplémentaire que je pensais que les lecteurs qui viennent ici devraient lire.
MicroservicesOnDDD
6

Notez également que lors de l'utilisation de MFC par exemple, les projets de débogage sont liés à des versions DLL non redistribuables comme MFC90D.DLLwhile release builds lien avec les versions redistribuables telles que MFC90.DLL. Ceci est probablement similaire à d'autres frameworks.

Par conséquent, vous ne serez probablement pas en mesure d'exécuter des applications de débogage sur des machines non développées.

foraidt
la source
très vrai. Ran à l'encontre de cela une fois chez un client. Fonctionne sur My Machine (TM).
Matt Jacobsen
Vous êtes en mesure de les distribuer .. (je ne sais pas si vous y êtes autorisé). Ils doivent se trouver dans un sous-dossier de noms appropriés de votre application.
Andreas Reiff
@Andreas En ce qui concerne mon exemple, des moyens « non redistribuables » que Microsoft ne permet de les distribuer.
foraidt
4

Je me suis également intéressé à cette question lorsque j'avais développé une application copiée à partir d'une configuration de build existante.

J'ai un développeur qui est intéressant à utiliser cette application en mode débogage, alors je me suis demandé ce qu'il faudrait pour faire cette configuration de construction qui existe avec un nom de ReleaseMyBuild copié à partir d'une configuration de version (et devrait donc avoir tous les paramètres destinés à publier des optimisations ) pour changer soudainement d'équipes et devenir une version de débogage malgré le nom de configuration de construction déroutant.

J'ai pensé que la configuration du projet n'était qu'un nom et un moyen pratique de sélectionner «toute une série de paramètres», mentionne Joris Timmermans. Je voulais connaître les détails de ces paramètres qui font qu'une configuration de construction nommée "FOO" fonctionne comme une version de version optimisée .

En voici un aperçu. J'ai créé un nouveau VCXPROJ à partir du modèle de projet vide de Visual Studio 2010. Je l'ai ensuite copié et modifié les deux, le premier pour conserver le contenu de débogage et le second le contenu de la version. Voici le diff centré sur les différences pertinentes ...

VCXPROJs Debug vs Release diff

LIBÉRATION

<PropertyGroup>
    <WholeProgramOptimization>true</WholeProgramOptimization>

<ClCompile>
    <Optimization>MaxSpeed</Optimization>
    <FunctionLevelLinking>true</FunctionLevelLinking>
    <IntrinsicFunctions>true</IntrinsicFunctions>
<Link>
    <EnableCOMDATFolding>true</EnableCOMDATFolding>
    <OptimizeReferences>true</OptimizeReferences>

DÉBOGUER

<PropertyGroup>
    <UseDebugLibraries>true</UseDebugLibraries>`

<ClCompile>
    <Optimization>Disabled</Optimization>

Il est intéressant de noter que dans la section Lien, ils ont tous les deux GenerateDebugInformationdéfini la valeur true.

jxramos
la source
3

La différence évidente que vous pouvez voir est la taille du binaire. Une version Debug produit un binaire plus grand qu'une version Release.

Lors de la compilation dans Debug, la table des symboles est ajoutée à l'objet compilé du fichier de code, ce qui permet aux programmes de débogage de puiser dans ces binaires et d'accéder aux valeurs des objets et des variables.

Une autre différence observable est que, en mode Release, le binaire planterait simplement sur une erreur fatale en mode Debug, si vous commencez à déboguer l'application dans Visual Studio, vous pouvez vérifier la pile d'appels qui vous indique l'emplacement exact de l'instruction erronée .

fasih.rana
la source
-15

Je ne sais pas quelles sont les différences exactes, car il n'y a en fait aucune information facilement disponible à ce sujet.

Mais la principale différence observée est que la version finale corrompt parfois le fichier DLL résultant et rend ainsi votre application, application Web inutilisable.

Malheureusement, vous devez mettre la version de débogage en production. Et oui, pour publier, vous devez utiliser le bon vieux FTP.

f470071
la source
7
Comment cela répond-il à la question? Et veuillez faire attention lorsque vous tapez.
mmking
J'ai eu un problème similaire, le code fonctionne en mode débogage, mais a un problème en mode version. Il s'avère que le problème est dans mon code. Il existe un excellent article sur les problèmes courants de la version finale, j'espère que cela pourra également aider les autres.
Weihui Guo