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
apprécierait des idées et des entrées. p> p>
3 Réponses :
Si vous obtenez ceci à partir d'un StackTrace a >, alors vous pouvez faire boucle via le empildr_/a> via < Un href = "http://msdn.microsoft.com/en-us/library/system.diagnostics.stacktrace.getframe.aspx" rel = "noreferrer"> getframe et appelez GetMethod , getfilename et getfilelinenumber . Espace de noms et classe peuvent être récupérés de la méthode. P>
En réponse au premier commentaire ( malheureusement, nous obtenons les traces d'exception.stacktrace em>), vous pouvez appeler le StackTrace (exception) constructeur. P>
J'aurais dû être liée à ce constructeur à la place - StackTrace (exception, bool) a>. p>
exception.stacktrace code> est une chaîne code>, laquelle ne peut pas être transmise dans le constructeur b> de
StackTrace code> (Ça ne prend pas une chaîne
code>).
@Adrianbanks: C'est bien vrai et alors que OP a dit qu'il l'eue de exception.stacktrace code>, rien n'indique qu'il n'a pas accès à l'objet d'exception (+1 pour votre commentaire BTW).
Heureusement, j'ai accès à une exception, il s'agit donc d'une bonne solution. Malheureusement, il ne fournira pas de fichier, de numéro de ligne et de colonne, mais je pense que je peux probablement vivre sans cela.
Je suppose que le dos, il y a une surcharge qui fournira des informations de fichier également.
Cela ne fonctionne pas dans PCL. Il faut aussi penser à la localisation si l'analyse de la trace de la pile.
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.
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 code> 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 code>. 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
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)
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?