コード例 #1
0
        public async Task LldbEvalAsync()
        {
            const string     expressionText = "myVar";
            IDebugExpression expression     =
                CreateExpression(expressionText, ExpressionEvaluationStrategy.LLDB_EVAL);
            RemoteValueFake expressionValueNode =
                RemoteValueFakeUtil.CreateClass("CustomType", "$17", "23");

            _mockDebuggerStackFrame.EvaluateExpressionLldbEvalAsync(expressionText)
            .Returns(expressionValueNode);

            int status             = expression.EvaluateAsync(0, null);
            var debugEventVerifier = Arg.Is <DebugExpressionEvaluationCompleteEvent>(
                e => expressionText.Equals(GetName(GetResult(e))) &&
                "CustomType".Equals(GetType(GetResult(e))) &&
                "23".Equals(GetValue(GetResult(e))));

            // This assumes that task executor stub works synchronously.
            _mockDebugEngineHandler.Received().SendEvent(
                debugEventVerifier, Arg.Is(_mockProgram), Arg.Is(_mockThread));

            await _taskExecutor.ReceivedWithAnyArgs(1).SubmitAsync(
                () => Task.CompletedTask, Arg.Any <CancellationToken>(), Arg.Any <string>(),
                Arg.Any <Type>());

            Assert.AreEqual(VSConstants.S_OK, status);
        }
コード例 #2
0
        public async Task LldbEvalWithFallbackAsync(LldbEvalErrorCode lldbEvalErrorCode)
        {
            const string     expressionText = "myVar";
            IDebugExpression expression     = CreateExpression(
                expressionText, ExpressionEvaluationStrategy.LLDB_EVAL_WITH_FALLBACK);

            RemoteValueFake errorValue      = RemoteValueFakeUtil.CreateLldbEvalError(lldbEvalErrorCode);
            RemoteValueFake expressionValue =
                RemoteValueFakeUtil.CreateClass("CustomType", "$17", "23");

            _mockDebuggerStackFrame.EvaluateExpressionLldbEvalAsync(expressionText)
            .Returns(errorValue);
            _mockDebuggerStackFrame.EvaluateExpressionAsync(expressionText)
            .Returns(expressionValue);

            Assert.AreEqual(VSConstants.S_OK,
                            expression.EvaluateSync(0, 0, null, out IDebugProperty2 property));

            Assert.AreEqual(expressionText, GetName(property));
            Assert.AreEqual("CustomType", GetType(property));
            Assert.AreEqual("23", GetValue(property));

            // Make sure that a fallback to the LLDB happened.
            await _mockDebuggerStackFrame.Received(1).EvaluateExpressionLldbEvalAsync(
                Arg.Is(expressionText));

            await _mockDebuggerStackFrame.Received(1).EvaluateExpressionAsync(
                Arg.Is(expressionText));
        }
コード例 #3
0
        public void EvaluateSyncWithFormatSpecifier()
        {
            string           expressionText  = "myVar";
            string           formatSpecifier = ",x";
            string           testText        = expressionText + formatSpecifier;
            IDebugExpression expression      = CreateExpression(testText);

            RemoteValueFake remoteValue = RemoteValueFakeUtil.CreateSimpleInt("myVar", 16);

            _mockDebuggerStackFrame.FindValue(testText, ValueType.VariableGlobal)
            .Returns((RemoteValue)null);
            _mockDebuggerStackFrame.GetValueForVariablePath(expressionText)
            .Returns((RemoteValue)null);
            _mockDebuggerStackFrame.FindValue(expressionText, ValueType.VariableGlobal)
            .Returns((RemoteValue)null);
            _mockDebuggerStackFrame.EvaluateExpressionAsync(expressionText).Returns(remoteValue);

            Assert.AreEqual(VSConstants.S_OK,
                            expression.EvaluateSync(0, 0, null, out IDebugProperty2 property));

            Assert.AreEqual(testText, GetName(property));
            Assert.AreEqual(testText, GetFullName(property));
            Assert.AreEqual("int", GetType(property));
            Assert.AreEqual("0x10", GetValue(property));
        }
コード例 #4
0
        public void EvaluateSyncForLldbScratchVariable()
        {
            IDebugExpression expression = CreateExpression("$10");

            _mockDebuggerStackFrame.FindValue("10", ValueType.Register).Returns((RemoteValue)null);

            Assert.AreEqual(VSConstants.E_FAIL,
                            expression.EvaluateSync(0, 0, null, out IDebugProperty2 property));
            Assert.AreEqual(null, property);
        }
コード例 #5
0
        public void InvalidCommand()
        {
            IDebugExpression expression = CreateExpression(".invalidcommand");

            Assert.AreEqual(VSConstants.S_OK,
                            expression.EvaluateSync(0, 0, null, out IDebugProperty2 property));

            DEBUG_PROPERTY_INFO info =
                GetPropertyInfo(property, enum_DEBUGPROP_INFO_FLAGS.DEBUGPROP_INFO_ATTRIB);

            Assert.That(info.dwAttrib.HasFlag(enum_DBG_ATTRIB_FLAGS.DBG_ATTRIB_VALUE_ERROR));
        }
コード例 #6
0
        public void NatvisReloadCommand()
        {
            IDebugExpression expression = CreateExpression(".natvisreload");

            Assert.AreEqual(VSConstants.S_OK,
                            expression.EvaluateSync(0, 0, null, out IDebugProperty2 property));

            DEBUG_PROPERTY_INFO info =
                GetPropertyInfo(property, enum_DEBUGPROP_INFO_FLAGS.DEBUGPROP_INFO_ATTRIB);

            Assert.That(!info.dwAttrib.HasFlag(enum_DBG_ATTRIB_FLAGS.DBG_ATTRIB_VALUE_ERROR));

            _engineCommandsMock.Received().ReloadNatvis(Arg.Any <TextWriter>(), out string _);
        }
コード例 #7
0
        public void EvaluateSyncForNullResult()
        {
            string           testText   = "myVar";
            IDebugExpression expression = CreateExpression(testText);

            _mockDebuggerStackFrame.GetValueForVariablePath(testText).Returns((RemoteValue)null);
            _mockDebuggerStackFrame.FindValue(testText, ValueType.VariableGlobal)
            .Returns((RemoteValue)null);
            _mockDebuggerStackFrame.EvaluateExpressionAsync(testText).Returns((RemoteValue)null);

            Assert.AreEqual(VSConstants.E_FAIL,
                            expression.EvaluateSync(0, 0, null, out IDebugProperty2 property));
            Assert.AreEqual(null, property);
        }
コード例 #8
0
ファイル: Expression.cs プロジェクト: dp0h/QuickWatchEx
        /// <summary>
        /// Private constructor
        /// </summary>
        /// <param name="config"></param>
        /// <param name="expr"></param>
        /// <param name="parentPath"></param>
        /// <param name="level"></param>
        private Expression(IExpressionParameters config, IDebugExpression expr, string parentPath, int level)
            : this(config)
        {
            if (expr == null || !expr.IsValidValue) {
                return;
            }

            _expr = expr;
            _name = expr.Name;
            _type = expr.Type;
            _value = expr.Value;
            _path = string.IsNullOrEmpty(parentPath) ? _name : string.Format("{0}.{1}", parentPath, _name);
            _level = level;
        }
コード例 #9
0
        public void EvaluateSyncForVariablePath()
        {
            const string     expressionText        = "myVar";
            IDebugExpression expression            = CreateExpression(expressionText);
            RemoteValueFake  variablePathValueNode =
                RemoteValueFakeUtil.CreateClass("CustomType", "$17", "23");

            _mockDebuggerStackFrame.GetValueForVariablePath(expressionText)
            .Returns(variablePathValueNode);

            Assert.AreEqual(VSConstants.S_OK,
                            expression.EvaluateSync(0, 0, null, out IDebugProperty2 property));

            Assert.AreEqual(expressionText, GetName(property));
            Assert.AreEqual("CustomType", GetType(property));
            Assert.AreEqual("23", GetValue(property));
        }
コード例 #10
0
        public void EvaluateSyncForRegister()
        {
            string expressionText = "$rax";

            IDebugExpression expression         = CreateExpression(expressionText);
            RemoteValueFake  findValueValueNode =
                RemoteValueFakeUtil.CreateUnsignedLongRegister("rax", 123u);

            _mockDebuggerStackFrame.FindValue("rax", ValueType.Register)
            .Returns(findValueValueNode);

            Assert.AreEqual(VSConstants.S_OK,
                            expression.EvaluateSync(0, 0, null, out IDebugProperty2 property));

            Assert.AreEqual(expressionText, GetName(property));
            Assert.AreEqual("unsigned long", GetType(property));
            Assert.AreEqual("123", GetValue(property));
        }
コード例 #11
0
        public async Task LldbEvalWithoutFallbackAsync(LldbEvalErrorCode lldbEvalErrorCode)
        {
            const string     expressionText = "myVar";
            IDebugExpression expression     =
                CreateExpression(expressionText, ExpressionEvaluationStrategy.LLDB_EVAL);

            RemoteValueFake errorValue = RemoteValueFakeUtil.CreateLldbEvalError(lldbEvalErrorCode);

            _mockDebuggerStackFrame.EvaluateExpressionLldbEvalAsync(expressionText)
            .Returns(errorValue);

            Assert.AreEqual(VSConstants.S_OK,
                            expression.EvaluateSync(0, 0, null, out IDebugProperty2 property));

            // Make sure that a fallback to the LLDB didn't happen.
            await _mockDebuggerStackFrame.Received(1).EvaluateExpressionLldbEvalAsync(
                Arg.Is(expressionText));

            await _mockDebuggerStackFrame.DidNotReceive().EvaluateExpressionAsync(
                Arg.Any <string>());
        }
コード例 #12
0
        public void EvaluateSyncForAddressOf()
        {
            const string     expressionText = "&myVar";
            IDebugExpression expression     = CreateExpression("&myVar");

            var expressionValueNode = new RemoteValueFake("$17", "23");

            expressionValueNode.SetTypeInfo(new SbTypeStub("CustomType", TypeFlags.IS_CLASS));

            _mockDebuggerStackFrame.FindValue(expressionText, ValueType.VariableGlobal)
            .Returns((RemoteValue)null);
            _mockDebuggerStackFrame.EvaluateExpressionAsync(expressionText)
            .Returns(expressionValueNode);

            Assert.AreEqual(VSConstants.S_OK,
                            expression.EvaluateSync(0, 0, null, out IDebugProperty2 property));

            Assert.AreEqual(expressionText, GetName(property));
            Assert.AreEqual("CustomType", GetType(property));
            Assert.AreEqual("23", GetValue(property));
            _mockDebuggerStackFrame.DidNotReceiveWithAnyArgs().GetValueForVariablePath(null);
        }
コード例 #13
0
 public void AddChild(IDebugExpression child)
 {
     _children.Add(child);
 }
コード例 #14
0
ファイル: Expression.cs プロジェクト: dp0h/QuickWatchEx
 /// <summary>
 /// Constructor
 /// </summary>
 /// <param name="parameters"></param>
 /// <param name="expr"></param>
 /// <param name="level"></param>
 /// <param name="startTime"></param>
 public Expression(IExpressionParameters parameters, IDebugExpression expr, int level, DateTime startTime)
     : this(parameters, expr, "", level)
 {
     LoadChildren(startTime);
 }
コード例 #15
0
 public DebugExpression(IDebugExpression dexp)
 {
     this.dexp = dexp;
 }
コード例 #16
0
 public DelayedExpression(IExpressionParameters parameters, IDebugExpression expr, string parentPath)
     : base(parameters)
 {
     _expr = expr;
     _parentPath = parentPath;
 }
コード例 #17
0
        public void Abort()
        {
            IDebugExpression expression = CreateExpression("myVar");

            Assert.AreEqual(VSConstants.E_NOTIMPL, expression.Abort());
        }