Browse Source

Worked on variable updating; Properties in debugger tooltips

git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/trunk@877 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61
shortcuts
David Srbecký 20 years ago
parent
commit
18bd451e71
  1. 6
      src/AddIns/Misc/Debugger/Debugger.AddIn/Project/Src/Pads/CallStackPad.cs
  2. 2
      src/AddIns/Misc/Debugger/Debugger.AddIn/Project/Src/Pads/LocalVarPad.cs
  3. 12
      src/AddIns/Misc/Debugger/Debugger.AddIn/Project/Src/Pads/RunningThreadsPad.cs
  4. 5
      src/AddIns/Misc/Debugger/Debugger.AddIn/Project/Src/Pads/TreeListViewDebuggerItem.cs
  5. 36
      src/AddIns/Misc/Debugger/Debugger.AddIn/Project/Src/Service/DynamicTreeDebuggerRow.cs
  6. 37
      src/AddIns/Misc/Debugger/Debugger.AddIn/Project/Src/Service/WindowsDebugger.cs
  7. 40
      src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Debugger/NDebugger-StateControl.cs
  8. 9
      src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Modules/Module.cs
  9. 4
      src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Threads/Function.cs
  10. 20
      src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Variables/Variable.cs

6
src/AddIns/Misc/Debugger/Debugger.AddIn/Project/Src/Pads/CallStackPad.cs

@ -74,8 +74,8 @@ namespace ICSharpCode.SharpDevelop.Gui.Pads
{ {
debuggerCore = debugger.DebuggerCore; debuggerCore = debugger.DebuggerCore;
debuggerCore.DebuggingPaused += new EventHandler<DebuggingPausedEventArgs>(DebuggingPaused); debuggerCore.DebuggeeStateChanged += DebuggeeStateChanged;
debuggerCore.DebuggingResumed += new EventHandler<DebuggerEventArgs>(DebuggingResumed); debuggerCore.DebuggingResumed += DebuggingResumed;
RefreshList(); RefreshList();
} }
@ -180,7 +180,7 @@ namespace ICSharpCode.SharpDevelop.Gui.Pads
} }
} }
void DebuggingPaused(object sender, DebuggingPausedEventArgs e) void DebuggeeStateChanged(object sender, DebuggerEventArgs e)
{ {
RefreshList(); RefreshList();
} }

2
src/AddIns/Misc/Debugger/Debugger.AddIn/Project/Src/Pads/LocalVarPad.cs

@ -85,6 +85,8 @@ namespace ICSharpCode.SharpDevelop.Gui.Pads
{ {
debuggerCore = debugger.DebuggerCore; debuggerCore = debugger.DebuggerCore;
debuggerCore.DebuggeeStateChanged += delegate { debuggerCore.LocalVariables.Update(); };
localVarList.BeginUpdate(); localVarList.BeginUpdate();
AddVariableCollectionToTree(debuggerCore.LocalVariables, localVarList.Items); AddVariableCollectionToTree(debuggerCore.LocalVariables, localVarList.Items);
localVarList.EndUpdate(); localVarList.EndUpdate();

12
src/AddIns/Misc/Debugger/Debugger.AddIn/Project/Src/Pads/RunningThreadsPad.cs

@ -1,4 +1,4 @@
// <file> // <file>
// <copyright see="prj:///doc/copyright.txt">2002-2005 AlphaSierraPapa</copyright> // <copyright see="prj:///doc/copyright.txt">2002-2005 AlphaSierraPapa</copyright>
// <license see="prj:///doc/license.txt">GNU General Public License</license> // <license see="prj:///doc/license.txt">GNU General Public License</license>
// <owner name="David Srbecký" email="dsrbecky@gmail.com"/> // <owner name="David Srbecký" email="dsrbecky@gmail.com"/>
@ -80,10 +80,10 @@ namespace ICSharpCode.SharpDevelop.Gui.Pads
{ {
debuggerCore = debugger.DebuggerCore; debuggerCore = debugger.DebuggerCore;
debuggerCore.DebuggingPaused += new EventHandler<DebuggingPausedEventArgs>(OnDebuggingPaused); debuggerCore.DebuggeeStateChanged += DebuggeeStateChanged;
debuggerCore.ThreadStarted += new EventHandler<ThreadEventArgs>(ThreadStarted); debuggerCore.ThreadStarted += ThreadStarted;
debuggerCore.ThreadStateChanged += new EventHandler<ThreadEventArgs>(ThreadStateChanged); debuggerCore.ThreadStateChanged += ThreadStateChanged;
debuggerCore.ThreadExited += new EventHandler<ThreadEventArgs>(ThreadExited); debuggerCore.ThreadExited += ThreadExited;
RefreshList(); RefreshList();
} }
@ -166,7 +166,7 @@ namespace ICSharpCode.SharpDevelop.Gui.Pads
} }
} }
void OnDebuggingPaused(object sender, DebuggingPausedEventArgs e) void DebuggeeStateChanged(object sender, DebuggerEventArgs e)
{ {
RefreshList(); RefreshList();
} }

5
src/AddIns/Misc/Debugger/Debugger.AddIn/Project/Src/Pads/TreeListViewDebuggerItem.cs

@ -66,7 +66,10 @@ namespace ICSharpCode.SharpDevelop.Gui.Pads
if (this.SubItems[2].Text != Variable.Value.Type) if (this.SubItems[2].Text != Variable.Value.Type)
this.SubItems[2].Text = Variable.Value.Type; this.SubItems[2].Text = Variable.Value.Type;
this.ImageIndex = DebuggerIcons.GetImageListIndex(variable); int imageIndex = DebuggerIcons.GetImageListIndex(variable);
if (this.ImageIndex != imageIndex) {
this.ImageIndex = imageIndex;
}
if (IsExpanded) { if (IsExpanded) {
variable.SubVariables.Update(); variable.SubVariables.Update();

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

@ -9,6 +9,7 @@ using System;
using System.Drawing; using System.Drawing;
using System.Windows.Forms; using System.Windows.Forms;
using Debugger; using Debugger;
using ICSharpCode.Core;
using ICSharpCode.SharpDevelop.Gui; using ICSharpCode.SharpDevelop.Gui;
using ICSharpCode.SharpDevelop.Gui.TreeGrid; using ICSharpCode.SharpDevelop.Gui.TreeGrid;
@ -23,6 +24,7 @@ namespace ICSharpCode.SharpDevelop.Services
// 3 = value // 3 = value
Variable variable; Variable variable;
Image image;
public Variable Variable { public Variable Variable {
get { get {
@ -42,23 +44,35 @@ namespace ICSharpCode.SharpDevelop.Services
if (variable == null) throw new ArgumentNullException("variable"); if (variable == null) throw new ArgumentNullException("variable");
this.variable = variable; this.variable = variable;
this.variable.ValueChanged += delegate { Update(); };
this[1].Paint += OnIconPaint; this[1].Paint += OnIconPaint;
this[2].Text = variable.Name;
this[3].Text = variable.Value.AsString;
this[3].FinishLabelEdit += OnLabelEdited; this[3].FinishLabelEdit += OnLabelEdited;
if (variable.Value is PrimitiveValue && variable.Value.ManagedType != typeof(string)) { if (variable.Value is PrimitiveValue && variable.Value.ManagedType != typeof(string)) {
this[3].AllowLabelEdit = true; this[3].AllowLabelEdit = true;
} }
if (!variable.Value.MayHaveSubVariables) if (!variable.Value.MayHaveSubVariables) {
this.ShowPlus = false; this.ShowPlus = false;
}
this.ShowMinusWhileExpanded = true; this.ShowMinusWhileExpanded = true;
Update();
}
void Update()
{
image = DebuggerIcons.GetImage(variable);
this[1].Text = ""; // Icon
this[2].Text = variable.Name;
this[3].Text = variable.Value.AsString;
} }
void OnIconPaint(object sender, ItemPaintEventArgs e) void OnIconPaint(object sender, ItemPaintEventArgs e)
{ {
e.Graphics.DrawImageUnscaled(DebuggerIcons.GetImage(variable), e.ClipRectangle); if (image != null) {
e.Graphics.DrawImageUnscaled(image, e.ClipRectangle);
}
} }
void OnLabelEdited(object sender, DynamicListEventArgs e) void OnLabelEdited(object sender, DynamicListEventArgs e)
@ -71,5 +85,19 @@ namespace ICSharpCode.SharpDevelop.Services
MessageBox.Show(WorkbenchSingleton.MainForm, "Can not covert " + newValue + " to " + val.ManagedType.ToString(), "Can not set value"); MessageBox.Show(WorkbenchSingleton.MainForm, "Can not covert " + newValue + " to " + val.ManagedType.ToString(), "Can not set value");
} }
} }
/// <summary>
/// Called when plus is pressed in debugger tooltip.
/// Sets the data to be show in the next level.
/// </summary>
protected override void OnExpanding(DynamicListEventArgs e)
{
this.ChildRows.Clear();
foreach(Variable variable in this.Variable.SubVariables) {
DynamicTreeDebuggerRow newRow = new DynamicTreeDebuggerRow(variable);
DebuggerGridControl.AddColumns(newRow.ChildColumns);
this.ChildRows.Add(newRow);
}
}
} }
} }

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

@ -238,27 +238,10 @@ namespace ICSharpCode.SharpDevelop.Services
return null; return null;
} else { } else {
DynamicTreeDebuggerRow newRow = new DynamicTreeDebuggerRow(variable); DynamicTreeDebuggerRow newRow = new DynamicTreeDebuggerRow(variable);
newRow.Expanding += TooltipControlRowExpanding;
return new DebuggerGridControl(newRow); return new DebuggerGridControl(newRow);
} }
} }
/// <summary>
/// Called when plus is pressed in debugger tooltip.
/// Sets the data to be show in the next level.
/// </summary>
void TooltipControlRowExpanding(object sender, EventArgs args)
{
DynamicTreeDebuggerRow row = (DynamicTreeDebuggerRow) sender;
row.ChildRows.Clear();
foreach(Variable variable in row.Variable.SubVariables) {
DynamicTreeDebuggerRow newRow = new DynamicTreeDebuggerRow(variable);
DebuggerGridControl.AddColumns(newRow.ChildColumns);
newRow.Expanding += TooltipControlRowExpanding;
row.ChildRows.Add(newRow);
}
}
public bool CanSetInstructionPointer(string filename, int line, int column) public bool CanSetInstructionPointer(string filename, int line, int column)
{ {
if (debugger != null && debugger.IsPaused && debugger.CurrentFunction != null) { if (debugger != null && debugger.IsPaused && debugger.CurrentFunction != null) {
@ -298,12 +281,13 @@ namespace ICSharpCode.SharpDevelop.Services
debugger = new NDebugger(); debugger = new NDebugger();
debugger.LogMessage += new EventHandler<MessageEventArgs>(LogMessage); debugger.LogMessage += LogMessage;
debugger.DebuggerTraceMessage += new EventHandler<MessageEventArgs>(TraceMessage); debugger.DebuggerTraceMessage += TraceMessage;
debugger.ProcessStarted += new EventHandler<ProcessEventArgs>(ProcessStarted); debugger.ProcessStarted += ProcessStarted;
debugger.ProcessExited += new EventHandler<ProcessEventArgs>(ProcessExited); debugger.ProcessExited += ProcessExited;
debugger.DebuggingPaused += new EventHandler<DebuggingPausedEventArgs>(DebuggingPaused); debugger.DebuggingPaused += DebuggingPaused;
debugger.DebuggingResumed += new EventHandler<DebuggerEventArgs>(DebuggingResumed); debugger.DebuggeeStateChanged += DebuggeeStateChanged;
debugger.DebuggingResumed += DebuggingResumed;
debugger.BreakpointStateChanged += delegate (object sender, BreakpointEventArgs e) { debugger.BreakpointStateChanged += delegate (object sender, BreakpointEventArgs e) {
RestoreSharpdevelopBreakpoint(e.Breakpoint); RestoreSharpdevelopBreakpoint(e.Breakpoint);
@ -420,11 +404,14 @@ namespace ICSharpCode.SharpDevelop.Services
debugger.CurrentThread.InterceptCurrentException(); debugger.CurrentThread.InterceptCurrentException();
break; break;
} }
} else {
JumpToCurrentLine();
} }
} }
void DebuggeeStateChanged(object sender, DebuggerEventArgs e)
{
JumpToCurrentLine();
}
void DebuggingResumed(object sender, DebuggerEventArgs e) void DebuggingResumed(object sender, DebuggerEventArgs e)
{ {
isProcessRunningCache = true; isProcessRunningCache = true;

40
src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Debugger/NDebugger-StateControl.cs

@ -28,8 +28,9 @@ namespace Debugger
Process currentProcess; Process currentProcess;
public event EventHandler<DebuggingPausedEventArgs> DebuggingPaused;
public event EventHandler<DebuggerEventArgs> DebuggingResumed; public event EventHandler<DebuggerEventArgs> DebuggingResumed;
public event EventHandler<DebuggingPausedEventArgs> DebuggingPaused;
public event EventHandler<DebuggerEventArgs> DebuggeeStateChanged;
public bool PauseOnHandledException { public bool PauseOnHandledException {
get { get {
@ -40,11 +41,19 @@ namespace Debugger
} }
} }
protected virtual void OnDebuggingPaused(PausedReason reason) protected virtual void OnDebuggingResumed()
{ {
TraceMessage ("Debugger event: OnDebuggingPaused(" + reason.ToString() + ")"); TraceMessage ("Debugger event: OnDebuggingResumed()");
if (DebuggingResumed != null) {
DebuggingResumed(this, new DebuggerEventArgs(this));
}
}
protected virtual void OnDebuggingPaused()
{
TraceMessage ("Debugger event: OnDebuggingPaused (" + PausedReason.ToString() + ")");
if (DebuggingPaused != null) { if (DebuggingPaused != null) {
DebuggingPausedEventArgs args = new DebuggingPausedEventArgs(this, reason); DebuggingPausedEventArgs args = new DebuggingPausedEventArgs(this, PausedReason);
DebuggingPaused(this, args); DebuggingPaused(this, args);
if (args.ResumeDebugging) { if (args.ResumeDebugging) {
Continue(); Continue();
@ -52,11 +61,11 @@ namespace Debugger
} }
} }
protected virtual void OnDebuggingResumed() protected virtual void OnDebuggeeStateChanged()
{ {
TraceMessage ("Debugger event: OnDebuggingResumed()"); TraceMessage ("Debugger event: OnDebuggeeStateChanged (" + PausedReason.ToString() + ")");
if (DebuggingResumed != null) { if (DebuggeeStateChanged != null) {
DebuggingResumed(this, new DebuggerEventArgs(this)); DebuggeeStateChanged(this, new DebuggerEventArgs(this));
} }
} }
@ -167,16 +176,19 @@ namespace Debugger
pausedReason = reason; pausedReason = reason;
sessionID = new object(); sessionID = new object();
if (reason != PausedReason.AllEvalsComplete) { OnDebuggingPaused();
debugeeStateID = new object();
}
OnDebuggingPaused(reason);
// Debugger state is unknown after calling OnDebuggingPaused (it may be resumed) // Debugger state is unknown after calling OnDebuggingPaused (it may be resumed)
if (IsPaused) {
if (reason != PausedReason.AllEvalsComplete) {
debugeeStateID = new object();
OnDebuggeeStateChanged();
}
}
// This is a good point to autmaticaly evaluate evals from update of variables (if there are any) // This is a good point to autmaticaly evaluate evals from update of variables (if there are any)
if (IsPaused) { if (IsPaused) {
localVariables.Update();
this.StartEvaluation(); this.StartEvaluation();
} }

9
src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Modules/Module.cs

@ -19,6 +19,7 @@ namespace Debugger
{ {
NDebugger debugger; NDebugger debugger;
bool unloaded = false;
string fullPath; string fullPath;
string fullPathPDB; string fullPathPDB;
ulong baseAdress; ulong baseAdress;
@ -42,6 +43,12 @@ namespace Debugger
} }
} }
public bool Unloaded {
get {
return unloaded;
}
}
public SymReader SymReader { public SymReader SymReader {
get { get {
return symReader; return symReader;
@ -209,6 +216,8 @@ namespace Debugger
} finally { } finally {
metaDataInterface = null; metaDataInterface = null;
} }
unloaded = true;
} }
} }
} }

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

@ -76,7 +76,7 @@ namespace Debugger
/// </summary> /// </summary>
public bool HasExpired { public bool HasExpired {
get { get {
return steppedOut; return steppedOut || Module.Unloaded;
} }
} }
@ -492,7 +492,7 @@ namespace Debugger
yield return new PropertyVariable(debugger, yield return new PropertyVariable(debugger,
method.Name.Remove(0, 4), method.Name.Remove(0, 4),
delegate { delegate {
if (this.HasExpired && !this.IsStatic) { if (this.HasExpired) {
return null; return null;
} else { } else {
return CreatePropertyEval(method); return CreatePropertyEval(method);

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

@ -26,9 +26,23 @@ namespace Debugger
protected ValueGetter valueGetter; protected ValueGetter valueGetter;
Value cachedValue; Value cachedValue;
public event EventHandler<VariableEventArgs> ValueChanged; event EventHandler<DebuggerEventArgs> valueChanged;
public event EventHandler<VariableCollectionEventArgs> ValueRemovedFromCollection; public event EventHandler<VariableCollectionEventArgs> ValueRemovedFromCollection;
public event EventHandler<DebuggerEventArgs> ValueChanged {
add {
valueChanged += value;
debugger.DebuggeeStateChanged += value;
debugger.ProcessExited += delegate {
debugger.DebuggeeStateChanged -= value;
};
}
remove {
valueChanged -= value;
debugger.DebuggeeStateChanged -= value;
}
}
public NDebugger Debugger { public NDebugger Debugger {
get { get {
return debugger; return debugger;
@ -78,8 +92,8 @@ namespace Debugger
protected virtual void OnValueChanged() protected virtual void OnValueChanged()
{ {
cachedValue = null; cachedValue = null;
if (ValueChanged != null) { if (valueChanged != null) {
ValueChanged(this, new VariableEventArgs(this)); valueChanged(this, new VariableEventArgs(this));
} }
} }

Loading…
Cancel
Save