Пример #1
0
        // Sets the next statement to the given stack frame and code context.
        int IDebugThread2.SetNextStatement(IDebugStackFrame2 stackFrame, IDebugCodeContext2 codeContext)
        {
            AD7StackFrame    frame   = (AD7StackFrame)stackFrame;
            AD7MemoryAddress context = (AD7MemoryAddress)codeContext;

            if (TaskHelpers.RunSynchronouslyOnUIThread(ct => frame.StackFrame.SetLineNumber((int)context.LineNumber + 1, ct)))
            {
                return(VSConstants.S_OK);
            }
            else if (frame.StackFrame.Thread.Process.StoppedForException)
            {
                return(E_CANNOT_SET_NEXT_STATEMENT_ON_EXCEPTION);
            }

            return(VSConstants.E_FAIL);
        }
Пример #2
0
        public static string GetAddressDescription(/*DebuggedModule module,*/ AD7Engine engine, uint ip)
        {
            var d = new AD7StackFrame(engine, engine.mThread, engine.mProcess);

            d.SetFrameInfo(enum_FRAMEINFO_FLAGS.FIF_FUNCNAME | enum_FRAMEINFO_FLAGS.FIF_FUNCNAME_ARGS, out var info);
            return(info.m_bstrFuncName);

            //string location = ip.ToString("x8", CultureInfo.InvariantCulture);

            //if (module != null)
            {
                //  string moduleName = System.IO.Path.GetFileName(module.Name);
                //  location = string.Concat(moduleName, "!", location);
            }

            //return location;
        }
Пример #3
0
        internal IVariableInformation GetVariable(string expr, AD7StackFrame frame)
        {
            IVariableInformation variable;

            if (expr.EndsWith(",viz", StringComparison.Ordinal))
            {
                expr     = expr.Substring(0, expr.Length - 4);
                variable = new VariableInformation(expr, frame.ThreadContext, frame.Engine, frame.Thread);
                variable.SyncEval();
                if (!variable.Error)
                {
                    variable = GetVisualizationWrapper(variable) ?? variable;
                }
            }
            else
            {
                variable = new VariableInformation(expr, frame.ThreadContext, frame.Engine, frame.Thread);
            }
            return(variable);
        }
Пример #4
0
        // Retrieves a list of the stack frames for this thread.
        // We currently call into the process and get the frames.  We might want to cache the frame info.
        int IDebugThread2.EnumFrameInfo(enum_FRAMEINFO_FLAGS dwFieldSpec, uint nRadix, out IEnumDebugFrameInfo2 enumObject)
        {
            var stackFrames = _debuggedThread.Frames;

            if (stackFrames == null)
            {
                enumObject = null;
                return(VSConstants.E_FAIL);
            }

            int numStackFrames = stackFrames.Count;

            FRAMEINFO[] frameInfoArray = new FRAMEINFO[numStackFrames];

            for (int i = 0; i < numStackFrames; i++)
            {
                AD7StackFrame frame = new AD7StackFrame(_engine, this, stackFrames[i]);
                frame.SetFrameInfo(dwFieldSpec, out frameInfoArray[i]);
            }

            enumObject = new AD7FrameInfoEnum(frameInfoArray);
            return(VSConstants.S_OK);
        }
Пример #5
0
 public AD7Property(AD7StackFrame frame, PythonEvaluationResult obj, bool writable = false)
 {
     _evalResult = obj;
     _frame      = frame;
     _writable   = writable;
 }
Пример #6
0
 /// <summary>
 /// Constructor.
 /// </summary>
 /// <param name="exp"> The expression to be evaluated. </param>
 /// <param name="frame"> Current stack frame. </param>
 /// <param name="dispatcher"> Represents the class that manages debug events for the debug engine. </param>
 public AD7Expression(string exp, AD7StackFrame frame, EventDispatcher dispatcher)
 {
     this.exp = exp;
     this.m_eventDispatcher = dispatcher;
     this.m_frame           = frame;
 }
Пример #7
0
 internal IVariableInformation GetVariable(string expr, AD7StackFrame frame)
 {
     IVariableInformation variable;
     if (expr.EndsWith(",viz", StringComparison.Ordinal))
     {
         expr = expr.Substring(0, expr.Length - 4);
         variable = new VariableInformation(expr, frame.ThreadContext, frame.Engine, frame.Thread);
         variable.SyncEval();
         if (!variable.Error)
         {
             variable = GetVisualizationWrapper(variable) ?? variable;
         }
     }
     else
     {
         variable = new VariableInformation(expr, frame.ThreadContext, frame.Engine, frame.Thread);
     }
     return variable;
 }
 public AD7DebugExpressionContext( AD7StackFrame stackFrame )
 {
   _stackFrame = stackFrame;
 }
 public AD7DebugExpression( AD7StackFrame stackFrame, string expr )
 {
   _expr = expr;
   _stackFrame = stackFrame;
 }
Пример #10
0
        /// <summary>
        /// Retrieves a list of the stack frames for this thread. (http://msdn.microsoft.com/en-ca/library/bb145138.aspx)
        /// </summary>
        /// <param name="dwFieldSpec"> A combination of flags from the FRAMEINFO_FLAGS enumeration that specifies which fields of the
        /// FRAMEINFO structures are to be filled out. </param>
        /// <param name="nRadix"> Radix used in formatting numerical information in the enumerator. </param>
        /// <param name="ppEnum"> Returns an IEnumDebugFrameInfo2 object that contains a list of FRAMEINFO structures describing the
        /// stack frame. </param>
        /// <returns> If successful, returns S_OK; otherwise, returns an error code. </returns>
        int IDebugThread2.EnumFrameInfo(enum_FRAMEINFO_FLAGS dwFieldSpec, uint nRadix, out IEnumDebugFrameInfo2 ppEnum)
        {
            if (this._id == "")
            {
                ppEnum = null;
                return(Constants.S_FALSE);
            }

            if (this._engine.evaluatedTheseFlags(this._id, dwFieldSpec))
            {
                ppEnum = new AD7FrameInfoEnum(previousFrameInfoArray);
                return(Constants.S_OK);
            }

            // Ask for general stack information.
            if ((this._id != "") && (this._id != this._engine.currentThread()._id))
            {
                _engine.eDispatcher.selectThread(this._id);
            }

            string stackResponse = _engine.eDispatcher.getStackFrames().Replace("#;;;;", "");

            if (stackResponse == "")
            {
                ppEnum = null;
                return(Constants.S_FALSE);
            }
            string[] frameStrings = stackResponse.Split('#');

            // Query the stack depth without inquiring GDB.
            int numStackFrames = frameStrings.Length;

            if (numStackFrames > 30) // limiting the amount of stackFrames to avoid VS crashing.
            {
                numStackFrames = 30;
            }

            ppEnum = null;
            try
            {
                bool        created        = false;
                FRAMEINFO[] frameInfoArray = new FRAMEINFO[numStackFrames];
                for (int i = 0; i < numStackFrames; i++)
                {
                    string[] frameInfo = frameStrings[i].Split(';');
                    if (frameInfo.Length >= 3)
                    {
                        if (frameInfo[3].Contains("~"))
                        {
                            // Need to lengthen the path used by Visual Studio.
                            StringBuilder longPathName = new StringBuilder(1024);
                            GetLongPathName(frameInfo[3], longPathName, longPathName.Capacity);
                            frameInfo[3] = longPathName.ToString();
                        }
                        AD7StackFrame frame = AD7StackFrame.create(_engine, this, frameInfo, ref created);
                        if (frame.m_thread.__stackFrames == null) // that's weird, but sometimes VS is not initializing __stackFrames, so I added this loop to avoid other problems.
                        {
                            while (frame.m_thread.__stackFrames == null)
                            {
                                frame.m_thread.__stackFrames = new ArrayList()
                                {
                                    frame
                                }
                            }
                            ;
                        }
                        frame.SetFrameInfo(dwFieldSpec, out frameInfoArray[i]);
                    }
                }
                if ((previousFrameInfoArray.Length != frameInfoArray.Length) || (created == true))
                {
                    previousFrameInfoArray = frameInfoArray;
                    ppEnum = new AD7FrameInfoEnum(frameInfoArray);
                }
                else
                {
                    bool isEqual = true;
                    for (int i = 0; i < frameInfoArray.Length; i++)
                    {
                        if (frameInfoArray[i].m_bstrFuncName != previousFrameInfoArray[i].m_bstrFuncName)
                        {
                            isEqual = false;
                            break;
                        }
                        if (frameInfoArray[i].m_dwValidFields != previousFrameInfoArray[i].m_dwValidFields)
                        {
                            isEqual = false;
                            break;
                        }
                        if (frameInfoArray[i].m_bstrLanguage != previousFrameInfoArray[i].m_bstrLanguage)
                        {
                            isEqual = false;
                            break;
                        }
                    }
                    if (!isEqual)
                    {
                        previousFrameInfoArray = frameInfoArray;
                        ppEnum = new AD7FrameInfoEnum(frameInfoArray);
                    }
                    else
                    {
                        ppEnum = new AD7FrameInfoEnum(previousFrameInfoArray);
                    }
                }

                if ((this._id != "") && (this._id != this._engine.currentThread()._id))
                {
                    _engine.eDispatcher.selectThread(this._engine.currentThread()._id);
                }

                return(Constants.S_OK);
            }
            catch (ComponentException e)
            {
                if ((this._id != "") && (this._id != this._engine.currentThread()._id))
                {
                    _engine.eDispatcher.selectThread(this._engine.currentThread()._id);
                }
                return(e.HResult);
            }
            catch (Exception e)
            {
                if ((this._id != "") && (this._id != this._engine.currentThread()._id))
                {
                    _engine.eDispatcher.selectThread(this._engine.currentThread()._id);
                }
                return(EngineUtils.UnexpectedException(e));
            }
        }
Пример #11
0
 /// <summary>
 /// Constructor.
 /// </summary>
 /// <param name="vi"> Contains all information about a variable / expression. </param>
 public AD7Property(AD7StackFrame vi)
 {
     _stackFrame = vi;
 }
Пример #12
0
 public UncalculatedAD7Expression(AD7StackFrame frame, string expression, bool writable = false)
 {
     _frame      = frame;
     _expression = expression;
     _writable   = writable;
 }