Impression des informations de trace de stack à partir de C #

Dans le cadre de la gestion des erreurs dans notre produit, nous aimerions récupérer certaines informations de trace de la stack. Cependant, nous constatons que de nombreux utilisateurs vont simplement prendre une capture d’écran du message d’erreur au lieu de nous envoyer une copie du rapport complet disponible depuis le programme.

Une trace de stack .NET sur ma machine ressemble à ceci:

at System.IO.__Error.WinIOError(Int32 errorCode, Ssortingng maybeFullPath) at System.IO.FileStream.Init(Ssortingng path, FileMode mode, FileAccess access, Int32 rights, Boolean useRights, FileShare share, Int32 bufferSize, FileOptions options, SECURITY_ATTRIBUTES secAttrs, Ssortingng msgPath, Boolean bFromProxy) at System.IO.FileStream..ctor(Ssortingng path, FileMode mode, FileAccess access, FileShare share, Int32 bufferSize, FileOptions options) at System.IO.StreamReader..ctor(Ssortingng path, Encoding encoding, Boolean detectEncodingFromByteOrderMarks, Int32 bufferSize) at System.IO.StreamReader..ctor(Ssortingng path) at LVKWinFormsSandbox.MainForm.button1_Click(Object sender, EventArgs e) in C:\Dev\VS.NET\Gatsoft\LVKWinFormsSandbox\MainForm.cs:line 36 

J’ai cette question:

Le format semble être celui-ci:

 at  [in file:line ##] 

Cependant, les mots clés at et in , je suppose qu’ils seront localisés s’ils exécutent, par exemple, un runtime norvégien .NET au lieu de celui que j’ai installé en anglais.

Existe-t-il un moyen de séparer cette trace de stack de manière indépendante de la langue, de manière à ce que je puisse afficher uniquement le fichier et le numéro de ligne pour ces entrées?

En d’autres termes, je voudrais cette information du texte ci-dessus:

 C:\Dev\VS.NET\Gatsoft\LVKWinFormsSandbox\MainForm.cs:line 36 

Tout conseil que vous pouvez donner sera utile.

    Vous devriez pouvoir obtenir un object StackTrace au lieu d’une chaîne en disant

     var trace = new System.Diagnostics.StackTrace(exception); 

    Vous pouvez alors regarder les images vous-même sans compter sur le formatage du framework.

    Voir aussi: référence StackTrace

    Voici le code que j’utilise pour le faire sans exception

     public static void LogStack() { var trace = new System.Diagnostics.StackTrace(); foreach (var frame in trace.GetFrames()) { var method = frame.GetMethod(); if (method.Name.Equals("LogStack")) continue; Log.Debug(ssortingng.Format("{0}::{1}", method.ReflectedType != null ? method.ReflectedType.Name : ssortingng.Empty, method.Name)); } } 

    Juste pour faire une réponse de copier-coller de 15 secondes:

     static public ssortingng StackTraceToSsortingng() { SsortingngBuilder sb = new SsortingngBuilder(256); var frames = new System.Diagnostics.StackTrace().GetFrames(); for (int i = 1; i < frames.Length; i++) /* Ignore current StackTraceToString method...*/ { var currFrame = frames[i]; var method = currFrame.GetMethod(); sb.AppendLine(string.Format("{0}:{1}", method.ReflectedType != null ? method.ReflectedType.Name : string.Empty, method.Name)); } return sb.ToString(); } 

    (basé sur la réponse de Lindholm)

    Ou il y a une version encore plus courte.

     Console.Write(exception.StackTrace); 

    Comme alternative, log4net, bien que potentiellement dangereux, m’a donné de meilleurs résultats que System.Diagnostics. Fondamentalement, dans log4net, vous disposez d’une méthode pour les différents niveaux de journalisation, chacun avec un paramètre Exception. Ainsi, lorsque vous passez la deuxième exception, la trace de la stack sera imprimée sur l’auteur que vous avez configuré.

    exemple: Logger.Error("Danger!!!", myException );

    La sortie, selon la configuration, ressemble à quelque chose

     System.ApplicationException: Something went wrong. at Adapter.WriteToFile(OleDbCommand cmd) in C:\Adapter.vb:line 35 at Adapter.GetDissortingbutionDocument(Int32 id) in C:\Adapter.vb:line 181 ...