예제 #1
0
        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);
        }
예제 #2
0
        /// <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));
            }
        }