web-dev-qa-db-fra.com

Dois-je compiler les versions de version avec des informations de débogage en tant que «complet» ou «pdb uniquement»?

Dans Visual Studio 2010 pour un projet C #, si vous allez dans Propriétés du projet> Générer> Avancé> Informations de débogage, vous avez trois options: aucune, complète ou pdb uniquement. Sur la base de la réponse à cette question , je crois comprendre certaines des différences entre full et pdb-only. Cependant, lequel est plus approprié pour une version de version? Si j'utilise "complet", y aura-t-il des ramifications de performances? Si j'utilise "pdb-only", sera-t-il plus difficile de déboguer les problèmes de production?

Quelle est la différence entre "full" et "pdbonly"? https://docs.Microsoft.com/en-us/dotnet/csharp/language-reference/compiler-options/debug-compiler-option

109
RationalGeek

Je construirais avec pdb-only. Vous ne pourrez pas attacher un débogueur au produit publié, mais si vous obtenez un vidage sur incident, vous pouvez utiliser Visual Studio ou WinDBG pour examiner les traces de pile et les vidages de mémoire au moment du crash .

Si vous choisissez full plutôt que pdb-only, vous obtiendrez les mêmes avantages, sauf que l'exécutable peut être attaché directement à un débogueur. Vous devrez déterminer si cela est raisonnable compte tenu des clients de vos produits.

Veillez à enregistrer les fichiers PDB quelque part afin de pouvoir les référencer lorsqu'un rapport d'erreur arrive. Si vous pouvez configurer un serveur de symboles pour stocker ces symboles de débogage, tant mieux.

Si vous choisissez de construire avec none, vous n'aurez aucun recours en cas de plantage sur le terrain. Vous ne serez pas en mesure de faire un examen après coup du crash, ce qui pourrait sérieusement entraver votre capacité à dépister le problème.

Une note sur les performances:

John Robbins et Eric Lippert ont tous deux écrit des articles sur le /debug flag, et ils indiquent tous les deux que ce paramètre a zéro impact sur les performances . Il existe un /optimize flag qui indique si le compilateur doit effectuer des optimisations.

87
Matt Dillard

[~ # ~] avertissement [~ # ~] MSDN documentation pour le commutateur/debug (dans Visual Studio, il s'agit des informations de débogage ) semble obsolète! C'est ce qu'il a qui est incorrect

Si vous utilisez/debug: full , sachez que cela a un impact sur la vitesse et la taille du code optimisé JIT et un petit impact sur la qualité du code avec/debug: complet . Nous recommandons/débogage: pdbonly ou pas de PDB pour générer le code de version.

Une différence entre/debug: pdbonly et/debug: full est que avec/debug: full le compilateur émet un DebuggableAttribute, qui est utilisé pour indiquer au compilateur JIT que les informations de débogage sont disponibles.

Alors, qu'est-ce qui est vrai maintenant?

  1. Pdb uniquement - Avant .NET 2.0, il aidait à enquêter sur les vidages sur incident des produits commercialisés (machines clientes). Mais cela n'a pas permis d'attacher le débogueur. Ce n'est pas le cas de .NET 2.0. C'est exactement identique à Complet .
  2. Complet - Cela nous aide à enquêter sur les vidages sur incident, et nous permet également d'attacher le débogueur pour publier la version. Mais contrairement à MSDN, cela n'affecte pas les performances (depuis .NET 2.0). Il fait exactement la même chose que Pdb uniquement .

S'ils sont exactement les mêmes, pourquoi avons-nous ces options? John Robbins (dieu de débogage Windows) découvert ceux-ci sont là pour des raisons historiques.

Dans .NET 1.0, il y avait des différences, mais dans .NET 2.0, il n'y en avait pas. Il semble que .NET 4.0 suivra le même modèle. Après une double vérification avec l'équipe de débogage CLR, il n'y a aucune différence.

Ce qui contrôle si le JITter effectue une construction de débogage est le commutateur/Optimiser. <…>

L'essentiel est que vous souhaitiez créer vos versions de version avec/optimise + et l'un des commutateurs/debug afin de pouvoir déboguer avec le code source.

puis il continue de le prouver.

Maintenant, l'optimisation fait partie d'un commutateur séparé /optimize (dans Visual Studio, cela s'appelle Optimize code).

En bref, quel que soit le paramètre DebugInfo pdb-only ou full, nous aurons les mêmes résultats. La recommandation est d'éviter Aucune car cela vous priverait d'être en mesure d'analyser les vidages sur incident du produit publié ou d'attacher le débogueur.

56
rpattabi

Vous ne voudrez que PDB, mais vous ne voudrez pas donner les fichiers PDB aux utilisateurs. Cependant, les avoir pour vous-même, à côté de vos binaires, vous permet de charger des vidages sur incident dans un débogueur comme WinDbg et de voir où votre programme a réellement échoué. Cela peut être plutôt utile lorsque votre code plante sur une machine à laquelle vous n'avez pas accès.

Le débogage complet ajoute l'attribut [Debuggable] à votre code. Cela a un impact énorme sur la vitesse. Par exemple, certaines optimisations de boucle peuvent être désactivées pour faciliter la progression simple. De plus, cela a un petit effet sur le processus JIT, car il active le suivi.

16
blowdart

Je suis en train d'écrire un gestionnaire d'exceptions non géré et la trace de la pile inclut le numéro de ligne lorsque pdb-only est utilisé, sinon j'obtiens juste le nom de la sous-fonction lorsque je choisis None.

Si je ne distribue pas le .pdb, je n'obtiens pas le numéro de ligne dans la trace de la pile, même avec la version pdb uniquement.

Donc, je distribue (déployer XCOPY sur un LAN) la pdb avec l'exe de mon VB.

4
rheitzman