MSDN dit ceci à propos de la propriété StackTrace
de la classe Exception
:
La propriété StackTrace contient une trace de pile, que vous pouvez utiliser pour déterminer où dans le code l'erreur s'est produite. StackTrace répertorie toutes les méthodes appelées qui ont précédé l'exception et les numéros de ligne dans la source où les appels ont été effectués.
Je sais donc que cette information est disponible. Comment puis-je faire apparaître les numéros de ligne dans la trace de la pile? Mon code lève une exception dans un morceau de code très difficile et complexe qui passe par des TONNES d'objets, donc je ne veux pas parcourir un bazillion de temps pour voir où l'exception se produit. La trace de pile de l'exception affiche uniquement les signatures de méthode et aucun numéro de ligne.
Pour obtenir les numéros de ligne dans le 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 paramétrer sur full
devrait suffire (voir Documents de la boîte de dialogue Paramètres de construction avancés pour ce que font les autres options). Les informations de débogage (c'est-à-dire les fichiers PDB) sont générées par défaut pour les configurations de build de débogage, mais peuvent également être générées pour les configurations de build Release.
La génération de PDB pour les builds de versions vous permet de livrer votre code sans les PDB, mais de supprimer les PDB à côté des dll si vous avez besoin de numéros de ligne (ou même de joindre un débogueur distant). Une chose à noter est que dans une 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 (cela est particulièrement vrai si les numéros de ligne s'affichent comme 0).
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 devez suivre les conseils de cet article:
Le site Web Visual Studio 2012 ne copie pas les 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>
Vous devez créer 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 train d'être créés pour votre configuration en cliquant avec le bouton droit sur l'assembly pour lequel vous avez besoin des fichiers pdb, puis en vous rendant sur Propriétés> Générer> Avancé et en vous assurant que sous Output Debug Info est défini sur full.
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();
}
Suite aux autres grandes suggestions, nous déployions sur IIS. Nous avions un serveur de transfert et un serveur de production. Ils semblaient identiques, sauf que la mise en scène nous donnait des numéros de ligne et la production ne le faisait pas. Il s'est avéré qu'il y avait un DLL supplémentaire dans le répertoire bin de production (il se trouve que c'était SqlServerSpatial.dll fwiw)) et une fois qu'il a été déplacé vers le répertoire système, les numéros de ligne ont commencé à apparaître sur la production.
La leçon était de s'assurer que le répertoire bin de production correspond à tous les égards au répertoire bin de développement (à l'exception des fichiers XML).