Browse Source

fix setting breakpoints in properties.fix UI issues; fix null reference issues.remove old code mappings (not needed anymore).

pull/263/merge
Eusebiu Marcu 15 years ago
parent
commit
489bd6fb7a
  1. 3
      Debugger/ILSpy.Debugger/Commands/BreakpointCommand.cs
  2. 1
      Debugger/ILSpy.Debugger/Commands/DebuggerCommands.cs
  3. 5
      Debugger/ILSpy.Debugger/ILSpy.Debugger.csproj
  4. 11
      Debugger/ILSpy.Debugger/Services/Debugger/WindowsDebugger.cs
  5. 52
      ILSpy.SharpDevelop.LGPL/AvalonEdit/IconBarMargin.cs
  6. 19
      ILSpy.SharpDevelop.LGPL/Bookmarks/BreakpointBookmark.cs
  7. 10
      ILSpy.SharpDevelop.LGPL/Bookmarks/CurrentLineBookmark.cs
  8. 5
      ILSpy.SharpDevelop.LGPL/DebugInformation.cs
  9. 8
      ILSpy.SharpDevelop.LGPL/ILSpy.SharpDevelop.LGPL.csproj
  10. 2
      ILSpy.SharpDevelop.LGPL/Models/ToolTipRequestEventArgs.cs
  11. 19
      ILSpy.SharpDevelop.LGPL/Services/DebuggerService.cs
  12. 0
      ILSpy.SharpDevelop.LGPL/Services/IDebugger.cs
  13. 11
      ILSpy.SharpDevelop.LGPL/Services/ParserService.cs
  14. 10
      ILSpy/App.xaml.cs
  15. 7
      ILSpy/TextView/DecompilerTextView.cs

3
Debugger/ILSpy.Debugger/Commands/BreakpointCommand.cs

@ -32,8 +32,9 @@ namespace ICSharpCode.ILSpy.Debugger.Commands
// no bookmark on the line: create a new breakpoint // no bookmark on the line: create a new breakpoint
DebuggerService.ToggleBreakpointAt( DebuggerService.ToggleBreakpointAt(
DebugInformation.DecompiledMemberReferences[key], instruction.MemberMapping.MemberReference,
line, line,
token,
instruction.ILInstructionOffset, instruction.ILInstructionOffset,
DebugInformation.Language); DebugInformation.Language);
break; break;

1
Debugger/ILSpy.Debugger/Commands/DebuggerCommands.cs

@ -307,6 +307,7 @@ namespace ICSharpCode.ILSpy.Debugger.Commands
public override void Execute(object parameter) public override void Execute(object parameter)
{ {
if (CurrentDebugger.IsDebugging && !CurrentDebugger.IsProcessRunning) { if (CurrentDebugger.IsDebugging && !CurrentDebugger.IsProcessRunning) {
CurrentLineBookmark.Remove();
CurrentDebugger.Continue(); CurrentDebugger.Continue();
MainWindow.Instance.SetStatus("Running...", Brushes.Black); MainWindow.Instance.SetStatus("Running...", Brushes.Black);
} }

5
Debugger/ILSpy.Debugger/ILSpy.Debugger.csproj

@ -87,8 +87,6 @@
<Compile Include="Models\TreeModel\TreeNode.cs" /> <Compile Include="Models\TreeModel\TreeNode.cs" />
<Compile Include="Models\TreeModel\Utils.cs" /> <Compile Include="Models\TreeModel\Utils.cs" />
<Compile Include="Services\Debugger\DebuggerHelper.cs" /> <Compile Include="Services\Debugger\DebuggerHelper.cs" />
<Compile Include="Services\Debugger\DebuggerService.cs" />
<Compile Include="Services\Debugger\IDebugger.cs" />
<Compile Include="Services\Debugger\ListHelper.cs" /> <Compile Include="Services\Debugger\ListHelper.cs" />
<Compile Include="Services\Debugger\TypeResolverExtension.cs" /> <Compile Include="Services\Debugger\TypeResolverExtension.cs" />
<Compile Include="Services\Debugger\WindowsDebugger.cs" /> <Compile Include="Services\Debugger\WindowsDebugger.cs" />
@ -96,13 +94,11 @@
<Compile Include="Services\ImageService\ImageService.cs" /> <Compile Include="Services\ImageService\ImageService.cs" />
<Compile Include="Models\RunningProcess.cs" /> <Compile Include="Models\RunningProcess.cs" />
<Compile Include="Properties\AssemblyInfo.cs" /> <Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="Services\ParserService\ParserService.cs" />
<Compile Include="ToolTips\DebuggerPopup.cs" /> <Compile Include="ToolTips\DebuggerPopup.cs" />
<Compile Include="ToolTips\DebuggerTooltipControl.xaml.cs"> <Compile Include="ToolTips\DebuggerTooltipControl.xaml.cs">
<DependentUpon>DebuggerTooltipControl.xaml</DependentUpon> <DependentUpon>DebuggerTooltipControl.xaml</DependentUpon>
</Compile> </Compile>
<Compile Include="ToolTips\LazyItemsControl.cs" /> <Compile Include="ToolTips\LazyItemsControl.cs" />
<Compile Include="ToolTips\Models\ToolTipRequestEventArgs.cs" />
<Compile Include="ToolTips\TextEditorListener.cs" /> <Compile Include="ToolTips\TextEditorListener.cs" />
<Compile Include="ToolTips\VirtualizingIEnumerable.cs" /> <Compile Include="ToolTips\VirtualizingIEnumerable.cs" />
<Compile Include="UI\AttachToProcessWindow.xaml.cs"> <Compile Include="UI\AttachToProcessWindow.xaml.cs">
@ -123,7 +119,6 @@
<Folder Include="Models\TreeModel" /> <Folder Include="Models\TreeModel" />
<Folder Include="Commands" /> <Folder Include="Commands" />
<Folder Include="ToolTips" /> <Folder Include="ToolTips" />
<Folder Include="ToolTips\Models" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<Page Include="ToolTips\DebuggerTooltipControl.xaml" /> <Page Include="ToolTips\DebuggerTooltipControl.xaml" />

11
Debugger/ILSpy.Debugger/Services/Debugger/WindowsDebugger.cs

@ -1,6 +1,7 @@
// 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.ComponentModel.Composition;
using System.Diagnostics; using System.Diagnostics;
using System.Linq; using System.Linq;
using System.Runtime.InteropServices; using System.Runtime.InteropServices;
@ -27,6 +28,7 @@ using StackFrame = Debugger.StackFrame;
namespace ICSharpCode.ILSpy.Debugger.Services namespace ICSharpCode.ILSpy.Debugger.Services
{ {
[Export(typeof(IDebugger))]
public class WindowsDebugger : IDebugger public class WindowsDebugger : IDebugger
{ {
enum StopAttachedProcessDialogResult { enum StopAttachedProcessDialogResult {
@ -283,7 +285,7 @@ namespace ICSharpCode.ILSpy.Debugger.Services
int key = frame.MethodInfo.MetadataToken; int key = frame.MethodInfo.MetadataToken;
// get the mapped instruction from the current line marker or the next one // get the mapped instruction from the current line marker or the next one
if (!DebugInformation.CodeMappings.ContainsKey(key)) if (DebugInformation.CodeMappings == null || !DebugInformation.CodeMappings.ContainsKey(key))
return null; return null;
return DebugInformation.CodeMappings[key].GetInstructionByTokenAndOffset(key, frame.IP, out isMatch); return DebugInformation.CodeMappings[key].GetInstructionByTokenAndOffset(key, frame.IP, out isMatch);
@ -550,7 +552,7 @@ namespace ICSharpCode.ILSpy.Debugger.Services
debugger, debugger,
bookmark.MemberReference.DeclaringType.FullName, bookmark.MemberReference.DeclaringType.FullName,
bookmark.LineNumber, bookmark.LineNumber,
bookmark.MemberReference.MetadataToken.ToInt32(), bookmark.FunctionToken,
bookmark.ILRange.From, bookmark.ILRange.From,
bookmark.IsEnabled); bookmark.IsEnabled);
@ -796,11 +798,12 @@ namespace ICSharpCode.ILSpy.Debugger.Services
int line; int line;
MemberReference memberReference; MemberReference memberReference;
if (DebugInformation.CodeMappings.ContainsKey(token) && if (DebugInformation.CodeMappings != null &&
DebugInformation.CodeMappings.ContainsKey(token) &&
DebugInformation.CodeMappings[token].GetInstructionByTokenAndOffset(token, ilOffset, out memberReference, out line)) { DebugInformation.CodeMappings[token].GetInstructionByTokenAndOffset(token, ilOffset, out memberReference, out line)) {
DebugInformation.DebugStepInformation = null; // we do not need to step into/out DebugInformation.DebugStepInformation = null; // we do not need to step into/out
DebuggerService.RemoveCurrentLineMarker(); DebuggerService.RemoveCurrentLineMarker();
DebuggerService.JumpToCurrentLine(memberReference, line, 0, line, 0); DebuggerService.JumpToCurrentLine(memberReference, line, 0, line, 0, ilOffset);
} }
else { else {
StepIntoUnknownFrame(frame); StepIntoUnknownFrame(frame);

52
ILSpy.SharpDevelop.LGPL/AvalonEdit/IconBarMargin.cs

@ -15,6 +15,7 @@ using ICSharpCode.Decompiler;
using ICSharpCode.ILSpy.Bookmarks; using ICSharpCode.ILSpy.Bookmarks;
using ICSharpCode.ILSpy.Debugger; using ICSharpCode.ILSpy.Debugger;
using ICSharpCode.ILSpy.Debugger.Bookmarks; using ICSharpCode.ILSpy.Debugger.Bookmarks;
using ICSharpCode.ILSpy.Debugger.Services;
using ICSharpCode.NRefactory.CSharp; using ICSharpCode.NRefactory.CSharp;
using Mono.Cecil; using Mono.Cecil;
@ -70,10 +71,15 @@ namespace ICSharpCode.ILSpy.AvalonEdit
// create a dictionary line number => first bookmark // create a dictionary line number => first bookmark
Dictionary<int, IBookmark> bookmarkDict = new Dictionary<int, IBookmark>(); Dictionary<int, IBookmark> bookmarkDict = new Dictionary<int, IBookmark>();
foreach (var bm in BookmarkManager.Bookmarks) { foreach (var bm in BookmarkManager.Bookmarks) {
if (DebugInformation.DecompiledMemberReferences == null || DebugInformation.DecompiledMemberReferences.Count == 0 || if (bm is BreakpointBookmark) {
!DebugInformation.DecompiledMemberReferences.ContainsKey(bm.MemberReference.MetadataToken.ToInt32())) if (DebugInformation.CodeMappings == null || DebugInformation.CodeMappings.Count == 0 ||
continue; !DebugInformation.CodeMappings.ContainsKey(((BreakpointBookmark)bm).FunctionToken))
continue;
} else {
if (DebugInformation.DecompiledMemberReferences == null || DebugInformation.DecompiledMemberReferences.Count == 0 ||
!DebugInformation.DecompiledMemberReferences.ContainsKey(((MarkerBookmark)bm).MemberReference.MetadataToken.ToInt32()))
continue;
}
int line = bm.LineNumber; int line = bm.LineNumber;
IBookmark existingBookmark; IBookmark existingBookmark;
if (!bookmarkDict.TryGetValue(line, out existingBookmark) || bm.ZOrder > existingBookmark.ZOrder) if (!bookmarkDict.TryGetValue(line, out existingBookmark) || bm.ZOrder > existingBookmark.ZOrder)
@ -248,26 +254,24 @@ namespace ICSharpCode.ILSpy.AvalonEdit
if (storage == null || storage.Count == 0) if (storage == null || storage.Count == 0)
return; return;
//remove existing bookmarks and create new ones // TODO: handle other types of bookmarks
// remove existing bookmarks and create new ones
List<BreakpointBookmark> newBookmarks = new List<BreakpointBookmark>(); List<BreakpointBookmark> newBookmarks = new List<BreakpointBookmark>();
for (int i = BookmarkManager.Bookmarks.Count - 1; i >= 0; --i) { for (int i = BookmarkManager.Bookmarks.Count - 1; i >= 0; --i) {
var breakpoint = BookmarkManager.Bookmarks[i] as BreakpointBookmark; var breakpoint = BookmarkManager.Bookmarks[i] as BreakpointBookmark;
if (breakpoint == null) if (breakpoint == null)
continue; continue;
var key = breakpoint.MemberReference.MetadataToken.ToInt32(); var key = breakpoint.FunctionToken;
if (!storage.ContainsKey(key)) if (!storage.ContainsKey(key))
continue; continue;
var member = DebugInformation.DecompiledMemberReferences[key];
bool isMatch; bool isMatch;
SourceCodeMapping map = storage[key].GetInstructionByTokenAndOffset( SourceCodeMapping map = storage[key].GetInstructionByTokenAndOffset(key, breakpoint.ILRange.From, out isMatch);
member.MetadataToken.ToInt32(), breakpoint.ILRange.From, out isMatch);
if (map != null) { if (map != null) {
newBookmarks.Add(new BreakpointBookmark( newBookmarks.Add(new BreakpointBookmark(
member, new AstLocation(map.SourceCodeLine, 0), breakpoint.MemberReference, new AstLocation(map.SourceCodeLine, 0), breakpoint.FunctionToken,
map.ILInstructionOffset, BreakpointAction.Break, DebugInformation.Language)); map.ILInstructionOffset, BreakpointAction.Break, DebugInformation.Language));
BookmarkManager.RemoveMark(breakpoint); BookmarkManager.RemoveMark(breakpoint);
@ -285,33 +289,25 @@ namespace ICSharpCode.ILSpy.AvalonEdit
if (CurrentLineBookmark.Instance == null) if (CurrentLineBookmark.Instance == null)
return; return;
var oldMappings = DebugInformation.OldCodeMappings; var codeMappings = DebugInformation.CodeMappings;
var newMappings = DebugInformation.CodeMappings; if (codeMappings == null)
if (oldMappings == null || newMappings == null)
return; return;
// 1. Save it's data // 1. Save it's data
int line = CurrentLineBookmark.Instance.LineNumber; int line = CurrentLineBookmark.Instance.LineNumber;
var markerType = CurrentLineBookmark.Instance.MemberReference; var markerType = CurrentLineBookmark.Instance.MemberReference;
int token = markerType.MetadataToken.ToInt32();
int offset = CurrentLineBookmark.Instance.ILOffset;
if (!oldMappings.ContainsKey(markerType.MetadataToken.ToInt32()) || !newMappings.ContainsKey(markerType.MetadataToken.ToInt32())) if (!codeMappings.ContainsKey(token))
return; return;
// 2. Remove it // 2. map the marker line
CurrentLineBookmark.Remove();
// 3. map the marker line
int token;
var instruction = oldMappings[markerType.MetadataToken.ToInt32()].GetInstructionByLineNumber(line, out token);
if (instruction == null)
return;
MemberReference memberReference; MemberReference memberReference;
int newline; int newline;
if (newMappings[markerType.MetadataToken.ToInt32()].GetInstructionByTokenAndOffset(token, instruction.ILInstructionOffset.From, out memberReference, out newline)) { if (codeMappings[token].GetInstructionByTokenAndOffset(token, offset, out memberReference, out newline)) {
// 4. create breakpoint for new languages // 3. create breakpoint for new languages
CurrentLineBookmark.SetPosition(memberReference, newline, 0, newline, 0); DebuggerService.JumpToCurrentLine(memberReference, newline, 0, newline, 0, offset);
} }
} }
} }

19
ILSpy.SharpDevelop.LGPL/Bookmarks/BreakpointBookmark.cs

@ -40,6 +40,15 @@ namespace ICSharpCode.ILSpy.Debugger.Bookmarks
} }
} }
/// <summary>
/// Gets the function/method where the breakpoint is set.
/// <remarks>
/// In case of methods, it is the same as the MemberReference metadata token.<br/>
/// In case of properties and events, it's the GetMethod/SetMethod|AddMethod/RemoveMethod token.
/// </remarks>
/// </summary>
public int FunctionToken { get; private set; }
public ILRange ILRange { get; private set; } public ILRange ILRange { get; private set; }
public virtual bool IsHealthy { public virtual bool IsHealthy {
@ -72,12 +81,14 @@ namespace ICSharpCode.ILSpy.Debugger.Bookmarks
public string Tooltip { get; private set; } public string Tooltip { get; private set; }
public BreakpointBookmark(MemberReference member, AstLocation location, ILRange range, BreakpointAction action, DecompiledLanguages language) : base(member, location) public BreakpointBookmark(MemberReference member, AstLocation location, int functionToken, ILRange range, BreakpointAction action, DecompiledLanguages language)
: base(member, location)
{ {
this.action = action; this.action = action;
this.FunctionToken = functionToken;
this.ILRange = range; this.ILRange = range;
this.Tooltip = string.Format("Language:{0}, Line:{1}, IL range:{2}-{3}", language.ToString(), location.Line, range.From, range.To); this.Tooltip = string.Format("Language:{0}, Line:{1}, IL range:{2}-{3}", language.ToString(), location.Line, range.From, range.To);
this.Language = language; this.Language = language;
} }
public override ImageSource Image { public override ImageSource Image {
@ -91,8 +102,8 @@ namespace ICSharpCode.ILSpy.Debugger.Bookmarks
ITextMarker marker = markerService.Create(offset, length); ITextMarker marker = markerService.Create(offset, length);
marker.BackgroundColor = Color.FromRgb(180, 38, 38); marker.BackgroundColor = Color.FromRgb(180, 38, 38);
marker.ForegroundColor = Colors.White; marker.ForegroundColor = Colors.White;
marker.IsVisible = b => b is MarkerBookmark && DebugInformation.DecompiledMemberReferences != null && marker.IsVisible = b => b is BreakpointBookmark && DebugInformation.CodeMappings != null &&
DebugInformation.DecompiledMemberReferences.ContainsKey(((MarkerBookmark)b).MemberReference.MetadataToken.ToInt32()); DebugInformation.CodeMappings.ContainsKey(((BreakpointBookmark)b).FunctionToken);
marker.Bookmark = this; marker.Bookmark = this;
this.Marker = marker; this.Marker = marker;

10
ILSpy.SharpDevelop.LGPL/Bookmarks/CurrentLineBookmark.cs

@ -24,7 +24,7 @@ namespace ICSharpCode.ILSpy.Debugger.Bookmarks
static int endLine; static int endLine;
static int endColumn; static int endColumn;
public static void SetPosition(MemberReference memberReference, int makerStartLine, int makerStartColumn, int makerEndLine, int makerEndColumn) public static void SetPosition(MemberReference memberReference, int makerStartLine, int makerStartColumn, int makerEndLine, int makerEndColumn, int ilOffset)
{ {
Remove(); Remove();
@ -33,7 +33,7 @@ namespace ICSharpCode.ILSpy.Debugger.Bookmarks
endLine = makerEndLine; endLine = makerEndLine;
endColumn = makerEndColumn; endColumn = makerEndColumn;
instance = new CurrentLineBookmark(memberReference, new AstLocation(startLine, startColumn)); instance = new CurrentLineBookmark(memberReference, new AstLocation(startLine, startColumn), ilOffset);
BookmarkManager.AddMark(instance); BookmarkManager.AddMark(instance);
} }
@ -53,11 +53,13 @@ namespace ICSharpCode.ILSpy.Debugger.Bookmarks
get { return 100; } get { return 100; }
} }
public CurrentLineBookmark(MemberReference member, AstLocation location) : base(member, location) public CurrentLineBookmark(MemberReference member, AstLocation location, int ilOffset) : base(member, location)
{ {
this.ILOffset = ilOffset;
} }
public int ILOffset { get; private set; }
public override ImageSource Image { public override ImageSource Image {
get { return Images.CurrentLine; } get { return Images.CurrentLine; }
} }

5
ILSpy.SharpDevelop.LGPL/DebugInformation.cs

@ -47,11 +47,6 @@ namespace ICSharpCode.ILSpy.Debugger
/// </summary> /// </summary>
public static ConcurrentDictionary<int, IEnumerable<ILVariable>> LocalVariables { get; set; } public static ConcurrentDictionary<int, IEnumerable<ILVariable>> LocalVariables { get; set; }
/// <summary>
/// Gets or sets the old code mappings.
/// </summary>
public static Dictionary<int, List<MemberMapping>> OldCodeMappings { get; set; }
/// <summary> /// <summary>
/// Gets or sets the MembeReference that was decompiled (a TypeDefinition, MethodDefinition, etc) /// Gets or sets the MembeReference that was decompiled (a TypeDefinition, MethodDefinition, etc)
/// </summary> /// </summary>

8
ILSpy.SharpDevelop.LGPL/ILSpy.SharpDevelop.LGPL.csproj

@ -32,7 +32,7 @@
<Optimize>True</Optimize> <Optimize>True</Optimize>
<CheckForOverflowUnderflow>False</CheckForOverflowUnderflow> <CheckForOverflowUnderflow>False</CheckForOverflowUnderflow>
<DefineConstants>TRACE</DefineConstants> <DefineConstants>TRACE</DefineConstants>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition=" '$(Platform)' == 'AnyCPU' "> <PropertyGroup Condition=" '$(Platform)' == 'AnyCPU' ">
<PlatformTarget>AnyCPU</PlatformTarget> <PlatformTarget>AnyCPU</PlatformTarget>
</PropertyGroup> </PropertyGroup>
@ -76,11 +76,17 @@
<Compile Include="Bookmarks\MarkerBookmark.cs" /> <Compile Include="Bookmarks\MarkerBookmark.cs" />
<Compile Include="DebugInformation.cs" /> <Compile Include="DebugInformation.cs" />
<Compile Include="Images.cs" /> <Compile Include="Images.cs" />
<Compile Include="Models\ToolTipRequestEventArgs.cs" />
<Compile Include="Properties\AssemblyInfo.cs" /> <Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="Services\DebuggerService.cs" />
<Compile Include="Services\IDebugger.cs" />
<Compile Include="Services\ParserService.cs" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<Folder Include="AvalonEdit" /> <Folder Include="AvalonEdit" />
<Folder Include="Bookmarks" /> <Folder Include="Bookmarks" />
<Folder Include="Models" />
<Folder Include="Services" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ProjectReference Include="..\AvalonEdit\ICSharpCode.AvalonEdit\ICSharpCode.AvalonEdit.csproj"> <ProjectReference Include="..\AvalonEdit\ICSharpCode.AvalonEdit\ICSharpCode.AvalonEdit.csproj">

2
Debugger/ILSpy.Debugger/ToolTips/Models/ToolTipRequestEventArgs.cs → ILSpy.SharpDevelop.LGPL/Models/ToolTipRequestEventArgs.cs

@ -7,7 +7,7 @@ using ICSharpCode.NRefactory.CSharp;
namespace ICSharpCode.ILSpy.Debugger.Tooltips namespace ICSharpCode.ILSpy.Debugger.Tooltips
{ {
internal class ToolTipRequestEventArgs : EventArgs public class ToolTipRequestEventArgs : EventArgs
{ {
/// <summary> /// <summary>
/// Gets whether the tool tip request was handled. /// Gets whether the tool tip request was handled.

19
Debugger/ILSpy.Debugger/Services/Debugger/DebuggerService.cs → ILSpy.SharpDevelop.LGPL/Services/DebuggerService.cs

@ -26,7 +26,7 @@ namespace ICSharpCode.ILSpy.Debugger.Services
static IDebugger GetCompatibleDebugger() static IDebugger GetCompatibleDebugger()
{ {
return currentDebugger = new WindowsDebugger(); return currentDebugger;
} }
/// <summary> /// <summary>
@ -38,6 +38,8 @@ namespace ICSharpCode.ILSpy.Debugger.Services
get { get {
if (currentDebugger == null) { if (currentDebugger == null) {
currentDebugger = GetCompatibleDebugger(); currentDebugger = GetCompatibleDebugger();
if (currentDebugger == null)
return null;
currentDebugger.DebugStarting += new EventHandler(OnDebugStarting); currentDebugger.DebugStarting += new EventHandler(OnDebugStarting);
currentDebugger.DebugStarted += new EventHandler(OnDebugStarted); currentDebugger.DebugStarted += new EventHandler(OnDebugStarted);
currentDebugger.DebugStopped += new EventHandler(OnDebugStopped); currentDebugger.DebugStopped += new EventHandler(OnDebugStopped);
@ -165,12 +167,12 @@ namespace ICSharpCode.ILSpy.Debugger.Services
} }
} }
public static void ToggleBreakpointAt(MemberReference member, int lineNumber, ILRange range, DecompiledLanguages language) public static void ToggleBreakpointAt(MemberReference member, int lineNumber, int functionToken, ILRange range, DecompiledLanguages language)
{ {
BookmarkManager.ToggleBookmark( BookmarkManager.ToggleBookmark(
member.FullName, lineNumber, member.FullName, lineNumber,
b => b.CanToggle && b is BreakpointBookmark, b => b.CanToggle && b is BreakpointBookmark,
location => new BreakpointBookmark(member, location, range, BreakpointAction.Break, language)); location => new BreakpointBookmark(member, location, functionToken, range, BreakpointAction.Break, language));
} }
/* TODO: reimplement this stuff /* TODO: reimplement this stuff
@ -186,9 +188,9 @@ namespace ICSharpCode.ILSpy.Debugger.Services
CurrentLineBookmark.Remove(); CurrentLineBookmark.Remove();
} }
public static void JumpToCurrentLine(MemberReference memberReference, int startLine, int startColumn, int endLine, int endColumn) public static void JumpToCurrentLine(MemberReference memberReference, int startLine, int startColumn, int endLine, int endColumn, int ilOffset)
{ {
CurrentLineBookmark.SetPosition(memberReference, startLine, startColumn, endLine, endColumn); CurrentLineBookmark.SetPosition(memberReference, startLine, startColumn, endLine, endColumn, ilOffset);
} }
#region Tool tips #region Tool tips
@ -198,7 +200,7 @@ namespace ICSharpCode.ILSpy.Debugger.Services
/// showing its current value (when in debugging mode) can be returned /// showing its current value (when in debugging mode) can be returned
/// through the ToolTipRequestEventArgs.SetTooltip() method. /// through the ToolTipRequestEventArgs.SetTooltip() method.
/// </summary> /// </summary>
internal static void HandleToolTipRequest(ToolTipRequestEventArgs e) public static void HandleToolTipRequest(ToolTipRequestEventArgs e)
{ {
if (!e.InDocument) if (!e.InDocument)
return; return;
@ -384,5 +386,10 @@ namespace ICSharpCode.ILSpy.Debugger.Services
// return text.ToString(); // return text.ToString();
// } // }
#endregion #endregion
public static void SetDebugger(Lazy<IDebugger> debugger)
{
currentDebugger = debugger.Value;
}
} }
} }

0
Debugger/ILSpy.Debugger/Services/Debugger/IDebugger.cs → ILSpy.SharpDevelop.LGPL/Services/IDebugger.cs

11
Debugger/ILSpy.Debugger/Services/ParserService/ParserService.cs → ILSpy.SharpDevelop.LGPL/Services/ParserService.cs

@ -15,7 +15,7 @@ namespace ICSharpCode.ILSpy.Debugger.Services
static ParserService() static ParserService()
{ {
mySet.AddRange((new [] { mySet.AddRange((new string [] {
".", ".",
"{", "{",
"}", "}",
@ -41,7 +41,14 @@ namespace ICSharpCode.ILSpy.Debugger.Services
@"\t", @"\t",
@"\r", @"\r",
"|" "|"
}).AsReadOnly()); }));
}
static void AddRange<T>(this ICollection<T> list, IEnumerable<T> items)
{
foreach (T item in items)
if (!list.Contains(item))
list.Add(item);
} }
/// <summary> /// <summary>

10
ILSpy/App.xaml.cs

@ -17,16 +17,16 @@
// DEALINGS IN THE SOFTWARE. // DEALINGS IN THE SOFTWARE.
using System; using System;
using System.Collections.Generic;
using System.ComponentModel.Composition.Hosting; using System.ComponentModel.Composition.Hosting;
using System.Diagnostics; using System.Diagnostics;
using System.IO; using System.IO;
using System.Linq; using System.Linq;
using System.Threading;
using System.Windows; using System.Windows;
using System.Windows.Documents; using System.Windows.Documents;
using System.Windows.Navigation; using System.Windows.Navigation;
using System.Windows.Threading; using System.Windows.Threading;
using ICSharpCode.ILSpy.Debugger.Services;
using ICSharpCode.ILSpy.TextView; using ICSharpCode.ILSpy.TextView;
namespace ICSharpCode.ILSpy namespace ICSharpCode.ILSpy
@ -73,6 +73,12 @@ namespace ICSharpCode.ILSpy
EventManager.RegisterClassHandler(typeof(Window), EventManager.RegisterClassHandler(typeof(Window),
Hyperlink.RequestNavigateEvent, Hyperlink.RequestNavigateEvent,
new RequestNavigateEventHandler(Window_RequestNavigate)); new RequestNavigateEventHandler(Window_RequestNavigate));
try {
DebuggerService.SetDebugger(compositionContainer.GetExport<IDebugger>());
} catch {
// unable to find a IDebugger
}
} }
string FullyQualifyPath(string argument) string FullyQualifyPath(string argument)

7
ILSpy/TextView/DecompilerTextView.cs

@ -46,6 +46,7 @@ using ICSharpCode.ILSpy.AvalonEdit;
using ICSharpCode.ILSpy.Bookmarks; using ICSharpCode.ILSpy.Bookmarks;
using ICSharpCode.ILSpy.Debugger; using ICSharpCode.ILSpy.Debugger;
using ICSharpCode.ILSpy.Debugger.Bookmarks; using ICSharpCode.ILSpy.Debugger.Bookmarks;
using ICSharpCode.ILSpy.Debugger.Services;
using ICSharpCode.ILSpy.Options; using ICSharpCode.ILSpy.Options;
using ICSharpCode.ILSpy.TreeNodes; using ICSharpCode.ILSpy.TreeNodes;
using ICSharpCode.ILSpy.XmlDoc; using ICSharpCode.ILSpy.XmlDoc;
@ -452,7 +453,7 @@ namespace ICSharpCode.ILSpy.TextView
iconMargin.SyncBookmarks(); iconMargin.SyncBookmarks();
if (isDecompilationOk) { if (isDecompilationOk) {
if (DebugInformation.DebugStepInformation != null) { if (DebugInformation.DebugStepInformation != null && DebuggerService.CurrentDebugger != null) {
// repaint bookmarks // repaint bookmarks
iconMargin.InvalidateVisual(); iconMargin.InvalidateVisual();
@ -467,8 +468,7 @@ namespace ICSharpCode.ILSpy.TextView
DebugInformation.CodeMappings[token].GetInstructionByTokenAndOffset(token, ilOffset, out member, out line); DebugInformation.CodeMappings[token].GetInstructionByTokenAndOffset(token, ilOffset, out member, out line);
// update marker // update marker
CurrentLineBookmark.Remove(); DebuggerService.JumpToCurrentLine(member, line, 0, line, 0, ilOffset);
CurrentLineBookmark.SetPosition(member, line, 0, line, 0);
var bm = CurrentLineBookmark.Instance; var bm = CurrentLineBookmark.Instance;
DocumentLine docline = textEditor.Document.GetLineByNumber(line); DocumentLine docline = textEditor.Document.GetLineByNumber(line);
@ -530,7 +530,6 @@ namespace ICSharpCode.ILSpy.TextView
void DecompileNodes(DecompilationContext context, ITextOutput textOutput) void DecompileNodes(DecompilationContext context, ITextOutput textOutput)
{ {
// reset data // reset data
DebugInformation.OldCodeMappings = DebugInformation.CodeMappings;
DebugInformation.CodeMappings = null; DebugInformation.CodeMappings = null;
DebugInformation.LocalVariables = null; DebugInformation.LocalVariables = null;
DebugInformation.DecompiledMemberReferences = null; DebugInformation.DecompiledMemberReferences = null;

Loading…
Cancel
Save