Imprimer les informations de trace de pile à partir de C#
Dans le cadre d'une gestion d'erreur dans notre produit, nous aimerions dump certaines informations de trace de pile. Cependant, nous faisons l'expérience que de nombreux utilisateurs vont tout simplement prendre une capture d'écran de la boîte de dialogue de message d'erreur au lieu de nous envoyer une copie du rapport complet disponible à partir du programme, et donc je voudrais faire un minimum de trace de la pile d'informations disponibles dans cette boîte de dialogue.
Un .NET trace de la pile sur ma machine ressemble à ceci:
at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)
at System.IO.FileStream.Init(String path, FileMode mode, FileAccess access, Int32 rights, Boolean useRights, FileShare share, Int32 bufferSize, FileOptions options, SECURITY_ATTRIBUTES secAttrs, String msgPath, Boolean bFromProxy)
at System.IO.FileStream..ctor(String path, FileMode mode, FileAccess access, FileShare share, Int32 bufferSize, FileOptions options)
at System.IO.StreamReader..ctor(String path, Encoding encoding, Boolean detectEncodingFromByteOrderMarks, Int32 bufferSize)
at System.IO.StreamReader..ctor(String 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 ressemble à ceci:
at <class/method> [in file:line ##]
Cependant, la à et dans mots-clés, je suppose que ces vont être localisées, s'ils sont à court, disons, un norvégien .NET au lieu de l'anglais, je l'ai installé.
Est-il de toute façon pour moi de prendre part à cette trace de la pile dans une langue neutre, de sorte que je peux afficher uniquement le fichier et le numéro de ligne pour les entrées qui ont ce?
En d'autres termes, je voudrais des informations à partir du texte ci-dessus:
C:\Dev\VS.NET\Gatsoft\LVKWinFormsSandbox\MainForm.cs:line 36
Tous les conseils que vous pouvez donner vous être utile.
- Je souhaite que quelqu'un avait donné l'analyse de réponse pour ce que je suis en train de travailler avec connecté chaînes à partir d'applications arbitraires et espérais vraiment pour obtenir des détails sur cette. Étant donné que vous avez le contrôle de la source de la StackTrace vous d'avoir bien sélectionné la bonne réponse bien 🙂
Vous devez vous connecter pour publier un commentaire.
Vous devriez être en mesure d'obtenir une StackTrace objet au lieu d'une chaîne en disant
Vous pouvez ensuite regarder les images vous-même sans s'appuyer sur le cadre de la mise en forme.
Voir aussi: StackTrace de référence
SerializationHelper.Serialize(@"c:\temp\ConfigurationErrorsExceptions.ser", ex);
Si je désérialiser à partir d'un fichiervar exception = SerializationHelper.Deserialize(@"ConfigurationErrorsExceptions.ser");
Trace est non disponiblevar trace = new System.Diagnostics.StackTrace(exception as Exception);
le FrameCount est 0Voici le code que j'utilise pour ce faire sans une exception
Juste pour faire de ce à 15 sec copier-coller réponse:
(basé sur Lindholm réponse)
Ou il existe même une version plus courte..
Comme alternative, log4net, bien que potentiellement dangereux, m'a donné de meilleurs résultats que le Système.Diagnostics. En gros, dans log4net, vous avez une méthode pour les différents niveaux de journal, chacun avec un paramètre d'Exception. Donc, lorsque vous passez à la deuxième exception, il va imprimer la trace de la pile selon la appender vous avez configuré.
exemple:
Logger.Error("Danger!!!", myException );
La sortie, en fonction de la configuration, ressemble à quelque chose comme