From 610f738f4c2a96e48d0c35f0bccb9d5b335bb2fc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Srbeck=C3=BD?= Date: Sun, 2 Apr 2006 13:33:09 +0000 Subject: [PATCH] Created classes to keep debugger state. State changes to paused for whole callback git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/branches/2.0@1250 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61 --- .../Project/Debugger.Core.csproj | 2 + .../Project/Src/Debugger/DebugeeState.cs | 20 ++ .../Debugger/DebuggerEvents/PausedReason.cs | 6 +- .../Src/Debugger/Internal/ManagedCallback.cs | 171 +++++++----------- .../Src/Debugger/NDebugger-StateControl.cs | 71 ++------ .../Project/Src/Debugger/NDebugger.cs | 2 +- .../Project/Src/Debugger/PauseSession.cs | 33 ++++ .../Project/Src/Threads/Function.cs | 12 +- .../Project/Src/Threads/Process.cs | 28 +-- .../Project/Src/Threads/Thread.cs | 2 +- .../Project/Src/Variables/Evals/Eval.cs | 5 +- .../Project/Src/Variables/Value.cs | 6 +- .../Project/Src/DebuggerTests.cs | 12 +- 13 files changed, 172 insertions(+), 198 deletions(-) create mode 100644 src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Debugger/DebugeeState.cs create mode 100644 src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Debugger/PauseSession.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 57ba958266..96b9989fd8 100644 --- a/src/AddIns/Misc/Debugger/Debugger.Core/Project/Debugger.Core.csproj +++ b/src/AddIns/Misc/Debugger/Debugger.Core/Project/Debugger.Core.csproj @@ -368,6 +368,8 @@ + + diff --git a/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Debugger/DebugeeState.cs b/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Debugger/DebugeeState.cs new file mode 100644 index 0000000000..9cec04ccf2 --- /dev/null +++ b/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Debugger/DebugeeState.cs @@ -0,0 +1,20 @@ +// +// +// +// +// $Revision$ +// + +using System; + +namespace Debugger +{ + /// + /// Unique identifier of the state of the debugee. + /// Changes when debuggee is stepped, but not when properity is evaluated. + /// + public class DebugeeState + { + + } +} diff --git a/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Debugger/DebuggerEvents/PausedReason.cs b/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Debugger/DebuggerEvents/PausedReason.cs index 0df22933c1..39b438c15b 100644 --- a/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Debugger/DebuggerEvents/PausedReason.cs +++ b/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Debugger/DebuggerEvents/PausedReason.cs @@ -9,17 +9,17 @@ namespace Debugger { public enum PausedReason:int { - AllEvalsComplete, + EvalComplete, StepComplete, Breakpoint, Break, ControlCTrap, Exception, DebuggerError, - EvalComplete, CurrentThreadChanged, CurrentFunctionChanged, ExceptionIntercepted, - SetIP + SetIP, + Other } } 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 bad0732ffe..ad0d346f46 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 @@ -10,7 +10,7 @@ // Output: \1 - intention \2 - declaration \3 - function name \4-9 parameters // Replace with: -// \1\2\n\1{\n\1\tEnterCallback("\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.Runtime.InteropServices; @@ -22,88 +22,55 @@ namespace Debugger class ManagedCallback { NDebugger debugger; - - bool handlingCallback = false; - - Process callingProcess; - Thread callingThread; public NDebugger Debugger { get { return debugger; } } - + public ManagedCallback(NDebugger debugger) { this.debugger = debugger; } - public bool HandlingCallback { - get { - return handlingCallback; - } - } - - // Sets CurrentProcess - void EnterCallback(string name, ICorDebugProcess pProcess) - { - EnterCallback(name); - - callingProcess = debugger.GetProcess(pProcess); - callingProcess.IsRunning = false; - } - - // Sets CurrentProcess - void EnterCallback(string name, ICorDebugAppDomain pAppDomain) + void EnterCallback(PausedReason pausedReason, string name, ICorDebugProcess pProcess) { - EnterCallback(name); - - callingProcess = debugger.GetProcess(pAppDomain.Process); - callingProcess.IsRunning = false; + debugger.TraceMessage("Callback: " + name); + debugger.AssertRunning(); + debugger.PauseSession = new PauseSession(pausedReason); + debugger.CurrentProcess = debugger.GetProcess(pProcess); + debugger.CurrentProcess.IsRunning = false; } - void EnterCallback(string name, ICorDebugThread pThread) + void EnterCallback(PausedReason pausedReason, string name, ICorDebugAppDomain pAppDomain) { - EnterCallback(name); - - callingThread = debugger.GetThread(pThread); - - callingProcess = callingThread.Process; - callingProcess.IsRunning = false; + EnterCallback(pausedReason, name, pAppDomain.Process); } - void EnterCallback(string name) + void EnterCallback(PausedReason pausedReason, string name, ICorDebugThread pThread) { - handlingCallback = true; debugger.TraceMessage("Callback: " + name); // ExitProcess may be called at any time when debuggee is killed - if (name != "ExitProcess") { - debugger.AssertRunning(); - } + if (name != "ExitProcess") debugger.AssertRunning(); + Thread thread = debugger.GetThread(pThread); + debugger.PauseSession = new PauseSession(pausedReason); + debugger.CurrentProcess = thread.Process; + debugger.CurrentProcess.IsRunning = false; + debugger.CurrentProcess.CurrentThread = thread; } void ExitCallback_Continue() { - callingProcess.ContinueCallback(); - - callingThread = null; - callingProcess = null; - handlingCallback = false; + debugger.CurrentProcess.Continue(); } - void ExitCallback_Paused(PausedReason reason) + void ExitCallback_Paused() { - if (callingThread != null) { - callingThread.DeactivateAllSteppers(); + if (debugger.CurrentThread != null) { + debugger.CurrentThread.DeactivateAllSteppers(); } - - handlingCallback = false; - - debugger.Pause(reason, callingProcess, callingThread, null); - - callingThread = null; - callingProcess = null; + debugger.Pause(); } @@ -111,7 +78,7 @@ namespace Debugger public void StepComplete(ICorDebugAppDomain pAppDomain, ICorDebugThread pThread, ICorDebugStepper pStepper, CorDebugStepReason reason) { - EnterCallback("StepComplete (" + reason.ToString() + ")", pThread); + EnterCallback(PausedReason.StepComplete, "StepComplete (" + reason.ToString() + ")", pThread); Stepper stepper = debugger.GetThread(pThread).GetStepper(pStepper); if (stepper != null) { @@ -122,23 +89,23 @@ namespace Debugger } } - if (!callingThread.LastFunction.HasSymbols) { + if (!debugger.CurrentThread.LastFunction.HasSymbols) { // This should not happen with JMC enabled debugger.TraceMessage(" - leaving code without symbols"); ExitCallback_Continue(); } else { - ExitCallback_Paused(PausedReason.StepComplete); + ExitCallback_Paused(); } } // Do not pass the pBreakpoint parameter as ICorDebugBreakpoint - marshaling of it fails in .NET 1.1 public void Breakpoint(ICorDebugAppDomain pAppDomain, ICorDebugThread pThread, IntPtr pBreakpoint) { - EnterCallback("Breakpoint", pThread); + EnterCallback(PausedReason.Breakpoint, "Breakpoint", pThread); - ExitCallback_Paused(PausedReason.Breakpoint); + ExitCallback_Paused(); // foreach (Breakpoint b in debugger.Breakpoints) { // if (b.Equals(pBreakpoint)) { @@ -150,23 +117,23 @@ namespace Debugger public void BreakpointSetError(ICorDebugAppDomain pAppDomain, ICorDebugThread pThread, ICorDebugBreakpoint pBreakpoint, uint dwError) { - EnterCallback("BreakpointSetError", pThread); + EnterCallback(PausedReason.Other, "BreakpointSetError", pThread); ExitCallback_Continue(); } public unsafe void Break(ICorDebugAppDomain pAppDomain, ICorDebugThread pThread) { - EnterCallback("Break", pThread); + EnterCallback(PausedReason.Break, "Break", pThread); - ExitCallback_Paused(PausedReason.Break); + ExitCallback_Paused(); } public void ControlCTrap(ICorDebugProcess pProcess) { - EnterCallback("ControlCTrap", pProcess); + EnterCallback(PausedReason.ControlCTrap, "ControlCTrap", pProcess); - ExitCallback_Paused(PausedReason.ControlCTrap); + ExitCallback_Paused(); } public unsafe void Exception(ICorDebugAppDomain pAppDomain, ICorDebugThread pThread, int unhandled) @@ -179,7 +146,7 @@ namespace Debugger Exception2(pAppDomain, pThread, null, 0, (CorDebugExceptionCallbackType)exceptionType, 0); } else { // This callback should be ignored in v2 applications - EnterCallback("Exception", pThread); + EnterCallback(PausedReason.Other, "Exception", pThread); ExitCallback_Continue(); } @@ -191,14 +158,14 @@ namespace Debugger public void LogSwitch(ICorDebugAppDomain pAppDomain, ICorDebugThread pThread, int lLevel, uint ulReason, string pLogSwitchName, string pParentName) { - EnterCallback("LogSwitch", pThread); + EnterCallback(PausedReason.Other, "LogSwitch", pThread); ExitCallback_Continue(); } public void LogMessage(ICorDebugAppDomain pAppDomain, ICorDebugThread pThread, int lLevel, string pLogSwitchName, string pMessage) { - EnterCallback("LogMessage", pThread); + EnterCallback(PausedReason.Other, "LogMessage", pThread); debugger.OnLogMessage(pMessage); @@ -207,21 +174,21 @@ namespace Debugger public void EditAndContinueRemap(ICorDebugAppDomain pAppDomain, ICorDebugThread pThread, ICorDebugFunction pFunction, int fAccurate) { - EnterCallback("EditAndContinueRemap", pThread); + EnterCallback(PausedReason.Other, "EditAndContinueRemap", pThread); ExitCallback_Continue(); } public void EvalException(ICorDebugAppDomain pAppDomain, ICorDebugThread pThread, ICorDebugEval corEval) { - EnterCallback("EvalException", pThread); + EnterCallback(PausedReason.EvalComplete, "EvalException", pThread); HandleEvalComplete(pAppDomain, pThread, corEval, true); } public void EvalComplete(ICorDebugAppDomain pAppDomain, ICorDebugThread pThread, ICorDebugEval corEval) { - EnterCallback("EvalComplete", pThread); + EnterCallback(PausedReason.EvalComplete, "EvalComplete", pThread); HandleEvalComplete(pAppDomain, pThread, corEval, false); } @@ -239,23 +206,23 @@ namespace Debugger debugger.SetupNextEvaluation(debugger.GetThread(pThread)); ExitCallback_Continue(); } else { - ExitCallback_Paused(PausedReason.AllEvalsComplete); + ExitCallback_Paused(); } } public void DebuggerError(ICorDebugProcess pProcess, int errorHR, uint errorCode) { - EnterCallback("DebuggerError", pProcess); + EnterCallback(PausedReason.DebuggerError, "DebuggerError", pProcess); string errorText = String.Format("Debugger error: \nHR = 0x{0:X} \nCode = 0x{1:X}", errorHR, errorCode); System.Windows.Forms.MessageBox.Show(errorText); - ExitCallback_Paused(PausedReason.DebuggerError); + ExitCallback_Paused(); } public void UpdateModuleSymbols(ICorDebugAppDomain pAppDomain, ICorDebugModule pModule, IStream pSymbolStream) { - EnterCallback("UpdateModuleSymbols", pAppDomain); + EnterCallback(PausedReason.Other, "UpdateModuleSymbols", pAppDomain); ExitCallback_Continue(); } @@ -266,7 +233,7 @@ namespace Debugger public void CreateProcess(ICorDebugProcess pProcess) { - EnterCallback("CreateProcess", pProcess); + EnterCallback(PausedReason.Other, "CreateProcess", pProcess); // Process is added in NDebugger.Start @@ -275,7 +242,7 @@ namespace Debugger public void CreateAppDomain(ICorDebugProcess pProcess, ICorDebugAppDomain pAppDomain) { - EnterCallback("CreateAppDomain", pAppDomain); + EnterCallback(PausedReason.Other, "CreateAppDomain", pAppDomain); pAppDomain.Attach(); @@ -284,14 +251,14 @@ namespace Debugger public void LoadAssembly(ICorDebugAppDomain pAppDomain, ICorDebugAssembly pAssembly) { - EnterCallback("LoadAssembly", pAppDomain); + EnterCallback(PausedReason.Other, "LoadAssembly", pAppDomain); ExitCallback_Continue(); } public unsafe void LoadModule(ICorDebugAppDomain pAppDomain, ICorDebugModule pModule) { - EnterCallback("LoadModule", pAppDomain); + EnterCallback(PausedReason.Other, "LoadModule", pAppDomain); debugger.AddModule(pModule); @@ -302,14 +269,14 @@ namespace Debugger { if (pAppDomain != null) { - EnterCallback("NameChange: pAppDomain", pAppDomain); + EnterCallback(PausedReason.Other, "NameChange: pAppDomain", pAppDomain); ExitCallback_Continue(); } if (pThread != null) { - EnterCallback("NameChange: pThread", pThread); + EnterCallback(PausedReason.Other, "NameChange: pThread", pThread); Thread thread = debugger.GetThread(pThread); thread.HasBeenLoaded = true; @@ -323,7 +290,7 @@ namespace Debugger { // We can not use pThread since it has not been added yet // and we continue from this callback anyway - EnterCallback("CreateThread", pAppDomain); + EnterCallback(PausedReason.Other, "CreateThread", pAppDomain); debugger.AddThread(pThread); @@ -332,7 +299,7 @@ namespace Debugger public void LoadClass(ICorDebugAppDomain pAppDomain, ICorDebugClass c) { - EnterCallback("LoadClass", pAppDomain); + EnterCallback(PausedReason.Other, "LoadClass", pAppDomain); ExitCallback_Continue(); } @@ -343,14 +310,14 @@ namespace Debugger public void UnloadClass(ICorDebugAppDomain pAppDomain, ICorDebugClass c) { - EnterCallback("UnloadClass", pAppDomain); + EnterCallback(PausedReason.Other, "UnloadClass", pAppDomain); ExitCallback_Continue(); } public void UnloadModule(ICorDebugAppDomain pAppDomain, ICorDebugModule pModule) { - EnterCallback("UnloadModule", pAppDomain); + EnterCallback(PausedReason.Other, "UnloadModule", pAppDomain); debugger.RemoveModule(pModule); @@ -359,14 +326,14 @@ namespace Debugger public void UnloadAssembly(ICorDebugAppDomain pAppDomain, ICorDebugAssembly pAssembly) { - EnterCallback("UnloadAssembly", pAppDomain); + EnterCallback(PausedReason.Other, "UnloadAssembly", pAppDomain); ExitCallback_Continue(); } public void ExitThread(ICorDebugAppDomain pAppDomain, ICorDebugThread pThread) { - EnterCallback("ExitThread", pThread); + EnterCallback(PausedReason.Other, "ExitThread", pThread); Thread thread = debugger.GetThread(pThread); @@ -381,14 +348,14 @@ namespace Debugger public void ExitAppDomain(ICorDebugProcess pProcess, ICorDebugAppDomain pAppDomain) { - EnterCallback("ExitAppDomain", pAppDomain); + EnterCallback(PausedReason.Other, "ExitAppDomain", pAppDomain); ExitCallback_Continue(); } public void ExitProcess(ICorDebugProcess pProcess) { - EnterCallback("ExitProcess", pProcess); + EnterCallback(PausedReason.Other, "ExitProcess", pProcess); Process process = debugger.GetProcess(pProcess); @@ -406,54 +373,54 @@ namespace Debugger public void ChangeConnection(ICorDebugProcess pProcess, uint dwConnectionId) { - EnterCallback("ChangeConnection", pProcess); + EnterCallback(PausedReason.Other, "ChangeConnection", pProcess); ExitCallback_Continue(); } public void CreateConnection(ICorDebugProcess pProcess, uint dwConnectionId, IntPtr pConnName) { - EnterCallback("CreateConnection", pProcess); + EnterCallback(PausedReason.Other, "CreateConnection", pProcess); ExitCallback_Continue(); } public void DestroyConnection(ICorDebugProcess pProcess, uint dwConnectionId) { - EnterCallback("DestroyConnection", pProcess); + EnterCallback(PausedReason.Other, "DestroyConnection", pProcess); ExitCallback_Continue(); } public void Exception2(ICorDebugAppDomain pAppDomain, ICorDebugThread pThread, ICorDebugFrame pFrame, uint nOffset, CorDebugExceptionCallbackType exceptionType, uint dwFlags) { - EnterCallback("Exception2", pThread); + EnterCallback(PausedReason.Exception, "Exception2", pThread); // This callback is also called from Exception(...)!!!! (the .NET 1.1 version) // Whatch out for the zeros and null! // Exception -> Exception2(pAppDomain, pThread, null, 0, exceptionType, 0); - callingThread.CurrentExceptionType = (ExceptionType)exceptionType; + debugger.CurrentThread.CurrentExceptionType = (ExceptionType)exceptionType; if (ExceptionType.DEBUG_EXCEPTION_UNHANDLED != (ExceptionType)exceptionType) { // Handled exception if (debugger.PauseOnHandledException) { - ExitCallback_Paused(PausedReason.Exception); + ExitCallback_Paused(); } else { ExitCallback_Continue(); } } else { // Unhandled exception - ExitCallback_Paused(PausedReason.Exception); + ExitCallback_Paused(); } } public void ExceptionUnwind(ICorDebugAppDomain pAppDomain, ICorDebugThread pThread, CorDebugExceptionUnwindCallbackType dwEventType, uint dwFlags) { - EnterCallback("ExceptionUnwind", pThread); + EnterCallback(PausedReason.ExceptionIntercepted, "ExceptionUnwind", pThread); if (dwEventType == CorDebugExceptionUnwindCallbackType.DEBUG_EXCEPTION_INTERCEPTED) { - ExitCallback_Paused(PausedReason.ExceptionIntercepted); + ExitCallback_Paused(); } else { ExitCallback_Continue(); } @@ -461,14 +428,14 @@ namespace Debugger public void FunctionRemapComplete(ICorDebugAppDomain pAppDomain, ICorDebugThread pThread, ICorDebugFunction pFunction) { - EnterCallback("FunctionRemapComplete", pThread); + EnterCallback(PausedReason.Other, "FunctionRemapComplete", pThread); ExitCallback_Continue(); } public void FunctionRemapOpportunity(ICorDebugAppDomain pAppDomain, ICorDebugThread pThread, ICorDebugFunction pOldFunction, ICorDebugFunction pNewFunction, uint oldILOffset) { - EnterCallback("FunctionRemapOpportunity", pThread); + EnterCallback(PausedReason.Other, "FunctionRemapOpportunity", pThread); ExitCallback_Continue(); } @@ -476,9 +443,9 @@ namespace Debugger public void MDANotification(ICorDebugController c, ICorDebugThread t, ICorDebugMDA mda) { if (c.Is()) { - EnterCallback("MDANotification", c.CastTo()); + EnterCallback(PausedReason.Other, "MDANotification", c.CastTo()); } else if (c.Is()){ - EnterCallback("MDANotification", c.CastTo()); + EnterCallback(PausedReason.Other, "MDANotification", c.CastTo()); } else { throw new System.Exception("Unknown callback argument"); } diff --git a/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Debugger/NDebugger-StateControl.cs b/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Debugger/NDebugger-StateControl.cs index 5b010f2f56..0ed8842dbc 100644 --- a/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Debugger/NDebugger-StateControl.cs +++ b/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Debugger/NDebugger-StateControl.cs @@ -18,12 +18,11 @@ namespace Debugger { public partial class NDebugger { - PausedReason? pausedReason = null; bool pauseOnHandledException = false; ManualResetEvent pausedHandle = new ManualResetEvent(false); - object sessionID = new object(); - object debugeeStateID = new object(); + PauseSession pauseSession; + DebugeeState debugeeState; Process currentProcess; @@ -74,10 +73,12 @@ namespace Debugger if (currentProcess == null) { return null; } else { - if (currentProcess.IsRunning) return null; return currentProcess; } } + set { + currentProcess = value; + } } public Thread CurrentThread { @@ -102,21 +103,21 @@ namespace Debugger /// /// Indentification of the current debugger session. This value changes whenever debugger is continued /// - public object SessionID { + public PauseSession PauseSession { get { - return sessionID; + return pauseSession; } internal set { - sessionID = value; + pauseSession = value; } } /// /// Indentification of the state of the debugee. This value changes whenever the state of the debugee significatntly changes /// - public object DebugeeStateID { + public DebugeeState DebugeeState { get { - return debugeeStateID; + return debugeeState; } } @@ -136,13 +137,13 @@ namespace Debugger public bool IsPaused { get { - return (pausedReason != null); + return (pauseSession != null); } } public bool IsRunning { get { - return (pausedReason == null); + return (pauseSession == null); } } @@ -153,60 +154,28 @@ namespace Debugger public PausedReason PausedReason { get { AssertPaused(); - return (PausedReason)pausedReason; + return pauseSession.PausedReason; } } - internal void Pause(PausedReason reason, Process process, Thread thread, Function function) + internal void Pause() { - if (IsPaused) { - throw new DebuggerException("Already paused"); - } - if (process == null) { - throw new DebuggerException("Process can not be null"); - } - if (thread == null && function != null) { - throw new DebuggerException("Function can not be set without thread"); - } - - currentProcess = process; - currentProcess.CurrentThread = thread; - if (currentProcess.CurrentThread != null) { - currentProcess.CurrentThread.CurrentFunction = function; - } - - pausedReason = reason; - OnDebuggingPaused(); // Debugger state is unknown after calling OnDebuggingPaused (it may be resumed) if (IsPaused) { - if (reason != PausedReason.AllEvalsComplete) { - debugeeStateID = new object(); + if (PausedReason != PausedReason.EvalComplete) { + debugeeState = new DebugeeState(); OnDebuggeeStateChanged(); } } - // This is a good point to autmaticaly evaluate evals from update of variables (if there are any) - if (IsPaused) { - this.StartEvaluation(); - } - if (IsPaused) { pausedHandle.Set(); } } - internal void FakePause(PausedReason reason, bool keepCurrentFunction) - { - Process process = CurrentProcess; - Thread thread = CurrentThread; - Function function = CurrentFunction; - Resume(); - Pause(reason, process, thread, keepCurrentFunction ? function : null); - } - internal void Resume() { if (IsRunning) { @@ -217,14 +186,8 @@ namespace Debugger pausedHandle.Reset(); - pausedReason = null; - - // Remove all stored functions, they are disponsed between callbacks and they need to be regenerated - foreach(Thread t in Threads) { - t.CurrentFunction = null; - } + pauseSession = null; - // Clear current process currentProcess = null; } diff --git a/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Debugger/NDebugger.cs b/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Debugger/NDebugger.cs index 6a129538c6..d56d5be9ad 100644 --- a/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Debugger/NDebugger.cs +++ b/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Debugger/NDebugger.cs @@ -132,7 +132,7 @@ namespace Debugger currentProcess = null; pausedHandle.Reset(); - pausedReason = null; + pauseSession = null; pendingEvalsCollection.Clear(); diff --git a/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Debugger/PauseSession.cs b/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Debugger/PauseSession.cs new file mode 100644 index 0000000000..1b415010fd --- /dev/null +++ b/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Debugger/PauseSession.cs @@ -0,0 +1,33 @@ +// +// +// +// +// $Revision$ +// + +using System; + +using Debugger.Wrappers.CorDebug; + +namespace Debugger +{ + /// + /// Holds information about the state of paused debugger. + /// Expires when when Continue is called on debugger. + /// + public class PauseSession + { + PausedReason pausedReason; + + public PausedReason PausedReason { + get { + return pausedReason; + } + } + + public PauseSession(PausedReason pausedReason) + { + this.pausedReason = pausedReason; + } + } +} 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 80c6a7ed58..94e52016a1 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 @@ -23,7 +23,7 @@ namespace Debugger Module module; ICorDebugFunction corFunction; ICorDebugILFrame corILFrame; - object corILFrameDebuggerSessionID; + object corILFramePauseSession; bool steppedOut; Thread thread; @@ -110,7 +110,7 @@ namespace Debugger this.chainIndex = chainIndex; this.frameIndex = frameIndex; this.corILFrame = corILFrame; - this.corILFrameDebuggerSessionID = debugger.SessionID; + this.corILFramePauseSession = debugger.PauseSession; corFunction = corILFrame.Function; module = debugger.GetModule(corFunction.Module); @@ -129,9 +129,9 @@ namespace Debugger internal ICorDebugILFrame CorILFrame { get { if (HasExpired) throw new DebuggerException("Function has expired"); - if (corILFrameDebuggerSessionID != debugger.SessionID) { + if (corILFramePauseSession != debugger.PauseSession) { corILFrame = thread.GetFunctionAt(chainIndex, frameIndex).CorILFrame; - corILFrameDebuggerSessionID = debugger.SessionID; + corILFramePauseSession = debugger.PauseSession; } return corILFrame; } @@ -361,8 +361,10 @@ namespace Debugger if (simulate) { CorILFrame.CanSetIP((uint)ilOffset); } else { + // invalidates all frames and chains for the current thread CorILFrame.SetIP((uint)ilOffset); - debugger.FakePause(PausedReason.SetIP, false); + debugger.PauseSession = new PauseSession(PausedReason.SetIP); + debugger.Pause(); } } catch { return null; diff --git a/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Threads/Process.cs b/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Threads/Process.cs index 6599bfdb18..65a646ed45 100644 --- a/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Threads/Process.cs +++ b/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Threads/Process.cs @@ -60,7 +60,7 @@ namespace Debugger { CurrentThread = thread; - debugger.FakePause(PausedReason.CurrentThreadChanged, false); + debugger.Pause(); } public IList Threads { @@ -122,36 +122,26 @@ namespace Debugger if (!isProcessRunning) { throw new DebuggerException("Invalid operation"); } - - corProcess.Stop(5000); // TODO: Hardcoded value - + + corProcess.Stop(5000); // TODO: Hardcoded value + isProcessRunning = false; - debugger.Pause(PausedReason.Break, this, null, null); + debugger.PauseSession = new PauseSession(PausedReason.Break); + debugger.CurrentProcess = this; + debugger.Pause(); } - + public void Continue() { if (isProcessRunning) { throw new DebuggerException("Invalid operation"); } - + debugger.Resume(); isProcessRunning = true; - debugger.SessionID = new object(); corProcess.Continue(0); } - internal void ContinueCallback() - { - if (isProcessRunning) { - throw new DebuggerException("Invalid operation"); - } - - isProcessRunning = true; - debugger.SessionID = new object(); - corProcess.Continue(0); - } - public void Terminate() { // Resume stoped tread 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 1e4cf07d6b..83fb4f0a2d 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 @@ -317,7 +317,7 @@ namespace Debugger { CurrentFunction = function; - debugger.FakePause(PausedReason.CurrentFunctionChanged, true); + debugger.Pause(); } public Function LastFunctionWithLoadedSymbols { diff --git a/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Variables/Evals/Eval.cs b/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Variables/Evals/Eval.cs index 314d71f95c..c71d069ddd 100644 --- a/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Variables/Evals/Eval.cs +++ b/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Variables/Evals/Eval.cs @@ -24,8 +24,6 @@ namespace Debugger { NDebugger debugger; - object debugeeStateIDatCreation; - ICorDebugEval corEval; ICorDebugFunction corFunction; CorValuesGetter getArgs; @@ -101,7 +99,6 @@ namespace Debugger this.debugger = debugger; this.corFunction = corFunction; this.getArgs = getArgs; - this.debugeeStateIDatCreation = debugger.DebugeeStateID; // Schedule the eval for evaluation debugger.AddEval(this); @@ -115,7 +112,7 @@ namespace Debugger /// True is setup was successful internal bool SetupEvaluation(Thread targetThread) { - if (!debugger.ManagedCallback.HandlingCallback) debugger.AssertPaused(); + debugger.AssertPaused(); ICorDebugValue[] args = getArgs(); diff --git a/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Variables/Value.cs b/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Variables/Value.cs index 5b2874d550..95381dff8f 100644 --- a/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Variables/Value.cs +++ b/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Variables/Value.cs @@ -17,7 +17,7 @@ namespace Debugger { protected NDebugger debugger; protected ICorDebugValue corValue; - object debuggerSessionIDatCreation; + object pauseSessionAtCreation; public event EventHandler ValueChanged; @@ -38,7 +38,7 @@ namespace Debugger /// public bool IsExpired { get { - return debuggerSessionIDatCreation != debugger.SessionID; + return pauseSessionAtCreation != debugger.PauseSession; } } @@ -106,7 +106,7 @@ namespace Debugger if (corValue != null) { this.corValue = DereferenceUnbox(corValue); } - this.debuggerSessionIDatCreation = debugger.SessionID; + this.pauseSessionAtCreation = debugger.PauseSession; } public override string ToString() diff --git a/src/AddIns/Misc/Debugger/Debugger.Tests/Project/Src/DebuggerTests.cs b/src/AddIns/Misc/Debugger/Debugger.Tests/Project/Src/DebuggerTests.cs index f94ccca08f..bb92006faf 100644 --- a/src/AddIns/Misc/Debugger/Debugger.Tests/Project/Src/DebuggerTests.cs +++ b/src/AddIns/Misc/Debugger/Debugger.Tests/Project/Src/DebuggerTests.cs @@ -527,22 +527,22 @@ namespace Debugger.Tests Assert.AreEqual(typeof(UnavailableValue), subVars[1].Value.GetType()); debugger.StartEvaluation(); - WaitForPause(PausedReason.AllEvalsComplete, null); + WaitForPause(PausedReason.EvalComplete, null); Assert.AreEqual("private", subVars[1].Value.AsString); Assert.AreEqual(typeof(UnavailableValue), subVars[2].Value.GetType()); debugger.StartEvaluation(); - WaitForPause(PausedReason.AllEvalsComplete, null); + WaitForPause(PausedReason.EvalComplete, null); Assert.AreEqual("public", subVars[2].Value.AsString); Assert.AreEqual(typeof(UnavailableValue), subVars[3].Value.GetType()); debugger.StartEvaluation(); - WaitForPause(PausedReason.AllEvalsComplete, null); + WaitForPause(PausedReason.EvalComplete, null); Assert.AreEqual(typeof(UnavailableValue), subVars[3].Value.GetType()); Assert.AreEqual(typeof(UnavailableValue), subVars[4].Value.GetType()); debugger.StartEvaluation(); - WaitForPause(PausedReason.AllEvalsComplete, null); + WaitForPause(PausedReason.EvalComplete, null); Assert.AreEqual("static", subVars[4].Value.AsString); debugger.Continue(); @@ -569,7 +569,7 @@ namespace Debugger.Tests if (var is PropertyVariable) { Assert.AreEqual(typeof(UnavailableValue), var.Value.GetType(), "Variable name: " + var.Name); debugger.StartEvaluation(); - WaitForPause(PausedReason.AllEvalsComplete, null); + WaitForPause(PausedReason.EvalComplete, null); Assert.AreEqual(false, var.Value.IsExpired, "Variable name: " + var.Name); Assert.AreNotEqual(null, var.Value.AsString, "Variable name: " + var.Name); } @@ -584,7 +584,7 @@ namespace Debugger.Tests } } debugger.StartEvaluation(); - WaitForPause(PausedReason.AllEvalsComplete, null); + WaitForPause(PausedReason.EvalComplete, null); debugger.Continue(); debugger.WaitForPrecessExit();