Domanda

Come parte della gestione degli errori nel nostro prodotto, vorremmo scaricare alcune informazioni sull'analisi dello stack.Tuttavia, abbiamo riscontrato che molti utenti acquisiscono semplicemente uno screenshot della finestra di dialogo del messaggio di errore invece di inviarci una copia del report completo disponibile dal programma e quindi vorrei rendere disponibili alcune informazioni minime sull'analisi dello stack in questa finestra di dialogo.

Una traccia dello stack .NET sulla mia macchina è simile alla seguente:

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

Ho questa domanda:

Il formato sembra essere questo:

at <class/method> [in file:line ##]

comunque, il A E In parole chiave, presumo che verranno localizzate se eseguono, ad esempio, un runtime .NET norvegese invece di quello inglese che ho installato.

Esiste un modo per separare questa traccia dello stack in modo indipendente dalla lingua, in modo da poter visualizzare solo il file e il numero di riga per le voci che lo hanno?

In altre parole, vorrei queste informazioni dal testo sopra:

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

Qualsiasi consiglio tu possa dare sarà utile.

È stato utile?

Soluzione

Dovresti essere in grado di ottenere un oggetto StackTrace invece di una stringa dicendo

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

Puoi quindi guardare tu stesso i frame senza fare affidamento sulla formattazione del framework.

Guarda anche: Riferimento StackTrace

Altri suggerimenti

Ecco il codice che utilizzo per farlo senza eccezioni

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(string.Format("{0}::{1}", 
        method.ReflectedType != null ? method.ReflectedType.Name : string.Empty,
        method.Name));
  }
}

Giusto per rendere questa risposta copia-incolla di 15 secondi:

static public string StackTraceToString()
{
    StringBuilder sb = new StringBuilder(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();
}

(basato sulla risposta di Lindholm)

Oppure esiste una versione ancora più breve..

Console.Write(exception.StackTrace);

In alternativa, log4net, sebbene potenzialmente pericoloso, mi ha dato risultati migliori di System.Diagnostics.Fondamentalmente in log4net hai un metodo per i vari livelli di log, ciascuno con un parametro Exception.Quindi, quando passi la seconda eccezione, stamperà l'analisi dello stack su qualunque appender tu abbia configurato.

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

L'output, a seconda della configurazione, assomiglia a qualcosa del genere

System.ApplicationException: Something went wrong.
   at Adapter.WriteToFile(OleDbCommand cmd) in C:\Adapter.vb:line 35
   at Adapter.GetDistributionDocument(Int32 id) in C:\Adapter.vb:line 181
   ...
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top