diff --git a/src/AddIns/Misc/Debugger/Debugger.BooInterpreter/Project/Src/DebugeeInterpreterContext.cs b/src/AddIns/Misc/Debugger/Debugger.BooInterpreter/Project/Src/DebugeeInterpreterContext.cs index 62550b4e3f..57aaa8b1f7 100644 --- a/src/AddIns/Misc/Debugger/Debugger.BooInterpreter/Project/Src/DebugeeInterpreterContext.cs +++ b/src/AddIns/Misc/Debugger/Debugger.BooInterpreter/Project/Src/DebugeeInterpreterContext.cs @@ -137,16 +137,14 @@ namespace Debugger PrintLine("Getting local variable " + name); // First, get out of GC unsafe point Stepper stepOut = new Stepper(debugger.SelectedThread.LastFunction, "Boo interperter"); - stepOut.PauseWhenComplete = true; stepOut.StepComplete += delegate { debugger.MTA2STA.AsyncCall(delegate { if (!interpreter_localVariable.SetValue(localVar)) { PrintLine("Getting of local variable " + name + " failed"); } - debugger.SkipEventsDuringEvaluation = true; + debugger.Continue(); }); }; - debugger.SkipEventsDuringEvaluation = false; stepOut.StepOut(); } diff --git a/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Debugger/Internal/ManagedCallback.cs b/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Debugger/Internal/ManagedCallback.cs index 8fb44ed161..5ae879de52 100644 --- a/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Debugger/Internal/ManagedCallback.cs +++ b/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Debugger/Internal/ManagedCallback.cs @@ -24,7 +24,6 @@ namespace Debugger { NDebugger debugger; bool pauseProcessInsteadOfContinue; - bool skipEventsDuringEvaluation; public NDebugger Debugger { get { @@ -32,15 +31,6 @@ namespace Debugger } } - public bool SkipEventsDuringEvaluation { - get { - return skipEventsDuringEvaluation; - } - set { - skipEventsDuringEvaluation = value; - } - } - public ManagedCallback(NDebugger debugger) { this.debugger = debugger; @@ -65,8 +55,7 @@ namespace Debugger } else { pauseProcessInsteadOfContinue = false; } - debugger.SelectedProcess.IsRunning = false; - debugger.PauseSession = new PauseSession(pausedReason); + debugger.SelectedProcess.NotifyPaused(new PauseSession(pausedReason)); } else { throw new DebuggerException("Invalid state at the start of callback"); } @@ -96,11 +85,11 @@ namespace Debugger void ExitCallback_Paused() { - if (debugger.Evaluating && skipEventsDuringEvaluation) { + if (debugger.Evaluating) { // Ignore events during property evaluation ExitCallback_Continue(); } else { - debugger.Pause(); + debugger.Pause(debugger.PauseSession.PausedReason != PausedReason.EvalComplete); } } diff --git a/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Debugger/NDebugger-StateControl.cs b/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Debugger/NDebugger-StateControl.cs index 3810ef3ec3..7b45edb100 100644 --- a/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Debugger/NDebugger-StateControl.cs +++ b/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Debugger/NDebugger-StateControl.cs @@ -19,9 +19,8 @@ namespace Debugger public partial class NDebugger { bool pauseOnHandledException = false; - ManualResetEvent pausedHandle = new ManualResetEvent(false); + internal ManualResetEvent pausedHandle = new ManualResetEvent(false); - PauseSession pauseSession; DebugeeState debugeeState; Process selectedProcess; @@ -47,7 +46,7 @@ namespace Debugger } } - protected virtual void OnDebuggingResumed() + internal virtual void OnDebuggingResumed() { TraceMessage ("Debugger event: OnDebuggingResumed()"); if (DebuggingResumed != null) { @@ -101,15 +100,13 @@ namespace Debugger } } - /// - /// Indentification of the current debugger session. This value changes whenever debugger is continued - /// public PauseSession PauseSession { get { - return pauseSession; - } - internal set { - pauseSession = value; + if (SelectedProcess == null) { + return null; + } else { + return SelectedProcess.PauseSession; + } } } @@ -138,13 +135,13 @@ namespace Debugger public bool IsPaused { get { - return (pauseSession != null); + return (PauseSession != null); } } public bool IsRunning { get { - return (pauseSession == null); + return !IsPaused; } } @@ -155,11 +152,11 @@ namespace Debugger public PausedReason PausedReason { get { AssertPaused(); - return pauseSession.PausedReason; + return PauseSession.PausedReason; } } - internal void Pause() + internal void Pause(bool debuggeeStateChanged) { if (this.SelectedThread == null && this.Threads.Count > 0) { this.SelectedProcess.SelectedThread = this.Threads[0]; @@ -174,7 +171,7 @@ namespace Debugger this.SelectedThread.SelectedFunction = this.SelectedThread.LastFunctionWithLoadedSymbols; } - if (PausedReason != PausedReason.EvalComplete) { + if (debuggeeStateChanged) { DebugeeState oldDebugeeState = debugeeState; debugeeState = new DebugeeState(this); OnDebuggeeStateChanged(); @@ -196,18 +193,6 @@ namespace Debugger } } - internal void Resume() - { - if (IsRunning) { - throw new DebuggerException("Already resumed"); - } - - pauseSession.NotifyHasExpired(); - pauseSession = null; - OnDebuggingResumed(); - pausedHandle.Reset(); - } - /// /// Waits until the debugger pauses unless it is already paused. /// Use PausedReason to find out why it paused. diff --git a/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Debugger/NDebugger.cs b/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Debugger/NDebugger.cs index 274342a89c..e5becfd1a6 100644 --- a/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Debugger/NDebugger.cs +++ b/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Debugger/NDebugger.cs @@ -50,15 +50,6 @@ namespace Debugger } } - public bool SkipEventsDuringEvaluation { - get { - return managedCallback.SkipEventsDuringEvaluation; - } - set { - managedCallback.SkipEventsDuringEvaluation = value; - } - } - public NDebugger() { if (ApartmentState.STA == System.Threading.Thread.CurrentThread.GetApartmentState()) { @@ -133,7 +124,6 @@ namespace Debugger selectedProcess = null; pausedHandle.Reset(); - pauseSession = null; pendingEvalsCollection.Clear(); diff --git a/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Threads/Function.cs b/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Threads/Function.cs index 16cbd8a2b7..474b1685b1 100644 --- a/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Threads/Function.cs +++ b/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Threads/Function.cs @@ -343,8 +343,8 @@ namespace Debugger } else { // invalidates all frames and chains for the current thread CorILFrame.SetIP((uint)ilOffset); - debugger.PauseSession = new PauseSession(PausedReason.SetIP); - debugger.Pause(); + debugger.SelectedProcess.NotifyPaused(new PauseSession(PausedReason.SetIP)); + debugger.Pause(false); } } catch { return null; diff --git a/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Threads/Process.cs b/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Threads/Process.cs index 3801d1c52f..ba572621ba 100644 --- a/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Threads/Process.cs +++ b/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Threads/Process.cs @@ -21,7 +21,7 @@ namespace Debugger ICorDebugProcess corProcess; Thread selectedThread; - bool isProcessRunning = true; + PauseSession pauseSession; bool hasExpired = false; @@ -43,6 +43,19 @@ namespace Debugger } } + /// + /// Indentification of the current debugger session. This value changes whenever debugger is continued + /// + public PauseSession PauseSession { + get { + return pauseSession; + } + } + + internal void NotifyPaused(PauseSession pauseSession) + { + this.pauseSession = pauseSession; + } public NDebugger Debugger { get { @@ -127,27 +140,25 @@ namespace Debugger internal void Break() { - if (!isProcessRunning) { - throw new DebuggerException("Invalid operation"); - } + AssertRunning(); corProcess.Stop(5000); // TODO: Hardcoded value - isProcessRunning = false; - debugger.PauseSession = new PauseSession(PausedReason.ForcedBreak); + pauseSession = new PauseSession(PausedReason.ForcedBreak); debugger.SelectedProcess = this; - debugger.Pause(); + debugger.Pause(true); } public void Continue() { - if (isProcessRunning) { - throw new DebuggerException("Invalid operation"); - } + AssertPaused(); + + pauseSession.NotifyHasExpired(); + pauseSession = null; + debugger.OnDebuggingResumed(); + debugger.pausedHandle.Reset(); - debugger.Resume(); - isProcessRunning = true; corProcess.Continue(0); } @@ -164,24 +175,28 @@ namespace Debugger public bool IsRunning { get { - return isProcessRunning; - } - internal set { - isProcessRunning = value; + return pauseSession == null; } } public bool IsPaused { get { - return !isProcessRunning; + return !IsRunning; } } public void AssertPaused() { - if (!IsPaused) { + if (IsRunning) { throw new DebuggerException("Process is not paused."); } } + + public void AssertRunning() + { + if (IsPaused) { + throw new DebuggerException("Process is not running."); + } + } } }