Esempio n. 1
0
        private void RequestBackendVariables(DAPRequest request, DAPVariablesRequest msg, int dapIndex)
        {
            if (!VariableRefs.TryGetValue(dapIndex, out BackendVariableReference varRef))
            {
                throw new RequestFailedException($"Unknown backend variable reference: {dapIndex}");
            }

            var state = DAP.GetThread(varRef.Context);

            if (!state.Stopped)
            {
                throw new RequestFailedException("Cannot fetch variables when thread is not stopped");
            }

            uint seq = DAP.DbgCli.SendGetVariables(varRef);

            PendingGetVariablesRequests.Add(seq, (uint replySeq, StatusCode status, BkGetVariablesResponse response) =>
            {
                if (status == StatusCode.Success)
                {
                    OnVariablesReceived(request, msg, state, response);
                }
                else if (status == StatusCode.EvalFailed && response != null)
                {
                    DAP.Stream.SendReply(request, response.ErrorMessage);
                }
                else
                {
                    DAP.Stream.SendReply(request, $"Backend returned error: {status}");
                }
            });
        }
Esempio n. 2
0
        private void OnVariablesReceived(DAPRequest request, DAPVariablesRequest msg, ThreadState state, BkGetVariablesResponse response)
        {
            int startIndex = msg.start == null ? 0 : (int)msg.start;
            int numVars    = (msg.count == null || msg.count == 0) ? response.Result.Count : (int)msg.count;
            int lastIndex  = Math.Min(startIndex + numVars, response.Result.Count);
            // TODO req.filter, format

            var variables = new List <DAPVariable>();

            for (var i = startIndex; i < startIndex + numVars; i++)
            {
                var variable = response.Result[i];
                var dapVar   = new DAPVariable
                {
                    value = DbgValueToString(variable.Value),
                    type  = variable.Value.TypeId.ToString()
                };

                if (variable.Type == MsgChildValue.Types.Type.Numeric)
                {
                    dapVar.name = variable.Index.ToString();
                }
                else
                {
                    dapVar.name = variable.Name;
                }


                if (variable.Value.Variables != null)
                {
                    var varsRef = BackendVariableReference.FromDbg(state.Context, variable.Value.Variables);
                    var varsIdx = NextVariableReference++;
                    VariableRefs.Add(varsIdx, varsRef);
                    dapVar.variablesReference = MakeVariableRef(varsIdx);
                }

                variables.Add(dapVar);
            }

            var reply = new DAPVariablesResponse
            {
                variables = variables
            };

            DAP.Stream.SendReply(request, reply);
        }
Esempio n. 3
0
        private void RequestStackVariables(DAPRequest request, DAPVariablesRequest msg, int threadId, int frameIndex, int scopeIndex)
        {
            var state = DAP.GetThread(threadId);

            if (!state.Stopped)
            {
                throw new RequestFailedException("Cannot get scopes when thread is not stopped");
            }

            if (frameIndex < 0 || frameIndex >= state.Stack.Count)
            {
                throw new RequestFailedException($"Requested variables for unknown frame {frameIndex}");
            }

            var varRef = new BackendVariableReference();

            varRef.Context     = state.Context;
            varRef.VariableRef = -1;
            varRef.Frame       = frameIndex;
            varRef.Local       = -1;
            uint seq = DAP.DbgCli.SendGetVariables(varRef);

            PendingGetVariablesRequests.Add(seq, (uint replySeq, StatusCode status, BkGetVariablesResponse response) =>
            {
                if (status == StatusCode.Success)
                {
                    // Filter locals/upvalues based on requested scope type
                    var results = response.Result.Where(result => ((result.Index >= 0) == (scopeIndex == 0))).ToList();
                    response.Result.Clear();
                    response.Result.AddRange(results);

                    OnVariablesReceived(request, msg, state, response);
                }
                else if (status == StatusCode.EvalFailed && response != null)
                {
                    DAP.Stream.SendReply(request, response.ErrorMessage);
                }
                else
                {
                    DAP.Stream.SendReply(request, $"Backend returned error: {status}");
                }
            });
        }
Esempio n. 4
0
        public void OnDAPVariablesRequested(DAPRequest request, DAPVariablesRequest msg)
        {
            var variableType = RefToVariableType(msg.variablesReference);

            if (variableType == 0)
            {
                var index = RefToVariableIndex(msg.variablesReference);
                RequestBackendVariables(request, msg, index);
            }
            else if (variableType == 1)
            {
                var threadId   = RefToThreadId(msg.variablesReference);
                var frameIndex = RefToFrameIndex(msg.variablesReference);
                var scopeIndex = RefToScopeIndex(msg.variablesReference);
                RequestStackVariables(request, msg, threadId, frameIndex, scopeIndex);
            }
            else
            {
                throw new InvalidOperationException($"Unknown variables reference type: {variableType} (ref: {msg.variablesReference})");
            }
        }