void AddMarkers(bool updateActiveStatements) { Debug.Assert(currentStatementMarker == null); Debug.Assert(callReturnMarker == null); bool tooManyFrames; var frames = stackFrameService.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, DsImages.CurrentInstructionPointer, ThemeClassificationTypeNameKeys.CurrentStatementMarker, null, classificationTypeCurrentStatement, GlyphTextMarkerServiceZIndexes.CurrentStatement, null, null, textViewFilter); } int selectedFrameNumber = stackFrameService.SelectedFrameNumber; methodOffset = selectedFrameNumber != 0 && selectedFrameNumber < frames.Count ? GetModuleTokenId(frames[selectedFrameNumber]) : null; if (methodOffset != null) { callReturnMarker = glyphTextMarkerService.AddMarker( methodOffset.Value.Key, methodOffset.Value.Value, DsImages.CallReturnInstructionPointer, ThemeClassificationTypeNameKeys.CallReturnMarker, null, classificationTypeCallReturn, GlyphTextMarkerServiceZIndexes.ReturnStatement, null, null, textViewFilter); } if (updateActiveStatements) { activeStatementService.Value.OnNewActiveStatements(frames); } }
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 = stackFrameService.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 == stackFrameService.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 == stackFrameService.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)); } }