예제 #1
0
        public override Task <EvaluateExpressionLldbEvalResponse> EvaluateExpressionLldbEval(
            EvaluateExpressionLldbEvalRequest request, ServerCallContext context)
        {
            var value = valueStore.GetObject(request.Value.Id);
            IDictionary <string, SbValue> contextValues = new Dictionary <string, SbValue>();

            if (request.ContextVariables != null)
            {
                foreach (var contextVariable in request.ContextVariables)
                {
                    var val = valueStore.GetObject(contextVariable.Value.Id);

                    if (val != null)
                    {
                        contextValues.Add(contextVariable.Name, val.GetSbValue());
                    }
                }
            }
            var result   = value.EvaluateExpressionLldbEval(request.Expression, contextValues);
            var response = new EvaluateExpressionLldbEvalResponse();

            if (result != null)
            {
                response.Value = GrpcFactoryUtils.CreateValue(result, valueStore.AddObject(result));
            }
            return(Task.FromResult(response));
        }
예제 #2
0
        public override Task <GetChildrenResponse> GetChildren(
            GetChildrenRequest request, ServerCallContext context)
        {
            var value    = valueStore.GetObject(request.Value.Id);
            var children = value.GetChildren(request.Offset, request.Count);
            var response = new GetChildrenResponse();

            for (uint n = 0; n < children.Count; ++n)
            {
                RemoteValue child = children[(int)n];
                if (child != null)
                {
                    response.Children[n + request.Offset] =
                        GrpcFactoryUtils.CreateValue(child, valueStore.AddObject(child));
                }
            }

            // (internal): Special case for pointers. LLDB names them $"*{value.GetName()}", but
            // Visual Studio just shows an empty name.
            if (value.TypeIsPointerType() && response.Children.ContainsKey(0) &&
                response.Children[0].Name == $"*{value.GetName()}")
            {
                response.Children[0].Name = string.Empty;
            }

            return(Task.FromResult(response));
        }
예제 #3
0
        private GrpcValueInfo CreateValueInfoAndUpdateStores(RemoteValue remoteValue)
        {
            if (remoteValue == null)
            {
                return(null);
            }

            string expressionPath;
            var    hasExpressionPath = remoteValue.GetExpressionPath(out expressionPath);
            var    valueInfo         = new GrpcValueInfo
            {
                ExpressionPath    = expressionPath ?? "",
                HasExpressionPath = hasExpressionPath,
                NumChildren       = remoteValue.GetNumChildren(),
                Summary           = remoteValue.GetSummary() ?? "",
                TypeName          = remoteValue.GetTypeName() ?? "",
                Value             = remoteValue.GetValue() ?? "",
                ValueType         = EnumUtil.ConvertTo <Debugger.Common.ValueType>(
                    remoteValue.GetValueType()),
                IsPointerType = remoteValue.TypeIsPointerType(),
                ByteSize      = remoteValue.GetByteSize(),
            };
            var typeInfo = remoteValue.GetTypeInfo();

            if (typeInfo != null)
            {
                valueInfo.Type = GrpcFactoryUtils.CreateType(
                    typeInfo, typeStore.AddObject(typeInfo));
            }
            return(valueInfo);
        }
예제 #4
0
 GrpcSbFrame CreateGrpcSbFrame(RemoteFrame frame)
 => frame == null ? null : new GrpcSbFrame
 {
     Id           = frameStore.AddObject(frame),
     FunctionName = frame.GetFunctionName() ?? "",
     FunctionNameWithSignature = frame.GetFunctionNameWithSignature() ?? "",
     ProgramCounter            = frame.GetPC(),
     LineEntry = GrpcFactoryUtils.CreateGrpcLineEntryInfo(frame.GetLineEntry())
 };
        public override Task <GetLineEntryResponse> GetLineEntry(GetLineEntryRequest request,
                                                                 ServerCallContext context)
        {
            var address  = addressStore.GetObject(request.Address.Id);
            var response = new GetLineEntryResponse();

            response.LineEntry = GrpcFactoryUtils.CreateGrpcLineEntryInfo(address.GetLineEntry());
            return(Task.FromResult(response));
        }
예제 #6
0
        public override Task <GetChildMemberWithNameResponse> GetChildMemberWithName(
            GetChildMemberWithNameRequest request, ServerCallContext context)
        {
            var value    = valueStore.GetObject(request.Value.Id);
            var child    = value.GetChildMemberWithName(request.Name);
            var response = new GetChildMemberWithNameResponse();

            if (child != null)
            {
                response.Child = GrpcFactoryUtils.CreateValue(child, valueStore.AddObject(child));
            }
            return(Task.FromResult(response));
        }
예제 #7
0
        public override Task <CloneResponse> Clone(CloneRequest request, ServerCallContext context)
        {
            RemoteValue value       = valueStore.GetObject(request.Value.Id);
            RemoteValue cloneResult = value.Clone();
            var         response    = new CloneResponse();

            if (cloneResult != null)
            {
                response.CloneResult =
                    GrpcFactoryUtils.CreateValue(cloneResult, valueStore.AddObject(cloneResult));
            }
            return(Task.FromResult(response));
        }
예제 #8
0
        public override Task <GetTypeInfoResponse> GetTypeInfo(
            GetTypeInfoRequest request, ServerCallContext context)
        {
            var value    = valueStore.GetObject(request.Value.Id);
            var sbType   = value.GetTypeInfo();
            var response = new GetTypeInfoResponse();

            if (sbType != null)
            {
                response.Type = GrpcFactoryUtils.CreateType(sbType, typeStore.AddObject(sbType));
            }
            return(Task.FromResult(response));
        }
예제 #9
0
        public override Task <GetInfoResponse> GetInfo(GetInfoRequest request,
                                                       ServerCallContext context)
        {
            RemoteFrame          frame = frameStore.GetObject(request.Frame.Id);
            FrameInfo <SbModule> info  = frame.GetInfo((FrameInfoFlags)request.Fields);

            // Note: info can't be null since it's a struct.
            var moduleId = info.Module != null?moduleStore.AddObject(info.Module) : (long?)null;

            return(Task.FromResult(new GetInfoResponse
            {
                Info = GrpcFactoryUtils.CreateFrameInfo(info, moduleId)
            }));
        }
예제 #10
0
        public override Task <GetCanonicalTypeResponse> GetCanonicalType(
            GetCanonicalTypeRequest request, ServerCallContext context)
        {
            var type          = typeStore.GetObject(request.Type.Id);
            var canonicalType = type.GetCanonicalType();
            var response      = new GetCanonicalTypeResponse();

            if (canonicalType != null)
            {
                response.Type = GrpcFactoryUtils.CreateType(
                    canonicalType, typeStore.AddObject(canonicalType));
            }
            return(Task.FromResult(response));
        }
예제 #11
0
        public override Task <AddressOfResponse> AddressOf(
            AddressOfRequest request, ServerCallContext context)
        {
            var value    = valueStore.GetObject(request.Value.Id);
            var address  = value.AddressOf();
            var response = new AddressOfResponse();

            if (address != null)
            {
                response.AddressValue = GrpcFactoryUtils.CreateValue(
                    address, valueStore.AddObject(address));
            }
            return(Task.FromResult(response));
        }
예제 #12
0
        public override Task <GetValueForExpressionPathResponse> GetValueForExpressionPath(
            GetValueForExpressionPathRequest request, ServerCallContext context)
        {
            var value      = valueStore.GetObject(request.Value.Id);
            var childValue = value.GetValueForExpressionPath(request.ExpressionPath);
            GetValueForExpressionPathResponse response = new GetValueForExpressionPathResponse();

            if (childValue != null)
            {
                response.Value = GrpcFactoryUtils.CreateValue(
                    childValue, valueStore.AddObject(childValue));
            }
            return(Task.FromResult(response));
        }
예제 #13
0
        public override Task <DereferenceResponse> Dereference(
            DereferenceRequest request, ServerCallContext context)
        {
            RemoteValue value             = valueStore.GetObject(request.Value.Id);
            RemoteValue dereferenceResult = value.Dereference();
            var         response          = new DereferenceResponse();

            if (dereferenceResult != null)
            {
                response.DereferenceResult = GrpcFactoryUtils.CreateValue(
                    dereferenceResult, valueStore.AddObject(dereferenceResult));
            }
            return(Task.FromResult(response));
        }
예제 #14
0
        public override Task <GetRegistersResponse> GetRegisters(GetRegistersRequest request,
                                                                 ServerCallContext context)
        {
            RemoteFrame        frame     = frameStore.GetObject(request.Frame.Id);
            List <RemoteValue> registers = frame.GetRegisters();

            var response = new GetRegistersResponse();

            response.Registers.Add(
                registers.Select(s => GrpcFactoryUtils.CreateValue(
                                     s, valueStore.AddObject(s))).ToList());

            return(Task.FromResult(response));
        }
예제 #15
0
        public override Task <EvaluateExpressionLldbEvalResponse> EvaluateExpressionLldbEval(
            EvaluateExpressionLldbEvalRequest request, ServerCallContext context)
        {
            RemoteFrame frame = frameStore.GetObject(request.Frame.Id);
            RemoteValue value = frame.EvaluateExpressionLldbEval(request.Expression);

            var response = new EvaluateExpressionLldbEvalResponse();

            if (value != null)
            {
                response.Value = GrpcFactoryUtils.CreateValue(value, valueStore.AddObject(value));
            }
            return(Task.FromResult(response));
        }
예제 #16
0
        public override Task <GetValueForVariablePathResponse> GetValueForVariablePath(
            GetValueForVariablePathRequest request,
            ServerCallContext context)
        {
            RemoteFrame frame = frameStore.GetObject(request.Frame.Id);
            RemoteValue value = frame.GetValueForVariablePath(request.VariablePath);

            var response = new GetValueForVariablePathResponse();

            if (value != null)
            {
                response.Value = GrpcFactoryUtils.CreateValue(value, valueStore.AddObject(value));
            }
            return(Task.FromResult(response));
        }
예제 #17
0
        public override Task <EvaluateExpressionResponse> EvaluateExpression(
            EvaluateExpressionRequest request, ServerCallContext context)
        {
            var value            = valueStore.GetObject(request.Value.Id);
            var expressionResult =
                value.EvaluateExpression(request.Expression);
            var response = new EvaluateExpressionResponse();

            if (expressionResult != null)
            {
                response.ExpressionResult = GrpcFactoryUtils.CreateValue(
                    expressionResult, valueStore.AddObject(expressionResult));
            }
            return(Task.FromResult(response));
        }
예제 #18
0
        public override Task <CreateValueFromAddressResponse> CreateValueFromAddress(
            CreateValueFromAddressRequest request, ServerCallContext context)
        {
            RemoteValue value            = valueStore.GetObject(request.Value.Id);
            RemoteValue expressionResult = value.CreateValueFromAddress(
                request.Name, request.Address, typeStore.GetObject(request.Type.Id));
            var response = new CreateValueFromAddressResponse();

            if (expressionResult != null)
            {
                response.ExpressionResult = GrpcFactoryUtils.CreateValue(
                    expressionResult, valueStore.AddObject(expressionResult));
            }
            return(Task.FromResult(response));
        }
예제 #19
0
        public override Task <GetVariablesResponse> GetVariables(GetVariablesRequest request,
                                                                 ServerCallContext context)
        {
            RemoteFrame        frame     = frameStore.GetObject(request.Frame.Id);
            List <RemoteValue> variables =
                frame.GetVariables(
                    request.Arguments, request.Locals, request.Statics, request.OnlyInScope);

            var response = new GetVariablesResponse();

            response.Variables.Add(
                variables.Select(s => GrpcFactoryUtils.CreateValue(
                                     s, valueStore.AddObject(s))).ToList());

            return(Task.FromResult(response));
        }
예제 #20
0
        public override Task <FindValueResponse> FindValue(FindValueRequest request,
                                                           ServerCallContext context)
        {
            RemoteFrame frame    = frameStore.GetObject(request.Frame.Id);
            RemoteValue variable = frame.FindValue(request.VariableName,
                                                   request.ValueType.ConvertTo <LldbApi.ValueType>());

            var response = new FindValueResponse();

            if (variable != null)
            {
                response.Variable = GrpcFactoryUtils.CreateValue(
                    variable, valueStore.AddObject(variable));
            }

            return(Task.FromResult(response));
        }
예제 #21
0
        public override Task <GetCachedViewResponse> GetCachedView(
            GetCachedViewRequest request, ServerCallContext context)
        {
            var value = valueStore.GetObject(request.Value.Id);

            value.SetFormat(request.Format.ConvertTo <LldbApi.ValueFormat>());
            var response = new GetCachedViewResponse
            {
                ValueInfo = CreateValueInfoAndUpdateStores(value)
            };
            var addressOf = value.AddressOf();

            if (addressOf != null)
            {
                response.AddressValue = GrpcFactoryUtils.CreateValue(
                    addressOf, valueStore.AddObject(addressOf));
                response.AddressInfo = CreateValueInfoAndUpdateStores(addressOf);
            }
            return(Task.FromResult(response));
        }
예제 #22
0
        public override Task <GetFramesWithInfoResponse> GetFramesWithInfo(
            GetFramesWithInfoRequest request, ServerCallContext context)
        {
            var thread         = threadStore.GetObject(request.Thread.Id);
            var framesWithInfo = thread.GetFramesWithInfo((FrameInfoFlags)request.Fields,
                                                          request.StartIndex, request.MaxCount);
            var response = new GetFramesWithInfoResponse();

            foreach (var frameWithInfo in framesWithInfo)
            {
                var grpcFrameWithInfo = new GrpcFrameWithInfo();
                grpcFrameWithInfo.Frame = CreateGrpcSbFrame(frameWithInfo.Frame);
                FrameInfo <SbModule> info = frameWithInfo.Info;
                long?moduleId             = info.Module != null?
                                            moduleStore.AddObject(info.Module) : (long?)null;

                grpcFrameWithInfo.Info = GrpcFactoryUtils.CreateFrameInfo(info, moduleId);
                response.FramesWithInfo.Add(grpcFrameWithInfo);
            }
            return(Task.FromResult(response));
        }