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

28
src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Debugger/Internal/ManagedCallback.cs

@ -13,6 +13,7 @@ @@ -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 @@ -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 @@ -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) {
ExitCallback_Continue();
return;
}
}
Thread thread = debugger.GetThread(pThread);
Stepper stepper = thread.GetStepper(pStepper);
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
debugger.TraceMessage(" - leaving code without symbols");
ExitCallback_Continue();
}
} else {
ExitCallback_Paused();
ExitCallback_Continue();
}
}

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

@ -25,6 +25,8 @@ namespace Debugger @@ -25,6 +25,8 @@ namespace Debugger
ICorDebugILFrame corILFrame;
object corILFramePauseSession;
Stepper stepOutStepper;
bool steppedOut;
Thread thread;
uint chainIndex;
@ -117,10 +119,10 @@ namespace Debugger @@ -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 @@ -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()
{
Step(true);
@ -179,11 +192,7 @@ namespace Debugger @@ -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 @@ -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<ICorDebugStepper2>()) { // Is the debuggee .NET 2.0?
stepper.SetUnmappedStopMask(CorDebugUnmappedStop.STOP_NONE);
(stepper.CastTo<ICorDebugStepper2>()).SetJMC(1 /* true */);
stepper = CreateStepper();
stepper.CorStepper.StepRange(true /* step in */, nextSt.StepRanges);
}
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<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);
}
// 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();
}

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

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

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

@ -0,0 +1,22 @@ @@ -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