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);
}
Populate();
}
+ public async Task<int> 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);
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);
}
}
}
return null;
}
}
- asm.DebugId = assemblyId;
+ asm.SetDebugId(assemblyId);
assemblies[assemblyId] = asm;
return asm;
}
);
});
+ [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<string>();
+ 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<string>();
+ await EvaluateOnCallFrameAndCheck(id,
+ ("a.valueToCheck", TNumber(20)));
+ });
}
}
{
return 50;
}
+ public static int valueToCheck = 10;
}
-}
+ public class ClassToCheckFieldValue
+ {
+ public int valueToCheck;
+ public ClassToCheckFieldValue()
+ {
+ valueToCheck = 20;
+ }
+ }
+}
\ No newline at end of file
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()
var f_g_s = new EvaluateTestsGenericStruct<int>();
f_g_s.EvaluateTestsGenericStructInstanceMethod(100, 200, "test");
}
+ public static void EvaluateLocalsFromAnotherAssembly()
+ {
+ TestEvaluate eval = new TestEvaluate();
+ eval.EvaluateLocalsFromAnotherAssembly();
+ }
}