예제 #1
0
 internal static void Execute(CallStackFrameVM vm, bool newTab)
 {
     if (vm != null)
     {
         StackFrameManager.Instance.SelectedFrameNumber = vm.Index;
         FrameUtils.GoTo(vm.Frame, newTab);
     }
 }
예제 #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 = 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));
            }
        }
예제 #3
0
 internal static void Execute(IModuleIdProvider moduleIdProvider, IStackFrameService stackFrameService, IDocumentTabService documentTabService, IModuleLoader moduleLoader, CallStackFrameVM vm, bool newTab)
 {
     if (vm != null)
     {
         stackFrameService.SelectedFrameNumber = vm.Index;
         FrameUtils.GoTo(moduleIdProvider, documentTabService, moduleLoader, vm.Frame, newTab);
     }
 }
예제 #4
0
 internal static void Execute(IStackFrameManager stackFrameManager, IFileTabManager fileTabManager, IModuleLoader moduleLoader, CallStackFrameVM vm, bool newTab)
 {
     if (vm != null)
     {
         stackFrameManager.SelectedFrameNumber = vm.Index;
         FrameUtils.GoTo(fileTabManager, moduleLoader, vm.Frame, newTab);
     }
 }
예제 #5
0
파일: CallStackVM.cs 프로젝트: ottrur/dnSpy
        internal void InitializeStackFrames()
        {
            if (!IsEnabled)
            {
                framesList.Clear();
                return;
            }

            bool tooManyFrames;
            var  newFrames = StackFrameManager.Instance.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(this, i, frame);
                    vm.IsCurrentFrame = i == StackFrameManager.Instance.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.Instance.SelectedFrameNumber;
                vm.IsUserCode     = IsUserCode(frame);
                vm.Frame          = frame;
            }

            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(this, newFrames.Count, "The maximum number of stack frames supported by dnSpy has been exceeded."));
            }
        }
예제 #6
0
		internal void InitializeStackFrames() {
			if (!IsEnabled) {
				framesList.Clear();
				return;
			}

			bool tooManyFrames;
			var newFrames = StackFrameManager.Instance.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(this, i, frame);
					vm.IsCurrentFrame = i == StackFrameManager.Instance.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.Instance.SelectedFrameNumber;
				vm.IsUserCode = IsUserCode(frame);
				vm.Frame = frame;
			}

			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(this, newFrames.Count, "The maximum number of stack frames supported by dnSpy has been exceeded."));
		}
예제 #7
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 = 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));
		}