Example #1
0
        void AddMarkers(bool updateActiveStatements)
        {
            Debug.Assert(currentStatementMarker == null);
            Debug.Assert(callReturnMarker == null);
            bool tooManyFrames;
            var  frames = stackFrameManager.GetFrames(out tooManyFrames);

            if (frames.Count == 0)
            {
                return;
            }

            var methodOffset = GetModuleTokenId(frames[0]);

            if (methodOffset != null)
            {
                currentStatementMarker = glyphTextMarkerService.AddMarker(
                    methodOffset.Value.Key,
                    methodOffset.Value.Value,
                    new ImageReference(GetType().Assembly, "CurrentStatement"),
                    ThemeClassificationTypeNameKeys.CurrentStatementMarker,
                    null,
                    classificationTypeCurrentStatement,
                    GlyphTextMarkerServiceZIndexes.CurrentStatement,
                    null,
                    null,
                    textViewFilter);
            }

            int selectedFrameNumber = stackFrameManager.SelectedFrameNumber;

            methodOffset = selectedFrameNumber != 0 && selectedFrameNumber < frames.Count ? GetModuleTokenId(frames[selectedFrameNumber]) : null;
            if (methodOffset != null)
            {
                callReturnMarker = glyphTextMarkerService.AddMarker(
                    methodOffset.Value.Key,
                    methodOffset.Value.Value,
                    new ImageReference(GetType().Assembly, "CallReturn"),
                    ThemeClassificationTypeNameKeys.CallReturnMarker,
                    null,
                    classificationTypeCallReturn,
                    GlyphTextMarkerServiceZIndexes.ReturnStatement,
                    null,
                    null,
                    textViewFilter);
            }

            if (updateActiveStatements)
            {
                activeStatementService.Value.OnNewActiveStatements(frames);
            }
        }
Example #2
0
        void InitializeStackFrames()
        {
            if (!IsEnabled || theDebugger.ProcessState != DebuggerProcessState.Paused)
            {
                framesList.Clear();
                return;
            }

            var process = theDebugger.Debugger?.Processes?.FirstOrDefault();

            Debug.Assert(process != null);
            if (process == null)
            {
                framesList.Clear();
                return;
            }

            bool tooManyFrames;
            var  newFrames = stackFrameManager.GetFrames(out tooManyFrames);

            bool oldHadTooManyFrames   = framesList.Count > 0 && framesList[framesList.Count - 1] is MessageCallStackFrameVM;
            int  oldVisibleFramesCount = framesList.Count - (oldHadTooManyFrames ? 1 : 0);

            int       framesToAdd     = newFrames.Count - oldVisibleFramesCount;
            const int MAX_FRAMES_DIFF = 50;

            if (Math.Abs(framesToAdd) > MAX_FRAMES_DIFF)
            {
                oldHadTooManyFrames   = false;
                oldVisibleFramesCount = 0;
                framesToAdd           = newFrames.Count;
                framesList.Clear();
            }

            if (framesToAdd > 0)
            {
                for (int i = 0; i < framesToAdd; i++)
                {
                    var frame = newFrames[i];
                    var vm    = new CallStackFrameVM(callStackFrameContext, i, frame, process);
                    vm.IsCurrentFrame = i == stackFrameManager.SelectedFrameNumber;
                    vm.IsUserCode     = IsUserCode(frame);

                    if (framesList.Count == i)
                    {
                        framesList.Add(vm);
                    }
                    else
                    {
                        framesList.Insert(i, vm);
                    }
                }
            }
            else if (framesToAdd < 0)
            {
                int frames = framesToAdd;
                while (frames++ < 0)
                {
                    framesList.RemoveAt(0);
                }
            }

            for (int i = framesToAdd >= 0 ? framesToAdd : 0; i < newFrames.Count; i++)
            {
                var vm    = (CallStackFrameVM)framesList[i];
                var frame = newFrames[i];

                vm.Index          = i;
                vm.IsCurrentFrame = i == stackFrameManager.SelectedFrameNumber;
                vm.IsUserCode     = IsUserCode(frame);
                vm.SetFrame(frame, process);
            }

            if (oldHadTooManyFrames == tooManyFrames)
            {
            }
            else if (oldHadTooManyFrames && !tooManyFrames)
            {
                bool b = framesList.Count > 0 && framesList[framesList.Count - 1] is MessageCallStackFrameVM;
                Debug.Assert(b);
                if (b)
                {
                    framesList.RemoveAt(framesList.Count - 1);
                }
            }
            else if (!oldHadTooManyFrames && tooManyFrames)
            {
                framesList.Add(new MessageCallStackFrameVM(callStackFrameContext, newFrames.Count, dnSpy_Debugger_Resources.CallStack_MaxFramesExceeded));
            }
        }