Browse Source

Moving functionality from NDebugger to Process - using ProcessEventArgs

git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/trunk@1687 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61
shortcuts
David Srbecký 20 years ago
parent
commit
5a239657b8
  1. 4
      src/AddIns/Misc/Debugger/Debugger.AddIn/Project/Src/Service/DynamicTreeDebuggerRow.cs
  2. 6
      src/AddIns/Misc/Debugger/Debugger.AddIn/Project/Src/Service/WindowsDebugger.cs
  3. 2
      src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Debugger/DebugeeState.cs
  4. 2
      src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Debugger/DebuggerEvents/MessageEventArgs.cs
  5. 2
      src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Debugger/ExceptionEventArgs.cs
  6. 2
      src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Debugger/IMutable.cs
  7. 12
      src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Debugger/Internal/ManagedCallback.cs
  8. 46
      src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Debugger/NDebugger.cs
  9. 90
      src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Debugger/Process-StateControl.cs
  10. 2
      src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Modules/ModuleEventArgs.cs
  11. 2
      src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Threads/Function.cs
  12. 74
      src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Threads/Process.cs
  13. 4
      src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Threads/StepperEventArgs.cs
  14. 2
      src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Threads/Thread.cs
  15. 2
      src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Threads/ThreadEventArgs.cs
  16. 2
      src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Variables/ArrayValue.cs
  17. 2
      src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Variables/Evals/EvalEventArgs.cs
  18. 4
      src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Variables/ValueEventArgs.cs
  19. 8
      src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Variables/Variable.cs
  20. 2
      src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Variables/VariableEventArgs.cs

4
src/AddIns/Misc/Debugger/Debugger.AddIn/Project/Src/Service/DynamicTreeDebuggerRow.cs

@ -74,7 +74,7 @@ namespace ICSharpCode.SharpDevelop.Services
Update(); Update();
} }
void Update(object sender, DebuggerEventArgs e) void Update(object sender, ProcessEventArgs e)
{ {
dirty = true; dirty = true;
Update(); Update();
@ -166,7 +166,7 @@ namespace ICSharpCode.SharpDevelop.Services
if (Variable.Process.IsPaused) { if (Variable.Process.IsPaused) {
action(); action();
} else { } else {
EventHandler<DebuggerEventArgs> onDebuggingPaused = null; EventHandler<ProcessEventArgs> onDebuggingPaused = null;
onDebuggingPaused = delegate { onDebuggingPaused = delegate {
action(); action();
Variable.Process.DebuggingPaused -= onDebuggingPaused; Variable.Process.DebuggingPaused -= onDebuggingPaused;

6
src/AddIns/Misc/Debugger/Debugger.AddIn/Project/Src/Service/WindowsDebugger.cs

@ -329,7 +329,7 @@ namespace ICSharpCode.SharpDevelop.Services
} }
} }
void DebuggingPaused(object sender, DebuggerEventArgs e) void DebuggingPaused(object sender, ProcessEventArgs e)
{ {
OnIsProcessRunningChanged(EventArgs.Empty); OnIsProcessRunningChanged(EventArgs.Empty);
} }
@ -357,12 +357,12 @@ namespace ICSharpCode.SharpDevelop.Services
} }
} }
void DebuggeeStateChanged(object sender, DebuggerEventArgs e) void DebuggeeStateChanged(object sender, ProcessEventArgs e)
{ {
JumpToCurrentLine(); JumpToCurrentLine();
} }
void DebuggingResumed(object sender, DebuggerEventArgs e) void DebuggingResumed(object sender, ProcessEventArgs e)
{ {
if (!debugger.Evaluating) { if (!debugger.Evaluating) {
DebuggerService.RemoveCurrentLineMarker(); DebuggerService.RemoveCurrentLineMarker();

2
src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Debugger/DebugeeState.cs

@ -20,7 +20,7 @@ namespace Debugger
public event EventHandler Expired; public event EventHandler Expired;
public event EventHandler<DebuggerEventArgs> Changed { public event EventHandler<ProcessEventArgs> Changed {
add { add {
process.DebuggeeStateChanged += value; process.DebuggeeStateChanged += value;
} }

2
src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Debugger/DebuggerEvents/MessageEventArgs.cs

@ -10,7 +10,7 @@ using System;
namespace Debugger namespace Debugger
{ {
[Serializable] [Serializable]
public class MessageEventArgs : DebuggerEventArgs public class MessageEventArgs : ProcessEventArgs
{ {
int level; int level;
string message; string message;

2
src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Debugger/ExceptionEventArgs.cs

@ -9,7 +9,7 @@ using System;
namespace Debugger namespace Debugger
{ {
public class ExceptionEventArgs: DebuggerEventArgs public class ExceptionEventArgs: ProcessEventArgs
{ {
bool @continue; bool @continue;
Exception exception; Exception exception;

2
src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Debugger/IMutable.cs

@ -11,6 +11,6 @@ namespace Debugger
{ {
public interface IMutable public interface IMutable
{ {
event EventHandler<DebuggerEventArgs> Changed; event EventHandler<ProcessEventArgs> Changed;
} }
} }

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

@ -46,16 +46,16 @@ namespace Debugger
// ExitProcess may be called at any time when debuggee is killed // ExitProcess may be called at any time when debuggee is killed
name == "ExitProcess") { name == "ExitProcess") {
process.SelectedProcess = process.GetProcess(pProcess); process = process.GetProcess(pProcess);
if (process.IsPaused && process.PauseSession.PausedReason == PausedReason.ForcedBreak) { if (process.IsPaused && process.PauseSession.PausedReason == PausedReason.ForcedBreak) {
process.TraceMessage("Processing post-break callback"); process.TraceMessage("Processing post-break callback");
// Continue the break, process is still breaked because of the callback // Continue the break, process is still breaked because of the callback
process.SelectedProcess.Continue(); process.Continue();
pauseProcessInsteadOfContinue = true; pauseProcessInsteadOfContinue = true;
} else { } else {
pauseProcessInsteadOfContinue = false; pauseProcessInsteadOfContinue = false;
} }
process.SelectedProcess.NotifyPaused(new PauseSession(pausedReason)); process.NotifyPaused(new PauseSession(pausedReason));
} else { } else {
throw new DebuggerException("Invalid state at the start of callback"); throw new DebuggerException("Invalid state at the start of callback");
} }
@ -69,9 +69,9 @@ namespace Debugger
void EnterCallback(PausedReason pausedReason, string name, ICorDebugThread pThread) void EnterCallback(PausedReason pausedReason, string name, ICorDebugThread pThread)
{ {
EnterCallback(pausedReason, name, pThread.Process); EnterCallback(pausedReason, name, pThread.Process);
process.SelectedProcess.SelectedThread = process.GetThread(pThread); process.SelectedThread = process.GetThread(pThread);
// Remove expired functions from the callstack cache // Remove expired functions from the callstack cache
process.SelectedProcess.SelectedThread.CheckExpirationOfFunctions(); process.SelectedThread.CheckExpirationOfFunctions();
} }
void ExitCallback_Continue() void ExitCallback_Continue()
@ -79,7 +79,7 @@ namespace Debugger
if (pauseProcessInsteadOfContinue) { if (pauseProcessInsteadOfContinue) {
ExitCallback_Paused(); ExitCallback_Paused();
} else { } else {
process.SelectedProcess.Continue(); process.Continue();
} }
} }

46
src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Debugger/NDebugger.cs

@ -44,7 +44,7 @@ namespace Debugger
} }
} }
internal ManagedCallback ManagedCallback { internal ManagedCallback ManagedCallback {
get { get {
return managedCallback; return managedCallback;
} }
@ -116,17 +116,8 @@ namespace Debugger
internal void TerminateDebugger() internal void TerminateDebugger()
{ {
ClearModules();
ResetBreakpoints(); ResetBreakpoints();
ClearThreads();
selectedProcess = null;
pausedHandle.Reset();
pendingEvalsCollection.Clear();
TraceMessage("Reset done"); TraceMessage("Reset done");
corDebug.Terminate(); corDebug.Terminate();
@ -142,20 +133,6 @@ namespace Debugger
noProcessesHandle.Set(); noProcessesHandle.Set();
} }
/// <summary>
/// Fired when System.Diagnostics.Trace.WriteLine() is called in debuged process
/// </summary>
public event EventHandler<MessageEventArgs> LogMessage;
protected internal virtual void OnLogMessage(MessageEventArgs arg)
{
TraceMessage ("Debugger event: OnLogMessage");
if (LogMessage != null) {
LogMessage(this, arg);
}
}
/// <summary> /// <summary>
/// Internal: Used to debug the debugger library. /// Internal: Used to debug the debugger library.
/// </summary> /// </summary>
@ -174,7 +151,6 @@ namespace Debugger
OnDebuggerTraceMessage(message); OnDebuggerTraceMessage(message);
} }
public void StartWithoutDebugging(System.Diagnostics.ProcessStartInfo psi) public void StartWithoutDebugging(System.Diagnostics.ProcessStartInfo psi)
{ {
System.Diagnostics.Process process; System.Diagnostics.Process process;
@ -189,25 +165,5 @@ namespace Debugger
Process process = Process.CreateProcess(this, filename, workingDirectory, arguments); Process process = Process.CreateProcess(this, filename, workingDirectory, arguments);
AddProcess(process); AddProcess(process);
} }
public SourcecodeSegment NextStatement {
get {
if (SelectedFunction == null || IsRunning) {
return null;
} else {
return SelectedFunction.NextStatement;
}
}
}
public VariableCollection LocalVariables {
get {
if (SelectedFunction == null || IsRunning) {
return VariableCollection.Empty;
} else {
return SelectedFunction.Variables;
}
}
}
} }
} }

90
src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Debugger/Process-StateControl.cs

@ -26,9 +26,9 @@ namespace Debugger
Process selectedProcess; Process selectedProcess;
public event EventHandler<ExceptionEventArgs> ExceptionThrown; public event EventHandler<ExceptionEventArgs> ExceptionThrown;
public event EventHandler<DebuggerEventArgs> DebuggingResumed; public event EventHandler<ProcessEventArgs> DebuggingResumed;
public event EventHandler<DebuggerEventArgs> DebuggingPaused; public event EventHandler<ProcessEventArgs> DebuggingPaused;
public event EventHandler<DebuggerEventArgs> DebuggeeStateChanged; public event EventHandler<ProcessEventArgs> DebuggeeStateChanged;
public bool PauseOnHandledException { public bool PauseOnHandledException {
get { get {
@ -50,7 +50,7 @@ namespace Debugger
{ {
TraceMessage ("Debugger event: OnDebuggingResumed()"); TraceMessage ("Debugger event: OnDebuggingResumed()");
if (DebuggingResumed != null) { if (DebuggingResumed != null) {
DebuggingResumed(this, new DebuggerEventArgs(this)); DebuggingResumed(this, new ProcessEventArgs(this));
} }
} }
@ -58,7 +58,7 @@ namespace Debugger
{ {
TraceMessage ("Debugger event: OnDebuggingPaused (" + PausedReason.ToString() + ")"); TraceMessage ("Debugger event: OnDebuggingPaused (" + PausedReason.ToString() + ")");
if (DebuggingPaused != null) { if (DebuggingPaused != null) {
DebuggingPaused(this, new DebuggerEventArgs(this)); DebuggingPaused(this, new ProcessEventArgs(this));
} }
} }
@ -67,26 +67,7 @@ namespace Debugger
{ {
TraceMessage ("Debugger event: OnDebuggeeStateChanged (" + PausedReason.ToString() + ")"); TraceMessage ("Debugger event: OnDebuggeeStateChanged (" + PausedReason.ToString() + ")");
if (DebuggeeStateChanged != null) { if (DebuggeeStateChanged != null) {
DebuggeeStateChanged(this, new DebuggerEventArgs(this)); DebuggeeStateChanged(this, new ProcessEventArgs(this));
}
}
public Process SelectedProcess {
get {
return selectedProcess;
}
set {
selectedProcess = value;
}
}
public Thread SelectedThread {
get {
if (SelectedProcess == null) {
return null;
} else {
return SelectedProcess.SelectedThread;
}
} }
} }
@ -100,16 +81,6 @@ namespace Debugger
} }
} }
public PauseSession PauseSession {
get {
if (SelectedProcess == null) {
return null;
} else {
return SelectedProcess.PauseSession;
}
}
}
/// <summary> /// <summary>
/// Indentification of the state of the debugee. This value changes whenever the state of the debugee significatntly changes /// Indentification of the state of the debugee. This value changes whenever the state of the debugee significatntly changes
/// </summary> /// </summary>
@ -119,32 +90,6 @@ namespace Debugger
} }
} }
public void AssertPaused()
{
if (!IsPaused) {
throw new DebuggerException("Debugger is not paused.");
}
}
public void AssertRunning()
{
if (IsPaused) {
throw new DebuggerException("Debugger is not running.");
}
}
public bool IsPaused {
get {
return (PauseSession != null);
}
}
public bool IsRunning {
get {
return !IsPaused;
}
}
/// <summary> /// <summary>
/// The reason why the debugger is paused. /// The reason why the debugger is paused.
/// Thows an DebuggerException if debugger is not paused. /// Thows an DebuggerException if debugger is not paused.
@ -159,7 +104,7 @@ namespace Debugger
internal void Pause(bool debuggeeStateChanged) internal void Pause(bool debuggeeStateChanged)
{ {
if (this.SelectedThread == null && this.Threads.Count > 0) { if (this.SelectedThread == null && this.Threads.Count > 0) {
this.SelectedProcess.SelectedThread = this.Threads[0]; this.SelectedThread = this.Threads[0];
} }
if (this.SelectedThread != null) { if (this.SelectedThread != null) {
@ -221,15 +166,6 @@ namespace Debugger
} }
} }
public void Break()
{
foreach(Process p in Processes) {
if (p.IsRunning) {
p.Break();
}
}
}
public void StepInto() public void StepInto()
{ {
SelectedFunction.StepInto(); SelectedFunction.StepInto();
@ -244,17 +180,5 @@ namespace Debugger
{ {
SelectedFunction.StepOut(); SelectedFunction.StepOut();
} }
public void Continue()
{
SelectedProcess.Continue();
}
public void Terminate()
{
foreach(Process p in Processes) {
p.Terminate();
}
}
} }
} }

2
src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Modules/ModuleEventArgs.cs

@ -10,7 +10,7 @@ using System;
namespace Debugger namespace Debugger
{ {
[Serializable] [Serializable]
public class ModuleEventArgs : DebuggerEventArgs public class ModuleEventArgs : ProcessEventArgs
{ {
Module module; Module module;

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

@ -343,7 +343,7 @@ namespace Debugger
} else { } else {
// invalidates all frames and chains for the current thread // invalidates all frames and chains for the current thread
CorILFrame.SetIP((uint)ilOffset); CorILFrame.SetIP((uint)ilOffset);
process.SelectedProcess.NotifyPaused(new PauseSession(PausedReason.SetIP)); process.NotifyPaused(new PauseSession(PausedReason.SetIP));
process.Pause(false); process.Pause(false);
} }
} catch { } catch {

74
src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Threads/Process.cs

@ -38,7 +38,7 @@ namespace Debugger
if(!hasExpired) { if(!hasExpired) {
hasExpired = true; hasExpired = true;
if (Expired != null) { if (Expired != null) {
Expired(this, new DebuggerEventArgs(debugger)); Expired(this, new ProcessEventArgs(this));
} }
} }
} }
@ -84,18 +84,6 @@ namespace Debugger
} }
} }
public IList<Thread> Threads {
get {
List<Thread> threads = new List<Thread>();
foreach(Thread thread in debugger.Threads) {
if (thread.Process == this) {
threads.Add(thread);
}
}
return threads;
}
}
static public Process CreateProcess(NDebugger debugger, string filename, string workingDirectory, string arguments) static public Process CreateProcess(NDebugger debugger, string filename, string workingDirectory, string arguments)
{ {
return debugger.MTA2STA.Call<Process>(delegate{ return debugger.MTA2STA.Call<Process>(delegate{
@ -145,9 +133,8 @@ namespace Debugger
corProcess.Stop(5000); // TODO: Hardcoded value corProcess.Stop(5000); // TODO: Hardcoded value
pauseSession = new PauseSession(PausedReason.ForcedBreak); pauseSession = new PauseSession(PausedReason.ForcedBreak);
debugger.SelectedProcess = this;
debugger.Pause(true); Pause(true);
} }
public void Continue() public void Continue()
@ -156,8 +143,8 @@ namespace Debugger
pauseSession.NotifyHasExpired(); pauseSession.NotifyHasExpired();
pauseSession = null; pauseSession = null;
debugger.OnDebuggingResumed(); OnDebuggingResumed();
debugger.pausedHandle.Reset(); pausedHandle.Reset();
corProcess.Continue(0); corProcess.Continue(0);
} }
@ -198,5 +185,58 @@ namespace Debugger
throw new DebuggerException("Process is not running."); throw new DebuggerException("Process is not running.");
} }
} }
/// <summary>
/// Fired when System.Diagnostics.Trace.WriteLine() is called in debuged process
/// </summary>
public event EventHandler<MessageEventArgs> LogMessage;
protected internal virtual void OnLogMessage(MessageEventArgs arg)
{
TraceMessage ("Debugger event: OnLogMessage");
if (LogMessage != null) {
LogMessage(this, arg);
}
}
/// <summary>
/// Internal: Used to debug the debugger library.
/// </summary>
public event EventHandler<MessageEventArgs> DebuggerTraceMessage;
protected internal virtual void OnDebuggerTraceMessage(string message)
{
if (DebuggerTraceMessage != null) {
DebuggerTraceMessage(this, new MessageEventArgs(this, message));
}
}
internal void TraceMessage(string message)
{
System.Diagnostics.Debug.WriteLine("Debugger:" + message);
OnDebuggerTraceMessage(message);
}
public SourcecodeSegment NextStatement {
get {
if (SelectedFunction == null || IsRunning) {
return null;
} else {
return SelectedFunction.NextStatement;
}
}
}
public VariableCollection LocalVariables {
get {
if (SelectedFunction == null || IsRunning) {
return VariableCollection.Empty;
} else {
return SelectedFunction.Variables;
}
}
}
} }
} }

4
src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Threads/StepperEventArgs.cs

@ -10,7 +10,7 @@ using System;
namespace Debugger namespace Debugger
{ {
[Serializable] [Serializable]
public class StepperEventArgs: DebuggerEventArgs public class StepperEventArgs: ProcessEventArgs
{ {
Stepper stepper; Stepper stepper;
@ -20,7 +20,7 @@ namespace Debugger
} }
} }
public StepperEventArgs(Stepper stepper): base(stepper.Debugger) public StepperEventArgs(Stepper stepper): base(stepper.Process)
{ {
this.stepper = stepper; this.stepper = stepper;
} }

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

@ -74,8 +74,6 @@ namespace Debugger
this.process = process; this.process = process;
this.corThread = corThread; this.corThread = corThread;
id = corThread.ID; id = corThread.ID;
this.process = process.GetProcess(corThread.Process);
} }
public bool Suspended { public bool Suspended {

2
src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Threads/ThreadEventArgs.cs

@ -10,7 +10,7 @@ using System;
namespace Debugger namespace Debugger
{ {
[Serializable] [Serializable]
public class ThreadEventArgs : DebuggerEventArgs public class ThreadEventArgs : ProcessEventArgs
{ {
Thread thread; Thread thread;

2
src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Variables/ArrayValue.cs

@ -118,7 +118,7 @@ namespace Debugger
elementName += indices[i].ToString() + ","; elementName += indices[i].ToString() + ",";
elementName = elementName.TrimEnd(new char[] {','}) + "]"; elementName = elementName.TrimEnd(new char[] {','}) + "]";
return new Variable(Debugger, return new Variable(Process,
elementName, elementName,
Variable.Flags.Default, Variable.Flags.Default,
new IExpirable[] {this.Variable}, new IExpirable[] {this.Variable},

2
src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Variables/Evals/EvalEventArgs.cs

@ -10,7 +10,7 @@ using System;
namespace Debugger namespace Debugger
{ {
[Serializable] [Serializable]
public class EvalEventArgs : DebuggerEventArgs public class EvalEventArgs : ProcessEventArgs
{ {
Eval eval; Eval eval;

4
src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Variables/ValueEventArgs.cs

@ -10,7 +10,7 @@ using System;
namespace Debugger namespace Debugger
{ {
[Serializable] [Serializable]
public class ValueEventArgs : DebuggerEventArgs public class ValueEventArgs : ProcessEventArgs
{ {
Value val; Value val;
@ -20,7 +20,7 @@ namespace Debugger
} }
} }
public ValueEventArgs(Value val): base(val.Debugger) public ValueEventArgs(Value val): base(val.Process)
{ {
this.val = val; this.val = val;
} }

8
src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Variables/Variable.cs

@ -55,7 +55,7 @@ namespace Debugger
bool isExpired = false; bool isExpired = false;
public event EventHandler Expired; public event EventHandler Expired;
public event EventHandler<DebuggerEventArgs> Changed; public event EventHandler<ProcessEventArgs> Changed;
public Process Process { public Process Process {
get { get {
@ -161,7 +161,7 @@ namespace Debugger
foreach(IExpirable exp in expireDependencies) { foreach(IExpirable exp in expireDependencies) {
AddExpireDependency(exp); AddExpireDependency(exp);
} }
AddExpireDependency(process.SelectedProcess); AddExpireDependency(process);
this.mutateDependencies = mutateDependencies; this.mutateDependencies = mutateDependencies;
if (!this.HasExpired) { if (!this.HasExpired) {
@ -198,7 +198,7 @@ namespace Debugger
} }
} }
void DependencyChanged(object sender, DebuggerEventArgs e) void DependencyChanged(object sender, ProcessEventArgs e)
{ {
NotifyChange(); NotifyChange();
} }
@ -218,7 +218,7 @@ namespace Debugger
} }
} }
protected virtual void OnChanged(DebuggerEventArgs e) protected virtual void OnChanged(ProcessEventArgs e)
{ {
if (Changed != null) { if (Changed != null) {
Changed(this, e); Changed(this, e);

2
src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Variables/VariableEventArgs.cs

@ -9,7 +9,7 @@ using System;
namespace Debugger namespace Debugger
{ {
public class VariableEventArgs: DebuggerEventArgs public class VariableEventArgs: ProcessEventArgs
{ {
Variable variable; Variable variable;

Loading…
Cancel
Save