Browse Source

Fix StepInto uncompiled code.

pull/191/merge
Eusebiu Marcu 15 years ago
parent
commit
eafc08a181
  1. 6
      Debugger/ILSpy.Debugger/DebuggedType.cs
  2. 34
      Debugger/ILSpy.Debugger/Services/Debugger/WindowsDebugger.cs
  3. 1
      ICSharpCode.Decompiler/PlainTextOutput.cs
  4. 29
      ILSpy/Commands/DebuggerCommands.cs

6
Debugger/ILSpy.Debugger/DebuggedType.cs

@ -17,6 +17,7 @@
// DEALINGS IN THE SOFTWARE. // DEALINGS IN THE SOFTWARE.
using System; using System;
using System.Collections.Generic;
using ICSharpCode.Decompiler; using ICSharpCode.Decompiler;
using Mono.Cecil; using Mono.Cecil;
@ -36,5 +37,10 @@ namespace ILSpy.Debugger
/// Gets or sets the decompiled language. /// Gets or sets the decompiled language.
/// </summary> /// </summary>
public static DecompiledLanguages Language { get; set; } public static DecompiledLanguages Language { get; set; }
/// <summary>
/// List of loaded assemblies.
/// </summary>
public static IEnumerable<AssemblyDefinition> LoadedAssemblies { get; set; }
} }
} }

34
Debugger/ILSpy.Debugger/Services/Debugger/WindowsDebugger.cs

@ -4,6 +4,7 @@ using System;
using System.Collections.Concurrent; using System.Collections.Concurrent;
using System.Collections.Generic; using System.Collections.Generic;
using System.Diagnostics; using System.Diagnostics;
using System.IO;
using System.Linq; using System.Linq;
using System.Runtime.InteropServices; using System.Runtime.InteropServices;
using System.Text; using System.Text;
@ -13,6 +14,7 @@ using System.Windows.Media;
using Debugger; using Debugger;
using Debugger.Interop.CorPublish; using Debugger.Interop.CorPublish;
using ICSharpCode.Decompiler; using ICSharpCode.Decompiler;
using ICSharpCode.Decompiler.Ast;
using ICSharpCode.NRefactory; using ICSharpCode.NRefactory;
using ICSharpCode.NRefactory.CSharp; using ICSharpCode.NRefactory.CSharp;
using ICSharpCode.NRefactory.Visitors; using ICSharpCode.NRefactory.Visitors;
@ -824,6 +826,38 @@ namespace ILSpy.Debugger.Services
TypeDefinition type; TypeDefinition type;
if (CodeMappingsStorage.GetSourceCodeFromMetadataTokenAndOffset(token, ilOffset, out type, out line)) { if (CodeMappingsStorage.GetSourceCodeFromMetadataTokenAndOffset(token, ilOffset, out type, out line)) {
DebuggerService.JumpToCurrentLine(type, line, 0, line, 0); DebuggerService.JumpToCurrentLine(type, line, 0, line, 0);
} else {
var debugType = frame.MethodInfo.DeclaringType;
string fullName = debugType.Namespace + "." + debugType.Name;
FileStream ds = new FileStream("dasda", FileMode.Create);
// search for type in the current assembly list
TypeReference typeRef = null;
foreach (var assembly in DebugData.LoadedAssemblies) {
foreach (var module in assembly.Modules) {
if (module.TryGetTypeReference(fullName, out typeRef)) {
break;
}
}
if (typeRef != null)
break;
}
if (typeRef != null) {
// decompile on demand
AstBuilder builder = new AstBuilder(new DecompilerContext());
builder.AddType(typeRef.Resolve());
builder.GenerateCode(new PlainTextOutput());
// jump
if (CodeMappingsStorage.GetSourceCodeFromMetadataTokenAndOffset(token, ilOffset, out type, out line)) {
DebuggerService.JumpToCurrentLine(type, line, 0, line, 0);
}
} else {
// continue since we cannot find the debugged type
Continue();
}
} }
} }
} }

1
ICSharpCode.Decompiler/PlainTextOutput.cs

@ -38,6 +38,7 @@ namespace ICSharpCode.Decompiler
public PlainTextOutput() public PlainTextOutput()
{ {
this.writer = new StringWriter(); this.writer = new StringWriter();
CurrentLine = 1;
} }
public int CurrentLine { get; set; } public int CurrentLine { get; set; }

29
ILSpy/Commands/DebuggerCommands.cs

@ -17,9 +17,9 @@ using Microsoft.Win32;
namespace ICSharpCode.ILSpy.Commands namespace ICSharpCode.ILSpy.Commands
{ {
internal abstract class DebuggerCommands : SimpleCommand internal abstract class DebuggerCommand : SimpleCommand
{ {
public DebuggerCommands() public DebuggerCommand()
{ {
MainWindow.Instance.KeyUp += OnKeyUp; MainWindow.Instance.KeyUp += OnKeyUp;
} }
@ -75,6 +75,11 @@ namespace ICSharpCode.ILSpy.Commands
} }
#endregion #endregion
public override void Execute(object parameter)
{
DebugData.LoadedAssemblies = MainWindow.Instance.AssemblyList.assemblies.Select(a => a.AssemblyDefinition);
}
protected static IDebugger CurrentDebugger { protected static IDebugger CurrentDebugger {
get { get {
return DebuggerService.CurrentDebugger; return DebuggerService.CurrentDebugger;
@ -166,7 +171,7 @@ namespace ICSharpCode.ILSpy.Commands
MenuCategory = "Debugger1", MenuCategory = "Debugger1",
Header = "Attach to _running application", Header = "Attach to _running application",
MenuOrder = 0)] MenuOrder = 0)]
internal sealed class AttachCommand : DebuggerCommands internal sealed class AttachCommand : DebuggerCommand
{ {
public override void Execute(object parameter) public override void Execute(object parameter)
{ {
@ -186,7 +191,7 @@ namespace ICSharpCode.ILSpy.Commands
InputGestureText = "F5", InputGestureText = "F5",
IsEnabled = false, IsEnabled = false,
MenuOrder = 1)] MenuOrder = 1)]
internal sealed class ContinueDebuggingCommand : DebuggerCommands internal sealed class ContinueDebuggingCommand : DebuggerCommand
{ {
public override void Execute(object parameter) public override void Execute(object parameter)
{ {
@ -202,14 +207,16 @@ namespace ICSharpCode.ILSpy.Commands
InputGestureText = "F11", InputGestureText = "F11",
IsEnabled = false, IsEnabled = false,
MenuOrder = 2)] MenuOrder = 2)]
internal sealed class StepIntoCommand : DebuggerCommands internal sealed class StepIntoCommand : DebuggerCommand
{ {
public override void Execute(object parameter) public override void Execute(object parameter)
{ {
if (CurrentDebugger.IsDebugging && !CurrentDebugger.IsProcessRunning) if (CurrentDebugger.IsDebugging && !CurrentDebugger.IsProcessRunning) {
base.Execute(null);
CurrentDebugger.StepInto(); CurrentDebugger.StepInto();
} }
} }
}
[ExportMainMenuCommand(Menu = "_Debugger", [ExportMainMenuCommand(Menu = "_Debugger",
MenuIcon = "ILSpy.Debugger;component/Images/StepOver.png", MenuIcon = "ILSpy.Debugger;component/Images/StepOver.png",
@ -218,7 +225,7 @@ namespace ICSharpCode.ILSpy.Commands
InputGestureText = "F10", InputGestureText = "F10",
IsEnabled = false, IsEnabled = false,
MenuOrder = 3)] MenuOrder = 3)]
internal sealed class StepOverCommand : DebuggerCommands internal sealed class StepOverCommand : DebuggerCommand
{ {
public override void Execute(object parameter) public override void Execute(object parameter)
{ {
@ -233,7 +240,7 @@ namespace ICSharpCode.ILSpy.Commands
Header = "Step out", Header = "Step out",
IsEnabled = false, IsEnabled = false,
MenuOrder = 4)] MenuOrder = 4)]
internal sealed class StepOutCommand : DebuggerCommands internal sealed class StepOutCommand : DebuggerCommand
{ {
public override void Execute(object parameter) public override void Execute(object parameter)
{ {
@ -247,7 +254,7 @@ namespace ICSharpCode.ILSpy.Commands
Header = "_Detach from running application", Header = "_Detach from running application",
IsEnabled = false, IsEnabled = false,
MenuOrder = 5)] MenuOrder = 5)]
internal sealed class DetachCommand : DebuggerCommands internal sealed class DetachCommand : DebuggerCommand
{ {
public override void Execute(object parameter) public override void Execute(object parameter)
{ {
@ -265,7 +272,7 @@ namespace ICSharpCode.ILSpy.Commands
MenuCategory = "Debugger2", MenuCategory = "Debugger2",
Header = "Remove all _breakpoints", Header = "Remove all _breakpoints",
MenuOrder = 6)] MenuOrder = 6)]
internal sealed class RemoveBreakpointsCommand : DebuggerCommands internal sealed class RemoveBreakpointsCommand : DebuggerCommand
{ {
public override void Execute(object parameter) public override void Execute(object parameter)
{ {
@ -288,7 +295,7 @@ namespace ICSharpCode.ILSpy.Commands
MenuCategory = "Debugger3", MenuCategory = "Debugger3",
Header = "Debug an _executable", Header = "Debug an _executable",
MenuOrder = 7)] MenuOrder = 7)]
internal sealed class DebugExecutableCommand : DebuggerCommands internal sealed class DebugExecutableCommand : DebuggerCommand
{ {
public override void Execute(object parameter) public override void Execute(object parameter)
{ {

Loading…
Cancel
Save