Ejemplo n.º 1
0
        private VariablesMessageResult DoGetVariablesByScope(Scope scope)
        {
            EnsureIsCurrentScope(scope);
            IDebugSymbolGroup2 group;
            IDebugSymbolGroup2 oldGroup = State.GetSymbolsForScope(scope.Id);
            uint oldItemsCount          = 0;

            if (oldGroup != null)
            {
                oldGroup.GetNumberSymbols(out oldItemsCount);
            }

            var hr = _symbols.GetScopeSymbolGroup2(Scopes.GetScopeByName(scope.Name), oldGroup, out group);

            if (hr != HResult.Ok)
            {
                return(new VariablesMessageResult(Enumerable.Empty <Variable>()));
            }
            State.UpdateSymbolGroup(scope.Id, group);
            uint newItemsCount = 0;

            group.GetNumberSymbols(out newItemsCount);

            if (oldItemsCount == newItemsCount)
            {
                return(new VariablesMessageResult(State.GetVariablesByScope(scope.Id)));
            }

            var result = DoGetVariablesFromSymbols(group, 0, Defaults.NoParent, scope.Id);

            return(new VariablesMessageResult(result));
        }
Ejemplo n.º 2
0
        private IEnumerable<Variable> DoGetVariablesFromSymbols(IDebugSymbolGroup2 symbols, uint startIndex, uint parentSymbolListIndex, int parentId)
        {
            List<Variable> result = new List<Variable>();
            uint variableCount;
            var hr = symbols.GetNumberSymbols(out variableCount);
            if (hr != HResult.Ok)
                return result;

            DEBUG_SYMBOL_PARAMETERS[] parameters = new DEBUG_SYMBOL_PARAMETERS[variableCount];
            hr = symbols.GetSymbolParameters(0, variableCount, parameters);
            if (hr != HResult.Ok)
                return result;

            for (uint variableIndex = startIndex; variableIndex < variableCount; variableIndex++)
            {
                if (parentSymbolListIndex != Defaults.NoParent && !IsChild(parentSymbolListIndex, parameters, variableIndex))
                    continue;

                DEBUG_SYMBOL_ENTRY entry;
                symbols.GetSymbolEntryInformation(variableIndex, out entry);

                StringBuilder buffer = new StringBuilder(Defaults.BufferSize);
                uint nameSize;

                hr = symbols.GetSymbolNameWide(variableIndex, buffer, Defaults.BufferSize, out nameSize);
                if (hr != HResult.Ok)
                    continue;
                var variableName = buffer.ToString();

                hr = symbols.GetSymbolTypeNameWide(variableIndex, buffer, Defaults.BufferSize, out nameSize);
                if (hr != HResult.Ok)
                    continue;
                var typeName = buffer.ToString();

                hr = symbols.GetSymbolValueTextWide(variableIndex, buffer, Defaults.BufferSize, out nameSize);
                if (hr != HResult.Ok)
                    continue;
                var value = buffer.ToString();

                var typedData = _requestHelper.CreateTypedData(entry.ModuleBase, entry.Offset, entry.TypeId);
                VisualizationResult handledVariable;
                Variable variable;
                if (_visualizers.TryHandle(new VariableMetaData(variableName, typeName, typedData), out handledVariable))
                {
                    variable = State.AddVariable(
                        parentId,
                        (id) => new Variable(id, variableName, typeName, handledVariable.Value, handledVariable.HasChildren),
                        typedData);
                }
                else
                {
                    bool hasChildren = false;
                    if (parameters.Length > variableIndex)
                        hasChildren = parameters[variableIndex].SubElements > 0;

                    variable = State.AddVariable(parentId, (id) => new Variable(id, variableName, typeName, value, hasChildren), typedData);
                }
                result.Add(variable);
            }

            return result;
        }
Ejemplo n.º 3
0
 public void UpdateSymbolGroup(int id, IDebugSymbolGroup2 group)
 {
     _symbolGroups[id] = group;
 }
Ejemplo n.º 4
0
 public ScopeSymbolGroup(IDebugSymbolGroup2 group)
 {
     _group = group;
 }