diff --git a/src/mono/wasm/debugger/BrowserDebugProxy/DebugStore.cs b/src/mono/wasm/debugger/BrowserDebugProxy/DebugStore.cs index fc0dbf7aaf96a9..6fb9b309d88e28 100644 --- a/src/mono/wasm/debugger/BrowserDebugProxy/DebugStore.cs +++ b/src/mono/wasm/debugger/BrowserDebugProxy/DebugStore.cs @@ -530,7 +530,7 @@ internal class AssemblyInfo internal MetadataReader asmMetadataReader { get; } internal MetadataReader pdbMetadataReader { get; set; } internal List enCMetadataReader = new List(); - public int DebugId { get; set; } + private int debugId; internal int PdbAge { get; } internal System.Guid PdbGuid { get; } internal string PdbName { get; } @@ -539,6 +539,7 @@ internal class AssemblyInfo public unsafe AssemblyInfo(MonoProxy monoProxy, SessionId sessionId, string url, byte[] assembly, byte[] pdb, CancellationToken token) { + debugId = -1; this.id = Interlocked.Increment(ref next_id); using var asmStream = new MemoryStream(assembly); peReader = new PEReader(asmStream); @@ -579,6 +580,20 @@ public unsafe AssemblyInfo(MonoProxy monoProxy, SessionId sessionId, string url, Populate(); } + public async Task GetDebugId(MonoSDBHelper sdbAgent, CancellationToken token) + { + if (debugId > 0) + return debugId; + debugId = await sdbAgent.GetAssemblyId(Name, token); + return debugId; + } + + public void SetDebugId(int id) + { + if (debugId <= 0 && debugId != id) + debugId = id; + } + public bool EnC(byte[] meta, byte[] pdb) { var asmStream = new MemoryStream(meta); diff --git a/src/mono/wasm/debugger/BrowserDebugProxy/MemberReferenceResolver.cs b/src/mono/wasm/debugger/BrowserDebugProxy/MemberReferenceResolver.cs index 4415db53b2ec20..8516b349f4cf23 100644 --- a/src/mono/wasm/debugger/BrowserDebugProxy/MemberReferenceResolver.cs +++ b/src/mono/wasm/debugger/BrowserDebugProxy/MemberReferenceResolver.cs @@ -163,7 +163,7 @@ async Task FindStaticTypeId(string typeName) if (type == null) continue; - int id = await context.SdbAgent.GetTypeIdFromToken(asm.DebugId, type.Token, token); + int id = await context.SdbAgent.GetTypeIdFromToken(await asm.GetDebugId(context.SdbAgent, token), type.Token, token); if (id != -1) return id; } diff --git a/src/mono/wasm/debugger/BrowserDebugProxy/MonoSDBHelper.cs b/src/mono/wasm/debugger/BrowserDebugProxy/MonoSDBHelper.cs index 2adcad6a14e3e9..216f78a53af564 100644 --- a/src/mono/wasm/debugger/BrowserDebugProxy/MonoSDBHelper.cs +++ b/src/mono/wasm/debugger/BrowserDebugProxy/MonoSDBHelper.cs @@ -749,7 +749,7 @@ public async Task GetAssemblyInfo(int assemblyId, CancellationToke return null; } } - asm.DebugId = assemblyId; + asm.SetDebugId(assemblyId); assemblies[assemblyId] = asm; return asm; } diff --git a/src/mono/wasm/debugger/DebuggerTestSuite/EvaluateOnCallFrameTests.cs b/src/mono/wasm/debugger/DebuggerTestSuite/EvaluateOnCallFrameTests.cs index 600067a47be62b..80bef3eb092578 100644 --- a/src/mono/wasm/debugger/DebuggerTestSuite/EvaluateOnCallFrameTests.cs +++ b/src/mono/wasm/debugger/DebuggerTestSuite/EvaluateOnCallFrameTests.cs @@ -855,6 +855,26 @@ await RuntimeEvaluateAndCheck( ("\"15\"", TString("15"))); }); + [Fact] + public async Task EvaluateStaticAttributeInAssemblyNotRelatedButLoaded() => await CheckInspectLocalsAtBreakpointSite( + "DebuggerTests.EvaluateTestsClass", "EvaluateLocals", 9, "EvaluateLocals", + "window.setTimeout(function() { invoke_static_method ('[debugger-test] DebuggerTests.EvaluateTestsClass:EvaluateLocals'); })", + wait_for_event_fn: async (pause_location) => + { + await RuntimeEvaluateAndCheck( + ("ClassToBreak.valueToCheck", TNumber(10))); + }); + + [Fact] + public async Task EvaluateLocalObjectFromAssemblyNotRelatedButLoaded() + => await CheckInspectLocalsAtBreakpointSite( + "DebuggerTests.EvaluateTestsClass", "EvaluateLocalsFromAnotherAssembly", 5, "EvaluateLocalsFromAnotherAssembly", + "window.setTimeout(function() { invoke_static_method ('[debugger-test] DebuggerTests.EvaluateTestsClass:EvaluateLocalsFromAnotherAssembly'); })", + wait_for_event_fn: async (pause_location) => + { + await RuntimeEvaluateAndCheck( + ("a.valueToCheck", TNumber(20))); + }); } } diff --git a/src/mono/wasm/debugger/DebuggerTestSuite/Tests.cs b/src/mono/wasm/debugger/DebuggerTestSuite/Tests.cs index 6025d684659359..965a55dcd534a3 100644 --- a/src/mono/wasm/debugger/DebuggerTestSuite/Tests.cs +++ b/src/mono/wasm/debugger/DebuggerTestSuite/Tests.cs @@ -905,14 +905,7 @@ 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); }}"; + var expression = $"{{ invoke_static_method('[debugger-test] DebugTypeFull:CallToEvaluateLocal'); }}"; await EvaluateAndCheck( "window.setTimeout(function() {" + expression + "; }, 1);", diff --git a/src/mono/wasm/debugger/tests/debugger-test-with-source-link/test.cs b/src/mono/wasm/debugger/tests/debugger-test-with-source-link/test.cs index af90df3e9a05f4..93344258884c17 100644 --- a/src/mono/wasm/debugger/tests/debugger-test-with-source-link/test.cs +++ b/src/mono/wasm/debugger/tests/debugger-test-with-source-link/test.cs @@ -8,5 +8,14 @@ public static int TestBreakpoint() { return 50; } + public static int valueToCheck = 10; + } + public class ClassToCheckFieldValue + { + public int valueToCheck; + public ClassToCheckFieldValue() + { + valueToCheck = 20; + } } } diff --git a/src/mono/wasm/debugger/tests/debugger-test/debugger-evaluate-test.cs b/src/mono/wasm/debugger/tests/debugger-test/debugger-evaluate-test.cs index 6a9d87ba3f9e3d..f27888c17200cc 100644 --- a/src/mono/wasm/debugger/tests/debugger-test/debugger-evaluate-test.cs +++ b/src/mono/wasm/debugger/tests/debugger-test/debugger-evaluate-test.cs @@ -43,6 +43,14 @@ public static void EvaluateLocals() f_g_s.EvaluateTestsGenericStructInstanceMethod(100, 200, "test"); } + public static void EvaluateLocalsFromAnotherAssembly() + { + var asm = System.Reflection.Assembly.LoadFrom("debugger-test-with-source-link.dll"); + var myType = asm.GetType("DebuggerTests.ClassToCheckFieldValue"); + var myMethod = myType.GetConstructor(new Type[] { }); + var a = myMethod.Invoke(new object[]{}); + } + } public struct EvaluateTestsGenericStruct diff --git a/src/mono/wasm/debugger/tests/debugger-test/debugger-test.cs b/src/mono/wasm/debugger/tests/debugger-test/debugger-test.cs index 3d3502a83d4ade..3ed1f339bfb8ec 100644 --- a/src/mono/wasm/debugger/tests/debugger-test/debugger-test.cs +++ b/src/mono/wasm/debugger/tests/debugger-test/debugger-test.cs @@ -852,7 +852,7 @@ public static void RunDebuggerBreak() public class DebugTypeFull { - public static void CallToEvaluateLocal(string asm_base64, string pdb_base64) + public static void CallToEvaluateLocal() { var asm = System.Reflection.Assembly.LoadFrom("debugger-test-with-full-debug-type.dll"); var myType = asm.GetType("DebuggerTests.ClassToInspectWithDebugTypeFull");