/// <summary> /// Add the Method type to the specified StackSegment /// </summary> /// <param name="frame">The Stack frame.</param> /// <param name="segment">The Stack segment.</param> private static void AddMethodType(StackFrame frame, StackSegment segment) { MethodBase Method = frame.GetMethod(); if(Method.IsPublic) { segment.Type = MethodType.Public; } else if(Method.IsPrivate) { segment.Type = MethodType.Private; } else if(Method.IsStatic) { segment.Type = MethodType.Static; } else if(Method.IsVirtual) { segment.Type = MethodType.Virtual; } else if(Method.IsAbstract) { segment.Type = MethodType.Abstract; } }
/// <summary> /// Tries to add to the message all the stack information available at the given moment. /// </summary> /// <param name="message">The message to which to attach the stack information.</param> private static void AddStackInfoToMessage(DebugMessage message) { if(message == null) { return; } // check if we need to allocate the stack segments if(message.HasStack && message.StackSegments != null) { message.StackSegments.Clear(); } else { message.StackSegments = new List<StackSegment>(); message.HasStack = true; } // obtain stack information StackTrace stackInfo = new StackTrace(0, true); for(int i = 0; i < stackInfo.FrameCount; i++) { StackSegment segment = new StackSegment(); StackFrame frame = stackInfo.GetFrame(i); if(frame.GetMethod().DeclaringType.Namespace == typeof(Debug).Namespace) { continue; } // copy the relevant data segment.File = frame.GetFileName(); segment.DeclaringObject = frame.GetMethod().DeclaringType.Name; segment.DeclaringNamespace = frame.GetMethod().DeclaringType.Namespace; segment.Method = frame.GetMethod().ToString(); AddMethodType(frame, segment); segment.Line = frame.GetFileLineNumber(); message.StackSegments.Add(segment); } }
public DebugMessage() { _baseMethod = new StackSegment(); }