【发布时间】:2019-10-24 15:52:55
【问题描述】:
我想记录通过一些复杂的多线程代码传递的对象上的调用堆栈。 Environment.StackTrace 为您提供调用堆栈,但很难阅读。
at System.Environment.GetStackTrace(Exception e, Boolean needFileInfo)\r\n at System.Environment.get_StackTrace()\r\n at Foo.Bar.Biz(Monolith monolith) in C:\\Users\\Me\\Google\\Source\\Search.cs :line 70\r\n at Blah.Nonsense.Business(Monolith monolith) in C:\\Users\\Me\\Google\\Source\\Prediction.cs :line 129\r\n at ... you get the point
我只需要查看文件、类、方法和行。有没有正确的方法来获取这些信息?以下是我编写的方法,但由于所有字符串操作,它非常难看。
public static List<string[]> GetCallstack()
{
List<string[]> callstack = new List<string[]>();
string stackTrace = Environment.StackTrace;
string[] stackInstances = stackTrace.Split(new string[] { "\r\n" }, StringSplitOptions.None);
foreach (string stackInstance in stackInstances)
{
var stackInstanceComponents = stackInstance.Split(new string[] { ") in ", ":line " }, StringSplitOptions.None);
if (stackInstanceComponents.Length == 3)
{
string classAndMethod = string.Join(".", stackInstanceComponents[0].Split('.').Reverse().Take(2).Reverse().ToArray()) + ")";
string path = string.Join("/", stackInstanceComponents[1].Split(System.IO.Path.DirectorySeparatorChar).Reverse().Take(2).Reverse().ToArray()).Replace("at ", "");
string line = stackInstanceComponents[2];
if (classAndMethod != "Utility.GetCallstack()")
{
callstack.Add(new string[] { classAndMethod, path, line });
}
}
}
return callstack;
}
【问题讨论】:
-
MSDN 的示例很少有帮助,但在这种情况下they sort of are。