Browse Source

Steppers refactored

git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/branches/2.0@1265 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61
shortcuts
David Srbecký 20 years ago
parent
commit
d1c8d024f8
  1. 1
      src/AddIns/Misc/Debugger/Debugger.Core/Project/Debugger.Core.csproj
  2. 28
      src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Debugger/Internal/ManagedCallback.cs
  3. 61
      src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Threads/Function.cs
  4. 41
      src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Threads/Thread.cs
  5. 22
      src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Wrappers/CorDebug/ICorDebugStepper.cs

1
src/AddIns/Misc/Debugger/Debugger.Core/Project/Debugger.Core.csproj

@ -370,6 +370,7 @@
<Compile Include="Src\Wrappers\CorSym\Autogenerated\ISymUnmanagedDispose.cs" /> <Compile Include="Src\Wrappers\CorSym\Autogenerated\ISymUnmanagedDispose.cs" />
<Compile Include="Src\Debugger\DebugeeState.cs" /> <Compile Include="Src\Debugger\DebugeeState.cs" />
<Compile Include="Src\Debugger\PauseSession.cs" /> <Compile Include="Src\Debugger\PauseSession.cs" />
<Compile Include="Src\Wrappers\CorDebug\ICorDebugStepper.cs" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<Content Include="README.TXT" /> <Content Include="README.TXT" />

28
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} // \1\2\n\1{\n\1\tEnterCallback(PausedReason.Other, "\3");\n\1\t\n\1\tExitCallback_Continue();\n\1}
using System; using System;
using System.Collections.Generic;
using System.Runtime.InteropServices; using System.Runtime.InteropServices;
using Debugger.Wrappers.CorDebug; using Debugger.Wrappers.CorDebug;
@ -69,7 +70,11 @@ namespace Debugger
void ExitCallback_Paused() void ExitCallback_Paused()
{ {
if (debugger.SelectedThread != null) { 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.SelectedThread.SelectedFunction = debugger.SelectedThread.LastFunctionWithLoadedSymbols;
} }
debugger.Pause(); debugger.Pause();
@ -82,23 +87,22 @@ namespace Debugger
{ {
EnterCallback(PausedReason.StepComplete, "StepComplete (" + reason.ToString() + ")", pThread); EnterCallback(PausedReason.StepComplete, "StepComplete (" + reason.ToString() + ")", pThread);
Stepper stepper = debugger.GetThread(pThread).GetStepper(pStepper); Thread thread = debugger.GetThread(pThread);
if (stepper != null) { Stepper stepper = thread.GetStepper(pStepper);
stepper.OnStepComplete();
if (!stepper.PauseWhenComplete) {
ExitCallback_Continue();
return;
}
}
if (!debugger.SelectedThread.LastFunction.HasSymbols) { thread.Steppers.Remove(stepper);
stepper.OnStepComplete();
if (stepper.PauseWhenComplete) {
if (debugger.SelectedThread.LastFunction.HasSymbols) {
ExitCallback_Paused();
} else {
// This should not happen with JMC enabled // This should not happen with JMC enabled
debugger.TraceMessage(" - leaving code without symbols"); debugger.TraceMessage(" - leaving code without symbols");
ExitCallback_Continue(); ExitCallback_Continue();
}
} else { } else {
ExitCallback_Continue();
ExitCallback_Paused();
} }
} }

61
src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Threads/Function.cs

@ -25,6 +25,8 @@ namespace Debugger
ICorDebugILFrame corILFrame; ICorDebugILFrame corILFrame;
object corILFramePauseSession; object corILFramePauseSession;
Stepper stepOutStepper;
bool steppedOut; bool steppedOut;
Thread thread; Thread thread;
uint chainIndex; uint chainIndex;
@ -117,10 +119,10 @@ namespace Debugger
methodProps = module.MetaData.GetMethodProps(corFunction.Token); methodProps = module.MetaData.GetMethodProps(corFunction.Token);
// Expiry the function when it is finished // Expiry the function when it is finished
Stepper tracingStepper = thread.CreateStepper(); stepOutStepper = CreateStepper();
tracingStepper.CorStepper.StepOut(); stepOutStepper.CorStepper.StepOut();
tracingStepper.PauseWhenComplete = false; stepOutStepper.PauseWhenComplete = false;
tracingStepper.StepComplete += delegate { stepOutStepper.StepComplete += delegate {
steppedOut = true; steppedOut = true;
OnExpired(EventArgs.Empty); OnExpired(EventArgs.Empty);
}; };
@ -167,6 +169,17 @@ namespace Debugger
} }
} }
internal Stepper CreateStepper()
{
Stepper stepper = new Stepper(debugger, corILFrame.CreateStepper());
if (stepper.CorStepper.Is<ICorDebugStepper2>()) { // Is the debuggee .NET 2.0?
stepper.CorStepper.SetUnmappedStopMask(CorDebugUnmappedStop.STOP_NONE);
(stepper.CorStepper.CastTo<ICorDebugStepper2>()).SetJMC(1 /* true */);
}
thread.Steppers.Add(stepper);
return stepper;
}
public void StepInto() public void StepInto()
{ {
Step(true); Step(true);
@ -179,11 +192,7 @@ namespace Debugger
public void StepOut() public void StepOut()
{ {
ICorDebugStepper stepper = CorILFrame.CreateStepper(); stepOutStepper.PauseWhenComplete = true;
stepper.StepOut();
thread.AddActiveStepper(stepper);
debugger.Continue(); debugger.Continue();
} }
@ -200,38 +209,18 @@ namespace Debugger
throw new DebuggerException("Unable to step. Next statement not aviable"); throw new DebuggerException("Unable to step. Next statement not aviable");
} }
ICorDebugStepper stepper; Stepper stepper;
if (stepIn) { if (stepIn) {
stepper = CorILFrame.CreateStepper(); stepper = CreateStepper();
stepper.CorStepper.StepRange(true /* step in */, nextSt.StepRanges);
if (stepper.Is<ICorDebugStepper2>()) { // Is the debuggee .NET 2.0?
stepper.SetUnmappedStopMask(CorDebugUnmappedStop.STOP_NONE);
(stepper.CastTo<ICorDebugStepper2>()).SetJMC(1 /* true */);
} }
fixed (int* ranges = nextSt.StepRanges) { // Without JMC step in which ends in code without symblols is cotinued.
stepper.StepRange(1 /* true - step in*/ , (IntPtr)ranges, (uint)nextSt.StepRanges.Length / 2); // The next step over ensures that we at least do step over.
}
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<ICorDebugStepper2>()) { // Is the debuggee .NET 2.0?
stepper.SetUnmappedStopMask(CorDebugUnmappedStop.STOP_NONE);
(stepper.CastTo<ICorDebugStepper2>()).SetJMC(1 /* true */);
}
fixed (int* ranges = nextSt.StepRanges) {
stepper.StepRange(0 /* false - step over*/ , (IntPtr)ranges, (uint)nextSt.StepRanges.Length / 2);
}
thread.AddActiveStepper(stepper); stepper = CreateStepper();
stepper.CorStepper.StepRange(false /* step over */ , nextSt.StepRanges);
debugger.Continue(); debugger.Continue();
} }

41
src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Threads/Thread.cs

@ -23,7 +23,6 @@ namespace Debugger
internal ExceptionType currentExceptionType; internal ExceptionType currentExceptionType;
Process process; Process process;
List<ICorDebugStepper> activeSteppers = new List<ICorDebugStepper>();
List<Stepper> steppers = new List<Stepper>(); List<Stepper> steppers = new List<Stepper>();
uint id; uint id;
@ -140,18 +139,6 @@ namespace Debugger
process.Continue(); 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) internal Stepper GetStepper(ICorDebugStepper corStepper)
{ {
foreach(Stepper stepper in steppers) { foreach(Stepper stepper in steppers) {
@ -159,35 +146,13 @@ namespace Debugger
return stepper; return stepper;
} }
} }
return null; throw new DebuggerException("Stepper is not in collection");
}
internal IList<Stepper> Steppers {
get {
return steppers.AsReadOnly();
}
} }
internal IList<ICorDebugStepper> ActiveSteppers { internal List<Stepper> Steppers {
get { get {
return activeSteppers.AsReadOnly(); return steppers;
}
}
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");
}
} }
activeSteppers.Clear();
} }
public event EventHandler<ThreadEventArgs> ThreadStateChanged; public event EventHandler<ThreadEventArgs> ThreadStateChanged;

22
src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Wrappers/CorDebug/ICorDebugStepper.cs

@ -0,0 +1,22 @@
// <file>
// <copyright see="prj:///doc/copyright.txt"/>
// <license see="prj:///doc/license.txt"/>
// <owner name="David Srbecký" email="dsrbecky@gmail.com"/>
// <version>$Revision$</version>
// </file>
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);
}
}
}
}
Loading…
Cancel
Save