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.");
+ }
+ }
}
}