diff --git a/src/AddIns/Misc/Debugger/Debugger.AddIn/Project/Src/TreeModel/Utils.cs b/src/AddIns/Misc/Debugger/Debugger.AddIn/Project/Src/TreeModel/Utils.cs index f462673927..eb500d08fe 100644 --- a/src/AddIns/Misc/Debugger/Debugger.AddIn/Project/Src/TreeModel/Utils.cs +++ b/src/AddIns/Misc/Debugger/Debugger.AddIn/Project/Src/TreeModel/Utils.cs @@ -31,12 +31,6 @@ namespace Debugger.AddIn.TreeModel throw new AbortedBecauseDebuggeeResumedException(); } } - - public static WindowsDebugger WindowsDebugger { - get { - return (WindowsDebugger)DebuggerService.CurrentDebugger; - } - } } public class AbortedBecauseDebuggeeResumedException: System.Exception diff --git a/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Control/Process-StateControl.cs b/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Control/Process-StateControl.cs index ca0fe243ca..a0cc17d0b1 100644 --- a/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Control/Process-StateControl.cs +++ b/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Control/Process-StateControl.cs @@ -101,6 +101,7 @@ namespace Debugger internal void RaisePausedEvents() { DisableAllSteppers(); + CheckSelectedStackFrames(); SelectMostRecentStackFrameWithLoadedSymbols(); if (this.PauseSession.PausedReason == PausedReason.Exception) { @@ -262,6 +263,19 @@ namespace Debugger } } + internal void CheckSelectedStackFrames() + { + foreach(Thread thread in this.Threads) { + if (thread.IsInValidState) { + if (thread.SelectedStackFrame != null && thread.SelectedStackFrame.IsInvalid) { + thread.SelectedStackFrame = null; + } + } else { + thread.SelectedStackFrame = null; + } + } + } + internal void SelectMostRecentStackFrameWithLoadedSymbols() { SelectSomeThread(); diff --git a/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Control/StackFrame.cs b/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Control/StackFrame.cs index e96f33769d..61d967c773 100644 --- a/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Control/StackFrame.cs +++ b/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Control/StackFrame.cs @@ -74,11 +74,15 @@ namespace Debugger } } - /// Returns true is this incance can not be used any more. - /// Stack frame is valid only until the debugee is resumed. + /// Returns true is this incance can not be used any more. public bool IsInvalid { get { - return this.corILFramePauseSession != process.PauseSession; + try { + object frame = this.CorILFrame; + return false; + } catch (DebuggerException) { + return true; + } } } @@ -108,7 +112,13 @@ namespace Debugger internal ICorDebugILFrame CorILFrame { get { - if (this.IsInvalid) throw new DebuggerException("StackFrame is not valid anymore"); + if (corILFramePauseSession != this.Process.PauseSession) { + // Reobtain the stackframe + StackFrame stackFrame = this.Thread.GetStackFrameAt(chainIndex, frameIndex); + if (stackFrame.MethodInfo != this.MethodInfo) throw new DebuggerException("The stack frame on the thread does not represent the same method anymore"); + corILFrame = stackFrame.corILFrame; + corILFramePauseSession = stackFrame.corILFramePauseSession; + } return corILFrame; } } @@ -121,13 +131,6 @@ namespace Debugger } } - internal StackFrame Reobtain() - { - StackFrame stackFrame = this.Thread.GetStackFrameAt(chainIndex, frameIndex); - if (stackFrame.MethodInfo != this.MethodInfo) throw new DebuggerException("The stack frame on the thread does not represent the same method anymore"); - return stackFrame; - } - SourcecodeSegment GetSegmentForOffet(uint offset) { return SourcecodeSegment.Resolve(this.MethodInfo.Module, corFunction, offset); diff --git a/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Internal/ManagedCallback.cs b/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Internal/ManagedCallback.cs index 6ffeb86607..f1ee95f6b5 100644 --- a/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Internal/ManagedCallback.cs +++ b/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Internal/ManagedCallback.cs @@ -107,8 +107,9 @@ namespace Debugger { if (process.PauseSession.PausedReason == PausedReason.EvalComplete || process.PauseSession.PausedReason == PausedReason.ExceptionIntercepted) { - process.SelectMostRecentStackFrameWithLoadedSymbols(); process.DisableAllSteppers(); + process.CheckSelectedStackFrames(); + // Do not set selected stack frame // Do not raise events } else { // Raise the pause event outside the callback diff --git a/src/AddIns/Misc/Debugger/Debugger.Tests/Project/Src/TestPrograms/FunctionLifetime.cs b/src/AddIns/Misc/Debugger/Debugger.Tests/Project/Src/TestPrograms/FunctionLifetime.cs index 8b3f4f1c68..07089cecd5 100644 --- a/src/AddIns/Misc/Debugger/Debugger.Tests/Project/Src/TestPrograms/FunctionLifetime.cs +++ b/src/AddIns/Misc/Debugger/Debugger.Tests/Project/Src/TestPrograms/FunctionLifetime.cs @@ -84,13 +84,13 @@ namespace Debugger.Tests { Break FunctionLifetime.cs:29,4-29,40 + NextStatement="FunctionLifetime.cs:23,4-23,18" /> Break FunctionLifetime.cs:24,4-24,40 + NextStatement="FunctionLifetime.cs:24,4-24,40" /> + NextStatement="{Exception: The requested frame index is too big}" />