如何将stacktrace行拆分为命名空间,类,方法文件和行号?

时间:2011-02-28 22:09:02

标签: c# regex parsing stack-trace

C#堆栈跟踪采用以下形式:

   at Foo.Core.Test.FinalMethod(Doh doh) in C:\Projects\src\Core.Tests\Test.cs:line 21
   at Foo.Core.Test.AnotherMethod(Bar bar)
   at Foo.Core.Test.AMethod() in C:\Projects\src\Core.Tests\Test.cs:line 6
   at Foo.Core.Test.<>c__DisplayClass7.<SomeAnonDelegate>b__6(Object _) in C:\Projects\src\Core.Tests\Test.cs:line 35

如何从每一行检索命名空间,类,方法,文件和行号?

  • 有没有现成的课程要做?
  • 如果不是最好的方法是什么?
  • 正则表达式?我如何贪婪地匹配命名空间但保留类和方法?
  • 自定义解析器?

会欣赏一些想法和意见。

3 个答案:

答案 0 :(得分:13)

如果您是从StackTrace获得此内容,则可以通过StackFrames循环浏览GetFrame并致电GetMethodGetFileName和{ {3}}。可以从方法中检索命名空间和类。

修改
在回复第一条评论时(不幸的是,我们从Exception.StackTrace 获取了跟踪),您可以调用GetFileLineNumber构造函数。

修改
我应该链接到这个构造函数 - StackTrace(Exception)

答案 1 :(得分:3)

我读了Austin Salonen的回答,这显然更好,但我已经开始使用正则表达式。所以无论如何我都会写它。

Regex r = new Regex(@"at (?<namespace>.*)\.(?<class>.*)\.(?<method>.*(.*)) in (?<file>.*):line (?<line>\d*)");
var result = r.Match(@"at Foo.Core.Test.FinalMethod(Doh doh) in C:\Projects\src\Core.Tests\Test.cs:line 21");
if (result.Success)
{
    string _namespace = result.Groups["namespace"].Value.ToString();
    string _class = result.Groups["class"].Value.ToString();
    string _method = result.Groups["method"].Value.ToString();
    string _file = result.Groups["file"].Value.ToString();
    string _line = result.Groups["line"].Value.ToString();
    Console.WriteLine("namespace: " + _namespace);
    Console.WriteLine("class: " + _class);
    Console.WriteLine("method: " + _method);
    Console.WriteLine("file: " + _file);
    Console.WriteLine("line: " + _line);
}

答案 2 :(得分:1)

StackTraceParser 可以将堆栈跟踪文本输出(例如,通常由Environment.StackTrace或Exception.StackTrace返回)解析回一系列堆栈跟踪帧,包括以下组件: / p>

Type
Method
Parameter types and names
File and line information, if present

它以NuGet source package的形式提供,直接嵌入到C#项目中。

然而,它需要指定一些功能,并且它的使用并不是立即显而易见的。

public static IEnumerable<TFrame> Parse<TToken, TMethod, TParameters, TParameter, TSourceLocation, TFrame>(
    string text,
    Func<int, int, string, TToken> tokenSelector,
    Func<TToken, TToken, TMethod> methodSelector,
    Func<TToken, TToken, TParameter> parameterSelector,
    Func<TToken, IEnumerable<TParameter>, TParameters> parametersSelector,
    Func<TToken, TToken, TSourceLocation> sourceLocationSelector,
    Func<TToken, TMethod, TParameters, TSourceLocation, TFrame> selector)

请参阅https://github.com/atifaziz/StackTraceParserhttps://bitbucket.org/project-elmah/main/src/2a6b0b5916a6b4913ca5af4c22c4e4fc69f1260d/src/Elmah.AspNet/ErrorDetailPage.cs?at=default&fileviewer=file-view-default

中的示例