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}" />