public void StartTrace() { var curTime = DateTime.Now; int id = Thread.CurrentThread.ManagedThreadId; StackFrame frame = new StackFrame(1); MethodBase method = frame.GetMethod(); var stackInfo = new StackMethodsInfo(curTime, method); StackThreadInfo stackThreadInfo; Stack <StackMethodsInfo> curStack; MethodInfo methodInfo = new MethodInfo(method.Name, method.DeclaringType.FullName, null); stackInfo.MethodInfo = methodInfo; if (cdIdStack.ContainsKey(id)) { cdIdStack.TryGetValue(id, out stackThreadInfo); curStack = stackThreadInfo.Stack; } else { curStack = new Stack <StackMethodsInfo>(); ThreadInfo threadInfo = new ThreadInfo(id); stackThreadInfo = new StackThreadInfo(threadInfo, curStack); cdIdStack.TryAdd(id, stackThreadInfo); threadInfos.Add(threadInfo); } AddToList(stackThreadInfo, methodInfo); curStack.Push(stackInfo); }
private void AddToList(StackThreadInfo threadInfos, MethodInfo methodInfo) { StackMethodsInfo parentMethod; Stack <StackMethodsInfo> methodInfos = threadInfos.Stack; if (methodInfos.Count > 0) { parentMethod = methodInfos.Pop(); MethodInfo method = parentMethod.MethodInfo; if (method.Methods == null) { method.Methods = new List <MethodInfo>(); } method.Methods.Add(methodInfo); methodInfos.Push(parentMethod); } else { ThreadInfo threadInfo = threadInfos.ThreadInfo; if (threadInfo.Methods == null) { threadInfo.Methods = new List <MethodInfo>(); } threadInfo.Methods.Add(methodInfo); } }