Imprimir información de rastreo de pila desde C#
parsing error-handling (5)
Aquí está el código que uso para hacer esto sin una excepción
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));
}
}
Como parte de algún manejo de errores en nuestro producto, nos gustaría descargar alguna información de seguimiento de la pila. Sin embargo, experimentamos que muchos usuarios simplemente tomarán una captura de pantalla del cuadro de diálogo de mensaje de error en lugar de enviarnos una copia del informe completo disponible del programa, y por lo tanto me gustaría hacer que haya información mínima de seguimiento de pila disponible en este diálogo.
Un seguimiento de pila .NET en mi máquina se ve así:
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
Tengo esta pregunta:
El formato parece ser este:
at <class/method> [in file:line ##]
Sin embargo, las palabras clave at yin, supongo que se localizarán si ejecutan, por ejemplo, un tiempo de ejecución noruego de .NET en lugar del inglés que he instalado.
¿Hay alguna forma de separar este trazado de la pila de una manera neutral en cuanto al idioma, de modo que pueda mostrar solo el archivo y el número de línea para las entradas que tienen esto?
En otras palabras, me gustaría obtener esta información del texto anterior:
C:/Dev/VS.NET/Gatsoft/LVKWinFormsSandbox/MainForm.cs:line 36
Cualquier consejo que pueda dar será útil.
Como alternativa, log4net, aunque potencialmente peligroso, me ha dado mejores resultados que System.Diagnostics. Básicamente en log4net, tiene un método para los diversos niveles de registro, cada uno con un parámetro de excepción. Por lo tanto, cuando pase la segunda excepción, imprimirá el seguimiento de la pila a cualquier apéndice que haya configurado.
ejemplo: Logger.Error("Danger!!!", myException );
La salida, dependiendo de la configuración, se parece más a
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
...
Debería poder obtener un objeto StackTrace en lugar de una cadena diciendo
var trace = new System.Diagnostics.StackTrace(exception);
Luego puede mirar los cuadros usted mismo sin depender del formato del marco.
Ver también: referencia de StackTrace
O incluso hay una versión más corta ...
Console.Write(exception.StackTrace);
Solo para hacer una respuesta de copiar y pegar de 15 segundos:
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();
}
(basado en la respuesta de Lindholm)