C# stack traces take the following form:
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
How can I retrieve namespace, class, method, file and line number from each line?
- Are there any existing classes to do this?
- If not what would be the the best approach?
- Regex? How would I greedily match the namespace but leave the class and method?
- Custom parser?
Would appreciate some ideas and input.
I read the Austin Salonen's answer and it's obvious better, but I've already started with regex. so I'll write it anyway.
If you're getting this from a StackTrace, then you can loop through the StackFrames via GetFrame and call GetMethod, GetFileName, and GetFileLineNumber. Namespace and class can be retrieved from the method.
EDIT
In response to the first comment (unfortunately we get the traces from Exception.StackTrace), you can call the StackTrace(Exception) constructor.
EDIT
I should've linked to this constructor instead -- StackTrace(Exception,bool).
StackTraceParser can parse a stack trace text output (e.g. typically returned by Environment.StackTrace or Exception.StackTrace) back into a sequence of stack trace frames, including the following components:
It is available as a NuGet source package that directly embeds into a C# project.
However it requires a few functions to specify and it's usage is not immediately obvious.
See examples in https://github.com/atifaziz/StackTraceParser and https://bitbucket.org/project-elmah/main/src/2a6b0b5916a6b4913ca5af4c22c4e4fc69f1260d/src/Elmah.AspNet/ErrorDetailPage.cs?at=default&fileviewer=file-view-default