From 3a2d10ed36887dca28c464cf9992da9daf475a2d Mon Sep 17 00:00:00 2001 From: TomasMatousek Date: Fri, 6 Feb 2015 17:54:05 -0800 Subject: [PATCH] Move Roslyn.DebuggerVisualizers to open. This project contains VS debugger visualizers of IL, PDB and metadata blobs helful for debugging Roslyn issues. (changeset 1411991) --- .../IL/ILDebuggerVisualizer.cs | 26 ++++ .../Source/DebuggerVisualizers/Install.cmd | 12 ++ .../MetadataDeltaDebuggerVisualizer.cs | 37 ++++++ .../PDB/PdbDebuggerVisualizer.cs | 32 +++++ .../Roslyn.DebuggerVisualizers.csproj | 85 +++++++++++++ .../DebuggerVisualizers/UI/TextViewer.cs | 18 +++ .../UI/TextViewer.designer.cs | 79 ++++++++++++ .../DebuggerVisualizers/UI/TextViewer.resx | 120 ++++++++++++++++++ .../DebuggerVisualizers/packages.config | 5 + 9 files changed, 414 insertions(+) create mode 100644 src/Tools/Source/DebuggerVisualizers/IL/ILDebuggerVisualizer.cs create mode 100644 src/Tools/Source/DebuggerVisualizers/Install.cmd create mode 100644 src/Tools/Source/DebuggerVisualizers/Metadata/MetadataDeltaDebuggerVisualizer.cs create mode 100644 src/Tools/Source/DebuggerVisualizers/PDB/PdbDebuggerVisualizer.cs create mode 100644 src/Tools/Source/DebuggerVisualizers/Roslyn.DebuggerVisualizers.csproj create mode 100644 src/Tools/Source/DebuggerVisualizers/UI/TextViewer.cs create mode 100644 src/Tools/Source/DebuggerVisualizers/UI/TextViewer.designer.cs create mode 100644 src/Tools/Source/DebuggerVisualizers/UI/TextViewer.resx create mode 100644 src/Tools/Source/DebuggerVisualizers/packages.config diff --git a/src/Tools/Source/DebuggerVisualizers/IL/ILDebuggerVisualizer.cs b/src/Tools/Source/DebuggerVisualizers/IL/ILDebuggerVisualizer.cs new file mode 100644 index 00000000000..3c8e5387aec --- /dev/null +++ b/src/Tools/Source/DebuggerVisualizers/IL/ILDebuggerVisualizer.cs @@ -0,0 +1,26 @@ +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +using System.Diagnostics; +using System.Text; +using Microsoft.CodeAnalysis.EditAndContinue; +using Microsoft.VisualStudio.DebuggerVisualizers; +using Roslyn.DebuggerVisualizers; +using Roslyn.DebuggerVisualizers.UI; +using Roslyn.Test.MetadataUtilities; + +[assembly: DebuggerVisualizer(typeof(ILDebuggerVisualizer), Target = typeof(ILDelta), Description = "IL Visualizer")] + +namespace Roslyn.DebuggerVisualizers +{ + public sealed class ILDebuggerVisualizer : DialogDebuggerVisualizer + { + protected override void Show(IDialogVisualizerService windowService, IVisualizerObjectProvider objectProvider) + { + StringBuilder sb = new StringBuilder(); + var ilBytes = ((ILDelta)objectProvider.GetObject()).Value; + var viewer = new TextViewer(ilBytes.GetMethodIL(), "IL"); + viewer.ShowDialog(); + } + } +} diff --git a/src/Tools/Source/DebuggerVisualizers/Install.cmd b/src/Tools/Source/DebuggerVisualizers/Install.cmd new file mode 100644 index 00000000000..413dfc832f1 --- /dev/null +++ b/src/Tools/Source/DebuggerVisualizers/Install.cmd @@ -0,0 +1,12 @@ +@echo off +set VISUALIZERS=%USERPROFILE%\Documents\Visual Studio 14\Visualizers +set BIN=%~dp0..\..\..\Binaries\Debug + +copy /y "%BIN%\Roslyn.DebuggerVisualizers.dll" "%VISUALIZERS%" +copy /y "%BIN%\Roslyn.Test.PdbUtilities.dll" "%VISUALIZERS%" +copy /y "%BIN%\System.Reflection.Metadata.dll" "%VISUALIZERS%" +copy /y "%BIN%\MDbgCore.dll" "%VISUALIZERS%" +copy /y "%BIN%\CorApi.dll" "%VISUALIZERS%" +copy /y "%BIN%\CorApiRaw.dll" "%VISUALIZERS%" + +echo Close all VS instances to finish. \ No newline at end of file diff --git a/src/Tools/Source/DebuggerVisualizers/Metadata/MetadataDeltaDebuggerVisualizer.cs b/src/Tools/Source/DebuggerVisualizers/Metadata/MetadataDeltaDebuggerVisualizer.cs new file mode 100644 index 00000000000..448e18628e8 --- /dev/null +++ b/src/Tools/Source/DebuggerVisualizers/Metadata/MetadataDeltaDebuggerVisualizer.cs @@ -0,0 +1,37 @@ +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +using System; +using System.Diagnostics; +using System.IO; +using System.Reflection.Metadata; +using Microsoft.CodeAnalysis.EditAndContinue; +using Microsoft.VisualStudio.DebuggerVisualizers; +using Roslyn.DebuggerVisualizers; +using Roslyn.DebuggerVisualizers.UI; +using Roslyn.Test.MetadataUtilities; + +[assembly: DebuggerVisualizer( + typeof(MetadataDeltaDebuggerVisualizer), + Target = typeof(MetadataDelta), + Description = "PDB Visualizer")] + +namespace Roslyn.DebuggerVisualizers +{ + public sealed class MetadataDeltaDebuggerVisualizer : DialogDebuggerVisualizer + { + unsafe protected override void Show(IDialogVisualizerService windowService, IVisualizerObjectProvider objectProvider) + { + var md = (MetadataDelta)objectProvider.GetObject(); + var writer = new StringWriter(); + fixed (byte* ptr = md.Bytes) + { + var reader = new MetadataReader(ptr, md.Bytes.Length, MetadataReaderOptions.ApplyWindowsRuntimeProjections); + var visualizer = new MetadataVisualizer(reader, writer); + visualizer.Visualize(); + } + var viewer = new TextViewer(writer.ToString(), "Metadata"); + viewer.ShowDialog(); + } + } +} diff --git a/src/Tools/Source/DebuggerVisualizers/PDB/PdbDebuggerVisualizer.cs b/src/Tools/Source/DebuggerVisualizers/PDB/PdbDebuggerVisualizer.cs new file mode 100644 index 00000000000..5c838ee3216 --- /dev/null +++ b/src/Tools/Source/DebuggerVisualizers/PDB/PdbDebuggerVisualizer.cs @@ -0,0 +1,32 @@ +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +using System.Diagnostics; +using System.Linq; +using System.Text; +using Microsoft.CodeAnalysis.EditAndContinue; +using Microsoft.VisualStudio.DebuggerVisualizers; +using Roslyn.DebuggerVisualizers; +using Roslyn.DebuggerVisualizers.UI; +using Roslyn.Test.PdbUtilities; + +[assembly: DebuggerVisualizer( + typeof(PdbDebuggerVisualizer), + Target = typeof(PdbDelta), + Description = "PDB Visualizer")] + +namespace Roslyn.DebuggerVisualizers +{ + public sealed class PdbDebuggerVisualizer : DialogDebuggerVisualizer + { + protected override void Show(IDialogVisualizerService windowService, IVisualizerObjectProvider objectProvider) + { + StringBuilder sb = new StringBuilder(); + var pdb = (PdbDelta)objectProvider.GetObject(); + string xml = PdbToXmlConverter.DeltaPdbToXml(pdb.Stream, Enumerable.Range(0x06000001, 0xff)); + + var viewer = new TextViewer(xml, "PDB"); + viewer.ShowDialog(); + } + } +} diff --git a/src/Tools/Source/DebuggerVisualizers/Roslyn.DebuggerVisualizers.csproj b/src/Tools/Source/DebuggerVisualizers/Roslyn.DebuggerVisualizers.csproj new file mode 100644 index 00000000000..a7c4721ad6d --- /dev/null +++ b/src/Tools/Source/DebuggerVisualizers/Roslyn.DebuggerVisualizers.csproj @@ -0,0 +1,85 @@ + + + + + + + + true + Debug + AnyCPU + {37B2D19D-8A08-402A-AD08-84A0C6C0614C} + Library + Roslyn.DebuggerVisualizers + Roslyn.DebuggerVisualizers + v4.5 + 512 + + true + ..\..\..\ + true + + + + {1EE8CAD3-55F9-4D91-96B2-084641DA9A6C} + CodeAnalysis + + + {EDC68A0E-C68D-4A74-91B7-BF38EC909888} + Features + + + {AFDE6BEA-5038-4A4A-A88E-DBD2E4088EED} + PdbUtilities + + + + + + + + ARM + + + ARM + + + + + + False + ..\..\..\..\packages\System.Collections.Immutable.1.1.33-beta\lib\portable-net45+win8+wp8+wpa81\System.Collections.Immutable.dll + + + + + False + ..\..\..\..\packages\System.Reflection.Metadata.1.0.18-beta\lib\portable-net45+win8\System.Reflection.Metadata.dll + + + + + + + + + + form + + + TextViewer.cs + + + + + TextViewer.cs + + + + + + + + + + diff --git a/src/Tools/Source/DebuggerVisualizers/UI/TextViewer.cs b/src/Tools/Source/DebuggerVisualizers/UI/TextViewer.cs new file mode 100644 index 00000000000..1ee4de73227 --- /dev/null +++ b/src/Tools/Source/DebuggerVisualizers/UI/TextViewer.cs @@ -0,0 +1,18 @@ +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +using System.Windows.Forms; + +namespace Roslyn.DebuggerVisualizers.UI +{ + public partial class TextViewer : Form + { + public TextViewer(string text, string title) + { + InitializeComponent(); + + IL.Text = text; + this.Text = title; + } + } +} \ No newline at end of file diff --git a/src/Tools/Source/DebuggerVisualizers/UI/TextViewer.designer.cs b/src/Tools/Source/DebuggerVisualizers/UI/TextViewer.designer.cs new file mode 100644 index 00000000000..ba9f6e993fd --- /dev/null +++ b/src/Tools/Source/DebuggerVisualizers/UI/TextViewer.designer.cs @@ -0,0 +1,79 @@ +namespace Roslyn.DebuggerVisualizers.UI +{ + partial class TextViewer + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.panel2 = new System.Windows.Forms.Panel(); + this.IL = new System.Windows.Forms.RichTextBox(); + this.panel2.SuspendLayout(); + this.SuspendLayout(); + // + // panel2 + // + this.panel2.Controls.Add(this.IL); + this.panel2.Dock = System.Windows.Forms.DockStyle.Fill; + this.panel2.Location = new System.Drawing.Point(0, 0); + this.panel2.Name = "panel2"; + this.panel2.Size = new System.Drawing.Size(492, 373); + this.panel2.TabIndex = 8; + // + // IL + // + this.IL.BackColor = System.Drawing.SystemColors.Info; + this.IL.Dock = System.Windows.Forms.DockStyle.Fill; + this.IL.Font = new System.Drawing.Font("Lucida Console", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.IL.Location = new System.Drawing.Point(0, 0); + this.IL.Name = "IL"; + this.IL.Size = new System.Drawing.Size(492, 373); + this.IL.TabIndex = 2; + this.IL.Text = ""; + this.IL.WordWrap = false; + // + // MethodBodyViewer + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(492, 373); + this.Controls.Add(this.panel2); + this.KeyPreview = true; + this.MinimumSize = new System.Drawing.Size(450, 300); + this.Name = "MethodBodyViewer"; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; + this.Text = "IL"; + this.panel2.ResumeLayout(false); + this.ResumeLayout(false); + + } + + #endregion + private System.Windows.Forms.Panel panel2; + private System.Windows.Forms.RichTextBox IL; + + + } +} \ No newline at end of file diff --git a/src/Tools/Source/DebuggerVisualizers/UI/TextViewer.resx b/src/Tools/Source/DebuggerVisualizers/UI/TextViewer.resx new file mode 100644 index 00000000000..d58980a38d7 --- /dev/null +++ b/src/Tools/Source/DebuggerVisualizers/UI/TextViewer.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/src/Tools/Source/DebuggerVisualizers/packages.config b/src/Tools/Source/DebuggerVisualizers/packages.config new file mode 100644 index 00000000000..f7e2f1f0503 --- /dev/null +++ b/src/Tools/Source/DebuggerVisualizers/packages.config @@ -0,0 +1,5 @@ + + + + + -- GitLab