Comment obtenir le(S) Numéro (s) de ligne dans la StackTrace d'une exception levée in.NET pour se montrer

MSDN dit ceci à propos de la propriété StackTrace de la classe Exception:

La propriété StackTrace contient une pile trace, que vous pouvez utiliser pour déterminer où dans le code l'erreur s'est produite. StackTrace répertorie tous les appelés méthodes qui ont précédé l'exception et les numéros de ligne dans la source d'où les appels ont été effectués.

Je sais donc que cette information est disponible. Comment puis-je obtenir les numéros de ligne à apparaître dans la trace de la pile? Mon code est en train de jeter une exception dans un morceau de code très difficile et complexe qui traverse des tonnes d'objets, donc je ne veux pas passer par un bazillion de fois pour voir où l'exception se produit. La trace de pile de l'exception n'affiche que les signatures de méthode et aucun numéro de ligne.

28
demandé sur Christopher Perry 2010-09-25 03:19:24

6 réponses

Pour obtenir les numéros de ligne dans la StackTrace, vous devez avoir les informations de débogage correctes (fichiers PDB) à côté de vos DLL/exes. Pour générer les informations de débogage, définissez l'option dans Project Properties -> Build -> Advanced -> Debug Info:

le texte d'alt

Le définir sur full devrait suffire (voir la boîte de dialogue Advanced Build Settings docs pour savoir ce que font les autres options). Informations de débogage (ie. Les fichiers PDB) sont générés par défaut pour les configurations de build Debug,mais peuvent également être générés pour les configurations de build Release.

La génération de PDB pour les versions release vous permet d'expédier votre code sans PDB, mais de laisser tomber les PDB à côté des dll si vous avez besoin de numéros de ligne (ou même d'attacher un débogueur distant). Une chose à noter est que dans une version de version, les numéros de ligne peuvent ne pas être entièrement corrects en raison des optimisations effectuées par le compilateur ou le compilateur JIT (ceci est particulièrement vrai si les numéros de ligne indiquent 0).

36
répondu adrianbanks 2016-10-27 22:20:36

Vous devez construire le projet avec les fichiers pdb activés et assurez-vous de déployer les fichiers pdb avec votre application. Vous pouvez vérifier si les fichiers pdb sont en cours de construction pour votre configuration en cliquant avec le bouton droit sur l'assemblage pour lequel vous avez besoin de fichiers pdb, puis en vous dirigeant vers propriétés > Build > Advanced et en vous assurant que sous Output Debug Info est défini sur full.

5
répondu Jaimal Chohan 2010-09-24 23:26:44

Si vous avez une application web ou un projet de service web utilisant VS2012 ou une version ultérieure, la modification des paramètres de génération ne fonctionnera pas. Au lieu de cela, vous devriez suivre les conseils de cet article:

Le Site Web De Visual Studio 2012 Ne Publie Pas De Copie .fichiers pdb

Plus précisément, vous devez inclure le paramètre suivant dans le

<YOUR_PROJECT>\Properties\PublishProfiles\*.pubxml

Fichier(S) pour votre projet:

<PropertyGroup>
  <ExcludeGeneratedDebugSymbol>False</ExcludeGeneratedDebugSymbol>
</PropertyGroup>
5
répondu Peter Gluck 2017-05-23 12:25:26

Vous pouvez essayer ce qui suit, étant donné qu'il existe un fichier pdb pour l'assembly:

try
{
    throw new Exception();
}
catch (Exception ex)
{
    // Get line number from the stack trace's top frame for the exception with source file information
    int linenumber = (new StackTrace(ex, true)).GetFrame(0).GetFileLineNumber();
}
3
répondu chridam 2014-11-12 11:58:22

Suite aux autres bonnes suggestions, nous déployions sur IIS. Nous avions un serveur de mise en scène et un serveur de production. Ils sont apparus identiques, sauf la mise en scène nous a donné des numéros de ligne et la production n'a pas. Il s'est avéré qu'il y avait une DLL supplémentaire dans le répertoire bin de production (il s'agissait de SqlServerSpatial.dll FWIW) et une fois qu'il a été déplacé vers les numéros de ligne du répertoire système ont commencé à apparaître sur la production.

La leçon était de s'assurer que le répertoire bin de production correspond au répertoire bin de développement à tous égards (sauf pour les fichiers XML).

0
répondu DJA 2014-08-07 12:15:01

Semblent avoir trouvé la solution. Sur VS2010 au moins, avec les informations de débogage de sortie définies sur full, Je n'ai pas non plus obtenu de numéros de ligne dans les exceptions. L'astuce semble - t-il était d'activer les numéros de ligne dans l'éditeur. (Outils - > Options - > Éditeur de texte - > Toutes les langues - > général - > Affichage - > numéros de ligne)

Maintenant, les exceptions apparaissent avec des numéros de ligne.

-10
répondu Ricky 2013-02-22 13:47:17