Browse Source

Break at first line of execution

pull/15/head
Eusebiu Marcu 15 years ago
parent
commit
c1d5d98e0e
  1. 1495
      src/AddIns/Debugger/Debugger.AddIn/Service/WindowsDebugger.cs
  2. 359
      src/AddIns/Debugger/Debugger.Core/Breakpoint.cs
  3. 1294
      src/AddIns/Debugger/Debugger.Core/Process.cs
  4. 54
      src/Main/Base/Project/ICSharpCode.SharpDevelop.addin
  5. 14
      src/Main/Base/Project/Src/Commands/DebugCommands.cs
  6. 5
      src/Main/Base/Project/Src/Services/Debugger/DefaultDebugger.cs
  7. 7
      src/Main/Base/Project/Src/Services/Debugger/IDebugger.cs

1495
src/AddIns/Debugger/Debugger.AddIn/Service/WindowsDebugger.cs

File diff suppressed because it is too large Load Diff

359
src/AddIns/Debugger/Debugger.Core/Breakpoint.cs

@ -1,175 +1,184 @@
// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt) // Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt)
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt) // This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Runtime.InteropServices; using System.Runtime.InteropServices;
using Debugger.Interop.CorDebug; using Debugger.Interop.CorDebug;
namespace Debugger namespace Debugger
{ {
public class Breakpoint: DebuggerObject public class Breakpoint: DebuggerObject
{ {
NDebugger debugger; NDebugger debugger;
string fileName; string fileName;
byte[] checkSum; byte[] checkSum;
int line; int line;
int column; int column;
bool enabled; bool enabled;
SourcecodeSegment originalLocation; SourcecodeSegment originalLocation;
List<ICorDebugFunctionBreakpoint> corBreakpoints = new List<ICorDebugFunctionBreakpoint>(); List<ICorDebugFunctionBreakpoint> corBreakpoints = new List<ICorDebugFunctionBreakpoint>();
public event EventHandler<BreakpointEventArgs> Hit; public event EventHandler<BreakpointEventArgs> Hit;
public event EventHandler<BreakpointEventArgs> Set; public event EventHandler<BreakpointEventArgs> Set;
[Debugger.Tests.Ignore] [Debugger.Tests.Ignore]
public NDebugger Debugger { public NDebugger Debugger {
get { return debugger; } get { return debugger; }
} }
public string FileName { public string FileName {
get { return fileName; } get { return fileName; }
} }
public byte[] CheckSum { public byte[] CheckSum {
get { return checkSum; } get { return checkSum; }
} }
public int Line { public int Line {
get { return line; } get { return line; }
set { line = value; } set { line = value; }
} }
public int Column { public int Column {
get { return column; } get { return column; }
} }
public bool Enabled { public bool Enabled {
get { return enabled; } get { return enabled; }
set { set {
enabled = value; enabled = value;
foreach(ICorDebugFunctionBreakpoint corBreakpoint in corBreakpoints) { foreach(ICorDebugFunctionBreakpoint corBreakpoint in corBreakpoints) {
corBreakpoint.Activate(enabled ? 1 : 0); corBreakpoint.Activate(enabled ? 1 : 0);
} }
} }
} }
public SourcecodeSegment OriginalLocation { public SourcecodeSegment OriginalLocation {
get { return originalLocation; } get { return originalLocation; }
} }
public bool IsSet { public bool IsSet {
get { get {
return corBreakpoints.Count > 0; return corBreakpoints.Count > 0;
} }
} }
protected virtual void OnHit(BreakpointEventArgs e) protected virtual void OnHit(BreakpointEventArgs e)
{ {
if (Hit != null) { if (Hit != null) {
Hit(this, e); Hit(this, e);
} }
} }
internal void NotifyHit() internal void NotifyHit()
{ {
OnHit(new BreakpointEventArgs(this)); OnHit(new BreakpointEventArgs(this));
debugger.Breakpoints.OnHit(this); debugger.Breakpoints.OnHit(this);
} }
protected virtual void OnSet(BreakpointEventArgs e) protected virtual void OnSet(BreakpointEventArgs e)
{ {
if (Set != null) { if (Set != null) {
Set(this, e); Set(this, e);
} }
} }
public Breakpoint(NDebugger debugger, string fileName, byte[] checkSum, int line, int column, bool enabled) public Breakpoint(NDebugger debugger, ICorDebugFunctionBreakpoint corBreakpoint)
{ {
this.debugger = debugger; this.debugger = debugger;
this.fileName = fileName; this.corBreakpoints.Add(corBreakpoint);
this.checkSum = checkSum; }
this.line = line;
this.column = column; public Breakpoint(NDebugger debugger, string fileName, byte[] checkSum, int line, int column, bool enabled)
this.enabled = enabled; {
} this.debugger = debugger;
this.fileName = fileName;
internal bool IsOwnerOf(ICorDebugBreakpoint breakpoint) this.checkSum = checkSum;
{ this.line = line;
foreach(ICorDebugFunctionBreakpoint corFunBreakpoint in corBreakpoints) { this.column = column;
if (((ICorDebugBreakpoint)corFunBreakpoint).Equals(breakpoint)) return true; this.enabled = enabled;
} }
return false;
} internal bool IsOwnerOf(ICorDebugBreakpoint breakpoint)
{
internal void Deactivate() foreach(ICorDebugFunctionBreakpoint corFunBreakpoint in corBreakpoints) {
{ if (((ICorDebugBreakpoint)corFunBreakpoint).Equals(breakpoint)) return true;
foreach(ICorDebugFunctionBreakpoint corBreakpoint in corBreakpoints) { }
#if DEBUG return false;
// Get repro }
corBreakpoint.Activate(0);
#else internal void Deactivate()
try { {
corBreakpoint.Activate(0); foreach(ICorDebugFunctionBreakpoint corBreakpoint in corBreakpoints) {
} catch(COMException e) { #if DEBUG
// Sometimes happens, but we had not repro yet. // Get repro
// 0x80131301: Process was terminated. corBreakpoint.Activate(0);
if ((uint)e.ErrorCode == 0x80131301) #else
continue; try {
throw; corBreakpoint.Activate(0);
} } catch(COMException e) {
#endif // Sometimes happens, but we had not repro yet.
} // 0x80131301: Process was terminated.
corBreakpoints.Clear(); if ((uint)e.ErrorCode == 0x80131301)
} continue;
throw;
internal void MarkAsDeactivated() }
{ #endif
corBreakpoints.Clear(); }
} corBreakpoints.Clear();
}
internal bool SetBreakpoint(Module module)
{ internal void MarkAsDeactivated()
SourcecodeSegment segment = SourcecodeSegment.Resolve(module, FileName, CheckSum, Line, Column); {
if (segment == null) return false; corBreakpoints.Clear();
}
originalLocation = segment;
internal bool SetBreakpoint(Module module)
ICorDebugFunctionBreakpoint corBreakpoint = segment.CorFunction.GetILCode().CreateBreakpoint((uint)segment.ILStart); {
corBreakpoint.Activate(enabled ? 1 : 0); if (this.fileName == null)
return false;
corBreakpoints.Add(corBreakpoint);
SourcecodeSegment segment = SourcecodeSegment.Resolve(module, FileName, CheckSum, Line, Column);
OnSet(new BreakpointEventArgs(this)); if (segment == null) return false;
return true; originalLocation = segment;
}
ICorDebugFunctionBreakpoint corBreakpoint = segment.CorFunction.GetILCode().CreateBreakpoint((uint)segment.ILStart);
/// <summary> Remove this breakpoint </summary> corBreakpoint.Activate(enabled ? 1 : 0);
public void Remove()
{ corBreakpoints.Add(corBreakpoint);
debugger.Breakpoints.Remove(this);
} OnSet(new BreakpointEventArgs(this));
}
return true;
[Serializable] }
public class BreakpointEventArgs : DebuggerEventArgs
{ /// <summary> Remove this breakpoint </summary>
Breakpoint breakpoint; public void Remove()
{
public Breakpoint Breakpoint { debugger.Breakpoints.Remove(this);
get { }
return breakpoint; }
}
} [Serializable]
public class BreakpointEventArgs : DebuggerEventArgs
public BreakpointEventArgs(Breakpoint breakpoint): base(breakpoint.Debugger) {
{ Breakpoint breakpoint;
this.breakpoint = breakpoint;
} public Breakpoint Breakpoint {
} get {
} return breakpoint;
}
}
public BreakpointEventArgs(Breakpoint breakpoint): base(breakpoint.Debugger)
{
this.breakpoint = breakpoint;
}
}
}

1294
src/AddIns/Debugger/Debugger.Core/Process.cs

File diff suppressed because it is too large Load Diff

54
src/Main/Base/Project/ICSharpCode.SharpDevelop.addin

@ -928,9 +928,9 @@
</ComplexCondition> </ComplexCondition>
</Condition> </Condition>
<Condition name="IsProcessRunning" isdebugging = "True"> <Condition name="DebuggerSupports" debuggersupports = "Stepping">
<Condition name="DebuggerSupports" debuggersupports = "Stepping"> <Condition name = "SolutionOpen" action = "Disable">
<Condition name="IsProcessRunning" isprocessrunning = "False" action = "Disable"> <Condition name="DebuggerSupports" debuggersupports = "Start">
<ToolbarItem id = "SteppingSeparator" type = "Separator" /> <ToolbarItem id = "SteppingSeparator" type = "Separator" />
<ToolbarItem id = "Step over" <ToolbarItem id = "Step over"
icon = "Icons.16x16.Debug.StepOver" icon = "Icons.16x16.Debug.StepOver"
@ -940,10 +940,12 @@
icon = "Icons.16x16.Debug.StepInto" icon = "Icons.16x16.Debug.StepInto"
tooltip = "${res:XML.MainMenu.DebugMenu.StepInto.Description}" tooltip = "${res:XML.MainMenu.DebugMenu.StepInto.Description}"
class = "ICSharpCode.SharpDevelop.Project.Commands.StepIntoDebuggingCommand"/> class = "ICSharpCode.SharpDevelop.Project.Commands.StepIntoDebuggingCommand"/>
<ToolbarItem id = "Step out" <Condition name="IsProcessRunning" isdebugging = "True">
icon = "Icons.16x16.Debug.StepOut" <ToolbarItem id = "Step out"
tooltip = "${res:XML.MainMenu.DebugMenu.StepOut.Description}" icon = "Icons.16x16.Debug.StepOut"
class = "ICSharpCode.SharpDevelop.Project.Commands.StepOutDebuggingCommand"/> tooltip = "${res:XML.MainMenu.DebugMenu.StepOut.Description}"
class = "ICSharpCode.SharpDevelop.Project.Commands.StepOutDebuggingCommand"/>
</Condition>
</Condition> </Condition>
</Condition> </Condition>
</Condition> </Condition>
@ -1548,23 +1550,27 @@
</Condition> </Condition>
<Condition name="DebuggerSupports" debuggersupports = "Stepping"> <Condition name="DebuggerSupports" debuggersupports = "Stepping">
<Condition name="IsProcessRunning" isprocessrunning = "False" isdebugging = "True" action = "Disable"> <Condition name = "SolutionOpen" action = "Disable">
<MenuItem id = "BeforeSteppingSeparator" type = "Separator" /> <Condition name="DebuggerSupports" debuggersupports = "Start">
<MenuItem id = "Step over" <MenuItem id = "BeforeSteppingSeparator" type = "Separator" />
label = "${res:XML.MainMenu.DebugMenu.StepOver}" <MenuItem id = "Step over"
icon = "Icons.16x16.Debug.StepOver" label = "${res:XML.MainMenu.DebugMenu.StepOver}"
shortcut = "F10" icon = "Icons.16x16.Debug.StepOver"
class = "ICSharpCode.SharpDevelop.Project.Commands.StepDebuggingCommand"/> shortcut = "F10"
<MenuItem id = "Step into" class = "ICSharpCode.SharpDevelop.Project.Commands.StepDebuggingCommand"/>
label = "${res:XML.MainMenu.DebugMenu.StepInto}" <MenuItem id = "Step into"
icon = "Icons.16x16.Debug.StepInto" label = "${res:XML.MainMenu.DebugMenu.StepInto}"
shortcut = "F11" icon = "Icons.16x16.Debug.StepInto"
class = "ICSharpCode.SharpDevelop.Project.Commands.StepIntoDebuggingCommand"/> shortcut = "F11"
<MenuItem id = "Step out" class = "ICSharpCode.SharpDevelop.Project.Commands.StepIntoDebuggingCommand"/>
label = "${res:XML.MainMenu.DebugMenu.StepOut}" <Condition name="IsProcessRunning" isdebugging = "True">
icon = "Icons.16x16.Debug.StepOut" <MenuItem id = "Step out"
shortcut = "Shift|F11" label = "${res:XML.MainMenu.DebugMenu.StepOut}"
class = "ICSharpCode.SharpDevelop.Project.Commands.StepOutDebuggingCommand"/> icon = "Icons.16x16.Debug.StepOut"
shortcut = "Shift|F11"
class = "ICSharpCode.SharpDevelop.Project.Commands.StepOutDebuggingCommand"/>
</Condition>
</Condition>
</Condition> </Condition>
</Condition> </Condition>

14
src/Main/Base/Project/Src/Commands/DebugCommands.cs

@ -83,7 +83,12 @@ namespace ICSharpCode.SharpDevelop.Project.Commands
public override void Run() public override void Run()
{ {
LoggingService.Info("Debugger Command: StepOver"); LoggingService.Info("Debugger Command: StepOver");
DebuggerService.CurrentDebugger.StepOver(); if (!DebuggerService.CurrentDebugger.IsDebugging) {
DebuggerService.CurrentDebugger.BreakAtBegining = true;
new Execute().Run();
} else {
DebuggerService.CurrentDebugger.StepOver();
}
} }
} }
@ -92,7 +97,12 @@ namespace ICSharpCode.SharpDevelop.Project.Commands
public override void Run() public override void Run()
{ {
LoggingService.Info("Debugger Command: StepInto"); LoggingService.Info("Debugger Command: StepInto");
DebuggerService.CurrentDebugger.StepInto(); if (!DebuggerService.CurrentDebugger.IsDebugging) {
DebuggerService.CurrentDebugger.BreakAtBegining = true;
new Execute().Run();
} else {
DebuggerService.CurrentDebugger.StepOver();
}
} }
} }

5
src/Main/Base/Project/Src/Services/Debugger/DefaultDebugger.cs

@ -25,6 +25,11 @@ namespace ICSharpCode.SharpDevelop.Debugging
} }
} }
/// <inheritdoc/>
public bool BreakAtBegining {
get; set;
}
public bool CanDebug(IProject project) public bool CanDebug(IProject project)
{ {
return true; return true;

7
src/Main/Base/Project/Src/Services/Debugger/IDebugger.cs

@ -25,6 +25,13 @@ namespace ICSharpCode.SharpDevelop.Debugging
get; get;
} }
/// <summary>
/// Gets or sets whether the debugger should break at the first line of execution.
/// </summary>
bool BreakAtBegining {
get; set;
}
bool CanDebug(IProject project); bool CanDebug(IProject project);
/// <summary> /// <summary>

Loading…
Cancel
Save