作为我们产品中某些错误处理的一部分,我们希望转储一些堆栈跟踪信息。然而,我们发现许多用户只是简单地截取错误消息对话框的屏幕截图,而不是向我们发送程序中可用的完整报告的副本,因此我想在此对话框中提供一些最小的堆栈跟踪信息。

我的机器上的 .NET 堆栈跟踪如下所示:

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

我有这个问题:

格式看起来是这样的:

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

但是,那 关键字,我认为如果它们运行的​​是挪威语 .NET 运行时而不是我安装的英语运行时,它们将会被本地化。

有什么方法可以让我以语言中立的方式分离这个堆栈跟踪,以便我可以仅显示具有此堆栈跟踪的那些条目的文件和行号?

换句话说,我想从上面的文本中获得这些信息:

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

您提供的任何建议都会有所帮助。

有帮助吗?

解决方案

您应该能够通过以下方式获取 StackTrace 对象而不是字符串

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

只是为了让这个 15 秒复制粘贴答案:

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();
}

(基于 Lindholm 的回答)

或者还有更短的版本..

Console.Write(exception.StackTrace);

作为替代方案,log4net 虽然有潜在危险,但给我带来了比 System.Diagnostics 更好的结果。基本上在 log4net 中,您有一个用于各种日志级别的方法,每个日志级别都有一个 Exception 参数。因此,当您传递第二个异常时,它会将堆栈跟踪打印到您配置的任何附加程序。

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

根据配置,输出看起来像

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
   ...
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top