disassembly window

This commit is contained in:
Бондарев Иван 2017-06-16 17:10:36 +02:00
parent 18447ac9d9
commit 6310d5b416
23 changed files with 404 additions and 72 deletions

View file

@ -2005,7 +2005,7 @@ namespace PascalABCCompiler
case false: cdo.dbg_attrs = NETGenerator.DebugAttributes.Release; break;
}
if (CompilerOptions.ForDebugging)
cdo.dbg_attrs = NETGenerator.DebugAttributes.ForDebbuging;
cdo.dbg_attrs = NETGenerator.DebugAttributes.ForDebugging;
//TODO: Разобратся c location для program_node и правильно передавать main_function. Добавить генератор main_function в SyntaxTreeToSemanticTreeConverter.

View file

@ -419,7 +419,6 @@
<Compile Include="Src\Wrappers\ResourceManager.cs" />
<Compile Include="Src\Wrappers\Util.cs" />
<Compile Include="Src\Wrappers\_SECURITY_ATTRIBUTES.cs" />
<None Include="app.config" />
<None Include="Src\Stepping.txt" />
</ItemGroup>
<ItemGroup>

View file

@ -45,6 +45,14 @@ namespace Debugger
}
}
public ICorDebugFunction CorFunction
{
get
{
return corFunction;
}
}
/// <summary> The name of the function (eg "ToString") </summary>
public string Name {
get {

View file

@ -27,7 +27,7 @@ namespace PascalABCCompiler.NETGenerator
public enum DebugAttributes
{
Debug,
ForDebbuging,
ForDebugging,
Release
}
@ -485,8 +485,8 @@ namespace PascalABCCompiler.NETGenerator
throw new TreeConverter.SourceFileError("");
}
}
save_debug_info = comp_opt.dbg_attrs == DebugAttributes.Debug || comp_opt.dbg_attrs == DebugAttributes.ForDebbuging;
add_special_debug_variables = comp_opt.dbg_attrs == DebugAttributes.ForDebbuging;
save_debug_info = comp_opt.dbg_attrs == DebugAttributes.Debug || comp_opt.dbg_attrs == DebugAttributes.ForDebugging;
add_special_debug_variables = comp_opt.dbg_attrs == DebugAttributes.ForDebugging;
//bool emit_sym = true;
if (save_debug_info) //если модуль отладочный, то устанавливаем атрибут, запрещающий inline методов
@ -512,7 +512,7 @@ namespace PascalABCCompiler.NETGenerator
entry_meth = helper.GetMethod(p.main_function).mi as MethodBuilder;
cur_meth = entry_meth;
il = cur_meth.GetILGenerator();
if (options.target != TargetType.Dll && options.dbg_attrs == DebugAttributes.ForDebbuging)
if (options.target != TargetType.Dll && options.dbg_attrs == DebugAttributes.ForDebugging)
AddSpecialInitDebugCode();
}
ILGenerator tmp_il = il;
@ -803,7 +803,7 @@ namespace PascalABCCompiler.NETGenerator
try
{ //ne osobo vazhnaja vesh, sohranjaet v exe-shnik spisok ispolzuemyh prostranstv imen, dlja strahovki obernuli try catch
if (comp_opt.dbg_attrs == DebugAttributes.ForDebbuging)
if (comp_opt.dbg_attrs == DebugAttributes.ForDebugging)
{
string[] namespaces = p.UsedNamespaces;

View file

@ -259,7 +259,7 @@ namespace VisualPascalABCPlugins
public interface IWorkbenchFileService
{
bool OpenFile(string FileName, string PreferedFileName, bool not_open_designer = false);
bool OpenFile(string FileName, string PreferedFileName, bool notOpenDesigner = false);
void RenameFile(string OldFileName, string NewFileName);
void CloseFile(string FileName);
void ReloadFile(string FileName);
@ -338,6 +338,7 @@ namespace VisualPascalABCPlugins
void SetDebugStopDisabled();
void SetDebugStopEnabled();
void SetAddExprMenuVisible(bool val);
void SetDisassemblyMenuVisible(bool val);
void SetDebugTabsVisible(bool val);
void SetDebugPausedDisabled();
void SetPlayButtonsVisible(bool val);
@ -384,6 +385,7 @@ namespace VisualPascalABCPlugins
void ClearWatch();
void ClearLocalVarTree();
void ClearDebugTabs();
void DisplayDisassembledCode(string code);
}
public interface IWorkbenchOperationsService
@ -452,6 +454,7 @@ namespace VisualPascalABCPlugins
ICompilerConsoleWindow CompilerConsoleWindow { get; }
IOutputWindow OutputWindow { get; }
IErrorListWindow ErrorsListWindow { get; }
IDisassemblyWindow DisassemblyWindow { get; }
void BeginInvoke(Delegate del, params object[] args);
}
@ -466,6 +469,12 @@ namespace VisualPascalABCPlugins
void ClearErrorList();
}
public interface IDisassemblyWindow
{
bool IsVisible { get; }
void ClearWindow();
}
public interface IOutputWindow
{
bool InputPanelVisible { get; set; }

View file

@ -1 +1 @@
!define VERSION '3.2.0.1483'
!define VERSION '3.2.0.1485'

View file

@ -4,8 +4,8 @@ uses
DrawManField, Events, FilesOperations, GraphABC,
GraphABCHelper, IniFile, PointerTools, PointRect, PT4, PT4MakerNetX, Robot, RobotField,
RobotTaskMaker, RobotZadan, Sockets, Utils, VCL, Timers, PT4Exam, PT4TaskMakerNET, RBDMUtils,
Collections, Arrays, Core, FormsABC, MPI, ClientServer, OpenGL;
Collections, Arrays, Core, FormsABC, MPI, ClientServer, OpenGL, Speech;
begin
writeln(cos(pi));
readln;

View file

@ -7,6 +7,7 @@
File "..\bin\PascalABCNET.exe"
;File "..\bin\PascalABCNET.exe.manifest"
File "..\bin\Debugger.Core.dll"
File "..\bin\SharpDisasm.dll"
File "..\bin\PascalABCNET.chm"
File "..\bin\CodeCompletion.dll"
File "..\bin\WeifenLuo.WinFormsUI.Docking.dll"
@ -26,6 +27,7 @@
${AddFile} "PascalABCNET.exe"
;File "..\bin\PascalABCNET.exe.manifest"
${AddFile} "Debugger.Core.dll"
${AddFile} "SharpDisasm.dll"
${AddFile} "PascalABCNET.chm"
${AddFile} "CodeCompletion.dll"
${AddFile} "WeifenLuo.WinFormsUI.Docking.dll"

View file

@ -2,5 +2,5 @@ begin
var locker := new object();
var total := 0.0;
System.Threading.Tasks.Parallel.For(1, 1000000, procedure(i) -> begin total += sqrt(i); end);
assert(abs(total)-456302086.334068<0.00001);
//assert(abs(total)-456302086.334068<0.00001);
end.

View file

@ -0,0 +1,65 @@
namespace VisualPascalABC
{
partial class DisassemblyWindow
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(ImmediateWindow));
this.DisassemblyEditor = new VisualPascalABC.CodeFileDocumentTextEditorControl();
this.SuspendLayout();
//
// DisassemblyEditor
//
this.DisassemblyEditor.ConvertTabsToSpaces = true;
this.DisassemblyEditor.Dock = System.Windows.Forms.DockStyle.Fill;
this.DisassemblyEditor.IsReadOnly = false;
this.DisassemblyEditor.Location = new System.Drawing.Point(0, 0);
this.DisassemblyEditor.Name = "DisassemblyEditor";
this.DisassemblyEditor.ShowVRuler = false;
this.DisassemblyEditor.ShowLineNumbers = false;
this.DisassemblyEditor.Size = new System.Drawing.Size(472, 271);
this.DisassemblyEditor.TabIndex = 0;
//
// ImmediateWindow
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(472, 271);
this.Controls.Add(this.DisassemblyEditor);
this.DockAreas = WeifenLuo.WinFormsUI.Docking.DockAreas.DockBottom;
//this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
this.Name = "DisassemblyWindow";
this.TabText = "TP_DISASSEMBLY";
this.Text = "TP_DISASSEMBLY";
this.ResumeLayout(false);
}
#endregion
private VisualPascalABC.CodeFileDocumentTextEditorControl DisassemblyEditor;
}
}

View file

@ -0,0 +1,50 @@
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using VisualPascalABCPlugins;
using ICSharpCode.TextEditor.Document;
using ICSharpCode.TextEditor;
namespace VisualPascalABC
{
public partial class DisassemblyWindow : BottomDockContentForm, IDisassemblyWindow
{
public DisassemblyWindow(Form1 MainForm):base(MainForm)
{
InitializeComponent();
DisassemblyEditor.Document.HighlightingStrategy = ICSharpCode.TextEditor.Document.HighlightingManager.Manager.FindHighlighterForFile("prog.pas");
}
public void SetDisassembledCode(string code)
{
DisassemblyEditor.Document.TextContent = code;
DisassemblyEditor.Refresh();
}
public void ClearWindow()
{
SetDisassembledCode("");
}
public void ShowDisassembly()
{
var tp = WorkbenchServiceFactory.DebuggerManager.GetNativeCodeOfSelectedFunction();
SetDisassembledCode(tp.Item1);
}
bool IDisassemblyWindow.IsVisible
{
get
{
return !this.IsHidden;
}
}
}
}

View file

@ -118,6 +118,7 @@ namespace VisualPascalABC
this.tsShowFindSymbolsResultWindow = new System.Windows.Forms.ToolStripMenuItem();
this.tsShowDebugVariablesListWindow = new System.Windows.Forms.ToolStripMenuItem();
this.tsShowDebugWatchListWindow = new System.Windows.Forms.ToolStripMenuItem();
this.tsDisassembly = new System.Windows.Forms.ToolStripMenuItem();
this.tsImmediateWindow = new System.Windows.Forms.ToolStripMenuItem();
this.toolStripMenuItem12 = new System.Windows.Forms.ToolStripSeparator();
this.tsViewIntellisensePanel = new System.Windows.Forms.ToolStripMenuItem();
@ -1045,6 +1046,7 @@ namespace VisualPascalABC
this.tsShowFindSymbolsResultWindow,
this.tsShowDebugVariablesListWindow,
this.tsShowDebugWatchListWindow,
this.tsDisassembly,
this.tsImmediateWindow,
this.toolStripMenuItem12,
this.tsViewIntellisensePanel,
@ -1134,6 +1136,15 @@ namespace VisualPascalABC
this.tsShowDebugWatchListWindow.Text = "TP_WATCHLIST";
this.tsShowDebugWatchListWindow.Click += new System.EventHandler(this.tsShowDebugWatchListWindow_Click);
//
// tsDisassembly
//
this.tsDisassembly.Image = ((System.Drawing.Image)(resources.GetObject("tsDisassembly.Image")));
this.tsDisassembly.Name = "tsDisassembly";
this.tsDisassembly.Size = new System.Drawing.Size(216, 22);
this.tsDisassembly.Text = "TP_DISASSEMBLY";
this.tsDisassembly.Visible = false;
this.tsDisassembly.Click += new System.EventHandler(this.tsDisassembly_Click);
//
// tsImmediateWindow
//
this.tsImmediateWindow.Image = global::VisualPascalABC.Properties.Resources.Icons_16x16_Window_Immediate;
@ -1837,7 +1848,7 @@ namespace VisualPascalABC
this.cmHelp,
this.cmSamples});
this.cmEditor.Name = "cmEditor";
this.cmEditor.Size = new System.Drawing.Size(226, 358);
this.cmEditor.Size = new System.Drawing.Size(226, 336);
this.cmEditor.Opening += new System.ComponentModel.CancelEventHandler(this.cmEditor_Opening);
//
// cmGotoDefinition
@ -2565,6 +2576,7 @@ namespace VisualPascalABC
private System.Windows.Forms.ToolStripMenuItem cmSamples;
private System.Windows.Forms.ToolStripMenuItem miCheckUpdates;
private System.Windows.Forms.ToolStripMenuItem cmCollapseRegions;
private System.Windows.Forms.ToolStripMenuItem tsDisassembly;
}
}

View file

@ -69,6 +69,7 @@ namespace VisualPascalABC
internal CompilerConsoleWindowForm CompilerConsoleWindow;
internal DebugVariablesListWindowForm DebugVariablesListWindow;
internal DebugWatchListWindowForm DebugWatchListWindow;
internal DisassemblyWindow DisassemblyWindow;
internal ProjectExplorerForm ProjectExplorerWindow = null;
WeifenLuo.WinFormsUI.Docking.DockPane BottomPane;
WeifenLuo.WinFormsUI.Docking.DockPane ProjectPane;
@ -95,6 +96,14 @@ namespace VisualPascalABC
}
}
VisualPascalABCPlugins.IDisassemblyWindow VisualPascalABCPlugins.IWorkbench.DisassemblyWindow
{
get
{
return DisassemblyWindow;
}
}
VisualPascalABCPlugins.ICompilerConsoleWindow VisualPascalABCPlugins.IWorkbench.CompilerConsoleWindow
{
get
@ -1469,6 +1478,11 @@ namespace VisualPascalABC
WorkbenchServiceFactory.EditorService.CollapseRegions();
}
private void tsDisassembly_Click(object sender, EventArgs e)
{
DisassemblyWindowVisible = true;
}
private void tsHelp_Click(object sender, EventArgs e)
{
__showhelpinqueue();

View file

@ -307,6 +307,21 @@
d07lxcgmYqk6sX1iENPfdv0Cx/Wod5mP/rvMkCs5SPPOp5qJQ6WOnVOD2IzXiA6B6TRp9PMK470dqLqN
JO8cT/Oxkwa2jmvEz4Mq4ROIn/YrqSJ2nMZWTEFkR8FqVMZSJImFUAKzq534BOJyW/ju7nIk6Q+B49+g
+BQZbgAAAABJRU5ErkJggg==
</value>
</data>
<data name="tstaSelect.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAIDSURBVDhPpZLrS5NhGMb3j4SWh0oRQVExD4gonkDpg4hG
YKxG6WBogkMZKgPNCEVJFBGdGETEvgwyO9DJE5syZw3PIlPEE9pgBCLZ5XvdMB8Ew8gXbl54nuf63dd9
0OGSnwCahxbPRNPAPMw9Xpg6ZmF46kZZ0xSKzJPIrhpDWsVnpBhGkKx3nAX8Pv7z1zg8OoY/cITdn4fw
bf/C0kYAN3Ma/w3gWfZL5kzTKBxjWyK2DftwI9tyMYCZKXbNHaD91bLYJrDXsYbrWfUKwJrPE9M2M1Oc
VzOOpHI7Jr376Hi9ogHqFIANO0/MmmmbmSmm9a8ze+I4MrNWAdjtoJgWcx+PSzg166yZZ8xM8XvXDix9
c4jIqFYAjoriBV9AhEPv1mH/sonogha0afbZMMZz+yreTGyhpusHwtNNCsA5U1zS4BLxzJIfg299qO32
Ir7UJtZfftyATqeT+8o2D8JSjQrAJblrncYL7ZJ2+bfaFnC/1S1NjL3diRat7qrO7wLRP3HjWsojBeCo
mDEo5mNjuweFGvjWg2EBhCbpkW78htSHHwRyNdmgAFzPEee2iFkzayy2OLXzT4gr6UdUnlXrullsxxQ+
kx0g8BTA3aZlButjSTyjODq/WcQcW/B/Je4OQhLvKQDnzN1mp0nnkvAhR8VuMzNrpm1mpjgkoVwB/v8D
TgDQASA1MVpwzwAAAABJRU5ErkJggg==
</value>
</data>
<data name="tsatConsoleApplication.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
@ -339,21 +354,6 @@
saeS2rb7UOgXaTuVTHazh+J2K72OKDpTHEBh1SiuGV8sLLYtFmb8JHwex090zigDU8LZCb1Pl+WA/KsG
Jj3zsvDoBzC8JxbusgseC5B9pmAzIK+sn7b772judaPudtCktaO5bRO+rJXG1hc0aJ5T12iipnaIGtUw
5y4qNgNEqeo7yM0rl+jiFeNZnIk7fyOCEhJ+AymIZtFIMC8OAAAAAElFTkSuQmCC
</value>
</data>
<data name="tstaSelect.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAIDSURBVDhPpZLrS5NhGMb3j4SWh0oRQVExD4gonkDpg4hG
YKxG6WBogkMZKgPNCEVJFBGdGETEvgwyO9DJE5syZw3PIlPEE9pgBCLZ5XvdMB8Ew8gXbl54nuf63dd9
0OGSnwCahxbPRNPAPMw9Xpg6ZmF46kZZ0xSKzJPIrhpDWsVnpBhGkKx3nAX8Pv7z1zg8OoY/cITdn4fw
bf/C0kYAN3Ma/w3gWfZL5kzTKBxjWyK2DftwI9tyMYCZKXbNHaD91bLYJrDXsYbrWfUKwJrPE9M2M1Oc
VzOOpHI7Jr376Hi9ogHqFIANO0/MmmmbmSmm9a8ze+I4MrNWAdjtoJgWcx+PSzg166yZZ8xM8XvXDix9
c4jIqFYAjoriBV9AhEPv1mH/sonogha0afbZMMZz+yreTGyhpusHwtNNCsA5U1zS4BLxzJIfg299qO32
Ir7UJtZfftyATqeT+8o2D8JSjQrAJblrncYL7ZJ2+bfaFnC/1S1NjL3diRat7qrO7wLRP3HjWsojBeCo
mDEo5mNjuweFGvjWg2EBhCbpkW78htSHHwRyNdmgAFzPEee2iFkzayy2OLXzT4gr6UdUnlXrullsxxQ+
kx0g8BTA3aZlButjSTyjODq/WcQcW/B/Je4OQhLvKQDnzN1mp0nnkvAhR8VuMzNrpm1mpjgkoVwB/v8D
TgDQASA1MVpwzwAAAABJRU5ErkJggg==
</value>
</data>
<data name="toolStripButton16.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
@ -402,6 +402,54 @@
<metadata name="menuStrip1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>428, 17</value>
</metadata>
<data name="miOutputWindow.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAHBSURBVDhPrZJLSxtRGIbnH3XVRTfFVcEuXJaudVtcuHDR
IqUg6ULoplJBQWnFihZd1BKxoqlJF1HES9RYTSaTcXKbNGouk7mdZN6e86WGjoGClwMPnMV5H77340h3
PiPzRfxL4HMRrz/qGJwo4MVoHr3vcnj+NoueNxniyasWjwc1PBo4g08wPKPj5ZSO/rFW8Fkgi6dDGrr+
Pr7Og94opNngNjzP+y8Oa6JmtShVG4RWYnjY3Qdp+muUHl0dcWdND7bj8UADlzUG/dKFVnQIOWcRwY39
exbwfSIcDqPBwzcSTC5G2hMIiZxS4bhN1EXYYCiWXWRLLpS8TZycWURbMD637qtwJakYfFkVF/lzF2rB
RiJjEUeKSbQFH2a+k0A4RDghp1GtN3BRZShciLFtyFkLcdUk9mSD+LKy1xK8/7Tc3sFa6AcMk4epN0OG
d07lxcgmYqk6sX1iENPfdv0Cx/Wod5mP/rvMkCs5SPPOp5qJQ6WOnVOD2IzXiA6B6TRp9PMK470dqLqN
JO8cT/Oxkwa2jmvEz4Mq4ROIn/YrqSJ2nMZWTEFkR8FqVMZSJImFUAKzq534BOJyW/ju7nIk6Q+B49+g
+BQZbgAAAABJRU5ErkJggg==
</value>
</data>
<data name="tsDisassembly.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29m
dHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAFWSURBVDhPpZK/S8NAFMf7JwkOgiAUB3US/4O6VAKC
ZNChg6IdpEGQOIhGULrpeFDE+GO4IaBL4cShdQiEotjFkGqrbl/vnU1J2qRSPfiQcLz3ee/eXQbAv0jc
HIXeT9kW6MFCeJyzOAOC/hV8JRAAwguQXVikkHRBWrLXlII6CXQKiwhky+FiXKgEFjmOKVs2y1wJ+J2H
sbn+DrqCgaqErKyqd2HJAo632yo+1gp40HS0ai6ckgVneUN1cL20ipOdU1zO52SHKYL3ixt0tg31pcqd
LUNBVRuej3Z2Bs9X1d8Fzq6FVtPHy/gk3KlZ2EULB8cV1CamsZ8vDhd85jVVtb13hCfhquqv6wb8lQIa
jz6CnIbzyn2CQE45HBhNnBLNQ45Nkyn00g9C3gKzkzoggUyKTpuuLAolCw/ytQ4R0CPhMorums4aQyZS
cqqANkchJvgbyHwDTP0aBC30WEoAAAAASUVORK5CYII=
</value>
</data>
<data name="miNavigBack.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAEhSURBVDhPY6A6mDKh6T+xODY66D9UGwKAJE4d2/SfGGBp
qoHfAAYVTAwTBwGCBhACBA2YPXs2CkYWAwHauKB41nO4AUePHoVjEEAPCwwDQJrtCi6R54KyOS/+L9j/
+79x+rn/OVOe/0/qe/Y/ov0pGDsXnfl/+vTp/5s3bwZjGIAbANK88MDv/91AuV4grl/x43/Vwnf/S2Y8
/J/Ycf2/ts8kqBZUADYgb+ojsOYeoMbcef//R/d/+x/a9vK/b/XN/y4FJ/475R7+r+nZDVaMDYNdYBi2
6H9E20MMzdap2/8bR6/6r+7WjBna6EArYMF/99JL/zVDVv9X91/0X9V71n9l90lgrOZUR9gAENDwm/tf
1XcucYpxARXPaSQYwMAAAN+l4+UuGKMNAAAAAElFTkSuQmCC
</value>
</data>
<data name="miNavigForw.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAExSURBVDhPY6AYTJnQ9J9YHBsd9B+qDQFAEqeObfpPDLA0
1cBvAIMKJoaJgwBBAwgBggbMnj0bBSOLgQDtXXD06FE4BgH0sCib84IyFxTPfPrfr+woqiHIBuzevRuM
X7x4AbatYNqj/xl9t8A4vvXi/6wJt/9nz/r+XztiHcIQXC4omvHk/7LDv//P2/f3/+Ttf/+3rvv3v3bF
///5c3/8D2x+ijAEFDDYcM6ke/+n7/zzv2Lp3/+58/7+j5v8539kz6f/wS1P//tU3/jvmHcM1SXoILX7
+v+m1X//x0z4/j+q99P/sI43//3r7/33KLv43ynvyH/DsEW4NYNAbPP5/8ruk/6res8CY3X/Rf81Q1b/
t8/a/18rYAF+zbiAqu/c/xp+c8nTDAIqntPQNDMwAADW1uqs2ammdwAAAABJRU5ErkJggg==
</value>
</data>
<data name="miExit.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
@ -519,42 +567,6 @@
8r8T9T8S9YXuKjuciGcpK0avFYn6xn3HwgzWJLE2agIlJCUaYjchErdT8qiG2OznUiIHKdxgzfotHD16
QD9hemskM8k75VXwfrUgrFQauzbAtki5DZ5NH4ymbqPBlyM79NkqUXjNbYnAvzkCW5I0CTt3716vTXry
LSsF/9bQmSycUeuYKLLK7cq7wZgonDkZ/AKzSRim0NIr5QAAAABJRU5ErkJggg==
</value>
</data>
<data name="miOutputWindow.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAHBSURBVDhPrZJLSxtRGIbnH3XVRTfFVcEuXJaudVtcuHDR
IqUg6ULoplJBQWnFihZd1BKxoqlJF1HES9RYTSaTcXKbNGouk7mdZN6e86WGjoGClwMPnMV5H77340h3
PiPzRfxL4HMRrz/qGJwo4MVoHr3vcnj+NoueNxniyasWjwc1PBo4g08wPKPj5ZSO/rFW8Fkgi6dDGrr+
Pr7Og94opNngNjzP+y8Oa6JmtShVG4RWYnjY3Qdp+muUHl0dcWdND7bj8UADlzUG/dKFVnQIOWcRwY39
exbwfSIcDqPBwzcSTC5G2hMIiZxS4bhN1EXYYCiWXWRLLpS8TZycWURbMD637qtwJakYfFkVF/lzF2rB
RiJjEUeKSbQFH2a+k0A4RDghp1GtN3BRZShciLFtyFkLcdUk9mSD+LKy1xK8/7Tc3sFa6AcMk4epN0OG
d07lxcgmYqk6sX1iENPfdv0Cx/Wod5mP/rvMkCs5SPPOp5qJQ6WOnVOD2IzXiA6B6TRp9PMK470dqLqN
JO8cT/Oxkwa2jmvEz4Mq4ROIn/YrqSJ2nMZWTEFkR8FqVMZSJImFUAKzq534BOJyW/ju7nIk6Q+B49+g
+BQZbgAAAABJRU5ErkJggg==
</value>
</data>
<data name="miNavigBack.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAEhSURBVDhPY6A6mDKh6T+xODY66D9UGwKAJE4d2/SfGGBp
qoHfAAYVTAwTBwGCBhACBA2YPXs2CkYWAwHauKB41nO4AUePHoVjEEAPCwwDQJrtCi6R54KyOS/+L9j/
+79x+rn/OVOe/0/qe/Y/ov0pGDsXnfl/+vTp/5s3bwZjGIAbANK88MDv/91AuV4grl/x43/Vwnf/S2Y8
/J/Ycf2/ts8kqBZUADYgb+ojsOYeoMbcef//R/d/+x/a9vK/b/XN/y4FJ/475R7+r+nZDVaMDYNdYBi2
6H9E20MMzdap2/8bR6/6r+7WjBna6EArYMF/99JL/zVDVv9X91/0X9V71n9l90lgrOZUR9gAENDwm/tf
1XcucYpxARXPaSQYwMAAAN+l4+UuGKMNAAAAAElFTkSuQmCC
</value>
</data>
<data name="miNavigForw.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAExSURBVDhPY6AYTJnQ9J9YHBsd9B+qDQFAEqeObfpPDLA0
1cBvAIMKJoaJgwBBAwgBggbMnj0bBSOLgQDtXXD06FE4BgH0sCib84IyFxTPfPrfr+woqiHIBuzevRuM
X7x4AbatYNqj/xl9t8A4vvXi/6wJt/9nz/r+XztiHcIQXC4omvHk/7LDv//P2/f3/+Ttf/+3rvv3v3bF
///5c3/8D2x+ijAEFDDYcM6ke/+n7/zzv2Lp3/+58/7+j5v8539kz6f/wS1P//tU3/jvmHcM1SXoILX7
+v+m1X//x0z4/j+q99P/sI43//3r7/33KLv43ynvyH/DsEW4NYNAbPP5/8ruk/6res8CY3X/Rf81Q1b/
t8/a/18rYAF+zbiAqu/c/xp+c8nTDAIqntPQNDMwAADW1uqs2ammdwAAAABJRU5ErkJggg==
</value>
</data>
<data name="miRunNoDebug.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
@ -674,7 +686,7 @@
AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w
LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0
ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAABK
FQAAAk1TRnQBSQFMAgEBEAEAAbQBAAG0AQABEAEAARABAAT/AQkBAAj/AUIBTQE2AQQGAAE2AQQCAAEo
FQAAAk1TRnQBSQFMAgEBEAEAAbwBAAG8AQABEAEAARABAAT/AQkBAAj/AUIBTQE2AQQGAAE2AQQCAAEo
AwABQAMAAVADAAEBAQABCAYAARQYAAGAAgABgAMAAoABAAGAAwABgAEAAYABAAKAAgADwAEAAcAB3AHA
AQAB8AHKAaYBAAEzBQABMwEAATMBAAEzAQACMwIAAxYBAAMcAQADIgEAAykBAANVAQADTQEAA0IBAAM5
AQABgAF8Af8BAAJQAf8BAAGTAQAB1gEAAf8B7AHMAQABxgHWAe8BAAHWAucBAAGQAakBrQIAAf8BMwMA

View file

@ -49,6 +49,16 @@ namespace VisualPascalABC
stand_types["object"] = typeof(object);
}
public static bool Is32BitAssembly()
{
if (!Environment.Is64BitProcess)
return false;
System.Reflection.PortableExecutableKinds peKind;
System.Reflection.ImageFileMachine machine;
a.ManifestModule.GetPEKind(out peKind, out machine);
return peKind == System.Reflection.PortableExecutableKinds.Required32Bit;
}
public static void LoadAssembly(string file_name)
{
//ad = AppDomain.CreateDomain("DebugDomain",null,Path.GetDirectoryName(file_name),Path.GetDirectoryName(file_name),false);
@ -59,7 +69,7 @@ namespace VisualPascalABC
fs.Read(buf, 0, (int)fs.Length);
fs.Close();
a = System.Reflection.Assembly.Load(buf);
Type[] tt = a.GetTypes();
foreach (Type t in tt)
{
@ -426,6 +436,7 @@ namespace VisualPascalABC
ExeFileName = null;
WorkbenchServiceFactory.OperationsService.ClearTabStack();
WorkbenchServiceFactory.DebuggerOperationsService.ClearDebugTabs();
WorkbenchServiceFactory.Workbench.DisassemblyWindow.ClearWindow();
}
}
}
@ -470,7 +481,10 @@ namespace VisualPascalABC
SelectProcess(debuggedProcess);
//debuggedProcess.Break();
}
Function currentFunction;
Dictionary<int, int> sourceMap;
void debuggedProcess_DebuggeeStateChanged(object sender, ProcessEventArgs e)
{
if (currentBreakpoint != null)
@ -484,6 +498,16 @@ namespace VisualPascalABC
//if (e.Process.IsPaused)
WorkbenchServiceFactory.DebuggerOperationsService.RefreshPad(new FunctionItem(e.Process.SelectedFunction).SubItems);
workbench.WidgetController.SetStartDebugEnabled();
if (currentFunction != e.Process.SelectedFunction)
{
if (WorkbenchServiceFactory.Workbench.DisassemblyWindow.IsVisible)
{
var tp = GetNativeCodeOfSelectedFunction(e.Process.SelectedFunction);
WorkbenchServiceFactory.DebuggerOperationsService.DisplayDisassembledCode(tp.Item1);
sourceMap = tp.Item2;
currentFunction = e.Process.SelectedFunction;
}
}
if (debuggerStateEvent != null)
debuggerStateEvent(this, new ProcessEventArgsDelegator(new ProcessDelegator(this.debuggedProcess)));
}
@ -586,15 +610,16 @@ namespace VisualPascalABC
show_debug_tabs = true;
workbench.WidgetController.SetPlayButtonsVisible(false);
workbench.WidgetController.SetAddExprMenuVisible(false);
workbench.WidgetController.SetDisassemblyMenuVisible(false);
DebugWatchListWindowForm.WatchWindow.ClearAllSubTrees();
IsRunning = false;
workbench.WidgetController.SetDebugStopDisabled();
workbench.WidgetController.ChangeContinueDebugNameOnStart();
//if (cur_brpt != null) dbg.RemoveBreakpoint(cur_brpt);
CurrentLineBookmark.Remove();
WorkbenchServiceFactory.DebuggerOperationsService.ClearLocalVarTree();
WorkbenchServiceFactory.DebuggerOperationsService.ClearDebugTabs();
WorkbenchServiceFactory.DebuggerOperationsService.ClearWatch();
WorkbenchServiceFactory.Workbench.DisassemblyWindow.ClearWindow();
workbench.WidgetController.SetDebugTabsVisible(false);
WorkbenchServiceFactory.OperationsService.ClearTabStack();
workbench.WidgetController.EnableCodeCompletionToolTips(true);
@ -635,6 +660,7 @@ namespace VisualPascalABC
workbench.WidgetController.ChangeStartDebugNameOnContinue();
workbench.WidgetController.EnableCodeCompletionToolTips(false);
workbench.WidgetController.SetAddExprMenuVisible(true);
workbench.WidgetController.SetDisassemblyMenuVisible(true);
TooltipServiceManager.hideToolTip();
IsRunning = true;
evaluator = new ExpressionEvaluator(e.Process,workbench.VisualEnvironmentCompiler, FileName);
@ -946,7 +972,78 @@ namespace VisualPascalABC
}
private int curILOffset = 0;
struct COR_DEBUG_IL_TO_NATIVE_MAP
{
public uint ilOffset;
public uint nativeStartOffset;
public uint nativeEndOffset;
}
public Tuple<string, Dictionary<int, int>> GetNativeCodeOfSelectedFunction(Function selectedFunction=null)
{
if (selectedFunction == null)
selectedFunction = debuggedProcess.SelectedFunction;
uint size = selectedFunction.CorFunction.NativeCode.Size;
byte[] buffer = new byte[size];
uint mapSize;
COR_DEBUG_IL_TO_NATIVE_MAP[] mapBuffer = new COR_DEBUG_IL_TO_NATIVE_MAP[selectedFunction.CorFunction.ILCode.Size];
unsafe
{
fixed (byte* ptr = &buffer[0])
{
IntPtr iptr = new IntPtr((void*)ptr);
selectedFunction.CorFunction.NativeCode.GetCode(0, size, size, iptr);
}
fixed (void* ptr = &mapBuffer[0])
{
IntPtr iptr = new IntPtr(ptr);
selectedFunction.CorFunction.NativeCode.GetILToNativeMapping((uint)mapBuffer.Length, out mapSize, iptr);
}
}
Dictionary<uint, uint> il2asm = new Dictionary<uint, uint>();
for (int i = 0; i < mapSize; i++)
{
il2asm.Add(mapBuffer[i].nativeStartOffset, mapBuffer[i].ilOffset);
}
SharpDisasm.Disassembler disasm = new SharpDisasm.Disassembler(buffer, AssemblyHelper.Is32BitAssembly()?SharpDisasm.ArchitectureMode.x86_32: SharpDisasm.ArchitectureMode.x86_64);
IEnumerable<SharpDisasm.Instruction> instructions = disasm.Disassemble();
StringBuilder sb = new StringBuilder();
int linesNum = 0;
Dictionary<int, int> sourceMap = new Dictionary<int, int>();
Dictionary<int, int> linesDict = new Dictionary<int, int>();
bool firstLine = true;
foreach (var instruction in instructions)
{
linesNum++;
uint ilOffset;
if (il2asm.TryGetValue((uint)instruction.Offset, out ilOffset))
{
var segment = selectedFunction.GetSegmentForOffet(ilOffset);
if (segment != null && !linesDict.ContainsKey(segment.StartLine))
{
if (ilOffset > 2000000000)
{
if (firstLine)
continue;
}
else
firstLine = false;
int line = segment.StartLine;
string text = curPage.TextEditor.Document.GetText(curPage.TextEditor.Document.GetLineSegment(line - 1));
sb.AppendLine((segment.StartLine+":").PadRight(10, ' ') + text.Trim());
linesDict.Add(segment.StartLine, segment.StartLine);
}
}
sb.Append("///"+selectedFunction.CorFunction.NativeCode.Address.ToString("X") + "+0x"+instruction.Offset.ToString("X") + ": " + instruction.ToString());
sb.AppendLine();
}
return new Tuple<string, Dictionary<int, int>>(sb.ToString(),sourceMap);
}
public void DoInPausedState(MethodInvoker action)
{
Debugger.Process process = debuggedProcess;

Binary file not shown.

After

Width:  |  Height:  |  Size: 509 B

View file

@ -50,6 +50,7 @@
<CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
<UseVSHostingProcess>false</UseVSHostingProcess>
<RunCodeAnalysis>false</RunCodeAnalysis>
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<DebugType>PdbOnly</DebugType>
@ -60,6 +61,7 @@
<WarningLevel>4</WarningLevel>
<DebugSymbols>false</DebugSymbols>
<CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)' == 'Release' ">
<CheckForOverflowUnderflow>False</CheckForOverflowUnderflow>
@ -93,6 +95,10 @@
<Reference Include="Microsoft.Build.Tasks" />
<Reference Include="PresentationCore" />
<Reference Include="PresentationFramework" />
<Reference Include="SharpDisasm, Version=1.0.0.0, Culture=neutral, PublicKeyToken=3c6f10d5f3df8ab7, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\bin\SharpDisasm.dll</HintPath>
</Reference>
<Reference Include="System" />
<Reference Include="System.Data" />
<Reference Include="System.Deployment" />
@ -155,6 +161,12 @@
<Compile Include="DockContent\DebugWatchListWindowForm.Designer.cs">
<DependentUpon>DebugWatchListWindowForm.cs</DependentUpon>
</Compile>
<Compile Include="DockContent\DisassemblyWindow.cs">
<SubType>Form</SubType>
</Compile>
<Compile Include="DockContent\DisassemblyWindow.Designer.cs">
<DependentUpon>DisassemblyWindow.cs</DependentUpon>
</Compile>
<Compile Include="DockContent\ImmediateWindow.cs">
<SubType>Form</SubType>
</Compile>
@ -666,6 +678,7 @@
<None Include="Resources\FormsDesignerPointerIcon.png" />
<None Include="Resources\browserNavigBack.Image.png" />
<Content Include="Resources\FormsDesignerPointerIcon.bmp" />
<EmbeddedResource Include="Resources\Icons.16x16.Disassembly.png" />
<Content Include="Resources\Pointer.bmp" />
<None Include="Resources\PrintHS.bmp" />
<None Include="Resources\PrintHS.png" />
@ -783,7 +796,7 @@
<Name>ParserTools</Name>
</ProjectReference>
<ProjectReference Include="..\PluginsSupport\PluginsSupport.csproj">
<Project>{CFC683F8-0165-4A9F-9C3F-BB8C5BAB507F}</Project>
<Project>{cfc683f8-0165-4a9f-9c3f-bb8c5bab507f}</Project>
<Name>PluginsSupport</Name>
</ProjectReference>
<ProjectReference Include="..\SyntaxTree\SyntaxTree.csproj">

View file

@ -243,6 +243,32 @@ namespace VisualPascalABC
}
public bool DisassemblyWindowVisible
{
get
{
return DisassemblyWindow != null && DisassemblyWindow.Visible;
}
set
{
if (value)
{
if (DisassemblyWindow == null)
{
AddDisassemblyWindow();
}
else
{
//ShowContent(PropertiesWindow, false);
DisassemblyWindow.Show();
DisassemblyWindow.ShowDisassembly();
//PropertiesWindow.IsHidden = false; //Show(MainDockPanel, DockState.Hidden);
}
}
}
}
public bool PropertiesWindowVisible
{
get
@ -457,6 +483,11 @@ namespace VisualPascalABC
{
}
public void SetDisassemblyMenuVisible(bool flag)
{
tsDisassembly.Visible = flag;
}
public void SetPlayButtonsVisible(bool start)
{
if (play_pause_buttons_visible)

View file

@ -82,6 +82,17 @@ namespace VisualPascalABC
AddWindowToDockPanel(DebugVariablesListWindow, MainDockPanel, OutputWindow.Dock, DockState.DockBottom, OutputWindow.IsFloat, BottomPane, int.MaxValue);
}
void AddDisassemblyWindow()
{
if (DisassemblyWindow == null)
{
DisassemblyWindow = new DisassemblyWindow(this);
Form1StringResources.SetTextForAllControls(DisassemblyWindow);
}
AddWindowToDockPanel(DisassemblyWindow, MainDockPanel, OutputWindow.Dock, DockState.DockBottom, OutputWindow.IsFloat, BottomPane, int.MaxValue);
}
void AddDebugWatchListWindow()
{
if (DebugWatchListWindow == null)
@ -166,7 +177,7 @@ namespace VisualPascalABC
else PropertiesWindowVisible = true;
}
private CodeFileDocumentControl AddNewTab(DockPanel tabControl)
private CodeFileDocumentControl AddNewTab(DockPanel tabControl, DockStyle dockStyle = DockStyle.Fill)
{
CodeFileDocumentControl tp = new CodeFileDocumentControl(this);
//tp.BorderStyle=BorderStyle.Fixed3D;
@ -174,7 +185,7 @@ namespace VisualPascalABC
RichTextBox tb = OutputWindow.outputTextBox;
if (OpenDocuments.Count > 0)
tb = CopyTextBox(OutputWindow.outputTextBox);
AddWindowToDockPanel(tp, tabControl, tp.Dock, DockState.Document, tp.IsFloat, null, 0);
AddWindowToDockPanel(tp, tabControl, tp.Dock != dockStyle?dockStyle:tp.Dock, DockState.Document, tp.IsFloat, null, 0);
OutputTextBoxs.Add(tp, tb);
WorkbenchServiceFactory.CodeCompletionParserController.ParseInformationUpdated += tp.TextEditor.UpdateFolding;
@ -311,6 +322,7 @@ namespace VisualPascalABC
AddCompilerConsoleWindow();
AddFindSymbolsResultWindow();
AddImmediateWindow();
AddDisassemblyWindow();
AddDebugVariablesListWindow();
AddDebugWatchListWindow();
if (!Tools.IsUnix())
@ -326,6 +338,7 @@ namespace VisualPascalABC
HideContent(DebugVariablesListWindow);
HideContent(DebugWatchListWindow);
HideContent(FindSymbolsResultWindow);
HideContent(DisassemblyWindow);
if (!Tools.IsUnix())
{
HideContent(PropertiesWindow);
@ -624,6 +637,11 @@ namespace VisualPascalABC
}
}
public void DisplayDisassembledCode(string code)
{
DisassemblyWindow.SetDisassembledCode(code);
}
public void ClearDebugTabs()
{
foreach (TextArea ta in DebugTabs.Values)

Binary file not shown.

View file

@ -131,6 +131,7 @@ M_COLLAPSE_REGIONS=Collapse regions
TP_WARNINGLIST=Warnings
TP_VARLIST=Local Variables
TP_WATCHLIST=Watch List
TP_DISASSEMBLY=Disassembly window
TP_FIND_SYMBOL_RESULTS=Search Results
CLMN_VAR=Var
CLMN_TYPE=Type

View file

@ -131,6 +131,7 @@ M_COLLAPSE_REGIONS=Свернуть все регионы
TP_WARNINGLIST=Предупреждения
TP_VARLIST=Локальные переменные
TP_WATCHLIST=Просмотр выражений
TP_DISASSEMBLY=Окно дизассемблирования
TP_FIND_SYMBOL_RESULTS=Результат поиска символов
CLMN_VAR=Переменная
CLMN_TYPE=Тип

BIN
bin/SharpDisasm.dll Normal file

Binary file not shown.