diff --git a/src/AddIns/Debugger/Debugger.Core/ManagedCallback.cs b/src/AddIns/Debugger/Debugger.Core/ManagedCallback.cs index ef83a76d63..003280051e 100644 --- a/src/AddIns/Debugger/Debugger.Core/ManagedCallback.cs +++ b/src/AddIns/Debugger/Debugger.Core/ManagedCallback.cs @@ -127,12 +127,12 @@ namespace Debugger EnterCallback(PausedReason.StepComplete, "StepComplete (" + reason.ToString() + ")", pThread); Thread thread = process.Threads[pThread]; - Stepper stepper = thread.GetStepper(pStepper); + Stepper stepper = process.GetStepper(pStepper); StackFrame currentStackFrame = process.SelectedThread.MostRecentStackFrame; process.TraceMessage(" - stopped at {0} because of {1}", currentStackFrame.MethodInfo.FullName, stepper.ToString()); - thread.Steppers.Remove(stepper); + process.Steppers.Remove(stepper); stepper.OnStepComplete(reason); if (stepper.Ignore) { diff --git a/src/AddIns/Debugger/Debugger.Core/Process.cs b/src/AddIns/Debugger/Debugger.Core/Process.cs index 9fc0d34543..682474f88f 100644 --- a/src/AddIns/Debugger/Debugger.Core/Process.cs +++ b/src/AddIns/Debugger/Debugger.Core/Process.cs @@ -93,6 +93,12 @@ namespace Debugger get { return appDomains; } } + List steppers = new List(); + + internal List Steppers { + get { return steppers; } + } + internal Process(NDebugger debugger, ICorDebugProcess corProcess) { this.debugger = debugger; @@ -390,6 +396,13 @@ namespace Debugger corProcess.Stop(uint.MaxValue); NotifyPaused(PausedReason.ForcedBreak); } + // This is necessary for detach + foreach(Stepper s in this.Steppers) { + if (s.CorStepper.IsActive() == 1) { + s.CorStepper.Deactivate(); + } + } + this.Steppers.Clear(); corProcess.Detach(); NotifyHasExited(); } @@ -537,13 +550,23 @@ namespace Debugger } } + internal Stepper GetStepper(ICorDebugStepper corStepper) + { + foreach(Stepper stepper in this.Steppers) { + if (stepper.IsCorStepper(corStepper)) { + return stepper; + } + } + throw new DebuggerException("Stepper is not in collection"); + } + internal void DisableAllSteppers() { foreach(Thread thread in this.Threads) { thread.CurrentStepIn = null; - foreach(Stepper stepper in thread.Steppers) { - stepper.Ignore = true; - } + } + foreach(Stepper stepper in this.Steppers) { + stepper.Ignore = true; } } diff --git a/src/AddIns/Debugger/Debugger.Core/Stepper.cs b/src/AddIns/Debugger/Debugger.Core/Stepper.cs index b4bed0c7cb..756fd53cf7 100644 --- a/src/AddIns/Debugger/Debugger.Core/Stepper.cs +++ b/src/AddIns/Debugger/Debugger.Core/Stepper.cs @@ -20,10 +20,15 @@ namespace Debugger string name; ICorDebugStepper corStepper; + bool ignore; public event EventHandler StepComplete; + public ICorDebugStepper CorStepper { + get { return corStepper; } + } + public Process Process { get { return stackFrame.Process; } } @@ -58,7 +63,7 @@ namespace Debugger this.corStepper = stackFrame.CorILFrame.CreateStepper(); this.ignore = false; - this.StackFrame.Thread.Steppers.Add(this); + this.StackFrame.Process.Steppers.Add(this); if (justMyCode) { corStepper.SetUnmappedStopMask(CorDebugUnmappedStop.STOP_NONE); diff --git a/src/AddIns/Debugger/Debugger.Core/Thread.cs b/src/AddIns/Debugger/Debugger.Core/Thread.cs index 16e964e271..5de4584253 100644 --- a/src/AddIns/Debugger/Debugger.Core/Thread.cs +++ b/src/AddIns/Debugger/Debugger.Core/Thread.cs @@ -25,7 +25,6 @@ namespace Debugger bool hasExited = false; Stepper currentStepIn; - List steppers = new List(); StackFrame selectedStackFrame; @@ -232,22 +231,6 @@ namespace Debugger return true; } - internal Stepper GetStepper(ICorDebugStepper corStepper) - { - foreach(Stepper stepper in steppers) { - if (stepper.IsCorStepper(corStepper)) { - return stepper; - } - } - throw new DebuggerException("Stepper is not in collection"); - } - - internal List Steppers { - get { - return steppers; - } - } - public override string ToString() { return String.Format("Thread Name = {1} Suspended = {2}", ID, Name, Suspended);