Afficher le nombre de lignes dans l'assembly Stack Trace pour .NET en mode Release

139

Existe-t-il un moyen d'afficher les lignes dans la trace de pile pour l'assembly .NET build / déployé en mode Release?

METTRE À JOUR:

Mon application est divisée en trois projets de bibliothèque de classes et un projet de "site Web" ASP.NET. L'erreur que j'essaie de localiser se trouve dans l'un des trois projets de bibliothèque de classe. J'ai déployé uniquement le fichier pdb pour le projet de bibliothèque de classes qui génère l'erreur "Référence d'objet non définie sur une instance d'un objet".

Les numéros de ligne n'apparaissent toujours pas dans la trace de pile. Dois-je déployer les fichiers pdb pour tous les projets pour obtenir les numéros de ligne dans la trace de pile?

Solution de travail

Le déploiement du fichier pdb pour chaque application a résolu le problème du numéro de ligne.

Michael Kniskern
la source

Réponses:

147
  • Accédez à la fenêtre Propriétés du projet dans lequel vous souhaitez voir les numéros de ligne de trace de pile.
  • Cliquez sur l'onglet Construire "vertical".
  • Sélectionnez la configuration "Release". Vérifiez le paramètre de constante DEBUG.
  • Décochez le paramètre «Optimiser le code» pour éviter le problème de trace occasionnel avec du code intégré (cette étape n'est pas indispensable).
  • Appuyez sur le bouton Avancé ... et choisissez Sortie -> Informations de débogage -> pdb uniquement.
  • Déployez le fichier .pdb généré avec l'assembly.

Mis en œuvre avec le commentaire ci-dessous:

  • Une autre chose à vérifier est dans la section "Package / Publish Web" que la case "Exclure les symboles de débogage générés" est également décochée
Coxy
la source
2
Dois-je déployer le fichier pdb avec l'assembly?
Michael Kniskern
7
Oui. C'est là que se trouvent les symboles de débogage et les numéros de ligne.
John Saunders
5
Vous ne voudrez probablement pas exposer ces informations si vous n'êtes pas obligé de le faire. Utilisez-le pour déboguer un problème client, oui. Mais vous ne voulez pas toujours le faire car les informations de débogage peuvent révéler des données sensibles et être un vecteur d'attaque. Selon ce qu'est votre application.
i_am_jorf
6
@Carlo: les informations de débogage fonctionnent également avec le code de version (optimisé), mais le débogage est quelque peu limité ( stackoverflow.com/questions/113866 ). Cependant, les piles d'appels sont assez fiables même dans un code optimisé, à l'exception des fonctions intégrées et des situations occasionnelles où l'appel de queue peut être manquant parce que la séquence d'appel xxx / ret a été remplacée par jmp xxx.
Suma
12
Une autre chose à vérifier est dans la section "Package / Publish Web" que la case "Exclure les symboles de débogage générés" est également décochée
Gaz
17

Dans VS2012, vous devez également décocher "Exclure les symboles de débogage générés" dans la section Package / Publish Web des propriétés.

user3250653
la source
ou s'il s'agit d'une application de bureau, assurez-vous que le fichier PDB est déployé
CAD bloke
9

J'ai rencontré des problèmes dans le passé où je ressens le besoin de déployer des fichiers PDB avec une version de version afin de détecter une erreur. La raison en est, comme vous l'avez dit, que l'exception s'est produite dans une méthode qui était très large et je ne pouvais pas déterminer avec précision où cela se produisait.

Cela peut indiquer que la méthode doit être refactorisée en méthodes plus petites et plus granulaires. Pas de réponse unique, mais cette approche m'a bien servi à court terme (j'ai souvent trouvé le bogue lors du refactoring) et à long terme.

Juste une pensée.

slolife
la source
Ce. Et au fur et à mesure, lancez des captures d'essai dans des endroits plus sommaires avec un grain plus fin. Et augmentez les gardes au début de ces fonctions si des hypothèses doivent être faites.
Gerard ONeill
Souvent dit et tellement vrai, cependant, il existe un héritage, il y a des programmeurs qui écrivent de nouvelles méthodes volumineuses, et parfois une méthode volumineuse est en fait la meilleure chose à faire (la diviser est déroutante ou YAGNI). De plus, même pour une méthode à 5 lignes - vous affinez votre recherche 5x - les PDB sont donc un mal nécessaire en production à moins que vous ne preniez la peine d'utiliser un serveur de symboles
FastAl
3

Incluez des symboles de débogage avec votre package de construction / déploiement.

Ken Browning
la source
0

Dans VS 2008 Express, je l'ai trouvé sous Propriétés du projet -> Compiler -> Options de compilation avancées.

Darel
la source
1
Qu'as-tu trouvé? Vous pouvez publier un commentaire si vous ne souhaitez pas publier une réponse complète.
jumxozizi
-4

Cela fonctionne à chaque fois. Il vous suffit de sous-transmettre le message de trace de la pile. Vraiment facile! En outre, dans vb.net, vous devez faire le "Afficher tous les fichiers" et inclure le pdb.

'Err is the exception passed to this function

Dim lineGrab As String = err.StackTrace.Substring(err.StackTrace.Length - 5)
Dim i As Integer = 0
While i < lineGrab.Length                   
    If (IsNumeric(lineGrab(i))) Then
        lineNo.Append(lineGrab(i))
    End If
    i += 1
End While

'LineNo holds the number as a string

Version C #:

string lineGrab = error.StackTrace.Substring(error.StackTrace.Length - 5);

int i = 0;
int value;
while (i < lineGrab.Length)
{
    if (int.TryParse(lineGrab[i].ToString(), out value))
    {
        strLineNo.Append(lineGrab[i]);
    }
    i++;
}
Tim Perry
la source