public DebugThread GetCallstack(ThreadInfo threadInfo) { var context = GetThreadContext(threadInfo); var frames = GetCallstackFrames(context); var f = new List <StackFrame>(frames.Count); var retVal = new DebugThread(f, threadInfo); f.AddRange(frames.Select(frame => ToStackFrame(frame, retVal))); return(retVal); }
private StackFrame ToStackFrame(FrameInfo frameInfo, DebugThread thread) { ulong displacement; var builder = new StringBuilder(256); var frame = frameInfo.StackFrame; _symbols.GetSymbolNameByOffset(frame.InstructionOffset, ref builder, out displacement); var name = builder.ToString(); return(new StackFrame(frame.ReturnOffset, frame.InstructionOffset, frame.FrameOffset, (ushort)frame.FrameNumber, string.Intern(name), displacement, thread)); }
public StackFrame(ulong returnOffset, ulong instructionOffset, ulong frameOffset, ushort frameNumber, string name, ulong displacement, DebugThread thread) { ReturnOffset = returnOffset; InstructionOffset = instructionOffset; FrameOffset = frameOffset; FrameNumber = frameNumber; Name = string.Intern(name); var sep = name.IndexOf('!'); sep = (sep == -1) ? 0 : sep; Module = string.Intern(name.Substring(0, sep)); Function = name.Substring(sep + 1); Displacement = displacement; Thread = thread; }