From d1c8d024f8d06572213d80eeb2deee78324e235b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Srbeck=C3=BD?= Date: Mon, 3 Apr 2006 23:14:31 +0000 Subject: [PATCH] Steppers refactored git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/branches/2.0@1265 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61 --- .../Project/Debugger.Core.csproj | 1 + .../Src/Debugger/Internal/ManagedCallback.cs | 34 ++++++----- .../Project/Src/Threads/Function.cs | 61 ++++++++----------- .../Project/Src/Threads/Thread.cs | 41 +------------ .../Src/Wrappers/CorDebug/ICorDebugStepper.cs | 22 +++++++ 5 files changed, 70 insertions(+), 89 deletions(-) create mode 100644 src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Wrappers/CorDebug/ICorDebugStepper.cs diff --git a/src/AddIns/Misc/Debugger/Debugger.Core/Project/Debugger.Core.csproj b/src/AddIns/Misc/Debugger/Debugger.Core/Project/Debugger.Core.csproj index 96b9989fd8..d75a1342ae 100644 --- a/src/AddIns/Misc/Debugger/Debugger.Core/Project/Debugger.Core.csproj +++ b/src/AddIns/Misc/Debugger/Debugger.Core/Project/Debugger.Core.csproj @@ -370,6 +370,7 @@ + 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 cd6ac8d86c..25c3925dca 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 @@ -13,6 +13,7 @@ // \1\2\n\1{\n\1\tEnterCallback(PausedReason.Other, "\3");\n\1\t\n\1\tExitCallback_Continue();\n\1} using System; +using System.Collections.Generic; using System.Runtime.InteropServices; using Debugger.Wrappers.CorDebug; @@ -69,7 +70,11 @@ namespace Debugger void ExitCallback_Paused() { if (debugger.SelectedThread != null) { - debugger.SelectedThread.DeactivateAllSteppers(); + // Disable all steppers - do not Deactivate since function tracking still needs them + foreach(Stepper s in debugger.SelectedThread.Steppers) { + s.PauseWhenComplete = false; + } + debugger.SelectedThread.SelectedFunction = debugger.SelectedThread.LastFunctionWithLoadedSymbols; } debugger.Pause(); @@ -82,23 +87,22 @@ namespace Debugger { EnterCallback(PausedReason.StepComplete, "StepComplete (" + reason.ToString() + ")", pThread); - Stepper stepper = debugger.GetThread(pThread).GetStepper(pStepper); - if (stepper != null) { - stepper.OnStepComplete(); - if (!stepper.PauseWhenComplete) { + Thread thread = debugger.GetThread(pThread); + Stepper stepper = thread.GetStepper(pStepper); + + thread.Steppers.Remove(stepper); + stepper.OnStepComplete(); + if (stepper.PauseWhenComplete) { + if (debugger.SelectedThread.LastFunction.HasSymbols) { + ExitCallback_Paused(); + } else { + // This should not happen with JMC enabled + debugger.TraceMessage(" - leaving code without symbols"); + ExitCallback_Continue(); - return; } - } - - if (!debugger.SelectedThread.LastFunction.HasSymbols) { - // This should not happen with JMC enabled - debugger.TraceMessage(" - leaving code without symbols"); - - ExitCallback_Continue(); } else { - - ExitCallback_Paused(); + ExitCallback_Continue(); } } 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 9bce372c46..890a44cf01 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 @@ -25,6 +25,8 @@ namespace Debugger ICorDebugILFrame corILFrame; object corILFramePauseSession; + Stepper stepOutStepper; + bool steppedOut; Thread thread; uint chainIndex; @@ -117,10 +119,10 @@ namespace Debugger methodProps = module.MetaData.GetMethodProps(corFunction.Token); // Expiry the function when it is finished - Stepper tracingStepper = thread.CreateStepper(); - tracingStepper.CorStepper.StepOut(); - tracingStepper.PauseWhenComplete = false; - tracingStepper.StepComplete += delegate { + stepOutStepper = CreateStepper(); + stepOutStepper.CorStepper.StepOut(); + stepOutStepper.PauseWhenComplete = false; + stepOutStepper.StepComplete += delegate { steppedOut = true; OnExpired(EventArgs.Empty); }; @@ -167,6 +169,17 @@ namespace Debugger } } + internal Stepper CreateStepper() + { + Stepper stepper = new Stepper(debugger, corILFrame.CreateStepper()); + if (stepper.CorStepper.Is()) { // Is the debuggee .NET 2.0? + stepper.CorStepper.SetUnmappedStopMask(CorDebugUnmappedStop.STOP_NONE); + (stepper.CorStepper.CastTo()).SetJMC(1 /* true */); + } + thread.Steppers.Add(stepper); + return stepper; + } + public void StepInto() { Step(true); @@ -179,11 +192,7 @@ namespace Debugger public void StepOut() { - ICorDebugStepper stepper = CorILFrame.CreateStepper(); - stepper.StepOut(); - - thread.AddActiveStepper(stepper); - + stepOutStepper.PauseWhenComplete = true; debugger.Continue(); } @@ -200,38 +209,18 @@ namespace Debugger throw new DebuggerException("Unable to step. Next statement not aviable"); } - ICorDebugStepper stepper; + Stepper stepper; if (stepIn) { - stepper = CorILFrame.CreateStepper(); - - if (stepper.Is()) { // Is the debuggee .NET 2.0? - stepper.SetUnmappedStopMask(CorDebugUnmappedStop.STOP_NONE); - (stepper.CastTo()).SetJMC(1 /* true */); - } - - fixed (int* ranges = nextSt.StepRanges) { - stepper.StepRange(1 /* true - step in*/ , (IntPtr)ranges, (uint)nextSt.StepRanges.Length / 2); - } - - thread.AddActiveStepper(stepper); - } - - // Mind that step in which ends in code without symblols is cotinued - // so the next step over ensures that we atleast do step over - - stepper = CorILFrame.CreateStepper(); - - if (stepper.Is()) { // Is the debuggee .NET 2.0? - stepper.SetUnmappedStopMask(CorDebugUnmappedStop.STOP_NONE); - (stepper.CastTo()).SetJMC(1 /* true */); + stepper = CreateStepper(); + stepper.CorStepper.StepRange(true /* step in */, nextSt.StepRanges); } - fixed (int* ranges = nextSt.StepRanges) { - stepper.StepRange(0 /* false - step over*/ , (IntPtr)ranges, (uint)nextSt.StepRanges.Length / 2); - } + // Without JMC step in which ends in code without symblols is cotinued. + // The next step over ensures that we at least do step over. - thread.AddActiveStepper(stepper); + stepper = CreateStepper(); + stepper.CorStepper.StepRange(false /* step over */ , nextSt.StepRanges); debugger.Continue(); } diff --git a/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Threads/Thread.cs b/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Threads/Thread.cs index bed5587464..5f039f0f65 100644 --- a/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Threads/Thread.cs +++ b/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Threads/Thread.cs @@ -23,7 +23,6 @@ namespace Debugger internal ExceptionType currentExceptionType; Process process; - List activeSteppers = new List(); List steppers = new List(); uint id; @@ -140,18 +139,6 @@ namespace Debugger process.Continue(); } - internal Stepper CreateStepper() - { - Stepper stepper = new Stepper(debugger, corThread.CreateStepper()); - stepper.StepComplete += delegate { - steppers.Remove(stepper); - }; - - steppers.Add(stepper); - - return stepper; - } - internal Stepper GetStepper(ICorDebugStepper corStepper) { foreach(Stepper stepper in steppers) { @@ -159,35 +146,13 @@ namespace Debugger return stepper; } } - return null; - } - - internal IList Steppers { - get { - return steppers.AsReadOnly(); - } + throw new DebuggerException("Stepper is not in collection"); } - internal IList ActiveSteppers { + internal List Steppers { get { - return activeSteppers.AsReadOnly(); - } - } - - internal void AddActiveStepper(ICorDebugStepper stepper) - { - activeSteppers.Add(stepper); - } - - internal void DeactivateAllSteppers() - { - foreach(ICorDebugStepper stepper in activeSteppers) { - if (stepper.IsActive != 0) { - stepper.Deactivate(); - debugger.TraceMessage("Stepper deactivated"); - } + return steppers; } - activeSteppers.Clear(); } public event EventHandler ThreadStateChanged; diff --git a/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Wrappers/CorDebug/ICorDebugStepper.cs b/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Wrappers/CorDebug/ICorDebugStepper.cs new file mode 100644 index 0000000000..5492043279 --- /dev/null +++ b/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Wrappers/CorDebug/ICorDebugStepper.cs @@ -0,0 +1,22 @@ +// +// +// +// +// $Revision$ +// + +namespace Debugger.Wrappers.CorDebug +{ + using System; + + + public partial class ICorDebugStepper + { + public unsafe void StepRange(bool bStepIn, int[] ranges) + { + fixed (int* pRanges = ranges) { + this.StepRange(bStepIn?1:0, (IntPtr)pRanges, (uint)ranges.Length / 2); + } + } + } +}