diff --git a/src/mono/wasm/debugger/BrowserDebugProxy/DebugStore.cs b/src/mono/wasm/debugger/BrowserDebugProxy/DebugStore.cs index be7d729dd019e4..75841529677d1c 100644 --- a/src/mono/wasm/debugger/BrowserDebugProxy/DebugStore.cs +++ b/src/mono/wasm/debugger/BrowserDebugProxy/DebugStore.cs @@ -514,12 +514,13 @@ internal class AssemblyInfo internal PEReader peReader; internal MemoryStream asmStream; internal MemoryStream pdbStream; - public int DebugId { get; set; } + private int debugId; public bool TriedToLoadSymbolsOnDemand { get; set; } public unsafe AssemblyInfo(string url, byte[] assembly, byte[] pdb) { + debugId = -1; this.id = Interlocked.Increment(ref next_id); asmStream = new MemoryStream(assembly); peReader = new PEReader(asmStream); @@ -542,7 +543,19 @@ public unsafe AssemblyInfo(string url, byte[] assembly, byte[] pdb) AssemblyNameUnqualified = asmMetadataReader.GetAssemblyDefinition().GetAssemblyName().Name + ".dll"; Populate(); } + public async Task GetDebugId(SessionId sessionId, MonoSDBHelper sdbAgent, CancellationToken token) + { + if (debugId > 0) + return debugId; + debugId = await sdbAgent.GetAssemblyId(sessionId, 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 55896677f2b052..9469cac5b9951a 100644 --- a/src/mono/wasm/debugger/BrowserDebugProxy/MemberReferenceResolver.cs +++ b/src/mono/wasm/debugger/BrowserDebugProxy/MemberReferenceResolver.cs @@ -124,7 +124,7 @@ public async Task TryToRunOnLoadedClasses(string varName, CancellationT var type = asm.GetTypeByName(classNameToFind); if (type != null) { - typeId = await sdbHelper.GetTypeIdFromToken(sessionId, asm.DebugId, type.Token, token); + typeId = await sdbHelper.GetTypeIdFromToken(sessionId, await asm.GetDebugId(sessionId, sdbHelper, token), type.Token, token); } } } diff --git a/src/mono/wasm/debugger/BrowserDebugProxy/MonoSDBHelper.cs b/src/mono/wasm/debugger/BrowserDebugProxy/MonoSDBHelper.cs index dee4b5ac0f5fde..b91763188aec27 100644 --- a/src/mono/wasm/debugger/BrowserDebugProxy/MonoSDBHelper.cs +++ b/src/mono/wasm/debugger/BrowserDebugProxy/MonoSDBHelper.cs @@ -710,7 +710,7 @@ public async Task GetAssemblyInfo(SessionId sessionId, int assembl 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 0b613dcca3370a..724648ccee9518 100644 --- a/src/mono/wasm/debugger/DebuggerTestSuite/EvaluateOnCallFrameTests.cs +++ b/src/mono/wasm/debugger/DebuggerTestSuite/EvaluateOnCallFrameTests.cs @@ -641,6 +641,28 @@ await EvaluateOnCallFrameFail(id, ); }); + [Fact] + public async Task EvaluateStaticAttributeInAssemblyNotRelatedButLoaded() => await CheckInspectLocalsAtBreakpointSite( + "DebuggerTests.EvaluateTestsClass/TestEvaluate", "EvaluateLocalsFromAnotherAssembly", 5, "EvaluateLocalsFromAnotherAssembly", + "window.setTimeout(function() { invoke_static_method ('[debugger-test] DebuggerTests.EvaluateTestsClass:EvaluateLocalsFromAnotherAssembly'); })", + wait_for_event_fn: async (pause_location) => + { + var id = pause_location["callFrames"][0]["callFrameId"].Value(); + await EvaluateOnCallFrameAndCheck(id, + ("DebuggerTests.ClassToBreak.valueToCheck", TNumber(10))); + }); + + [Fact] + public async Task EvaluateLocalObjectFromAssemblyNotRelatedButLoaded() + => await CheckInspectLocalsAtBreakpointSite( + "DebuggerTests.EvaluateTestsClass/TestEvaluate", "EvaluateLocalsFromAnotherAssembly", 5, "EvaluateLocalsFromAnotherAssembly", + "window.setTimeout(function() { invoke_static_method ('[debugger-test] DebuggerTests.EvaluateTestsClass:EvaluateLocalsFromAnotherAssembly'); })", + wait_for_event_fn: async (pause_location) => + { + var id = pause_location["callFrames"][0]["callFrameId"].Value(); + await EvaluateOnCallFrameAndCheck(id, + ("a.valueToCheck", TNumber(20))); + }); } } 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..53b80df37033bc 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; + } + } +} \ No newline at end of file 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 01bdda2868ddde..75e9631be7a58c 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 @@ -28,6 +28,13 @@ public void run(int g, int h, string a, string valString, int this_a) b = b + 1; c = c + 1; } + public 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 static void EvaluateLocals() @@ -41,6 +48,11 @@ public static void EvaluateLocals() var f_g_s = new EvaluateTestsGenericStruct(); f_g_s.EvaluateTestsGenericStructInstanceMethod(100, 200, "test"); } + public static void EvaluateLocalsFromAnotherAssembly() + { + TestEvaluate eval = new TestEvaluate(); + eval.EvaluateLocalsFromAnotherAssembly(); + } }