public int EnumFrameInfo(uint dwFieldSpec, uint nRadix, out IEnumDebugFrameInfo2 ppEnum) { Backtrace trace = _engine.SoftDebugger.ActiveBacktrace; //_monoThread.Backtrace; FRAMEINFO[] frames = new FRAMEINFO[trace.FrameCount]; for (int x = 0; x < trace.FrameCount; x++) { MonoStackFrame frame = new MonoStackFrame(_engine, this, trace.GetFrame(x)); frames[x] = frame.GetFrameInfo(dwFieldSpec); } ppEnum = new MonoFrameInfoEnumerator(frames); return(S_OK); }
/// <summary> /// Retrieves a list of the stack frames for this thread. /// For the sample engine, enumerating the stack frames requires walking the callstack in the debuggee for this thread /// and coverting that to an implementation of IEnumDebugFrameInfo2. /// Real engines will most likely want to cache this information to avoid recomputing it each time it is asked for, /// and or construct it on demand instead of walking the entire stack. /// </summary> /// <param name="dwFieldSpec">The field spec.</param> /// <param name="nRadix">The radix.</param> /// <param name="enumObject">The enum object.</param> /// <returns>If successful, returns S_OK; otherwise, returns an error code.</returns> public int EnumFrameInfo(enum_FRAMEINFO_FLAGS dwFieldSpec, uint nRadix, out IEnumDebugFrameInfo2 enumObject) { // Ask the lower-level to perform a stack walk on this thread enumObject = null; try { var numStackFrames = _debuggedThread.Backtrace.FrameCount; FRAMEINFO[] frameInfoArray; if (numStackFrames == 0) { // failed to walk any frames. Only return the top frame. frameInfoArray = new FRAMEINFO[0]; // MonoStackFrame frame = new MonoStackFrame(engine, this, debuggedThread); // frame.SetFrameInfo(dwFieldSpec, out frameInfoArray[0]); } else { frameInfoArray = new FRAMEINFO[numStackFrames]; for (var i = 0; i < numStackFrames; i++) { var i1 = i; var frame = new MonoStackFrame(_engine, this, () => _debuggedThread.Backtrace.GetFrame(i1)); if (_lineNumberOverride != null) { frame.LineNumber = _lineNumberOverride.Value; } frame.SetFrameInfo(dwFieldSpec, out frameInfoArray[i]); } } enumObject = new MonoFrameInfoEnumerator(frameInfoArray); return(S_OK); } catch (ComponentException e) { return(e.HResult); } catch (Exception e) { return(EngineUtils.UnexpectedException(e)); } }