11
votes

Comment diviser une ligne StackTrace en espace de noms, classe, fichier de méthode et numéro de ligne?

C # Stack Traces Prenez le formulaire suivant:

   at Foo.Core.Test.FinalMethod(Doh doh) in C:\Projects\src\Core.Tests\Test.cs:line 21
   at Foo.Core.Test.AnotherMethod(Bar bar)
   at Foo.Core.Test.AMethod() in C:\Projects\src\Core.Tests\Test.cs:line 6
   at Foo.Core.Test.<>c__DisplayClass7.<SomeAnonDelegate>b__6(Object _) in C:\Projects\src\Core.Tests\Test.cs:line 35
  • Y a-t-il des classes existantes pour faire cela? li>
  • Si non, quelle serait la meilleure approche? Li>
  • regex? Comment devrais-je correspondre à l'espace de noms de navigation, mais laissez la classe et la méthode? Li>
  • analyseur personnalisé? LI> ul>

    apprécierait des idées et des entrées. p> p>


6 commentaires

Juste hors de curiosité, vous avez l'intention d'utiliser cela dans un environnement de production? Autant que je me souvienne, la trace de pile n'est pas incluse en mode de sortie. Voir msdn.microsoft.com/en-us/Library/... qui indique que toutes ces informations sont obtenues à partir des symboles de débogage, qui ne sont pas inclus dans le constructeur de libération par défaut.


@J. Tihon, bon point, mais nous incluons des informations de symbole dans nos constructions de version


Eh bien, je ne voulais tout simplement pas que vous traversiez tous les problèmes avec regex et tout, lorsque vous ne pouvez pas vraiment l'utiliser à la fin.


@J. Tihon: Les traces de piles émanent des constructions de libération même sans symboles, mais elles manquent des numéros de ligne et des noms de fichiers.


Il y a très peu de raisons de ne pas expédier vos symboles lors du déploiement. Les PDB ne provoquent pas de dégradation de performances notable (il s'agit d'une idée fausse courante qu'elles sont liées à des constructions de débogage).


Pouvez-vous mettre le code complet pour analyse de la valeur de la chaîne StackTrace à partir d'une exception?


3 Réponses :



4
votes

J'ai lu la réponse de l'Austin Salonen et il est évident mieux, mais j'ai déjà commencé avec regex. Je vais donc l'écrire quand même. XXX


6 commentaires

C'est beau, je suis content que vous ayez posté de toute façon comme vous me rappeliez que c # permet des matchs nommés. Par intérêts, le match de noms de noms de noms des espaces de noms imbriqués par ex. Ns1.ns2.ns3.class.Method?


Oui, essayez-le. Mais il semble que j'ai un problème lorsque la chaîne ne contient pas toutes les pièces, je veux dire dans et le chemin.


Et si vous exécutez ce programme en Allemagne avec Localized .Net Runtime?


@Lasse V. Karlsen: Vous avez raison. Mais j'ai répondu à une question avec un exemple en anglais et étiqueté avec regex . Je sais que ma réponse n'est pas assez bonne mais je l'ai partagée de toute façon.


J'ai trouvé cette réponse utile pour un outil que je travaille à l'aide d'exceptions connectées. J'ai mis à jour la regex pour un fichier et un support téléphonique optionnel approprié. En outre, @ lassev.karlsen regex est rarement approprié pour les chaînes localisées; C'est en dehors de la portée de ce problème.


Cette regex ne fonctionne que si vos traces de pile sont localisées en anglais



2
votes

StackTraceParser strong> peut analyser une sortie de texte de trace de la pile (par exemple typiquement retourné par Environment.StackTrace ou Exception.StackTrace) de nouveau dans une séquence de trames de trace de pile, y compris les composants suivants:

public static IEnumerable<TFrame> Parse<TToken, TMethod, TParameters, TParameter, TSourceLocation, TFrame>(
    string text,
    Func<int, int, string, TToken> tokenSelector,
    Func<TToken, TToken, TMethod> methodSelector,
    Func<TToken, TToken, TParameter> parameterSelector,
    Func<TToken, IEnumerable<TParameter>, TParameters> parametersSelector,
    Func<TToken, TToken, TSourceLocation> sourceLocationSelector,
    Func<TToken, TMethod, TParameters, TSourceLocation, TFrame> selector)


0 commentaires