Skip to content
Merged
Show file tree
Hide file tree
Changes from 4 commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
38 changes: 24 additions & 14 deletions src/mono/wasm/debugger/BrowserDebugProxy/DebugStore.cs
Original file line number Diff line number Diff line change
Expand Up @@ -526,37 +526,49 @@ internal class AssemblyInfo
internal string Url { get; }
internal MetadataReader asmMetadataReader { get; }
internal MetadataReader pdbMetadataReader { get; set; }
internal List<MemoryStream> enCMemoryStream = new List<MemoryStream>();
internal List<MetadataReader> enCMetadataReader = new List<MetadataReader>();
internal PEReader peReader;
internal MemoryStream asmStream;
internal MemoryStream pdbStream;
public int DebugId { get; set; }
internal int PdbAge { get; }
internal System.Guid PdbGuid { get; }
internal string PdbName { get; }

public bool TriedToLoadSymbolsOnDemand { get; set; }

public unsafe AssemblyInfo(string url, byte[] assembly, byte[] pdb)
{
this.id = Interlocked.Increment(ref next_id);
asmStream = new MemoryStream(assembly);
peReader = new PEReader(asmStream);
var asmStream = new MemoryStream(assembly);
var peReader = new PEReader(asmStream);
var entries = peReader.ReadDebugDirectory();
var codeView = entries[0];
var codeViewData = peReader.ReadCodeViewDebugDirectoryData(codeView);
PdbAge = codeViewData.Age;
PdbGuid = codeViewData.Guid;
PdbName = codeViewData.Path;
asmMetadataReader = PEReaderExtensions.GetMetadataReader(peReader);
var asmDef = asmMetadataReader.GetAssemblyDefinition();
Name = asmDef.GetAssemblyName().Name + ".dll";
AssemblyNameUnqualified = asmDef.GetAssemblyName().Name + ".dll";
if (pdb != null)
{
pdbStream = new MemoryStream(pdb);
pdbMetadataReader = MetadataReaderProvider.FromPortablePdbStream(pdbStream).GetMetadataReader();
var pdbStream = new MemoryStream(pdb);
try
{
pdbMetadataReader = MetadataReaderProvider.FromPortablePdbStream(pdbStream).GetMetadataReader();
}
catch (BadImageFormatException)
{
Console.WriteLine($"Warning: Unable to read debug information of: {Name} (use DebugType=Portable/Embedded)");
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

you could log this using https://chromedevtools.github.io/devtools-protocol/tot/Log/ have it surface to the frontend

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

how do you add a LogEntry with that though?

Copy link
Member

@lewing lewing Dec 2, 2021

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As far as I understood this is not supported by JSDebugger so I implemented using Runtime.consoleAPICalled.

}
}
else
{
var entries = peReader.ReadDebugDirectory();
var embeddedPdbEntry = entries.FirstOrDefault(e => e.Type == DebugDirectoryEntryType.EmbeddedPortablePdb);
if (embeddedPdbEntry.DataSize != 0)
{
pdbMetadataReader = peReader.ReadEmbeddedPortablePdbDebugDirectoryData(embeddedPdbEntry).GetMetadataReader();
}
}
Name = asmMetadataReader.GetAssemblyDefinition().GetAssemblyName().Name + ".dll";
AssemblyNameUnqualified = asmMetadataReader.GetAssemblyDefinition().GetAssemblyName().Name + ".dll";
Populate();
}

Expand All @@ -566,8 +578,6 @@ public bool EnC(byte[] meta, byte[] pdb)
MetadataReader asmMetadataReader = MetadataReaderProvider.FromMetadataStream(asmStream).GetMetadataReader();
var pdbStream = new MemoryStream(pdb);
MetadataReader pdbMetadataReader = MetadataReaderProvider.FromPortablePdbStream(pdbStream).GetMetadataReader();
enCMemoryStream.Add(asmStream);
enCMemoryStream.Add(pdbStream);
enCMetadataReader.Add(asmMetadataReader);
enCMetadataReader.Add(pdbMetadataReader);
PopulateEnC(asmMetadataReader, pdbMetadataReader);
Expand Down Expand Up @@ -728,7 +738,7 @@ public TypeInfo GetTypeByName(string name)

internal void UpdatePdbInformation(Stream streamToReadFrom)
{
pdbStream = new MemoryStream();
var pdbStream = new MemoryStream();
streamToReadFrom.CopyTo(pdbStream);
pdbMetadataReader = MetadataReaderProvider.FromPortablePdbStream(pdbStream).GetMetadataReader();
}
Expand Down
11 changes: 2 additions & 9 deletions src/mono/wasm/debugger/BrowserDebugProxy/MonoProxy.cs
Original file line number Diff line number Diff line change
Expand Up @@ -939,18 +939,11 @@ internal async Task<MethodInfo> LoadSymbolsOnDemand(AssemblyInfo asm, int method
if (asm.TriedToLoadSymbolsOnDemand)
return null;
asm.TriedToLoadSymbolsOnDemand = true;
var peReader = asm.peReader;
var entries = peReader.ReadDebugDirectory();
var codeView = entries[0];
var codeViewData = peReader.ReadCodeViewDebugDirectoryData(codeView);
int pdbAge = codeViewData.Age;
var pdbGuid = codeViewData.Guid;
string pdbName = codeViewData.Path;
pdbName = Path.GetFileName(pdbName);
var pdbName = Path.GetFileName(asm.PdbName);

foreach (string urlSymbolServer in urlSymbolServerList)
{
string downloadURL = $"{urlSymbolServer}/{pdbName}/{pdbGuid.ToString("N").ToUpper() + pdbAge}/{pdbName}";
string downloadURL = $"{urlSymbolServer}/{pdbName}/{asm.PdbGuid.ToString("N").ToUpper() + asm.PdbAge}/{pdbName}";

try
{
Expand Down
29 changes: 29 additions & 0 deletions src/mono/wasm/debugger/DebuggerTestSuite/Tests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -901,6 +901,35 @@ await EvaluateAndCheck(
}
);
}

[Fact]
public async Task InspectLocalsUsingClassFromLibraryUsingDebugTypeFull()
{
byte[] bytes = File.ReadAllBytes(Path.Combine(DebuggerTestAppPath, "debugger-test-with-full-debug-type.dll"));
string asm_base64 = Convert.ToBase64String(bytes);

string pdb_base64 = null;
bytes = File.ReadAllBytes(Path.Combine(DebuggerTestAppPath, "debugger-test-with-full-debug-type.pdb"));
pdb_base64 = Convert.ToBase64String(bytes);

var expression = $"{{ let asm_b64 = '{asm_base64}'; let pdb_b64 = '{pdb_base64}'; invoke_static_method('[debugger-test] DebugTypeFull:CallToEvaluateLocal', asm_b64, pdb_b64); }}";

await EvaluateAndCheck(
"window.setTimeout(function() {" + expression + "; }, 1);",
"dotnet://debugger-test.dll/debugger-test.cs", 860, 8,
"CallToEvaluateLocal",
wait_for_event_fn: async (pause_location) =>
{
var a_props = await GetObjectOnFrame(pause_location["callFrames"][0], "a");
await CheckProps(a_props, new
{
a = TNumber(10),
b = TNumber(20),
c = TNumber(30)
}, "a");
}
);
}
//TODO add tests covering basic stepping behavior as step in/out/over
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<DebugType>full</DebugType>
</PropertyGroup>
</Project>
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
using System;

namespace DebuggerTests
{
public class ClassToInspectWithDebugTypeFull
{
int a;
int b;
int c;
public ClassToInspectWithDebugTypeFull()
{
a = 10;
b = 20;
c = 30;
Console.WriteLine(a);
Console.WriteLine(b);
Console.WriteLine(c);
}
}
}
12 changes: 12 additions & 0 deletions src/mono/wasm/debugger/tests/debugger-test/debugger-test.cs
Original file line number Diff line number Diff line change
Expand Up @@ -849,3 +849,15 @@ public static void RunDebuggerBreak()
VisibleMethodDebuggerBreak();
}
}

public class DebugTypeFull
{
public static void CallToEvaluateLocal(string asm_base64, string pdb_base64)
{
var asm = System.Reflection.Assembly.LoadFrom("debugger-test-with-full-debug-type.dll");
var myType = asm.GetType("DebuggerTests.ClassToInspectWithDebugTypeFull");
var myMethod = myType.GetConstructor(new Type[] { });
var a = myMethod.Invoke(new object[]{});
System.Diagnostics.Debugger.Break();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
<ProjectReference Include="..\library-dependency-debugger-test2\library-dependency-debugger-test2.csproj" Private="true"/>
<ProjectReference Include="..\debugger-test-with-source-link\debugger-test-with-source-link.csproj" Private="true"/>
<ProjectReference Include="..\ApplyUpdateReferencedAssembly\ApplyUpdateReferencedAssembly.csproj" />
<ProjectReference Include="..\debugger-test-with-full-debug-type\debugger-test-with-full-debug-type.csproj" Private="true"/>
</ItemGroup>

<Target Name="PrepareForWasmBuildApp" DependsOnTargets="RebuildWasmAppBuilder;Build">
Expand All @@ -38,6 +39,7 @@
<ItemGroup>
<WasmAssembliesToBundle Include="$(OutDir)\$(TargetFileName)" />
<WasmAssembliesToBundle Include="$(OutDir)\debugger-test-with-source-link.dll" />
<WasmAssembliesToBundle Include="$(OutDir)\debugger-test-with-full-debug-type.dll" />
<WasmAssemblySearchPaths Include="$(MicrosoftNetCoreAppRuntimePackRidDir)native"/>
<WasmAssemblySearchPaths Include="$(MicrosoftNetCoreAppRuntimePackRidDir)lib\$(NetCoreAppCurrent)"/>

Expand Down