Browse Source

Disable steppers before detach

git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/trunk@5292 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61
pull/1/head
David Srbecký 16 years ago
parent
commit
0305697c99
  1. 4
      src/AddIns/Debugger/Debugger.Core/ManagedCallback.cs
  2. 29
      src/AddIns/Debugger/Debugger.Core/Process.cs
  3. 7
      src/AddIns/Debugger/Debugger.Core/Stepper.cs
  4. 17
      src/AddIns/Debugger/Debugger.Core/Thread.cs

4
src/AddIns/Debugger/Debugger.Core/ManagedCallback.cs

@ -127,12 +127,12 @@ namespace Debugger
EnterCallback(PausedReason.StepComplete, "StepComplete (" + reason.ToString() + ")", pThread); EnterCallback(PausedReason.StepComplete, "StepComplete (" + reason.ToString() + ")", pThread);
Thread thread = process.Threads[pThread]; Thread thread = process.Threads[pThread];
Stepper stepper = thread.GetStepper(pStepper); Stepper stepper = process.GetStepper(pStepper);
StackFrame currentStackFrame = process.SelectedThread.MostRecentStackFrame; StackFrame currentStackFrame = process.SelectedThread.MostRecentStackFrame;
process.TraceMessage(" - stopped at {0} because of {1}", currentStackFrame.MethodInfo.FullName, stepper.ToString()); process.TraceMessage(" - stopped at {0} because of {1}", currentStackFrame.MethodInfo.FullName, stepper.ToString());
thread.Steppers.Remove(stepper); process.Steppers.Remove(stepper);
stepper.OnStepComplete(reason); stepper.OnStepComplete(reason);
if (stepper.Ignore) { if (stepper.Ignore) {

29
src/AddIns/Debugger/Debugger.Core/Process.cs

@ -93,6 +93,12 @@ namespace Debugger
get { return appDomains; } get { return appDomains; }
} }
List<Stepper> steppers = new List<Stepper>();
internal List<Stepper> Steppers {
get { return steppers; }
}
internal Process(NDebugger debugger, ICorDebugProcess corProcess) internal Process(NDebugger debugger, ICorDebugProcess corProcess)
{ {
this.debugger = debugger; this.debugger = debugger;
@ -390,6 +396,13 @@ namespace Debugger
corProcess.Stop(uint.MaxValue); corProcess.Stop(uint.MaxValue);
NotifyPaused(PausedReason.ForcedBreak); 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(); corProcess.Detach();
NotifyHasExited(); 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() internal void DisableAllSteppers()
{ {
foreach(Thread thread in this.Threads) { foreach(Thread thread in this.Threads) {
thread.CurrentStepIn = null; thread.CurrentStepIn = null;
foreach(Stepper stepper in thread.Steppers) { }
stepper.Ignore = true; foreach(Stepper stepper in this.Steppers) {
} stepper.Ignore = true;
} }
} }

7
src/AddIns/Debugger/Debugger.Core/Stepper.cs

@ -20,10 +20,15 @@ namespace Debugger
string name; string name;
ICorDebugStepper corStepper; ICorDebugStepper corStepper;
bool ignore; bool ignore;
public event EventHandler<StepperEventArgs> StepComplete; public event EventHandler<StepperEventArgs> StepComplete;
public ICorDebugStepper CorStepper {
get { return corStepper; }
}
public Process Process { public Process Process {
get { return stackFrame.Process; } get { return stackFrame.Process; }
} }
@ -58,7 +63,7 @@ namespace Debugger
this.corStepper = stackFrame.CorILFrame.CreateStepper(); this.corStepper = stackFrame.CorILFrame.CreateStepper();
this.ignore = false; this.ignore = false;
this.StackFrame.Thread.Steppers.Add(this); this.StackFrame.Process.Steppers.Add(this);
if (justMyCode) { if (justMyCode) {
corStepper.SetUnmappedStopMask(CorDebugUnmappedStop.STOP_NONE); corStepper.SetUnmappedStopMask(CorDebugUnmappedStop.STOP_NONE);

17
src/AddIns/Debugger/Debugger.Core/Thread.cs

@ -25,7 +25,6 @@ namespace Debugger
bool hasExited = false; bool hasExited = false;
Stepper currentStepIn; Stepper currentStepIn;
List<Stepper> steppers = new List<Stepper>();
StackFrame selectedStackFrame; StackFrame selectedStackFrame;
@ -232,22 +231,6 @@ namespace Debugger
return true; 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<Stepper> Steppers {
get {
return steppers;
}
}
public override string ToString() public override string ToString()
{ {
return String.Format("Thread Name = {1} Suspended = {2}", ID, Name, Suspended); return String.Format("Thread Name = {1} Suspended = {2}", ID, Name, Suspended);

Loading…
Cancel
Save