2 using System.Collections.Generic;
3 using System.Threading;
5 using System.Reflection;
8 using Mono.Debugger.Soft;
9 using Diag = System.Diagnostics;
12 using System.Security.Cryptography;
14 using NUnit.Framework;
16 #pragma warning disable 0219
22 public class DebuggerTests
25 MethodMirror entry_point;
26 StepEventRequest step_req;
29 void AssertThrows<ExType> (Action del) where ExType : Exception {
37 Assert.IsTrue (thrown);
40 // No other way to pass arguments to the tests ?
41 public static bool listening = Environment.GetEnvironmentVariable ("DBG_SUSPEND") != null;
42 public static string runtime = Environment.GetEnvironmentVariable ("DBG_RUNTIME");
43 public static string agent_args = Environment.GetEnvironmentVariable ("DBG_AGENT_ARGS");
45 // Not currently used, but can be useful when debugging individual tests.
46 void StackTraceDump (Event e)
49 foreach (var frame in e.Thread.GetFrames ())
52 Console.WriteLine ("Frame " + i + ", " + frame.Method.Name);
56 Event GetNextEvent () {
57 var es = vm.GetNextEventSet ();
58 Assert.AreEqual (1, es.Events.Length);
62 void Start (params string[] args) {
66 Diag.ProcessStartInfo CreateStartInfo (string[] args) {
67 var pi = new Diag.ProcessStartInfo ();
69 if (runtime != null) {
70 pi.FileName = runtime;
71 } else if (Path.DirectorySeparatorChar == '\\') {
72 string processExe = Diag.Process.GetCurrentProcess ().MainModule.FileName;
73 if (processExe != null) {
74 string fileName = Path.GetFileName (processExe);
75 if (fileName.StartsWith ("mono") && fileName.EndsWith (".exe"))
76 pi.FileName = processExe;
79 if (string.IsNullOrEmpty (pi.FileName))
81 pi.Arguments = String.Join (" ", args);
85 void Start (bool forceExit, params string[] args) {
86 this.forceExit = forceExit;
89 var pi = CreateStartInfo (args);
90 vm = VirtualMachineManager.Launch (pi, new LaunchOptions { AgentArgs = agent_args });
92 var ep = new IPEndPoint (IPAddress.Any, 10000);
93 Console.WriteLine ("Listening on " + ep + "...");
94 vm = VirtualMachineManager.Listen (ep);
97 var load_req = vm.CreateAssemblyLoadRequest ();
100 Event vmstart = GetNextEvent ();
101 Assert.AreEqual (EventType.VMStart, vmstart.EventType);
110 /* Find out the entry point */
114 if (e is AssemblyLoadEvent) {
115 AssemblyLoadEvent ae = (AssemblyLoadEvent)e;
116 entry_point = ae.Assembly.EntryPoint;
117 if (entry_point != null)
127 BreakpointEvent run_until (string name) {
129 MethodMirror m = entry_point.DeclaringType.GetMethod (name);
130 Assert.IsNotNull (m);
131 //Console.WriteLine ("X: " + name + " " + m.ILOffsets.Count + " " + m.Locations.Count);
132 var req = vm.SetBreakpoint (m, m.ILOffsets [0]);
139 if (e is BreakpointEvent)
145 Assert.IsInstanceOfType (typeof (BreakpointEvent), e);
146 Assert.AreEqual (m.Name, (e as BreakpointEvent).Method.Name);
148 return (e as BreakpointEvent);
151 class ReusableBreakpoint {
153 public string method_name;
154 public BreakpointEventRequest req;
155 public BreakpointEvent lastEvent = null;
156 public ReusableBreakpoint (DebuggerTests owner, string method_name)
159 this.method_name = method_name;
160 MethodMirror m = owner.entry_point.DeclaringType.GetMethod (method_name);
161 Assert.IsNotNull (m);
162 req = owner.vm.SetBreakpoint (m, m.ILOffsets [0]);
165 public void Continue ()
167 bool survived = false;
174 e = owner.GetNextEvent ();
175 if (e is BreakpointEvent)
179 Assert.IsInstanceOfType (typeof (BreakpointEvent), e);
180 Assert.AreEqual (method_name, (e as BreakpointEvent).Method.Name);
182 lastEvent = e as BreakpointEvent;
186 if (!survived) { // Ensure cleanup if we triggered an assert
192 public void Disable ()
198 /* One of the tests executes a complex tree of recursive functions.
199 The only good way to specify how its behavior should appear from this side
200 is to just run the function tree once over here and record what it does. */
201 public struct RecursiveChaoticPoint
203 public bool breakpoint;
207 public RecursiveChaoticPoint (bool breakpoint, string name, int depth)
209 this.breakpoint = breakpoint;
215 // The breakpoint is placed here in dtest-app.cs
216 public static void ss_recursive_chaotic_trap (int n, List<RecursiveChaoticPoint> trace, ref bool didLast, ref bool didAny)
218 // Depth is calculated as:
219 // Main + single_stepping + ss_recursive_chaotic + (n is 5 at outermost frame and 0 at innermost frame) + ss_recursive_chaotic_trap
220 trace.Add (new RecursiveChaoticPoint (true, "ss_recursive_chaotic_trap", 5 - n + 5));
224 public static void ss_recursive_chaotic_at (string at, int n, List<RecursiveChaoticPoint> trace, ref bool didLast, ref bool didAny)
226 // This will be called after every return from a function. The other function will return whether "step out" is currently active, and it will be passed in here as didLast.
228 // Depth is calculated as:
229 // Main + single_stepping + ss_recursive_chaotic + (n is 5 at outermost frame and 0 at innermost frame)
230 trace.Add (new RecursiveChaoticPoint (false, "ss_recursive_chaotic_" + at, 5 - n + 4));
236 public static bool ss_recursive_chaotic_fizz (int n, List<RecursiveChaoticPoint> trace)
238 bool didLast = false, didAny = false;
241 didLast = ss_recursive_chaotic_buzz (next, trace);
242 ss_recursive_chaotic_at ("fizz", n, trace, ref didLast, ref didAny);
243 didLast = ss_recursive_chaotic_fizzbuzz (next, trace);
244 ss_recursive_chaotic_at ("fizz", n, trace, ref didLast, ref didAny);
246 ss_recursive_chaotic_trap (n, trace, ref didLast, ref didAny);
247 ss_recursive_chaotic_at ("fizz", n, trace, ref didLast, ref didAny);
252 public static bool ss_recursive_chaotic_buzz (int n, List<RecursiveChaoticPoint> trace)
254 bool didLast = false, didAny = false;
257 didLast = ss_recursive_chaotic_fizz (next, trace);
258 ss_recursive_chaotic_at ("buzz", n, trace, ref didLast, ref didAny);
259 didLast = ss_recursive_chaotic_fizzbuzz (next, trace);
260 ss_recursive_chaotic_at ("buzz", n, trace, ref didLast, ref didAny);
265 public static bool ss_recursive_chaotic_fizzbuzz (int n, List<RecursiveChaoticPoint> trace)
267 bool didLast = false, didAny = false;
270 didLast = ss_recursive_chaotic_fizz (next, trace);
271 ss_recursive_chaotic_at ("fizzbuzz", n, trace, ref didLast, ref didAny);
272 didLast = ss_recursive_chaotic_buzz (next, trace);
273 ss_recursive_chaotic_at ("fizzbuzz", n, trace, ref didLast, ref didAny);
274 didLast = ss_recursive_chaotic_fizzbuzz (next, trace);
275 ss_recursive_chaotic_at ("fizzbuzz", n, trace, ref didLast, ref didAny);
280 public static void trace_ss_recursive_chaotic (List<RecursiveChaoticPoint> trace)
282 ss_recursive_chaotic_fizz (5, trace);
285 Event single_step (ThreadMirror t) {
286 var req = vm.CreateStepRequest (t);
290 Event e = GetNextEvent ();
291 Assert.IsTrue (e is StepEvent);
298 Event step_until (ThreadMirror t, string method_name) {
302 if ((e as StepEvent).Method.Name == method_name)
308 void check_arg_val (StackFrame frame, int pos, Type type, object eval) {
309 object val = frame.GetArgument (pos);
310 Assert.IsTrue (val is PrimitiveValue);
311 object v = (val as PrimitiveValue).Value;
312 Assert.AreEqual (type, v.GetType ());
314 Assert.IsTrue (Math.Abs ((float)eval - (float)v) < 0.0001);
315 else if (eval is double)
316 Assert.IsTrue (Math.Abs ((double)eval - (double)v) < 0.0001);
318 Assert.AreEqual (eval, v);
321 void AssertValue (object expected, object val) {
322 if (expected is string) {
323 Assert.IsTrue (val is StringMirror);
324 Assert.AreEqual (expected, (val as StringMirror).Value);
325 } else if (val is StructMirror && (val as StructMirror).Type.Name == "IntPtr") {
326 AssertValue (expected, (val as StructMirror).Fields [0]);
328 Assert.IsTrue (val is PrimitiveValue);
329 Assert.AreEqual (expected, (val as PrimitiveValue).Value);
334 public void SetUp () {
335 ThreadMirror.NativeTransitions = false;
336 Start (new string [] { "dtest-app.exe" });
340 public void TearDown () {
344 if (step_req != null)
352 Event e = GetNextEvent ();
354 if (e is VMDeathEvent)
363 public void SimpleBreakpoint () {
366 MethodMirror m = entry_point.DeclaringType.GetMethod ("bp1");
367 Assert.IsNotNull (m);
369 vm.SetBreakpoint (m, 0);
374 Assert.AreEqual (EventType.Breakpoint, e.EventType);
375 Assert.IsTrue (e is BreakpointEvent);
376 Assert.AreEqual (m.Name, (e as BreakpointEvent).Method.Name);
379 AssertThrows<ArgumentException> (delegate {
381 vm.SetBreakpoint (m, 2);
386 public void BreakpointsSameLocation () {
387 MethodMirror m = entry_point.DeclaringType.GetMethod ("bp2");
388 Assert.IsNotNull (m);
390 vm.SetBreakpoint (m, 0);
391 vm.SetBreakpoint (m, 0);
395 var es = vm.GetNextEventSet ();
396 Assert.AreEqual (2, es.Events.Length);
397 Assert.IsTrue (es [0] is BreakpointEvent);
398 Assert.AreEqual (m, (es [0] as BreakpointEvent).Method);
400 Assert.IsTrue (es [1] is BreakpointEvent);
401 Assert.AreEqual (m.Name, (es [1] as BreakpointEvent).Method.Name);
405 public void BreakpointAlreadyJITted () {
406 Event e = run_until ("bp1");
408 /* Place a breakpoint on bp3 */
409 MethodMirror m = entry_point.DeclaringType.GetMethod ("bp3");
410 Assert.IsNotNull (m);
411 vm.SetBreakpoint (m, 0);
413 /* Same with generic instances */
414 MethodMirror m2 = entry_point.DeclaringType.GetMethod ("bp7");
415 Assert.IsNotNull (m2);
416 vm.SetBreakpoint (m2, 0);
421 Assert.AreEqual (EventType.Breakpoint, e.EventType);
422 Assert.AreEqual (m.Name, (e as BreakpointEvent).Method.Name);
426 /* Non-shared instance */
428 Assert.AreEqual (EventType.Breakpoint, e.EventType);
429 Assert.AreEqual (m2.Name, (e as BreakpointEvent).Method.Name);
433 /* Shared instance */
435 Assert.AreEqual (EventType.Breakpoint, e.EventType);
436 Assert.AreEqual (m2.Name, (e as BreakpointEvent).Method.Name);
440 public void ClearBreakpoint () {
443 MethodMirror m = entry_point.DeclaringType.GetMethod ("bp4");
444 Assert.IsNotNull (m);
445 EventRequest req1 = vm.SetBreakpoint (m, 0);
446 EventRequest req2 = vm.SetBreakpoint (m, 0);
448 MethodMirror m2 = entry_point.DeclaringType.GetMethod ("bp5");
449 Assert.IsNotNull (m2);
450 vm.SetBreakpoint (m2, 0);
455 var es = vm.GetNextEventSet ();
456 Assert.AreEqual (2, es.Events.Length);
457 Assert.AreEqual (EventType.Breakpoint, es [0].EventType);
458 Assert.AreEqual (m.Name, (es [0] as BreakpointEvent).Method.Name);
459 Assert.AreEqual (EventType.Breakpoint, es [1].EventType);
460 Assert.AreEqual (m.Name, (es [1] as BreakpointEvent).Method.Name);
462 /* Clear one of them */
468 Assert.AreEqual (EventType.Breakpoint, e.EventType);
469 Assert.AreEqual (m.Name, (e as BreakpointEvent).Method.Name);
471 /* Clear the other */
477 Assert.AreEqual (EventType.Breakpoint, e.EventType);
478 Assert.AreEqual (m2.Name, (e as BreakpointEvent).Method.Name);
482 public void ClearAllBreakpoints () {
485 MethodMirror m = entry_point.DeclaringType.GetMethod ("bp4");
486 Assert.IsNotNull (m);
487 vm.SetBreakpoint (m, 0);
489 MethodMirror m2 = entry_point.DeclaringType.GetMethod ("bp5");
490 Assert.IsNotNull (m2);
491 vm.SetBreakpoint (m2, 0);
493 vm.ClearAllBreakpoints ();
498 Assert.IsTrue (!(e is BreakpointEvent));
499 if (e is VMDeathEvent)
504 public void BreakpointOnGShared () {
507 MethodMirror m = entry_point.DeclaringType.GetMethod ("bp6");
508 Assert.IsNotNull (m);
510 vm.SetBreakpoint (m, 0);
515 Assert.AreEqual (EventType.Breakpoint, e.EventType);
516 Assert.IsTrue (e is BreakpointEvent);
517 Assert.AreEqual (m.Name, (e as BreakpointEvent).Method.Name);
519 // Breakpoint on an open generic method of a closed generic class (#3422)
520 var frame = e.Thread.GetFrames ()[0];
521 var ginst = frame.GetValue (frame.Method.GetLocal ("gc"));
522 var m2 = (ginst as ObjectMirror).Type.GetMethod ("bp");
523 vm.SetBreakpoint (m2, 0);
528 Assert.AreEqual (EventType.Breakpoint, e.EventType);
529 Assert.IsTrue (e is BreakpointEvent);
530 Assert.AreEqual (m2.Name, (e as BreakpointEvent).Method.Name);
533 // Assert we have stepped to a location
534 void assert_location (Event e, string method) {
535 Assert.IsTrue (e is StepEvent);
536 Assert.AreEqual (method, (e as StepEvent).Method.Name);
539 // Assert we have breakpointed at a location
540 void assert_location_at_breakpoint (Event e, string method) {
541 Assert.IsTrue (e is BreakpointEvent);
542 Assert.AreEqual (method, (e as BreakpointEvent).Method.Name);
545 // Assert we have stepped to or breakpointed at a location
546 void assert_location_allow_breakpoint (Event e, string method) {
548 Assert.AreEqual (method, (e as StepEvent).Method.Name);
549 else if (e is BreakpointEvent)
550 Assert.AreEqual (method, (e as BreakpointEvent).Method.Name);
552 Assert.Fail ("Neither step nor breakpoint event");
555 StepEventRequest create_step (Event e) {
556 var req = vm.CreateStepRequest (e.Thread);
562 public void ClassLocalReflection () {
563 MethodMirror m = entry_point.DeclaringType.Assembly.GetType ("LocalReflectClass").GetMethod ("RunMe");
565 Assert.IsNotNull (m);
567 // foreach (var x in m.Locations) {
568 // Console.WriteLine (x);
572 int method_base_linum = m.Locations [0].LineNumber;
573 foreach (var location in m.Locations)
574 if (location.LineNumber == method_base_linum + 2) {
575 offset = location.ILOffset;
579 var req = vm.SetBreakpoint (m, offset);
586 if (e is BreakpointEvent)
592 Assert.IsInstanceOfType (typeof (BreakpointEvent), e);
593 Assert.AreEqual (m.Name, (e as BreakpointEvent).Method.Name);
595 e = single_step (e.Thread);
597 var frame = e.Thread.GetFrames ()[0];
599 Assert.IsNotNull (frame);
600 var field = frame.Method.GetLocal ("reflectMe");
601 Assert.IsNotNull (field);
602 Value variable = frame.GetValue (field);
604 ObjectMirror thisObj = (ObjectMirror)variable;
605 TypeMirror thisType = thisObj.Type;
606 FieldInfoMirror thisFi = null;
607 foreach (var fi in thisType.GetFields ())
608 if (fi.Name == "someField")
611 var gotVal = thisObj.GetValue (thisFi);
612 // If we got this far, we're good.
616 public void SingleStepping () {
617 Event e = run_until ("single_stepping");
619 var req = create_step (e);
622 // Step over 'bool b = true'
624 assert_location (e, "single_stepping");
631 assert_location (e, "ss1");
638 assert_location (e, "single_stepping");
642 assert_location (e, "single_stepping");
646 assert_location (e, "ss3");
648 // Step back into single_stepping
650 assert_location (e, "single_stepping");
652 // Step into next line
654 assert_location (e, "single_stepping");
656 // Step into ss3_2 ()
658 assert_location (e, "ss3_2");
660 // Step over ss3_2_2 ()
662 assert_location (e, "ss3_2");
664 // Recreate the request
671 // Step back into single_stepping () with the new request
673 assert_location (e, "single_stepping");
677 assert_location (e, "ss4");
682 // Change to StepSize.Line
684 req.Depth = StepDepth.Over;
685 req.Size = StepSize.Line;
688 // Step over ss1 (); ss1 ();
693 req.Depth = StepDepth.Into;
697 assert_location (e, "ss2");
702 e = run_until ("ss5");
704 // Add an assembly filter
705 req.AssemblyFilter = new AssemblyMirror [] { (e as BreakpointEvent).Method.DeclaringType.Assembly };
711 // Step into is_even, skipping the linq stuff
713 assert_location (e, "is_even");
715 // FIXME: Check that single stepping works with lock (obj)
719 e = run_until ("ss6");
721 req = create_step (e);
722 req.Depth = StepDepth.Over;
725 // Check that single stepping works in out-of-line bblocks
728 assert_location (e, "ss6");
731 // Testing stepping in, over and out with exception handlers in same or caller method
733 //stepout in ss7_2, which may not go to catch(instead out to ss7)
734 e = run_until ("ss7_2");
736 assert_location (step_out(), "ss7");
738 //stepout in ss7_2_1, which must go to catch
739 run_until ("ss7_2_1");
740 assert_location (step_out (), "ss7_2");
742 //stepover over ss7_2, which must go to catch
744 assert_location (step_over (), "ss7_2");//move to "try {" line
745 assert_location (step_over (), "ss7_2");//move to "ss7_2_2();" line
746 assert_location (step_over (), "ss7_2");//step over ss7_2_2();, assume we are at "catch" now
747 assert_location (step_over (), "ss7_2");//move to { of catch
748 assert_location (step_over (), "ss7_2");//move to } of catch
749 assert_location (step_over (), "ss7_2");//move to } of method
750 assert_location (step_over (), "ss7");//finish method
752 //stepover over ss7_2_1, which must go to catch
753 run_until ("ss7_2_1");
754 assert_location (step_over (), "ss7_2_1");//move from { of method to "throw new Exception ();"
755 assert_location (step_over (), "ss7_2");//step over exception, being in ss7_2 means we are at catch
757 //stepin in ss7_3, which must go to catch
759 assert_location (step_into (), "ss7_3");//move to "try {"
760 assert_location (step_into (), "ss7_3");//move to "throw new Exception ();"
762 step_req.AssemblyFilter = new AssemblyMirror [] { (e as BreakpointEvent).Method.DeclaringType.Assembly };
763 assert_location (step_into (), "ss7_3");//call "throw new Exception ();", we assume we end up at "catch"
764 assert_location (step_into (), "ss7_3");//move to { of catch
765 assert_location (step_into (), "ss7_3");//move to } of catch
766 assert_location (step_into (), "ss7_3");//move to } of method
767 assert_location (step_into (), "ss7");//move out to ss7
769 //stepover in ss7_2_1, which must go to catch
770 run_until ("ss7_2_1");
771 assert_location (step_into (), "ss7_2_1");//move from { of method to "throw new Exception ();"
772 assert_location (step_into (), "ss7_2");//step in exception, being in ss7_2 means we are at catch
775 // Check that stepping stops between nested calls
776 e = run_until ("ss_nested_2");
777 req = create_step (e);
779 assert_location (e, "ss_nested");
781 assert_location (e, "ss_nested_1");
783 assert_location (e, "ss_nested");
784 // Check that step over steps over nested calls
786 assert_location (e, "ss_nested");
788 assert_location (e, "ss_nested_2");
790 assert_location (e, "ss_nested_2");
792 assert_location (e, "ss_nested_2");
794 assert_location (e, "ss_nested");
796 assert_location (e, "ss_nested_1");
798 assert_location (e, "ss_nested_1");
800 assert_location (e, "ss_nested");
803 // Check DebuggerStepThrough support
804 e = run_until ("ss_step_through");
805 req = create_step (e);
806 req.Filter = StepFilter.DebuggerStepThrough;
808 // Step through step_through_1 ()
810 assert_location (e, "ss_step_through");
811 // Step through StepThroughClass.step_through_2 ()
813 assert_location (e, "ss_step_through");
815 req.Filter = StepFilter.None;
817 assert_location (e, "step_through_3");
820 // Check DebuggerNonUserCode support
821 e = run_until ("ss_non_user_code");
822 req = create_step (e);
823 req.Filter = StepFilter.DebuggerNonUserCode;
825 // Step through non_user_code_1 ()
827 assert_location (e, "ss_non_user_code");
828 // Step through StepThroughClass.non_user_code_2 ()
830 assert_location (e, "ss_non_user_code");
832 req.Filter = StepFilter.None;
834 assert_location (e, "non_user_code_3");
837 // Check that step-over doesn't stop at inner frames with recursive functions
838 e = run_until ("ss_recursive");
839 req = create_step (e);
843 var f = e.Thread.GetFrames () [0];
844 assert_location (e, "ss_recursive");
845 AssertValue (1, f.GetValue (f.Method.GetLocal ("n")));
848 // Check that step-over stops correctly when inner frames with recursive functions contain breakpoints
849 e = run_until ("ss_recursive2");
850 ReusableBreakpoint breakpoint = new ReusableBreakpoint (this, "ss_recursive2_trap");
852 breakpoint.Continue ();
853 e = breakpoint.lastEvent;
854 req = create_step (e);
855 for (int c = 1; c <= 4; c++) {
856 // The first five times we try to step over this function, the breakpoint will stop us
857 assert_location_at_breakpoint (e, "ss_recursive2_trap");
860 req = create_step (e);
861 req.Size = StepSize.Line;
864 e = step_over ();//Stepout gets us to ss_recursive2_trap ();, move to ss_recursive2 (next); line
865 assert_location (e, "ss_recursive2");
867 // Stack should consist of Main + single_stepping + (1 ss_recursive2 frame per loop iteration)
868 Assert.AreEqual (c+2, e.Thread.GetFrames ().Length);
869 e = step_over_or_breakpoint ();
871 // At this point we should have escaped the breakpoints and this will be a normal step stop
872 assert_location (e, "ss_recursive2");
873 Assert.AreEqual (6, e.Thread.GetFrames ().Length);
876 breakpoint.Disable ();
879 // Check that step-out stops correctly when inner frames with recursive functions contain breakpoints
880 e = run_until ("ss_recursive2");
881 breakpoint = new ReusableBreakpoint (this, "ss_recursive2_trap");
883 breakpoint.Continue ();
884 e = breakpoint.lastEvent;
885 req = create_step (e);
886 for (int c = 1; c <= 4; c++) {
887 // The first five times we try to step over this function, the breakpoint will stop us
888 assert_location_at_breakpoint (e, "ss_recursive2_trap");
891 req = create_step (e);
892 req.Size = StepSize.Line;
895 assert_location (e, "ss_recursive2");
897 // Stack should consist of Main + single_stepping + (1 ss_recursive2 frame per loop iteration)
898 Assert.AreEqual (c+2, e.Thread.GetFrames ().Length);
899 e = step_out_or_breakpoint ();
901 for (int c = 3; c >= 1; c--) {
902 assert_location (e, "ss_recursive2");
903 Assert.AreEqual (c + 2, e.Thread.GetFrames ().Length);
909 breakpoint.Disable ();
912 // Test step out with a really complicated call tree
913 List<RecursiveChaoticPoint> trace = new List<RecursiveChaoticPoint>();
914 trace_ss_recursive_chaotic (trace);
915 e = run_until ("ss_recursive_chaotic");
917 breakpoint = new ReusableBreakpoint (this, "ss_recursive_chaotic_trap");
918 breakpoint.Continue ();
919 e = breakpoint.lastEvent;
920 foreach (RecursiveChaoticPoint point in trace)
922 if (point.breakpoint)
923 assert_location_at_breakpoint (e, point.name);
925 assert_location (e, point.name);
926 Assert.AreEqual (point.depth, e.Thread.GetFrames ().Length);
929 req = create_step (e);
930 req.Size = StepSize.Line;
931 e = step_out_or_breakpoint ();
935 breakpoint.Disable ();
938 // Check that single stepping doesn't clobber fp values
939 e = run_until ("ss_fp_clobber");
940 req = create_step (e);
942 f = e.Thread.GetFrames ()[0];
944 if ((e as StepEvent).Method.Name == "ss_fp_clobber_2")
948 f = e.Thread.GetFrames ()[0];
949 AssertValue (7.0, f.GetValue (f.Method.GetParameters ()[0]));
952 e = run_until ("ss_await");
953 e = step_in_await ("ss_await", e);//ss_await_1 ().Wait ();//in
954 e = step_in_await ("MoveNext", e);//{
955 e = step_in_await ("MoveNext", e);//var a = 1;
956 e = step_in_await ("MoveNext", e);//await Task.Delay (10);
957 e = step_in_await ("MoveNext", e);//return a + 2;
958 e = step_in_await ("MoveNext", e);//}
959 e = step_in_await ("ss_await", e);//ss_await_1 ().Wait ();//in
961 e = step_in_await ("ss_await", e);//ss_await_1 ().Wait ();//over
962 e = step_in_await ("MoveNext", e);//{
963 e = step_over_await ("MoveNext", e);//var a = 1;
964 e = step_over_await ("MoveNext", e);//await Task.Delay (10);
965 e = step_over_await ("MoveNext", e);//return a + 2;
966 e = step_over_await ("MoveNext", e);//}
967 e = step_over_await ("ss_await", e);//ss_await_1 ().Wait ();//over
969 e = step_in_await ("ss_await", e);//ss_await_1 ().Wait ();//out before
970 e = step_in_await ("MoveNext", e);//{
971 e = step_out_await ("ss_await", e);//ss_await_1 ().Wait ();//out before
973 e = step_in_await ("ss_await", e);//ss_await_1 ().Wait ();//out after
974 e = step_in_await ("MoveNext", e);//{
975 e = step_in_await ("MoveNext", e);//var a = 1;
976 e = step_in_await ("MoveNext", e);//await Task.Delay (10);
977 e = step_in_await ("MoveNext", e);//return a + 2;
978 e = step_out_await ("ss_await", e);//ss_await_1 ().Wait ();//out after
980 e = step_in_await ("ss_await", e);//ss_await_1_exc (true, true).Wait ();//in
981 e = step_in_await ("MoveNext", e);//{
982 e = step_in_await ("MoveNext", e);//var a = 1;
983 e = step_in_await ("MoveNext", e);//await Task.Delay (10);
984 e = step_in_await ("MoveNext", e);//if (exc)
985 e = step_in_await ("MoveNext", e);//{
986 e = step_in_await ("MoveNext", e);//if (handled)
987 e = step_in_await ("MoveNext", e);//{
988 e = step_in_await ("MoveNext", e);//try {
989 e = step_in_await ("MoveNext", e);//throw new Exception ();
990 e = step_in_await ("MoveNext", e);//catch
991 e = step_in_await ("MoveNext", e);//{
992 e = step_in_await ("MoveNext", e);//}
993 e = step_in_await ("MoveNext", e);//}
994 e = step_in_await ("MoveNext", e);//}
995 e = step_in_await ("MoveNext", e);//return a + 2;
996 e = step_in_await ("MoveNext", e);//}
997 e = step_in_await ("ss_await", e);//ss_await_1_exc (true, true).Wait ();//in
999 e = step_in_await ("ss_await", e);//ss_await_1_exc (true, true).Wait ();//over
1000 e = step_in_await ("MoveNext", e);//{
1001 e = step_over_await ("MoveNext", e);//var a = 1;
1002 e = step_over_await ("MoveNext", e);//await Task.Delay (10);
1003 e = step_over_await ("MoveNext", e);//if (exc)
1004 e = step_over_await ("MoveNext", e);//{
1005 e = step_over_await ("MoveNext", e);//if (handled)
1006 e = step_over_await ("MoveNext", e);//{
1007 e = step_over_await ("MoveNext", e);//try {
1008 e = step_over_await ("MoveNext", e);//throw new Exception ();
1009 e = step_over_await ("MoveNext", e);//catch
1010 e = step_over_await ("MoveNext", e);//{
1011 e = step_over_await ("MoveNext", e);//}
1012 e = step_over_await ("MoveNext", e);//}
1013 e = step_over_await ("MoveNext", e);//}
1014 e = step_over_await ("MoveNext", e);//return a + 2;
1015 e = step_over_await ("MoveNext", e);//}
1016 e = step_over_await ("ss_await", e);//ss_await_1_exc (true, true).Wait ();//over
1018 e = step_in_await ("ss_await", e);//ss_await_1_exc (true, true).Wait ();//out
1019 e = step_in_await ("MoveNext", e);//{
1020 e = step_out_await ("ss_await", e);//ss_await_1_exc (true, true).Wait ();//out
1022 e = step_in_await ("ss_await", e);//try {
1023 e = step_in_await ("ss_await", e);//ss_await_1_exc (true, false).Wait ();//in
1024 e = step_in_await ("MoveNext", e);//{
1025 e = step_in_await ("MoveNext", e);//var a = 1;
1026 e = step_in_await ("MoveNext", e);//await Task.Delay (10);
1027 e = step_in_await ("MoveNext", e);//if (exc)
1028 e = step_in_await ("MoveNext", e);//{
1029 e = step_in_await ("MoveNext", e);//if (handled)
1030 e = step_in_await ("MoveNext", e);//} else {
1031 e = step_in_await ("MoveNext", e);//throw new Exception ();
1032 e = step_in_await ("ss_await", e);//catch
1033 e = step_in_await ("ss_await", e);//{
1034 e = step_in_await ("ss_await", e);//}
1035 e = step_in_await ("ss_await", e);//try {
1037 e = step_in_await ("ss_await", e);//ss_await_1_exc (true, false).Wait ();//over
1038 e = step_in_await ("MoveNext", e);//{
1039 e = step_over_await ("MoveNext", e);//var a = 1;
1040 e = step_over_await ("MoveNext", e);//await Task.Delay (10);
1041 e = step_over_await ("MoveNext", e);//if (exc)
1042 e = step_over_await ("MoveNext", e);//{
1043 e = step_over_await ("MoveNext", e);//if (handled)
1044 e = step_over_await ("MoveNext", e);//} else {
1045 e = step_over_await ("MoveNext", e);//throw new Exception ();
1046 e = step_over_await ("ss_await", e);//catch
1047 e = step_over_await ("ss_await", e);//{
1048 e = step_over_await ("ss_await", e);//}
1049 e = step_over_await ("ss_await", e);//try {
1051 e = step_in_await ("ss_await", e);//ss_await_1_exc (true, false).Wait ();//out
1052 e = step_in_await ("MoveNext", e);//{
1053 e = step_out_await ("ss_await", e);//ss_await_1_exc (true, true).Wait ();//out
1056 Event step_in_await (string method, Event e)
1058 if (step_req != null)
1059 step_req.Disable ();
1061 step_req.AssemblyFilter = new List<AssemblyMirror> () { entry_point.DeclaringType.Assembly };
1062 var ef = step_into ();
1063 assert_location (ef, method);
1067 Event step_over_await (string method, Event e)
1069 if (step_req != null)
1070 step_req.Disable ();
1072 step_req.AssemblyFilter = new List<AssemblyMirror> () { entry_point.DeclaringType.Assembly };
1073 var ef = step_over ();
1074 assert_location (ef, method);
1078 Event step_out_await (string method, Event e)
1080 if (step_req != null)
1081 step_req.Disable ();
1083 step_req.AssemblyFilter = new List<AssemblyMirror> () { entry_point.DeclaringType.Assembly };
1084 var ef = step_out ();
1085 assert_location (ef, method);
1090 public void SingleSteppingNoFrames () {
1092 // Test what happens when starting a single step operation on a thread
1093 // with no managed frames
1095 // Run a delegate on a tp thread
1096 var e = run_until ("ss_no_frames_2");
1098 var this_type = e.Thread.GetFrames ()[0].Method.DeclaringType;
1099 this_type.SetValue (this_type.GetField ("static_i"), vm.CreateValue (56));
1101 var thread = e.Thread;
1102 var e2 = run_until ("ss_no_frames_3");
1103 // The tp thread should be idle now
1104 step_req = vm.CreateStepRequest (thread);
1105 step_req.Depth = StepDepth.Over;
1106 AssertThrows<Exception> (delegate {
1112 public void MethodEntryExit () {
1113 run_until ("single_stepping");
1115 var req1 = vm.CreateMethodEntryRequest ();
1116 var req2 = vm.CreateMethodExitRequest ();
1122 Event e = GetNextEvent ();
1123 Assert.IsTrue (e is MethodEntryEvent);
1124 Assert.AreEqual ("ss1", (e as MethodEntryEvent).Method.Name);
1127 e = GetNextEvent ();
1128 Assert.IsTrue (e is MethodExitEvent);
1129 Assert.AreEqual ("ss1", (e as MethodExitEvent).Method.Name);
1136 public void CountFilter () {
1137 run_until ("single_stepping");
1139 MethodMirror m2 = entry_point.DeclaringType.GetMethod ("ss3");
1140 Assert.IsNotNull (m2);
1141 vm.SetBreakpoint (m2, 0);
1143 var req1 = vm.CreateMethodEntryRequest ();
1147 // Enter ss2, ss1 is skipped
1149 Event e = GetNextEvent ();
1150 Assert.IsTrue (e is MethodEntryEvent);
1151 Assert.AreEqual ("ss2", (e as MethodEntryEvent).Method.Name);
1153 // Breakpoint on ss3, the entry event is no longer reported
1155 e = GetNextEvent ();
1156 Assert.IsTrue (e is BreakpointEvent);
1162 public void Arguments () {
1165 var e = run_until ("arg1");
1167 StackFrame frame = e.Thread.GetFrames () [0];
1169 check_arg_val (frame, 0, typeof (sbyte), SByte.MaxValue - 5);
1170 check_arg_val (frame, 1, typeof (byte), Byte.MaxValue - 5);
1171 check_arg_val (frame, 2, typeof (bool), true);
1172 check_arg_val (frame, 3, typeof (short), Int16.MaxValue - 5);
1173 check_arg_val (frame, 4, typeof (ushort), UInt16.MaxValue - 5);
1174 check_arg_val (frame, 5, typeof (char), 'F');
1175 check_arg_val (frame, 6, typeof (int), Int32.MaxValue - 5);
1176 check_arg_val (frame, 7, typeof (uint), UInt32.MaxValue - 5);
1177 check_arg_val (frame, 8, typeof (long), Int64.MaxValue - 5);
1178 check_arg_val (frame, 9, typeof (ulong), UInt64.MaxValue - 5);
1179 check_arg_val (frame, 10, typeof (float), 1.2345f);
1180 check_arg_val (frame, 11, typeof (double), 6.78910);
1182 e = run_until ("arg2");
1184 frame = e.Thread.GetFrames () [0];
1187 val = frame.GetArgument (0);
1188 AssertValue ("FOO", val);
1189 Assert.AreEqual ("String", (val as ObjectMirror).Type.Name);
1192 val = frame.GetArgument (1);
1193 AssertValue (null, val);
1196 val = frame.GetArgument (2);
1197 AssertValue ("BLA", val);
1200 val = frame.GetArgument (3);
1201 AssertValue (42, val);
1204 val = frame.GetArgument (4);
1205 Assert.IsTrue (val is ObjectMirror);
1206 Assert.AreEqual ("GClass`1", (val as ObjectMirror).Type.Name);
1209 val = frame.GetArgument (5);
1210 Assert.IsTrue (val is ObjectMirror);
1211 Assert.AreEqual ("Object", (val as ObjectMirror).Type.Name);
1213 // this on static methods
1214 val = frame.GetThis ();
1215 AssertValue (null, val);
1217 e = run_until ("arg3");
1219 frame = e.Thread.GetFrames () [0];
1222 val = frame.GetThis ();
1223 Assert.IsTrue (val is ObjectMirror);
1224 Assert.AreEqual ("Tests", (val as ObjectMirror).Type.Name);
1226 // objref in register
1227 val = frame.GetArgument (0);
1228 AssertValue ("BLA", val);
1232 public void Arrays () {
1235 var e = run_until ("o2");
1237 StackFrame frame = e.Thread.GetFrames () [0];
1240 val = frame.GetArgument (0);
1241 Assert.IsTrue (val is ArrayMirror);
1242 ArrayMirror arr = val as ArrayMirror;
1243 Assert.AreEqual (2, arr.Length);
1244 AssertValue ("BAR", arr [0]);
1245 AssertValue ("BAZ", arr [1]);
1247 var vals = arr.GetValues (0, 2);
1248 Assert.AreEqual (2, vals.Count);
1249 AssertValue ("BAR", vals [0]);
1250 AssertValue ("BAZ", vals [1]);
1252 arr [0] = vm.RootDomain.CreateString ("ABC");
1253 AssertValue ("ABC", arr [0]);
1255 arr [0] = vm.CreateValue (null);
1256 AssertValue (null, arr [0]);
1258 arr.SetValues (0, new Value [] { vm.RootDomain.CreateString ("D1"), vm.RootDomain.CreateString ("D2") });
1259 AssertValue ("D1", arr [0]);
1260 AssertValue ("D2", arr [1]);
1263 val = frame.GetArgument (1);
1264 Assert.IsTrue (val is ArrayMirror);
1265 arr = val as ArrayMirror;
1266 Assert.AreEqual (2, arr.Length);
1267 AssertValue (42, arr [0]);
1268 AssertValue (43, arr [1]);
1270 // Argument checking
1271 AssertThrows<IndexOutOfRangeException> (delegate () {
1275 AssertThrows<IndexOutOfRangeException> (delegate () {
1276 val = arr [Int32.MinValue];
1279 AssertThrows<IndexOutOfRangeException> (delegate () {
1280 vals = arr.GetValues (0, 3);
1283 AssertThrows<IndexOutOfRangeException> (delegate () {
1284 arr [2] = vm.CreateValue (null);
1287 AssertThrows<IndexOutOfRangeException> (delegate () {
1288 arr [Int32.MinValue] = vm.CreateValue (null);
1291 AssertThrows<IndexOutOfRangeException> (delegate () {
1292 arr.SetValues (0, new Value [] { null, null, null });
1296 val = frame.GetArgument (2);
1297 Assert.IsTrue (val is ArrayMirror);
1298 arr = val as ArrayMirror;
1299 Assert.AreEqual (2, arr.Rank);
1300 Assert.AreEqual (4, arr.Length);
1301 Assert.AreEqual (2, arr.GetLength (0));
1302 Assert.AreEqual (2, arr.GetLength (1));
1303 Assert.AreEqual (0, arr.GetLowerBound (0));
1304 Assert.AreEqual (0, arr.GetLowerBound (1));
1305 vals = arr.GetValues (0, 4);
1306 AssertValue (1, vals [0]);
1307 AssertValue (2, vals [1]);
1308 AssertValue (3, vals [2]);
1309 AssertValue (4, vals [3]);
1311 val = frame.GetArgument (3);
1312 Assert.IsTrue (val is ArrayMirror);
1313 arr = val as ArrayMirror;
1314 Assert.AreEqual (2, arr.Rank);
1315 Assert.AreEqual (4, arr.Length);
1316 Assert.AreEqual (2, arr.GetLength (0));
1317 Assert.AreEqual (2, arr.GetLength (1));
1318 Assert.AreEqual (1, arr.GetLowerBound (0));
1319 Assert.AreEqual (3, arr.GetLowerBound (1));
1321 AssertThrows<ArgumentOutOfRangeException> (delegate () {
1324 AssertThrows<ArgumentOutOfRangeException> (delegate () {
1328 AssertThrows<ArgumentOutOfRangeException> (delegate () {
1329 arr.GetLowerBound (-1);
1331 AssertThrows<ArgumentOutOfRangeException> (delegate () {
1332 arr.GetLowerBound (2);
1335 // arrays treated as generic collections
1336 val = frame.GetArgument (4);
1337 Assert.IsTrue (val is ArrayMirror);
1338 arr = val as ArrayMirror;
1342 public void Object_GetValue () {
1343 var e = run_until ("o1");
1344 var frame = e.Thread.GetFrames () [0];
1346 object val = frame.GetThis ();
1347 Assert.IsTrue (val is ObjectMirror);
1348 Assert.AreEqual ("Tests", (val as ObjectMirror).Type.Name);
1349 ObjectMirror o = (val as ObjectMirror);
1351 TypeMirror t = o.Type;
1354 object f = o.GetValue (t.GetField ("field_i"));
1355 AssertValue (42, f);
1356 f = o.GetValue (t.GetField ("field_s"));
1357 AssertValue ("S", f);
1358 f = o.GetValue (t.GetField ("field_enum"));
1359 Assert.IsTrue (f is EnumMirror);
1360 Assert.AreEqual (1, (f as EnumMirror).Value);
1361 Assert.AreEqual ("B", (f as EnumMirror).StringValue);
1363 // Inherited object fields
1364 TypeMirror parent = t.BaseType;
1365 f = o.GetValue (parent.GetField ("base_field_i"));
1366 AssertValue (43, f);
1367 f = o.GetValue (parent.GetField ("base_field_s"));
1368 AssertValue ("T", f);
1371 f = o.GetValue (o.Type.GetField ("static_i"));
1372 AssertValue (55, f);
1374 // generic instances
1375 ObjectMirror o2 = frame.GetValue (frame.Method.GetParameters ()[1]) as ObjectMirror;
1376 Assert.AreEqual ("GClass`1", o2.Type.Name);
1377 TypeMirror t2 = o2.Type;
1378 f = o2.GetValue (t2.GetField ("field"));
1379 AssertValue (42, f);
1381 ObjectMirror o3 = frame.GetValue (frame.Method.GetParameters ()[2]) as ObjectMirror;
1382 Assert.AreEqual ("GClass`1", o3.Type.Name);
1383 TypeMirror t3 = o3.Type;
1384 f = o3.GetValue (t3.GetField ("field"));
1385 AssertValue ("FOO", f);
1387 // Argument checking
1388 AssertThrows<ArgumentNullException> (delegate () {
1394 public void Object_GetValues () {
1395 var e = run_until ("o1");
1396 var frame = e.Thread.GetFrames () [0];
1398 object val = frame.GetThis ();
1399 Assert.IsTrue (val is ObjectMirror);
1400 Assert.AreEqual ("Tests", (val as ObjectMirror).Type.Name);
1401 ObjectMirror o = (val as ObjectMirror);
1403 ObjectMirror val2 = frame.GetValue (frame.Method.GetParameters ()[0]) as ObjectMirror;
1405 TypeMirror t = o.Type;
1407 object[] vals = o.GetValues (new FieldInfoMirror [] { t.GetField ("field_i"), t.GetField ("field_s") });
1408 object f = vals [0];
1409 AssertValue (42, f);
1411 AssertValue ("S", f);
1413 // Argument checking
1414 AssertThrows<ArgumentNullException> (delegate () {
1418 AssertThrows<ArgumentNullException> (delegate () {
1419 o.GetValues (new FieldInfoMirror [] { null });
1422 // field of another class
1423 AssertThrows<ArgumentException> (delegate () {
1424 o.GetValue (val2.Type.GetField ("field_j"));
1428 void TestSetValue (ObjectMirror o, string field_name, object val) {
1430 o.SetValue (o.Type.GetField (field_name), vm.RootDomain.CreateString ((string)val));
1432 o.SetValue (o.Type.GetField (field_name), vm.CreateValue (val));
1433 Value f = o.GetValue (o.Type.GetField (field_name));
1434 AssertValue (val, f);
1438 public void Object_SetValues () {
1439 var e = run_until ("o1");
1440 var frame = e.Thread.GetFrames () [0];
1442 object val = frame.GetThis ();
1443 Assert.IsTrue (val is ObjectMirror);
1444 Assert.AreEqual ("Tests", (val as ObjectMirror).Type.Name);
1445 ObjectMirror o = (val as ObjectMirror);
1447 ObjectMirror val2 = frame.GetValue (frame.Method.GetParameters ()[0]) as ObjectMirror;
1449 TestSetValue (o, "field_i", 22);
1450 TestSetValue (o, "field_bool1", false);
1451 TestSetValue (o, "field_bool2", true);
1452 TestSetValue (o, "field_char", 'B');
1453 TestSetValue (o, "field_byte", (byte)129);
1454 TestSetValue (o, "field_sbyte", (sbyte)-33);
1455 TestSetValue (o, "field_short", (short)(Int16.MaxValue - 5));
1456 TestSetValue (o, "field_ushort", (ushort)(UInt16.MaxValue - 5));
1457 TestSetValue (o, "field_long", Int64.MaxValue - 5);
1458 TestSetValue (o, "field_ulong", (ulong)(UInt64.MaxValue - 5));
1459 TestSetValue (o, "field_float", 6.28f);
1460 TestSetValue (o, "field_double", 6.28);
1461 TestSetValue (o, "static_i", 23);
1462 TestSetValue (o, "field_s", "CDEF");
1467 f = o.GetValue (o.Type.GetField ("field_intptr"));
1468 Assert.IsInstanceOfType (typeof (StructMirror), f);
1469 AssertValue (Int32.MaxValue - 5, (f as StructMirror).Fields [0]);
1472 FieldInfoMirror field = o.Type.GetField ("field_enum");
1473 f = o.GetValue (field);
1474 (f as EnumMirror).Value = 5;
1475 o.SetValue (field, f);
1476 f = o.GetValue (field);
1477 Assert.AreEqual (5, (f as EnumMirror).Value);
1480 o.SetValue (o.Type.GetField ("field_s"), vm.CreateValue (null));
1481 f = o.GetValue (o.Type.GetField ("field_s"));
1482 AssertValue (null, f);
1485 field = o.Type.GetField ("generic_field_struct");
1486 f = o.GetValue (field);
1487 o.SetValue (field, f);
1490 field = o.Type.GetField ("field_nullable");
1491 f = o.GetValue (field);
1492 AssertValue (0, (f as StructMirror).Fields [0]);
1493 AssertValue (false, (f as StructMirror).Fields [1]);
1494 o.SetValue (field, vm.CreateValue (6));
1495 f = o.GetValue (field);
1496 AssertValue (6, (f as StructMirror).Fields [0]);
1497 AssertValue (true, (f as StructMirror).Fields [1]);
1498 o.SetValue (field, vm.CreateValue (null));
1499 f = o.GetValue (field);
1500 AssertValue (0, (f as StructMirror).Fields [0]);
1501 AssertValue (false, (f as StructMirror).Fields [1]);
1503 // Argument checking
1504 AssertThrows<ArgumentNullException> (delegate () {
1505 o.SetValues (null, new Value [0]);
1508 AssertThrows<ArgumentNullException> (delegate () {
1509 o.SetValues (new FieldInfoMirror [0], null);
1512 AssertThrows<ArgumentNullException> (delegate () {
1513 o.SetValues (new FieldInfoMirror [] { null }, new Value [1] { null });
1516 // vtype with a wrong type
1517 AssertThrows<ArgumentException> (delegate () {
1518 o.SetValue (o.Type.GetField ("field_struct"), o.GetValue (o.Type.GetField ("field_enum")));
1521 // reference type not assignment compatible
1522 AssertThrows<ArgumentException> (delegate () {
1523 o.SetValue (o.Type.GetField ("field_class"), o);
1526 // field of another class
1527 AssertThrows<ArgumentException> (delegate () {
1528 o.SetValue (val2.Type.GetField ("field_j"), vm.CreateValue (1));
1533 public void Type_SetValue () {
1534 var e = run_until ("o1");
1535 var frame = e.Thread.GetFrames () [0];
1538 object val = frame.GetThis ();
1539 Assert.IsTrue (val is ObjectMirror);
1540 Assert.AreEqual ("Tests", (val as ObjectMirror).Type.Name);
1541 ObjectMirror o = (val as ObjectMirror);
1543 ObjectMirror val2 = frame.GetValue (frame.Method.GetParameters ()[0]) as ObjectMirror;
1545 o.Type.SetValue (o.Type.GetField ("static_i"), vm.CreateValue (55));
1546 f = o.Type.GetValue (o.Type.GetField ("static_i"));
1547 AssertValue (55, f);
1549 o.Type.SetValue (o.Type.GetField ("static_s"), vm.RootDomain.CreateString ("B"));
1550 f = o.Type.GetValue (o.Type.GetField ("static_s"));
1551 AssertValue ("B", f);
1553 // Argument checking
1554 AssertThrows<ArgumentNullException> (delegate () {
1555 o.Type.SetValue (null, vm.CreateValue (0));
1558 AssertThrows<ArgumentNullException> (delegate () {
1559 o.Type.SetValue (o.Type.GetField ("static_i"), null);
1562 // field of another class
1563 AssertThrows<ArgumentException> (delegate () {
1564 o.SetValue (val2.Type.GetField ("field_j"), vm.CreateValue (1));
1569 public void TypeInfo () {
1570 Event e = run_until ("ti2");
1571 StackFrame frame = e.Thread.GetFrames () [0];
1576 t = frame.Method.GetParameters ()[0].ParameterType;
1578 Assert.AreEqual ("String[]", t.Name);
1579 Assert.AreEqual ("string[]", t.CSharpName);
1580 Assert.AreEqual ("Array", t.BaseType.Name);
1581 Assert.AreEqual (true, t.HasElementType);
1582 Assert.AreEqual (true, t.IsArray);
1583 Assert.AreEqual (1, t.GetArrayRank ());
1584 Assert.AreEqual ("String", t.GetElementType ().Name);
1586 t = frame.Method.GetParameters ()[2].ParameterType;
1588 Assert.AreEqual ("Int32[,]", t.Name);
1590 //Assert.AreEqual ("int[,]", t.CSharpName);
1591 Assert.AreEqual ("Array", t.BaseType.Name);
1592 Assert.AreEqual (true, t.HasElementType);
1593 Assert.AreEqual (true, t.IsArray);
1594 Assert.AreEqual (2, t.GetArrayRank ());
1595 Assert.AreEqual ("Int32", t.GetElementType ().Name);
1598 t = frame.Method.GetParameters ()[3].ParameterType;
1600 //Assert.AreEqual ("Int32&", t.Name);
1601 //Assert.AreEqual (true, t.IsByRef);
1602 //Assert.AreEqual (true, t.HasElementType);
1605 t = frame.Method.GetParameters ()[4].ParameterType;
1607 //Assert.AreEqual ("Int32*", t.Name);
1608 Assert.AreEqual (true, t.IsPointer);
1609 Assert.AreEqual (true, t.HasElementType);
1610 Assert.AreEqual ("Int32", t.GetElementType ().Name);
1611 Assert.AreEqual (false, t.IsPrimitive);
1614 t = frame.Method.GetParameters ()[5].ParameterType;
1615 Assert.AreEqual (true, t.IsPrimitive);
1618 t = frame.Method.GetParameters ()[6].ParameterType;
1619 Assert.AreEqual ("AStruct", t.Name);
1620 Assert.AreEqual (false, t.IsPrimitive);
1621 Assert.AreEqual (true, t.IsValueType);
1622 Assert.AreEqual (false, t.IsClass);
1625 t = frame.Method.GetParameters ()[7].ParameterType;
1626 Assert.AreEqual ("Tests", t.Name);
1627 var nested = (from nt in t.GetNestedTypes () where nt.IsNestedPublic select nt).ToArray ();
1628 Assert.AreEqual (1, nested.Length);
1629 Assert.AreEqual ("NestedClass", nested [0].Name);
1630 Assert.IsTrue (t.BaseType.IsAssignableFrom (t));
1631 Assert.IsTrue (!t.IsAssignableFrom (t.BaseType));
1633 // generic instances
1634 t = frame.Method.GetParameters ()[9].ParameterType;
1635 Assert.AreEqual ("GClass`1", t.Name);
1636 Assert.IsTrue (t.IsGenericType);
1637 Assert.IsFalse (t.IsGenericTypeDefinition);
1639 var args = t.GetGenericArguments ();
1640 Assert.AreEqual (1, args.Length);
1641 Assert.AreEqual ("Int32", args [0].Name);
1643 // generic type definitions
1644 var gtd = t.GetGenericTypeDefinition ();
1645 Assert.AreEqual ("GClass`1", gtd.Name);
1646 Assert.IsTrue (gtd.IsGenericType);
1647 Assert.IsTrue (gtd.IsGenericTypeDefinition);
1648 Assert.AreEqual (gtd, gtd.GetGenericTypeDefinition ());
1650 args = gtd.GetGenericArguments ();
1651 Assert.AreEqual (1, args.Length);
1652 Assert.AreEqual ("T", args [0].Name);
1655 t = frame.Method.GetParameters ()[10].ParameterType;
1656 Assert.AreEqual ("AnEnum", t.Name);
1657 Assert.IsTrue (t.IsEnum);
1658 Assert.AreEqual ("Int32", t.EnumUnderlyingType.Name);
1661 t = frame.Method.GetParameters ()[11].ParameterType;
1662 Assert.AreEqual ("TypedReference", t.Name);
1665 t = frame.Method.GetParameters ()[7].ParameterType;
1667 var props = t.GetProperties ();
1668 Assert.AreEqual (3, props.Length);
1669 foreach (PropertyInfoMirror prop in props) {
1670 ParameterInfoMirror[] indexes = prop.GetIndexParameters ();
1672 if (prop.Name == "IntProperty") {
1673 Assert.AreEqual ("Int32", prop.PropertyType.Name);
1674 Assert.AreEqual ("get_IntProperty", prop.GetGetMethod ().Name);
1675 Assert.AreEqual ("set_IntProperty", prop.GetSetMethod ().Name);
1676 Assert.AreEqual (0, indexes.Length);
1677 } else if (prop.Name == "ReadOnlyProperty") {
1678 Assert.AreEqual ("Int32", prop.PropertyType.Name);
1679 Assert.AreEqual ("get_ReadOnlyProperty", prop.GetGetMethod ().Name);
1680 Assert.AreEqual (null, prop.GetSetMethod ());
1681 Assert.AreEqual (0, indexes.Length);
1682 } else if (prop.Name == "IndexedProperty") {
1683 Assert.AreEqual (1, indexes.Length);
1684 Assert.AreEqual ("Int32", indexes [0].ParameterType.Name);
1688 // custom attributes
1689 t = frame.Method.GetParameters ()[8].ParameterType;
1690 Assert.AreEqual ("Tests2", t.Name);
1691 var attrs = t.GetCustomAttributes (true);
1692 Assert.AreEqual (5, attrs.Length);
1693 foreach (var attr in attrs) {
1694 if (attr.Constructor.DeclaringType.Name == "DebuggerDisplayAttribute") {
1695 Assert.AreEqual (1, attr.ConstructorArguments.Count);
1696 Assert.AreEqual ("Tests", attr.ConstructorArguments [0].Value);
1697 Assert.AreEqual (2, attr.NamedArguments.Count);
1698 Assert.AreEqual ("Name", attr.NamedArguments [0].Property.Name);
1699 Assert.AreEqual ("FOO", attr.NamedArguments [0].TypedValue.Value);
1700 Assert.AreEqual ("Target", attr.NamedArguments [1].Property.Name);
1701 Assert.IsInstanceOfType (typeof (TypeMirror), attr.NamedArguments [1].TypedValue.Value);
1702 Assert.AreEqual ("Int32", (attr.NamedArguments [1].TypedValue.Value as TypeMirror).Name);
1703 } else if (attr.Constructor.DeclaringType.Name == "DebuggerTypeProxyAttribute") {
1704 Assert.AreEqual (1, attr.ConstructorArguments.Count);
1705 Assert.IsInstanceOfType (typeof (TypeMirror), attr.ConstructorArguments [0].Value);
1706 Assert.AreEqual ("Tests", (attr.ConstructorArguments [0].Value as TypeMirror).Name);
1707 } else if (attr.Constructor.DeclaringType.Name == "BAttribute") {
1708 Assert.AreEqual (2, attr.NamedArguments.Count);
1709 Assert.AreEqual ("afield", attr.NamedArguments [0].Field.Name);
1710 Assert.AreEqual ("bfield", attr.NamedArguments [1].Field.Name);
1711 } else if (attr.Constructor.DeclaringType.Name == "ClassInterfaceAttribute") {
1712 // inherited from System.Object
1713 //} else if (attr.Constructor.DeclaringType.Name == "Serializable") {
1714 // inherited from System.Object
1715 } else if (attr.Constructor.DeclaringType.Name == "ComVisibleAttribute") {
1716 // inherited from System.Object
1718 Assert.Fail (attr.Constructor.DeclaringType.Name);
1722 var assembly = entry_point.DeclaringType.Assembly;
1723 var type = assembly.GetType ("Tests4");
1724 Assert.IsFalse (type.IsInitialized);
1728 public void FieldInfo () {
1729 Event e = run_until ("ti2");
1730 StackFrame frame = e.Thread.GetFrames () [0];
1734 t = frame.Method.GetParameters ()[8].ParameterType;
1735 Assert.AreEqual ("Tests2", t.Name);
1737 var fi = t.GetField ("field_j");
1738 var attrs = fi.GetCustomAttributes (true);
1739 Assert.AreEqual (1, attrs.Length);
1740 var attr = attrs [0];
1741 Assert.AreEqual ("DebuggerBrowsableAttribute", attr.Constructor.DeclaringType.Name);
1742 Assert.AreEqual (1, attr.ConstructorArguments.Count);
1743 Assert.IsInstanceOfType (typeof (EnumMirror), attr.ConstructorArguments [0].Value);
1744 Assert.AreEqual ((int)System.Diagnostics.DebuggerBrowsableState.Collapsed, (attr.ConstructorArguments [0].Value as EnumMirror).Value);
1748 public void PropertyInfo () {
1749 Event e = run_until ("ti2");
1750 StackFrame frame = e.Thread.GetFrames () [0];
1754 t = frame.Method.GetParameters ()[8].ParameterType;
1755 Assert.AreEqual ("Tests2", t.Name);
1757 var pi = t.GetProperty ("AProperty");
1758 var attrs = pi.GetCustomAttributes (true);
1759 Assert.AreEqual (1, attrs.Length);
1760 var attr = attrs [0];
1761 Assert.AreEqual ("DebuggerBrowsableAttribute", attr.Constructor.DeclaringType.Name);
1762 Assert.AreEqual (1, attr.ConstructorArguments.Count);
1763 Assert.IsInstanceOfType (typeof (EnumMirror), attr.ConstructorArguments [0].Value);
1764 Assert.AreEqual ((int)System.Diagnostics.DebuggerBrowsableState.Collapsed, (attr.ConstructorArguments [0].Value as EnumMirror).Value);
1768 [Category ("only5")]
1769 public void Type_GetValue () {
1770 Event e = run_until ("o1");
1771 StackFrame frame = e.Thread.GetFrames () [0];
1773 ObjectMirror o = (frame.GetThis () as ObjectMirror);
1775 TypeMirror t = o.Type;
1777 ObjectMirror val2 = frame.GetValue (frame.Method.GetParameters ()[0]) as ObjectMirror;
1780 object f = t.GetValue (o.Type.GetField ("static_i"));
1781 AssertValue (55, f);
1783 f = t.GetValue (o.Type.GetField ("static_s"));
1784 AssertValue ("A", f);
1786 // literal static fields
1787 f = t.GetValue (o.Type.GetField ("literal_i"));
1788 AssertValue (56, f);
1790 f = t.GetValue (o.Type.GetField ("literal_s"));
1791 AssertValue ("B", f);
1793 // Inherited static fields
1794 TypeMirror parent = t.BaseType;
1795 f = t.GetValue (parent.GetField ("base_static_i"));
1796 AssertValue (57, f);
1798 f = t.GetValue (parent.GetField ("base_static_s"));
1799 AssertValue ("C", f);
1801 // thread static field
1802 f = t.GetValue (t.GetField ("tls_i"), e.Thread);
1803 AssertValue (42, f);
1805 // Argument checking
1806 AssertThrows<ArgumentNullException> (delegate () {
1811 AssertThrows<ArgumentException> (delegate () {
1812 t.GetValue (o.Type.GetField ("field_i"));
1815 // field on another type
1816 AssertThrows<ArgumentException> (delegate () {
1817 t.GetValue (val2.Type.GetField ("static_field_j"));
1820 // special static field
1821 AssertThrows<ArgumentException> (delegate () {
1822 t.GetValue (t.GetField ("tls_i"));
1827 public void Type_GetValues () {
1828 Event e = run_until ("o1");
1829 StackFrame frame = e.Thread.GetFrames () [0];
1831 ObjectMirror o = (frame.GetThis () as ObjectMirror);
1833 TypeMirror t = o.Type;
1836 object[] vals = t.GetValues (new FieldInfoMirror [] { t.GetField ("static_i"), t.GetField ("static_s") });
1837 object f = vals [0];
1838 AssertValue (55, f);
1841 AssertValue ("A", f);
1843 // Argument checking
1844 AssertThrows<ArgumentNullException> (delegate () {
1848 AssertThrows<ArgumentNullException> (delegate () {
1849 t.GetValues (new FieldInfoMirror [] { null });
1854 public void ObjRefs () {
1855 Event e = run_until ("objrefs1");
1856 StackFrame frame = e.Thread.GetFrames () [0];
1858 ObjectMirror o = frame.GetThis () as ObjectMirror;
1859 ObjectMirror child = o.GetValue (o.Type.GetField ("child")) as ObjectMirror;
1861 Assert.IsTrue (child.Address != 0);
1863 // Check that object references are internalized correctly
1864 Assert.AreEqual (o, frame.GetThis ());
1866 run_until ("objrefs2");
1868 // child should be gc'd now
1869 // This is not deterministic
1870 //Assert.IsTrue (child.IsCollected);
1873 * No longer works since Type is read eagerly
1876 AssertThrows<ObjectCollectedException> (delegate () {
1877 TypeMirror t = child.Type;
1881 AssertThrows<ObjectCollectedException> (delegate () {
1882 long addr = child.Address;
1888 public void Type_GetObject () {
1889 Event e = run_until ("o1");
1890 StackFrame frame = e.Thread.GetFrames () [0];
1892 ObjectMirror o = (frame.GetThis () as ObjectMirror);
1894 TypeMirror t = o.Type;
1896 Assert.AreEqual ("RuntimeType", t.GetTypeObject ().Type.Name);
1900 public void VTypes () {
1901 Event e = run_until ("vtypes1");
1902 StackFrame frame = e.Thread.GetFrames () [0];
1905 ObjectMirror o = frame.GetThis () as ObjectMirror;
1906 var obj = o.GetValue (o.Type.GetField ("field_struct"));
1907 Assert.IsTrue (obj is StructMirror);
1908 var s = obj as StructMirror;
1909 Assert.AreEqual ("AStruct", s.Type.Name);
1910 AssertValue (42, s ["i"]);
1912 AssertValue ("S", obj);
1913 AssertValue (43, s ["k"]);
1914 obj = o.GetValue (o.Type.GetField ("field_boxed_struct"));
1915 Assert.IsTrue (obj is StructMirror);
1916 s = obj as StructMirror;
1917 Assert.AreEqual ("AStruct", s.Type.Name);
1918 AssertValue (42, s ["i"]);
1920 // Check decoding of nested structs (#14942)
1921 obj = o.GetValue (o.Type.GetField ("nested_struct"));
1922 o.SetValue (o.Type.GetField ("nested_struct"), obj);
1924 // Check round tripping of boxed struct fields (#12354)
1925 obj = o.GetValue (o.Type.GetField ("boxed_struct_field"));
1926 o.SetValue (o.Type.GetField ("boxed_struct_field"), obj);
1927 obj = o.GetValue (o.Type.GetField ("boxed_struct_field"));
1928 s = obj as StructMirror;
1929 AssertValue (1, s ["key"]);
1931 Assert.IsTrue (obj is StructMirror);
1932 s = obj as StructMirror;
1933 AssertValue (42, s ["m_value"]);
1935 // vtypes as arguments
1936 s = frame.GetArgument (0) as StructMirror;
1937 AssertValue (44, s ["i"]);
1939 AssertValue ("T", obj);
1940 AssertValue (45, s ["k"]);
1942 // vtypes as array entries
1943 var arr = frame.GetArgument (1) as ArrayMirror;
1945 Assert.IsTrue (obj is StructMirror);
1946 s = obj as StructMirror;
1947 AssertValue (1, s ["i"]);
1948 AssertValue ("S1", s ["s"]);
1950 Assert.IsTrue (obj is StructMirror);
1951 s = obj as StructMirror;
1952 AssertValue (2, s ["i"]);
1953 AssertValue ("S2", s ["s"]);
1956 var typedref = frame.GetArgument (2) as StructMirror;
1957 Assert.IsTrue (typedref is StructMirror);
1959 // Argument checking
1960 s = frame.GetArgument (0) as StructMirror;
1961 AssertThrows<ArgumentException> (delegate () {
1965 // generic vtype instances
1966 o = frame.GetThis () as ObjectMirror;
1967 obj = o.GetValue (o.Type.GetField ("generic_field_struct"));
1968 Assert.IsTrue (obj is StructMirror);
1969 s = obj as StructMirror;
1970 Assert.AreEqual ("GStruct`1", s.Type.Name);
1971 AssertValue (42, s ["i"]);
1973 // this on vtype methods
1974 e = run_until ("vtypes2");
1975 e = step_until (e.Thread, "foo");
1977 frame = e.Thread.GetFrames () [0];
1979 Assert.AreEqual ("foo", (e as StepEvent).Method.Name);
1980 obj = frame.GetThis ();
1982 Assert.IsTrue (obj is StructMirror);
1983 s = obj as StructMirror;
1984 AssertValue (44, s ["i"]);
1985 AssertValue ("T", s ["s"]);
1986 AssertValue (45, s ["k"]);
1989 s ["i"] = vm.CreateValue (55);
1991 obj = frame.GetThis ();
1992 Assert.IsTrue (obj is StructMirror);
1993 s = obj as StructMirror;
1994 AssertValue (55, s ["i"]);
1995 AssertValue ("T", s ["s"]);
1996 AssertValue (45, s ["k"]);
1998 // this on static vtype methods
1999 e = run_until ("vtypes3");
2000 e = step_until (e.Thread, "static_foo");
2002 frame = e.Thread.GetFrames () [0];
2004 Assert.AreEqual ("static_foo", (e as StepEvent).Method.Name);
2005 obj = frame.GetThis ();
2006 AssertValue (null, obj);
2008 // vtypes which reference themselves recursively
2009 e = run_until ("vtypes4_2");
2010 frame = e.Thread.GetFrames () [0];
2012 Assert.IsTrue (frame.GetArgument (0) is StructMirror);
2016 public void AssemblyInfo () {
2017 Event e = run_until ("single_stepping");
2019 StackFrame frame = e.Thread.GetFrames () [0];
2021 var aname = frame.Method.DeclaringType.Assembly.GetName ();
2022 Assert.AreEqual ("dtest-app, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null", aname.ToString ());
2024 ModuleMirror m = frame.Method.DeclaringType.Module;
2026 Assert.AreEqual ("dtest-app.exe", m.Name);
2027 Assert.AreEqual ("dtest-app.exe", m.ScopeName);
2028 Assert.IsTrue (m.FullyQualifiedName.IndexOf ("dtest-app.exe") != -1);
2029 Guid guid = m.ModuleVersionId;
2030 Assert.AreEqual (frame.Method.DeclaringType.Assembly, m.Assembly);
2031 Assert.AreEqual (frame.Method.DeclaringType.Assembly.ManifestModule, m);
2033 // This is no longer true on 4.0
2034 //Assert.AreEqual ("Assembly", frame.Method.DeclaringType.Assembly.GetAssemblyObject ().Type.Name);
2036 TypeMirror t = vm.RootDomain.Corlib.GetType ("System.Diagnostics.DebuggerDisplayAttribute");
2037 Assert.AreEqual ("DebuggerDisplayAttribute", t.Name);
2041 public void LocalsInfo () {
2042 Event e = run_until ("locals2");
2044 StackFrame frame = e.Thread.GetFrames () [0];
2046 var locals = frame.Method.GetLocals ();
2047 Assert.AreEqual (9, locals.Length);
2048 for (int i = 0; i < 9; ++i) {
2049 if (locals [i].Name == "args") {
2050 Assert.IsTrue (locals [i].IsArg);
2051 Assert.AreEqual ("String[]", locals [i].Type.Name);
2052 } else if (locals [i].Name == "arg") {
2053 Assert.IsTrue (locals [i].IsArg);
2054 Assert.AreEqual ("Int32", locals [i].Type.Name);
2055 } else if (locals [i].Name == "i") {
2056 Assert.IsFalse (locals [i].IsArg);
2057 Assert.AreEqual ("Int64", locals [i].Type.Name);
2058 } else if (locals [i].Name == "j") {
2059 Assert.IsFalse (locals [i].IsArg);
2060 Assert.AreEqual ("Int32", locals [i].Type.Name);
2061 } else if (locals [i].Name == "s") {
2062 Assert.IsFalse (locals [i].IsArg);
2063 Assert.AreEqual ("String", locals [i].Type.Name);
2064 } else if (locals [i].Name == "t") {
2066 Assert.IsTrue (locals [i].IsArg);
2067 Assert.AreEqual ("String", locals [i].Type.Name);
2068 } else if (locals [i].Name == "rs") {
2069 Assert.IsTrue (locals [i].IsArg);
2070 Assert.AreEqual ("String", locals [i].Type.Name);
2071 } else if (locals [i].Name == "astruct") {
2072 } else if (locals [i].Name == "alist") {
2078 var scopes = frame.Method.GetScopes ();
2079 Assert.AreEqual (2, scopes.Length);
2082 Event step_once () {
2084 var e = GetNextEvent ();
2085 Assert.IsTrue (e is StepEvent);
2089 Event step_into () {
2090 step_req.Disable ();
2091 step_req.Depth = StepDepth.Into;
2093 return step_once ();
2096 Event step_over () {
2097 step_req.Disable ();
2098 step_req.Depth = StepDepth.Over;
2100 return step_once ();
2104 step_req.Disable ();
2105 step_req.Depth = StepDepth.Out;
2107 return step_once ();
2110 Event step_once_or_breakpoint () {
2112 var e = GetNextEvent ();
2113 Assert.IsTrue (e is StepEvent || e is BreakpointEvent);
2117 Event step_over_or_breakpoint () {
2118 step_req.Disable ();
2119 step_req.Depth = StepDepth.Over;
2121 return step_once_or_breakpoint ();
2124 Event step_out_or_breakpoint () {
2125 step_req.Disable ();
2126 step_req.Depth = StepDepth.Out;
2128 return step_once_or_breakpoint ();
2132 public void Locals () {
2133 var be = run_until ("locals1");
2135 StackFrame frame = be.Thread.GetFrames () [0];
2136 MethodMirror m1 = frame.Method;
2138 // Compiler generated byref local
2139 foreach (var l in m1.GetLocals ()) {
2140 // The byval flag is hidden from the type
2141 if (l.Name != "ri" && l.Type.Name == "Double")
2142 AssertValue (null, frame.GetValue (l));
2145 be = run_until ("locals2");
2147 frame = be.Thread.GetFrames () [0];
2149 object val = frame.GetValue (frame.Method.GetLocal ("i"));
2150 AssertValue (0, val);
2152 var req = create_step (be);
2159 var e = step_once ();
2160 Assert.AreEqual ("locals2", (e as StepEvent).Method.Name);
2162 // Execute s = "AB";
2164 Assert.AreEqual ("locals2", (e as StepEvent).Method.Name);
2166 frame = e.Thread.GetFrames () [0];
2168 val = frame.GetValue (frame.Method.GetLocal ("i"));
2169 AssertValue (42, val);
2171 LocalVariable[] locals = frame.Method.GetLocals ();
2172 var vals = frame.GetValues (locals);
2173 Assert.AreEqual (locals.Length, vals.Length);
2174 for (int i = 0; i < locals.Length; ++i) {
2175 if (locals [i].Name == "i")
2176 AssertValue (42, vals [i]);
2177 if (locals [i].Name == "s")
2178 AssertValue ("AB", vals [i]);
2179 if (locals [i].Name == "t")
2180 AssertValue ("ABC", vals [i]);
2181 if (locals [i].Name == "alist") {
2185 // Argument checking
2188 AssertThrows<ArgumentNullException> (delegate () {
2189 frame.GetValue ((LocalVariable)null);
2191 // GetValue () local from another method
2192 AssertThrows<ArgumentException> (delegate () {
2193 frame.GetValue (m1.GetLocal ("foo"));
2197 AssertThrows<ArgumentNullException> (delegate () {
2198 frame.GetValue ((ParameterInfoMirror)null);
2200 // GetValue () local from another method
2201 AssertThrows<ArgumentException> (delegate () {
2202 frame.GetValue (m1.GetParameters ()[0]);
2205 // GetValues () null
2206 AssertThrows<ArgumentNullException> (delegate () {
2207 frame.GetValues (null);
2209 // GetValues () embedded null
2210 AssertThrows<ArgumentNullException> (delegate () {
2211 frame.GetValues (new LocalVariable [] { null });
2213 // GetValues () local from another method
2214 AssertThrows<ArgumentException> (delegate () {
2215 frame.GetValues (new LocalVariable [] { m1.GetLocal ("foo") });
2218 AssertThrows<ArgumentException> (delegate () {
2219 val = frame.GetValue (frame.Method.ReturnParameter);
2222 // invalid stack frames
2224 e = GetNextEvent ();
2225 Assert.IsTrue (e is StepEvent);
2226 Assert.AreEqual ("locals2", (e as StepEvent).Method.Name);
2228 AssertThrows<InvalidStackFrameException> (delegate () {
2229 frame.GetValue (frame.Method.GetLocal ("i"));
2235 be = run_until ("locals7");
2237 req = create_step (be);
2243 // Test that locals are initialized
2244 frame = e.Thread.GetFrames () [0];
2245 val = frame.GetValue (frame.Method.GetLocal ("t"));
2246 AssertValue (0, val);
2250 Assert.AreEqual ("locals7", (e as StepEvent).Method.Name);
2254 Assert.AreEqual ("locals7", (e as StepEvent).Method.Name);
2256 frame = e.Thread.GetFrames () [0];
2257 val = frame.GetValue (frame.Method.GetParameters ()[0]);
2258 AssertValue (22, val);
2259 val = frame.GetValue (frame.Method.GetLocal ("t"));
2260 AssertValue (22, val);
2261 val = frame.GetValue (frame.Method.GetLocal ("t2"));
2262 AssertValue (22, val);
2266 public void GetVisibleVariables () {
2267 Event e = run_until ("locals4");
2270 var locals = e.Thread.GetFrames ()[1].GetVisibleVariables ();
2271 Assert.AreEqual (2, locals.Count);
2272 var loc = locals.First (l => l.Name == "i");
2273 Assert.AreEqual ("Int64", loc.Type.Name);
2274 loc = locals.First (l => l.Name == "s");
2275 Assert.AreEqual ("String", loc.Type.Name);
2277 loc = e.Thread.GetFrames ()[1].GetVisibleVariableByName ("i");
2278 Assert.AreEqual ("i", loc.Name);
2279 Assert.AreEqual ("Int64", loc.Type.Name);
2281 e = run_until ("locals5");
2284 locals = e.Thread.GetFrames ()[1].GetVisibleVariables ();
2285 Assert.AreEqual (2, locals.Count);
2286 loc = locals.First (l => l.Name == "i");
2287 Assert.AreEqual ("String", loc.Type.Name);
2288 loc = locals.First (l => l.Name == "s");
2289 Assert.AreEqual ("String", loc.Type.Name);
2291 loc = e.Thread.GetFrames ()[1].GetVisibleVariableByName ("i");
2292 Assert.AreEqual ("i", loc.Name);
2293 Assert.AreEqual ("String", loc.Type.Name);
2295 // Variable in another scope
2296 loc = e.Thread.GetFrames ()[1].GetVisibleVariableByName ("j");
2297 Assert.IsNull (loc);
2301 public void Exit () {
2306 var e = GetNextEvent ();
2307 Assert.IsInstanceOfType (typeof (VMDeathEvent), e);
2309 Assert.AreEqual (5, (e as VMDeathEvent).ExitCode);
2312 /* Could be a remote vm with no process */
2315 Assert.AreEqual (5, p.ExitCode);
2318 AssertThrows<VMDisconnectedException> (delegate () {
2327 public void Dispose () {
2332 var e = GetNextEvent ();
2333 Assert.IsInstanceOfType (typeof (VMDisconnectEvent), e);
2336 /* Could be a remote vm with no process */
2339 Assert.AreEqual (3, p.ExitCode);
2342 AssertThrows<VMDisconnectedException> (delegate () {
2351 public void ColumnNumbers () {
2352 Event e = run_until ("line_numbers");
2354 // FIXME: Merge this with LineNumbers () when its fixed
2356 step_req = create_step (e);
2357 step_req.Depth = StepDepth.Into;
2365 e = GetNextEvent ();
2366 Assert.IsTrue (e is StepEvent);
2367 if (e.Thread.GetFrames ()[0].Method.Name == "ln1")
2371 // Do an additional step over so we are not on the beginning line of the method
2372 step_req.Disable ();
2373 step_req.Depth = StepDepth.Over;
2376 e = GetNextEvent ();
2377 Assert.IsTrue (e is StepEvent);
2379 l = e.Thread.GetFrames ()[0].Location;
2381 Assert.AreEqual (3, l.ColumnNumber);
2383 step_req.Disable ();
2387 // Broken by mcs+runtime changes (#5438)
2388 [Category("NotWorking")]
2389 public void LineNumbers () {
2390 Event e = run_until ("line_numbers");
2392 step_req = create_step (e);
2393 step_req.Depth = StepDepth.Into;
2400 e = GetNextEvent ();
2401 Assert.IsTrue (e is StepEvent);
2403 l = e.Thread.GetFrames ()[0].Location;
2405 Assert.IsTrue (l.SourceFile.IndexOf ("dtest-app.cs") != -1);
2406 Assert.AreEqual ("ln1", l.Method.Name);
2409 using (FileStream fs = new FileStream (l.SourceFile, FileMode.Open, FileAccess.Read)) {
2410 MD5 md5 = MD5.Create ();
2411 var hash = md5.ComputeHash (fs);
2413 for (int i = 0; i < 16; ++i)
2414 Assert.AreEqual (hash [i], l.SourceFileHash [i]);
2417 int line_base = l.LineNumber;
2420 e = GetNextEvent ();
2421 Assert.IsTrue (e is StepEvent);
2422 l = e.Thread.GetFrames ()[0].Location;
2423 Assert.AreEqual ("ln2", l.Method.Name);
2424 Assert.AreEqual (line_base + 6, l.LineNumber);
2427 e = GetNextEvent ();
2428 Assert.IsTrue (e is StepEvent);
2429 l = e.Thread.GetFrames ()[0].Location;
2430 Assert.AreEqual ("ln1", l.Method.Name);
2431 Assert.AreEqual (line_base + 1, l.LineNumber);
2434 e = GetNextEvent ();
2435 Assert.IsTrue (e is StepEvent);
2436 l = e.Thread.GetFrames ()[0].Location;
2437 Assert.AreEqual ("ln3", l.Method.Name);
2438 Assert.AreEqual (line_base + 11, l.LineNumber);
2441 e = GetNextEvent ();
2442 Assert.IsTrue (e is StepEvent);
2443 l = e.Thread.GetFrames ()[0].Location;
2444 Assert.AreEqual ("ln3", l.Method.Name);
2445 Assert.IsTrue (l.SourceFile.EndsWith ("FOO"));
2446 Assert.AreEqual (55, l.LineNumber);
2449 e = GetNextEvent ();
2450 Assert.IsTrue (e is StepEvent);
2451 l = e.Thread.GetFrames ()[0].Location;
2452 Assert.AreEqual ("ln1", l.Method.Name);
2453 Assert.AreEqual (line_base + 2, l.LineNumber);
2455 // GetSourceFiles ()
2456 string[] sources = l.Method.DeclaringType.GetSourceFiles ();
2457 Assert.AreEqual (2, sources.Length);
2458 Assert.AreEqual ("dtest-app.cs", sources [0]);
2459 Assert.AreEqual ("FOO", sources [1]);
2461 sources = l.Method.DeclaringType.GetSourceFiles (true);
2462 Assert.AreEqual (2, sources.Length);
2463 Assert.IsTrue (sources [0].EndsWith ("dtest-app.cs"));
2464 Assert.IsTrue (sources [1].EndsWith ("FOO"));
2468 public void Suspend () {
2471 Start (new string [] { "dtest-app.exe", "suspend-test" });
2473 Event e = run_until ("suspend");
2475 ThreadMirror main = e.Thread;
2483 // The debuggee should be suspended while it is running the infinite loop
2485 StackFrame frame = main.GetFrames ()[0];
2486 Assert.AreEqual ("suspend", frame.Method.Name);
2490 // resuming when not suspended
2491 AssertThrows<InvalidOperationException> (delegate () {
2501 public void AssemblyLoad () {
2502 Event e = run_until ("assembly_load");
2504 var load_req = vm.CreateAssemblyLoadRequest ();
2509 e = GetNextEvent ();
2510 Assert.IsInstanceOfType (typeof (AssemblyLoadEvent), e);
2511 Assert.IsTrue ((e as AssemblyLoadEvent).Assembly.Location.EndsWith ("System.dll"));
2513 var frames = e.Thread.GetFrames ();
2514 Assert.IsTrue (frames.Length > 0);
2515 Assert.AreEqual ("assembly_load", frames [0].Method.Name);
2519 public void CreateValue () {
2522 v = vm.CreateValue (1);
2523 Assert.AreEqual (vm, v.VirtualMachine);
2524 Assert.AreEqual (1, v.Value);
2526 v = vm.CreateValue (null);
2527 Assert.AreEqual (vm, v.VirtualMachine);
2528 Assert.AreEqual (null, v.Value);
2530 // Argument checking
2531 AssertThrows <ArgumentException> (delegate () {
2532 v = vm.CreateValue ("FOO");
2537 public void CreateString () {
2538 StringMirror s = vm.RootDomain.CreateString ("ABC");
2540 Assert.AreEqual (vm, s.VirtualMachine);
2541 Assert.AreEqual ("ABC", s.Value);
2542 Assert.AreEqual (vm.RootDomain, s.Domain);
2545 StringBuilder sb = new StringBuilder ();
2546 for (int i = 0; i < 1024; ++i)
2548 s = vm.RootDomain.CreateString (sb.ToString ());
2550 // Argument checking
2551 AssertThrows <ArgumentNullException> (delegate () {
2552 s = vm.RootDomain.CreateString (null);
2557 public void CreateBoxedValue () {
2558 ObjectMirror o = vm.RootDomain.CreateBoxedValue (new PrimitiveValue (vm, 42));
2560 Assert.AreEqual ("Int32", o.Type.Name);
2561 //AssertValue (42, m.GetValue (o.Type.GetField ("m_value")));
2563 // Argument checking
2564 AssertThrows <ArgumentNullException> (delegate () {
2565 vm.RootDomain.CreateBoxedValue (null);
2568 AssertThrows <ArgumentException> (delegate () {
2569 vm.RootDomain.CreateBoxedValue (o);
2574 public void Invoke () {
2575 Event e = run_until ("invoke1");
2577 StackFrame frame = e.Thread.GetFrames () [0];
2579 TypeMirror t = frame.Method.DeclaringType;
2580 ObjectMirror this_obj = (ObjectMirror)frame.GetThis ();
2582 TypeMirror t2 = frame.Method.GetParameters ()[0].ParameterType;
2588 m = t.GetMethod ("invoke_return_void");
2589 v = this_obj.InvokeMethod (e.Thread, m, null);
2593 m = t.GetMethod ("invoke_return_ref");
2594 v = this_obj.InvokeMethod (e.Thread, m, null);
2595 AssertValue ("ABC", v);
2598 m = t.GetMethod ("invoke_return_null");
2599 v = this_obj.InvokeMethod (e.Thread, m, null);
2600 AssertValue (null, v);
2603 m = t.GetMethod ("invoke_return_primitive");
2604 v = this_obj.InvokeMethod (e.Thread, m, null);
2605 AssertValue (42, v);
2608 m = t.GetMethod ("invoke_return_nullable");
2609 v = this_obj.InvokeMethod (e.Thread, m, null);
2610 Assert.IsInstanceOfType (typeof (StructMirror), v);
2611 var s = v as StructMirror;
2612 AssertValue (42, s.Fields [0]);
2613 AssertValue (true, s.Fields [1]);
2615 // pass nullable as this
2616 //m = vm.RootDomain.Corlib.GetType ("System.Object").GetMethod ("ToString");
2617 m = s.Type.GetMethod ("ToString");
2618 v = s.InvokeMethod (e.Thread, m, null);
2620 // return nullable null
2621 m = t.GetMethod ("invoke_return_nullable_null");
2622 v = this_obj.InvokeMethod (e.Thread, m, null);
2623 Assert.IsInstanceOfType (typeof (StructMirror), v);
2624 s = v as StructMirror;
2625 AssertValue (0, s.Fields [0]);
2626 AssertValue (false, s.Fields [1]);
2628 // pass nullable as this
2629 //m = vm.RootDomain.Corlib.GetType ("System.Object").GetMethod ("ToString");
2630 m = s.Type.GetMethod ("ToString");
2631 v = s.InvokeMethod (e.Thread, m, null);
2634 m = t.GetMethod ("invoke_pass_primitive");
2635 Value[] args = new Value [] {
2636 vm.CreateValue ((byte)Byte.MaxValue),
2637 vm.CreateValue ((sbyte)SByte.MaxValue),
2638 vm.CreateValue ((short)1),
2639 vm.CreateValue ((ushort)1),
2640 vm.CreateValue ((int)1),
2641 vm.CreateValue ((uint)1),
2642 vm.CreateValue ((long)1),
2643 vm.CreateValue ((ulong)1),
2644 vm.CreateValue ('A'),
2645 vm.CreateValue (true),
2646 vm.CreateValue (3.14f),
2647 vm.CreateValue (3.14) };
2649 v = this_obj.InvokeMethod (e.Thread, m, args);
2650 AssertValue ((int)Byte.MaxValue + (int)SByte.MaxValue + 1 + 1 + 1 + 1 + 1 + 1 + 'A' + 1 + 3 + 3, v);
2653 m = t.GetMethod ("invoke_pass_ref");
2654 v = this_obj.InvokeMethod (e.Thread, m, new Value [] { vm.RootDomain.CreateString ("ABC") });
2655 AssertValue ("ABC", v);
2658 m = t.GetMethod ("invoke_pass_ref");
2659 v = this_obj.InvokeMethod (e.Thread, m, new Value [] { vm.CreateValue (null) });
2660 AssertValue (null, v);
2663 m = t.GetMethod ("invoke_static_pass_ref");
2664 v = t.InvokeMethod (e.Thread, m, new Value [] { vm.RootDomain.CreateString ("ABC") });
2665 AssertValue ("ABC", v);
2667 // static invoked using ObjectMirror.InvokeMethod
2668 m = t.GetMethod ("invoke_static_pass_ref");
2669 v = this_obj.InvokeMethod (e.Thread, m, new Value [] { vm.RootDomain.CreateString ("ABC") });
2670 AssertValue ("ABC", v);
2672 // method which throws an exception
2674 m = t.GetMethod ("invoke_throws");
2675 v = this_obj.InvokeMethod (e.Thread, m, null);
2677 } catch (InvocationException ex) {
2678 Assert.AreEqual ("Exception", ex.Exception.Type.Name);
2682 m = t.GetMethod ("invoke_out");
2683 var out_task = this_obj.InvokeMethodAsyncWithResult (e.Thread, m, new Value [] { vm.CreateValue (1), vm.CreateValue (null) }, InvokeOptions.ReturnOutArgs);
2684 var out_args = out_task.Result.OutArgs;
2685 AssertValue (5, out_args [0]);
2686 Assert.IsTrue (out_args [1] is ArrayMirror);
2687 Assert.AreEqual (10, (out_args [1] as ArrayMirror).Length);
2689 // without ReturnOutArgs flag
2690 out_task = this_obj.InvokeMethodAsyncWithResult (e.Thread, m, new Value [] { vm.CreateValue (1), vm.CreateValue (null) });
2691 out_args = out_task.Result.OutArgs;
2692 Assert.IsNull (out_args);
2695 m = t.GetMethod (".ctor");
2696 v = t.InvokeMethod (e.Thread, m, null);
2697 Assert.IsInstanceOfType (typeof (ObjectMirror), v);
2698 Assert.AreEqual ("Tests", (v as ObjectMirror).Type.Name);
2701 var cl1 = frame.Method.DeclaringType.Assembly.GetType ("ITest2");
2702 m = cl1.GetMethod ("invoke_iface");
2703 v = this_obj.InvokeMethod (e.Thread, m, null);
2704 AssertValue (42, v);
2707 m = t.BaseType.GetMethod ("virtual_method");
2708 v = this_obj.InvokeMethod (e.Thread, m, null, InvokeOptions.Virtual);
2709 AssertValue ("V2", v);
2711 // virtual call on static method
2712 m = t.GetMethod ("invoke_static_pass_ref");
2713 v = t.InvokeMethod (e.Thread, m, new Value [] { vm.RootDomain.CreateString ("ABC") }, InvokeOptions.Virtual);
2714 AssertValue ("ABC", v);
2717 m = t.GetMethod ("invoke_pass_ref");
2718 var task = this_obj.InvokeMethodAsync (e.Thread, m, new Value [] { vm.RootDomain.CreateString ("ABC") });
2719 AssertValue ("ABC", task.Result);
2722 m = t.GetMethod ("invoke_static_pass_ref");
2723 task = t.InvokeMethodAsync (e.Thread, m, new Value [] { vm.RootDomain.CreateString ("ABC") });
2724 AssertValue ("ABC", task.Result);
2726 // Argument checking
2729 AssertThrows<ArgumentNullException> (delegate {
2730 m = t.GetMethod ("invoke_pass_ref");
2731 v = this_obj.InvokeMethod (null, m, new Value [] { vm.CreateValue (null) });
2735 AssertThrows<ArgumentNullException> (delegate {
2736 v = this_obj.InvokeMethod (e.Thread, null, new Value [] { vm.CreateValue (null) });
2739 // invalid number of arguments
2740 m = t.GetMethod ("invoke_pass_ref");
2741 AssertThrows<ArgumentException> (delegate {
2742 v = this_obj.InvokeMethod (e.Thread, m, null);
2745 // invalid type of argument (ref != primitive)
2746 m = t.GetMethod ("invoke_pass_ref");
2747 AssertThrows<ArgumentException> (delegate {
2748 v = this_obj.InvokeMethod (e.Thread, m, new Value [] { vm.CreateValue (1) });
2751 // invalid type of argument (primitive != primitive)
2752 m = t.GetMethod ("invoke_pass_primitive_2");
2753 AssertThrows<ArgumentException> (delegate {
2754 v = this_obj.InvokeMethod (e.Thread, m, new Value [] { vm.CreateValue (1) });
2757 // invoking a non-static method as static
2758 m = t.GetMethod ("invoke_pass_ref");
2759 AssertThrows<ArgumentException> (delegate {
2760 v = t.InvokeMethod (e.Thread, m, new Value [] { vm.RootDomain.CreateString ("ABC") });
2763 // invoking a method defined in another class
2764 m = t2.GetMethod ("invoke");
2765 AssertThrows<ArgumentException> (delegate {
2766 v = this_obj.InvokeMethod (e.Thread, m, null);
2771 public void InvokeVType () {
2772 Event e = run_until ("invoke1");
2774 StackFrame frame = e.Thread.GetFrames () [0];
2776 var s = frame.GetArgument (1) as StructMirror;
2778 TypeMirror t = s.Type;
2783 // Pass struct as this, receive int
2784 m = t.GetMethod ("invoke_return_int");
2785 v = s.InvokeMethod (e.Thread, m, null);
2786 AssertValue (42, v);
2788 // Pass boxed struct as this
2789 var boxed_this = t.NewInstance () as ObjectMirror;
2790 m = t.GetMethod ("invoke_return_int");
2791 v = boxed_this.InvokeMethod (e.Thread, m, null);
2794 // Pass struct as this, receive intptr
2795 m = t.GetMethod ("invoke_return_intptr");
2796 v = s.InvokeMethod (e.Thread, m, null);
2797 AssertValue (43, v);
2800 m = t.GetMethod ("invoke_static");
2801 v = t.InvokeMethod (e.Thread, m, null);
2804 // Pass generic struct as this
2805 s = frame.GetArgument (2) as StructMirror;
2807 m = t.GetMethod ("invoke_return_int");
2808 v = s.InvokeMethod (e.Thread, m, null);
2809 AssertValue (42, v);
2812 s = frame.GetArgument (1) as StructMirror;
2814 m = t.GetMethods ().First (method => method.Name == ".ctor" && method.GetParameters ().Length == 1);
2815 v = t.InvokeMethod (e.Thread, m, new Value [] { vm.CreateValue (1) });
2816 AssertValue (1, (v as StructMirror)["i"]);
2818 // Invoke a method which changes state
2819 s = frame.GetArgument (1) as StructMirror;
2821 m = t.GetMethod ("invoke_mutate");
2822 var task = s.InvokeMethodAsyncWithResult (e.Thread, m, null, InvokeOptions.ReturnOutThis);
2823 var out_this = task.Result.OutThis as StructMirror;
2824 AssertValue (5, out_this ["l"]);
2826 // Without the ReturnOutThis flag
2827 s = frame.GetArgument (1) as StructMirror;
2829 m = t.GetMethod ("invoke_mutate");
2830 task = s.InvokeMethodAsyncWithResult (e.Thread, m, null);
2831 out_this = task.Result.OutThis as StructMirror;
2832 Assert.AreEqual (null, out_this);
2835 var cl1 = frame.Method.DeclaringType.Assembly.GetType ("ITest2");
2836 m = cl1.GetMethod ("invoke_iface");
2837 v = s.InvokeMethod (e.Thread, m, null);
2838 AssertValue (42, v);
2841 m = vm.RootDomain.Corlib.GetType ("System.Object").GetMethod ("ToString");
2842 v = s.InvokeMethod (e.Thread, m, null, InvokeOptions.Virtual);
2843 AssertValue ("42", v);
2847 public void BreakpointDuringInvoke () {
2848 Event e = run_until ("invoke1");
2850 MethodMirror m = entry_point.DeclaringType.GetMethod ("invoke2");
2851 Assert.IsNotNull (m);
2852 vm.SetBreakpoint (m, 0);
2854 StackFrame frame = e.Thread.GetFrames () [0];
2855 var o = frame.GetThis () as ObjectMirror;
2857 bool failed = false;
2859 bool finished = false;
2860 object wait = new object ();
2862 // Have to invoke in a separate thread as the invoke is suspended until we
2863 // resume after the breakpoint
2864 Thread t = new Thread (delegate () {
2866 o.InvokeMethod (e.Thread, m, null);
2872 Monitor.Pulse (wait);
2878 StackFrame invoke_frame = null;
2881 e = GetNextEvent ();
2882 Assert.IsInstanceOfType (typeof (BreakpointEvent), e);
2883 // Check stack trace support and invokes
2884 var frames = e.Thread.GetFrames ();
2885 invoke_frame = frames [0];
2886 Assert.AreEqual ("invoke2", frames [0].Method.Name);
2887 Assert.IsTrue (frames [0].IsDebuggerInvoke);
2888 Assert.AreEqual ("invoke1", frames [1].Method.Name);
2895 Monitor.Wait (wait);
2898 // Check that the invoke frames are no longer valid
2899 AssertThrows<InvalidStackFrameException> (delegate {
2900 invoke_frame.GetThis ();
2903 // Check InvokeOptions.DisableBreakpoints flag
2904 o.InvokeMethod (e.Thread, m, null, InvokeOptions.DisableBreakpoints);
2908 public void DisabledExceptionDuringInvoke () {
2909 Event e = run_until ("invoke_ex");
2911 MethodMirror m = entry_point.DeclaringType.GetMethod ("invoke_ex_inner");
2913 StackFrame frame = e.Thread.GetFrames () [0];
2914 var o = frame.GetThis () as ObjectMirror;
2916 var req = vm.CreateExceptionRequest (null);
2919 // Check InvokeOptions.DisableBreakpoints flag
2920 o.InvokeMethod (e.Thread, m, null, InvokeOptions.DisableBreakpoints);
2926 public void InvokeSingleThreaded () {
2929 Start (new string [] { "dtest-app.exe", "invoke-single-threaded" });
2931 Event e = run_until ("invoke_single_threaded_2");
2933 StackFrame f = e.Thread.GetFrames ()[0];
2935 var obj = f.GetThis () as ObjectMirror;
2937 // Check that the counter value incremented by the other thread does not increase
2938 // during the invoke.
2939 object counter1 = (obj.GetValue (obj.Type.GetField ("counter")) as PrimitiveValue).Value;
2941 var m = obj.Type.GetMethod ("invoke_return_void");
2942 obj.InvokeMethod (e.Thread, m, null, InvokeOptions.SingleThreaded);
2944 object counter2 = (obj.GetValue (obj.Type.GetField ("counter")) as PrimitiveValue).Value;
2946 Assert.AreEqual ((int)counter1, (int)counter2);
2948 // Test multiple invokes done in succession
2949 m = obj.Type.GetMethod ("invoke_return_void");
2950 obj.InvokeMethod (e.Thread, m, null, InvokeOptions.SingleThreaded);
2952 // Test events during single-threaded invokes
2953 vm.EnableEvents (EventType.TypeLoad);
2954 m = obj.Type.GetMethod ("invoke_type_load");
2955 obj.BeginInvokeMethod (e.Thread, m, null, InvokeOptions.SingleThreaded, delegate {
2959 e = GetNextEvent ();
2960 Assert.AreEqual (EventType.TypeLoad, e.EventType);
2963 List<Value> invoke_results;
2966 public void InvokeMultiple () {
2967 Event e = run_until ("invoke1");
2969 StackFrame frame = e.Thread.GetFrames () [0];
2971 TypeMirror t = frame.Method.DeclaringType;
2972 ObjectMirror this_obj = (ObjectMirror)frame.GetThis ();
2974 TypeMirror t2 = frame.Method.GetParameters ()[0].ParameterType;
2976 var methods = new MethodMirror [2];
2977 methods [0] = t.GetMethod ("invoke_return_ref");
2978 methods [1] = t.GetMethod ("invoke_return_primitive");
2980 invoke_results = new List<Value> ();
2982 var r = this_obj.BeginInvokeMultiple (e.Thread, methods, null, InvokeOptions.SingleThreaded, invoke_multiple_cb, this_obj);
2983 WaitHandle.WaitAll (new WaitHandle[] { r.AsyncWaitHandle });
2984 this_obj.EndInvokeMultiple (r);
2985 // The callback might still be running
2986 while (invoke_results.Count < 2) {
2989 if (invoke_results [0] is PrimitiveValue) {
2990 AssertValue ("ABC", invoke_results [1]);
2991 AssertValue (42, invoke_results [0]);
2993 AssertValue ("ABC", invoke_results [0]);
2994 AssertValue (42, invoke_results [1]);
2998 void invoke_multiple_cb (IAsyncResult ar) {
2999 ObjectMirror this_obj = (ObjectMirror)ar.AsyncState;
3001 var res = this_obj.EndInvokeMethod (ar);
3002 lock (invoke_results)
3003 invoke_results.Add (res);
3007 public void InvokeAbort () {
3010 Start (new string [] { "dtest-app.exe", "invoke-abort" });
3012 Event e = run_until ("invoke_abort");
3014 StackFrame f = e.Thread.GetFrames ()[0];
3016 var obj = f.GetThis () as ObjectMirror;
3018 var m = t.GetMethod ("invoke_abort_2");
3019 // Invoke multiple times to check that the subsequent invokes are aborted too
3020 var res = (IInvokeAsyncResult)obj.BeginInvokeMultiple (e.Thread, new MethodMirror[] { m, m, m, m }, null, InvokeOptions.None, delegate { }, null);
3023 AssertThrows<CommandException> (delegate {
3024 obj.EndInvokeMethod (res);
3029 public void GetThreads () {
3034 public void Threads () {
3035 Event e = run_until ("threads");
3037 Assert.AreEqual (ThreadState.Running, e.Thread.ThreadState);
3039 Assert.IsTrue (e.Thread.ThreadId > 0);
3041 Assert.AreEqual (e.Thread.TID, e.Thread.TID);
3043 vm.EnableEvents (EventType.ThreadStart, EventType.ThreadDeath);
3047 e = GetNextEvent ();
3048 Assert.IsInstanceOfType (typeof (ThreadStartEvent), e);
3049 var state = e.Thread.ThreadState;
3050 Assert.IsTrue (state == ThreadState.Running || state == ThreadState.Unstarted);
3054 e = GetNextEvent ();
3055 Assert.IsInstanceOfType (typeof (ThreadDeathEvent), e);
3056 Assert.AreEqual (ThreadState.Stopped, e.Thread.ThreadState);
3060 public void Frame_SetValue () {
3061 Event e = run_until ("locals2");
3063 StackFrame frame = e.Thread.GetFrames () [0];
3066 var l = frame.Method.GetLocal ("i");
3067 frame.SetValue (l, vm.CreateValue ((long)55));
3068 AssertValue (55, frame.GetValue (l));
3071 l = frame.Method.GetLocal ("s");
3072 frame.SetValue (l, vm.RootDomain.CreateString ("DEF"));
3073 AssertValue ("DEF", frame.GetValue (l));
3075 // argument as local
3076 l = frame.Method.GetLocal ("arg");
3077 frame.SetValue (l, vm.CreateValue (6));
3078 AssertValue (6, frame.GetValue (l));
3081 var p = frame.Method.GetParameters ()[1];
3082 frame.SetValue (p, vm.CreateValue (7));
3083 AssertValue (7, frame.GetValue (p));
3086 p = frame.Method.GetParameters ()[2];
3087 frame.SetValue (p, vm.RootDomain.CreateString ("DEF"));
3088 AssertValue ("DEF", frame.GetValue (p));
3091 p = frame.Method.GetParameters ()[3];
3092 frame.SetValue (p, vm.RootDomain.CreateString ("DEF2"));
3093 AssertValue ("DEF2", frame.GetValue (p));
3096 p = frame.Method.GetParameters ()[4];
3097 var v = frame.GetValue (p) as StructMirror;
3098 v ["i"] = vm.CreateValue (43);
3099 frame.SetValue (p, v);
3100 v = frame.GetValue (p) as StructMirror;
3101 AssertValue (43, v ["i"]);
3103 // argument checking
3106 AssertThrows<ArgumentNullException> (delegate () {
3107 frame.SetValue ((LocalVariable)null, vm.CreateValue (55));
3111 AssertThrows<ArgumentNullException> (delegate () {
3112 l = frame.Method.GetLocal ("i");
3113 frame.SetValue (l, null);
3116 // value of invalid type
3117 AssertThrows<ArgumentException> (delegate () {
3118 l = frame.Method.GetLocal ("i");
3119 frame.SetValue (l, vm.CreateValue (55));
3125 public void Frame_SetValue_Registers () {
3126 Event e = run_until ("locals6_1");
3128 StackFrame frame = e.Thread.GetFrames () [1];
3131 var l = frame.Method.GetLocal ("j");
3132 frame.SetValue (l, vm.CreateValue (99));
3133 AssertValue (99, frame.GetValue (l));
3135 // Check it during execution
3136 e = run_until ("locals6_2");
3137 frame = e.Thread.GetFrames () [0];
3138 AssertValue (99, frame.GetValue (frame.Method.GetParameters ()[0]));
3140 // Set it while in a frame which clobbers its register
3141 e = run_until ("locals6_3");
3142 frame = e.Thread.GetFrames () [1];
3143 frame.SetValue (l, vm.CreateValue (100));
3144 AssertValue (100, frame.GetValue (l));
3146 // Check it during execution
3147 e = run_until ("locals6_4");
3148 frame = e.Thread.GetFrames () [0];
3149 AssertValue (100, frame.GetValue (frame.Method.GetParameters ()[0]));
3151 // Signed byte value
3152 e = run_until ("locals6_5");
3153 frame = e.Thread.GetFrames () [1];
3154 var l2 = frame.Method.GetLocal ("sb");
3155 frame.SetValue (l2, vm.CreateValue ((sbyte)-99));
3156 AssertValue (-99, frame.GetValue (l2));
3158 // Check it during execution
3159 e = run_until ("locals6_6");
3160 frame = e.Thread.GetFrames () [0];
3161 AssertValue (-99, frame.GetValue (frame.Method.GetParameters ()[0]));
3165 public void InvokeRegress () {
3166 Event e = run_until ("invoke1");
3168 StackFrame frame = e.Thread.GetFrames () [0];
3170 TypeMirror t = frame.Method.DeclaringType;
3171 ObjectMirror this_obj = (ObjectMirror)frame.GetThis ();
3173 TypeMirror t2 = frame.Method.GetParameters ()[0].ParameterType;
3179 m = t.GetMethod ("invoke_return_void");
3180 v = this_obj.InvokeMethod (e.Thread, m, null);
3183 // Check that the stack frames remain valid during the invoke
3184 Assert.AreEqual ("Tests", (frame.GetThis () as ObjectMirror).Type.Name);
3186 // do another invoke
3187 m = t.GetMethod ("invoke_return_void");
3188 v = this_obj.InvokeMethod (e.Thread, m, null);
3191 // Try a single step after the invoke
3192 var req = create_step (e);
3193 req.Depth = StepDepth.Into;
3194 req.Size = StepSize.Line;
3200 // Step into invoke2
3202 e = GetNextEvent ();
3203 Assert.IsTrue (e is StepEvent);
3204 Assert.AreEqual ("invoke2", (e as StepEvent).Method.Name);
3208 frame = e.Thread.GetFrames () [0];
3212 public void Exceptions () {
3213 Event e = run_until ("exceptions");
3214 var req = vm.CreateExceptionRequest (null);
3219 e = GetNextEvent ();
3220 Assert.IsInstanceOfType (typeof (ExceptionEvent), e);
3221 Assert.AreEqual ("OverflowException", (e as ExceptionEvent).Exception.Type.Name);
3223 var frames = e.Thread.GetFrames ();
3224 Assert.AreEqual ("exceptions", frames [0].Method.Name);
3227 // exception type filter
3229 req = vm.CreateExceptionRequest (vm.RootDomain.Corlib.GetType ("System.ArgumentException"));
3232 // Skip the throwing of the second OverflowException
3235 e = GetNextEvent ();
3236 Assert.IsInstanceOfType (typeof (ExceptionEvent), e);
3237 Assert.AreEqual ("ArgumentException", (e as ExceptionEvent).Exception.Type.Name);
3240 // exception type filter for subclasses
3241 req = vm.CreateExceptionRequest (vm.RootDomain.Corlib.GetType ("System.Exception"));
3246 e = GetNextEvent ();
3247 Assert.IsInstanceOfType (typeof (ExceptionEvent), e);
3248 Assert.AreEqual ("OverflowException", (e as ExceptionEvent).Exception.Type.Name);
3252 req.IncludeSubclasses = false;
3257 e = GetNextEvent ();
3258 Assert.IsInstanceOfType (typeof (ExceptionEvent), e);
3259 Assert.AreEqual ("Exception", (e as ExceptionEvent).Exception.Type.Name);
3262 // Implicit exceptions
3263 req = vm.CreateExceptionRequest (null);
3268 e = GetNextEvent ();
3269 Assert.IsInstanceOfType (typeof (ExceptionEvent), e);
3270 Assert.AreEqual ("NullReferenceException", (e as ExceptionEvent).Exception.Type.Name);
3273 // Single stepping after an exception
3274 req = vm.CreateExceptionRequest (null);
3279 e = GetNextEvent ();
3280 Assert.IsInstanceOfType (typeof (ExceptionEvent), e);
3281 Assert.AreEqual ("Exception", (e as ExceptionEvent).Exception.Type.Name);
3282 frames = e.Thread.GetFrames ();
3283 Assert.AreEqual ("exceptions2", frames [0].Method.Name);
3286 var sreq = create_step (e);
3287 sreq.Depth = StepDepth.Over;
3288 sreq.Size = StepSize.Line;
3292 e = GetNextEvent ();
3293 Assert.IsInstanceOfType (typeof (StepEvent), e);
3294 frames = e.Thread.GetFrames ();
3295 Assert.AreEqual ("exceptions", frames [0].Method.Name);
3298 // Argument checking
3299 AssertThrows<ArgumentException> (delegate {
3300 vm.CreateExceptionRequest (e.Thread.Type);
3305 public void ExceptionFilter () {
3306 Event e = run_until ("exception_filter");
3308 MethodMirror m = entry_point.DeclaringType.GetMethod ("exception_filter_filter");
3309 Assert.IsNotNull (m);
3311 vm.SetBreakpoint (m, 0);
3315 e = GetNextEvent ();
3316 Assert.AreEqual (EventType.Breakpoint, e.EventType);
3317 Assert.IsTrue (e is BreakpointEvent);
3318 Assert.AreEqual (m.Name, (e as BreakpointEvent).Method.Name);
3320 var frames = e.Thread.GetFrames ();
3322 Assert.IsTrue (frames [0].Location.SourceFile.IndexOf ("dtest-app.cs") != -1);
3323 Assert.AreEqual ("exception_filter_filter", frames [0].Location.Method.Name);
3325 Assert.AreEqual (0, frames [1].Location.Method.MetadataToken);
3326 Assert.AreEqual (0x0f, frames [1].Location.ILOffset);
3328 Assert.AreEqual ("exception_filter_method", frames [2].Location.Method.Name);
3329 Assert.AreEqual (0x06, frames [2].Location.ILOffset);
3331 Assert.AreEqual (0, frames [3].Location.Method.MetadataToken, 0);
3332 Assert.AreEqual (0, frames [3].Location.ILOffset);
3334 Assert.AreEqual ("exception_filter", frames [4].Location.Method.Name);
3338 public void ExceptionFilter2 () {
3341 Start (new string [] { "dtest-excfilter.exe" });
3343 MethodMirror filter_method = entry_point.DeclaringType.GetMethod ("Filter");
3344 Assert.IsNotNull (filter_method);
3346 MethodMirror test_method = entry_point.DeclaringType.GetMethod ("Test");
3347 Assert.IsNotNull (test_method);
3349 vm.SetBreakpoint (filter_method, 0);
3353 var e = GetNextEvent ();
3354 Assert.AreEqual (EventType.Breakpoint, e.EventType);
3355 Assert.IsTrue (e is BreakpointEvent);
3356 Assert.AreEqual (filter_method.Name, (e as BreakpointEvent).Method.Name);
3358 var frames = e.Thread.GetFrames ();
3360 Assert.AreEqual (4, frames.Count ());
3362 Assert.AreEqual (filter_method.Name, frames [0].Location.Method.Name);
3363 Assert.AreEqual (20, frames [0].Location.LineNumber);
3364 Assert.AreEqual (0, frames [0].Location.ILOffset);
3366 Assert.AreEqual (test_method.Name, frames [1].Location.Method.Name);
3367 Assert.AreEqual (37, frames [1].Location.LineNumber);
3368 Assert.AreEqual (0x0b, frames [1].Location.ILOffset);
3370 Assert.AreEqual (test_method.Name, frames [2].Location.Method.Name);
3371 Assert.AreEqual (33, frames [2].Location.LineNumber);
3372 Assert.AreEqual (0x05, frames [2].Location.ILOffset);
3374 Assert.AreEqual (entry_point.Name, frames [3].Location.Method.Name);
3375 Assert.AreEqual (14, frames [3].Location.LineNumber);
3376 Assert.AreEqual (0x00, frames [3].Location.ILOffset);
3384 public void EventSets () {
3386 // Create two filter which both match the same exception
3388 Event e = run_until ("exceptions");
3390 var req = vm.CreateExceptionRequest (null);
3393 var req2 = vm.CreateExceptionRequest (vm.RootDomain.Corlib.GetType ("System.OverflowException"));
3398 var es = vm.GetNextEventSet ();
3399 Assert.AreEqual (2, es.Events.Length);
3402 Assert.IsInstanceOfType (typeof (ExceptionEvent), e);
3403 Assert.AreEqual ("OverflowException", (e as ExceptionEvent).Exception.Type.Name);
3406 Assert.IsInstanceOfType (typeof (ExceptionEvent), e);
3407 Assert.AreEqual ("OverflowException", (e as ExceptionEvent).Exception.Type.Name);
3414 // Test single threaded invokes during processing of nullref exceptions.
3415 // These won't work if the exception handling is done from the sigsegv signal
3416 // handler, since the sigsegv signal is disabled until control returns from the
3420 [Category ("only3")]
3421 public void NullRefExceptionAndSingleThreadedInvoke () {
3422 Event e = run_until ("exceptions");
3423 var req = vm.CreateExceptionRequest (vm.RootDomain.Corlib.GetType ("System.NullReferenceException"));
3428 e = GetNextEvent ();
3429 Assert.IsInstanceOfType (typeof (ExceptionEvent), e);
3430 Assert.AreEqual ("NullReferenceException", (e as ExceptionEvent).Exception.Type.Name);
3432 var ex = (e as ExceptionEvent).Exception;
3433 var tostring_method = vm.RootDomain.Corlib.GetType ("System.Object").GetMethod ("ToString");
3434 ex.InvokeMethod (e.Thread, tostring_method, null, InvokeOptions.SingleThreaded);
3438 public void MemberInOtherDomain () {
3441 Start (new string [] { "dtest-app.exe", "domain-test" });
3443 vm.EnableEvents (EventType.AppDomainCreate, EventType.AppDomainUnload, EventType.AssemblyUnload);
3445 Event e = run_until ("domains_print_across");
3447 var frame = e.Thread.GetFrames ()[0];
3448 var inOtherDomain = frame.GetArgument (0) as ObjectMirror;
3449 var crossDomainField = (ObjectMirror) inOtherDomain.GetValue (inOtherDomain.Type.GetField("printMe"));
3450 Assert.AreEqual ("SentinelClass", crossDomainField.Type.Name);
3454 public void Domains () {
3457 Start (new string [] { "dtest-app.exe", "domain-test" });
3459 vm.EnableEvents (EventType.AppDomainCreate, EventType.AppDomainUnload, EventType.AssemblyUnload);
3461 Event e = run_until ("domains");
3465 e = GetNextEvent ();
3466 Assert.IsInstanceOfType (typeof (AppDomainCreateEvent), e);
3468 var domain = (e as AppDomainCreateEvent).Domain;
3470 // Check the object type
3471 e = run_until ("domains_2");
3472 var frame = e.Thread.GetFrames ()[0];
3473 var o = frame.GetArgument (0) as ObjectMirror;
3474 Assert.AreEqual ("CrossDomain", o.Type.Name);
3476 // Do a remoting invoke
3477 var cross_domain_type = o.Type;
3478 var v = o.InvokeMethod (e.Thread, cross_domain_type.GetMethod ("invoke_3"), null);
3479 AssertValue (42, v);
3481 // Run until the callback in the domain
3482 MethodMirror m = entry_point.DeclaringType.GetMethod ("invoke_in_domain");
3483 Assert.IsNotNull (m);
3484 vm.SetBreakpoint (m, 0);
3488 e = GetNextEvent ();
3489 if (e is BreakpointEvent)
3493 Assert.AreEqual ("invoke_in_domain", (e as BreakpointEvent).Method.Name);
3495 // d_method is from another domain
3496 MethodMirror d_method = (e as BreakpointEvent).Method;
3497 Assert.IsTrue (m != d_method);
3498 Assert.AreEqual (domain, d_method.DeclaringType.Assembly.Domain);
3500 var frames = e.Thread.GetFrames ();
3501 Assert.AreEqual ("invoke_in_domain", frames [0].Method.Name);
3502 Assert.AreEqual (domain, frames [0].Domain);
3503 Assert.AreEqual ("invoke", frames [1].Method.Name);
3504 Assert.AreEqual ("domains", frames [2].Method.Name);
3505 Assert.AreEqual (vm.RootDomain, frames [2].Domain);
3507 // Test breakpoints on already JITted methods in other domains
3508 m = entry_point.DeclaringType.GetMethod ("invoke_in_domain_2");
3509 Assert.IsNotNull (m);
3510 vm.SetBreakpoint (m, 0);
3514 e = GetNextEvent ();
3515 if (e is BreakpointEvent)
3519 Assert.AreEqual ("invoke_in_domain_2", (e as BreakpointEvent).Method.Name);
3521 // This is empty when receiving the AppDomainCreateEvent
3522 Assert.AreEqual ("domain", domain.FriendlyName);
3524 // Run until the unload
3527 e = GetNextEvent ();
3528 if (e is AssemblyUnloadEvent) {
3529 AssertThrows<Exception> (delegate () {
3530 var assembly_obj = (e as AssemblyUnloadEvent).Assembly.GetAssemblyObject ();
3537 Assert.IsInstanceOfType (typeof (AppDomainUnloadEvent), e);
3538 Assert.AreEqual (domain, (e as AppDomainUnloadEvent).Domain);
3540 // Run past the unload
3541 e = run_until ("domains_3");
3543 // Test access to unloaded types
3544 // FIXME: Add an exception type for this
3545 AssertThrows<Exception> (delegate {
3546 d_method.DeclaringType.GetValue (d_method.DeclaringType.GetField ("static_i"));
3549 // Check that .Domain is accessible for stack frames with native transitions
3550 e = run_until ("called_from_invoke");
3551 ThreadMirror.NativeTransitions = true;
3552 foreach (var f in e.Thread.GetFrames ()) {
3558 public void DynamicMethods () {
3559 Event e = run_until ("dyn_call");
3561 var m = e.Thread.GetFrames ()[1].Method;
3562 Assert.AreEqual ("dyn_method", m.Name);
3564 // Test access to IL
3565 var body = m.GetMethodBody ();
3567 ILInstruction ins = body.Instructions [0];
3568 Assert.AreEqual (OpCodes.Ldstr, ins.OpCode);
3569 Assert.AreEqual ("FOO", ins.Operand);
3573 public void RefEmit () {
3576 Start (new string [] { "dtest-app.exe", "ref-emit-test" });
3578 Event e = run_until ("ref_emit_call");
3580 var m = e.Thread.GetFrames ()[1].Method;
3581 Assert.AreEqual ("ref_emit_method", m.Name);
3583 // Test access to IL
3584 var body = m.GetMethodBody ();
3588 ins = body.Instructions [0];
3589 Assert.AreEqual (OpCodes.Ldstr, ins.OpCode);
3590 Assert.AreEqual ("FOO", ins.Operand);
3592 ins = body.Instructions [1];
3593 Assert.AreEqual (OpCodes.Call, ins.OpCode);
3594 Assert.IsInstanceOfType (typeof (MethodMirror), ins.Operand);
3595 Assert.AreEqual ("ref_emit_call", (ins.Operand as MethodMirror).Name);
3599 public void IsAttached () {
3600 var f = entry_point.DeclaringType.GetField ("is_attached");
3602 Event e = run_until ("Main");
3604 AssertValue (true, entry_point.DeclaringType.GetValue (f));
3608 public void StackTraceInNative () {
3609 // Check that stack traces can be produced for threads in native code
3612 Start (new string [] { "dtest-app.exe", "frames-in-native" });
3614 var e = run_until ("frames_in_native");
3616 // FIXME: This is racy
3623 StackFrame[] frames = e.Thread.GetFrames ();
3625 int frame_index = -1;
3626 for (int i = 0; i < frames.Length; ++i) {
3627 if (frames [i].Method.Name == "Sleep") {
3633 Assert.IsTrue (frame_index != -1);
3634 Assert.AreEqual ("Sleep", frames [frame_index].Method.Name);
3635 Assert.AreEqual ("frames_in_native", frames [frame_index + 1].Method.Name);
3636 Assert.AreEqual ("Main", frames [frame_index + 2].Method.Name);
3638 // Check that invokes are disabled for such threads
3639 TypeMirror t = frames [frame_index + 1].Method.DeclaringType;
3641 var m = t.GetMethod ("invoke_static_return_void");
3642 AssertThrows<InvalidOperationException> (delegate {
3643 t.InvokeMethod (e.Thread, m, null);
3646 // Check that the frame info is invalidated
3647 run_until ("frames_in_native_2");
3649 AssertThrows<InvalidStackFrameException> (delegate {
3650 Console.WriteLine (frames [frame_index].GetThis ());
3655 public void VirtualMachine_CreateEnumMirror () {
3656 var e = run_until ("o1");
3657 var frame = e.Thread.GetFrames () [0];
3659 object val = frame.GetThis ();
3660 Assert.IsTrue (val is ObjectMirror);
3661 Assert.AreEqual ("Tests", (val as ObjectMirror).Type.Name);
3662 ObjectMirror o = (val as ObjectMirror);
3664 FieldInfoMirror field = o.Type.GetField ("field_enum");
3665 Value f = o.GetValue (field);
3666 TypeMirror enumType = (f as EnumMirror).Type;
3668 o.SetValue (field, vm.CreateEnumMirror (enumType, vm.CreateValue (1)));
3669 f = o.GetValue (field);
3670 Assert.AreEqual (1, (f as EnumMirror).Value);
3672 // Argument checking
3673 AssertThrows<ArgumentNullException> (delegate () {
3674 vm.CreateEnumMirror (enumType, null);
3677 AssertThrows<ArgumentNullException> (delegate () {
3678 vm.CreateEnumMirror (null, vm.CreateValue (1));
3682 AssertThrows<ArgumentException> (delegate () {
3683 vm.CreateEnumMirror (enumType, vm.CreateValue (null));
3686 // value of a wrong type
3687 AssertThrows<ArgumentException> (delegate () {
3688 vm.CreateEnumMirror (enumType, vm.CreateValue ((long)1));
3693 public void VirtualMachine_EnableEvents_Breakpoint () {
3694 AssertThrows<ArgumentException> (delegate () {
3695 vm.EnableEvents (EventType.Breakpoint);
3700 public void SingleStepRegress654694 () {
3703 MethodMirror m = entry_point.DeclaringType.GetMethod ("ss_regress_654694");
3704 foreach (Location l in m.Locations) {
3705 if (l.ILOffset > 0 && il_offset == -1)
3706 il_offset = l.ILOffset;
3709 Event e = run_until ("ss_regress_654694");
3711 Assert.IsNotNull (m);
3712 vm.SetBreakpoint (m, il_offset);
3716 e = GetNextEvent ();
3717 Assert.IsTrue (e is BreakpointEvent);
3719 var req = create_step (e);
3720 req.Depth = StepDepth.Over;
3721 req.Size = StepSize.Line;
3726 e = GetNextEvent ();
3727 Assert.IsTrue (e is StepEvent);
3733 public void DebugBreak () {
3734 vm.EnableEvents (EventType.UserBreak);
3739 var e = GetNextEvent ();
3740 Assert.IsTrue (e is UserBreakEvent);
3744 public void DebugLog () {
3745 vm.EnableEvents (EventType.UserLog);
3750 var e = GetNextEvent ();
3751 Assert.IsTrue (e is UserLogEvent);
3752 var le = e as UserLogEvent;
3754 Assert.AreEqual (5, le.Level);
3755 Assert.AreEqual ("A", le.Category);
3756 Assert.AreEqual ("B", le.Message);
3760 public void TypeGetMethodsByNameFlags () {
3762 var assembly = entry_point.DeclaringType.Assembly;
3763 var type = assembly.GetType ("Tests3");
3765 Assert.IsNotNull (type);
3767 mm = type.GetMethodsByNameFlags (null, BindingFlags.Static | BindingFlags.Public, false);
3768 Assert.AreEqual (1, mm.Length, "#1");
3769 Assert.AreEqual ("M1", mm[0].Name, "#2");
3771 mm = type.GetMethodsByNameFlags (null, BindingFlags.Static | BindingFlags.NonPublic, false);
3772 Assert.AreEqual (1, mm.Length, "#3");
3773 Assert.AreEqual ("M2", mm[0].Name, "#4");
3775 mm = type.GetMethodsByNameFlags (null, BindingFlags.Instance | BindingFlags.Public, false);
3776 Assert.AreEqual (7, mm.Length, "#5"); //M3 plus Equals, GetHashCode, GetType, ToString, .ctor
3778 mm = type.GetMethodsByNameFlags (null, BindingFlags.Instance | BindingFlags.Public | BindingFlags.DeclaredOnly, false);
3779 Assert.AreEqual (2, mm.Length, "#7");
3781 mm = type.GetMethodsByNameFlags (null, BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.DeclaredOnly, false);
3782 Assert.AreEqual (1, mm.Length, "#9");
3784 mm = type.GetMethodsByNameFlags (null, BindingFlags.Static | BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.DeclaredOnly, false);
3785 Assert.AreEqual (5, mm.Length, "#11");
3788 mm = type.GetMethodsByNameFlags ("M1", BindingFlags.Static | BindingFlags.Public, false);
3789 Assert.AreEqual (1, mm.Length, "#12");
3790 Assert.AreEqual ("M1", mm[0].Name, "#13");
3792 mm = type.GetMethodsByNameFlags ("m1", BindingFlags.Static | BindingFlags.Public, true);
3793 Assert.AreEqual (1, mm.Length, "#14");
3794 Assert.AreEqual ("M1", mm[0].Name, "#15");
3796 mm = type.GetMethodsByNameFlags ("M1", BindingFlags.Static | BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, false);
3797 Assert.AreEqual (1, mm.Length, "#16");
3798 Assert.AreEqual ("M1", mm[0].Name, "#17");
3802 [Category ("only88")]
3803 public void TypeLoadSourceFileFilter () {
3804 Event e = run_until ("type_load");
3806 if (!vm.Version.AtLeast (2, 7))
3809 string srcfile = (e as BreakpointEvent).Method.DeclaringType.GetSourceFiles (true)[0];
3810 srcfile = srcfile.Replace ("dtest-app.cs", "TypeLoadClass.cs");
3811 Assert.IsTrue (srcfile.Contains ("TypeLoadClass.cs"));
3813 var req = vm.CreateTypeLoadRequest ();
3814 req.SourceFileFilter = new string [] { srcfile.ToUpper () };
3818 e = GetNextEvent ();
3819 Assert.IsTrue (e is TypeLoadEvent);
3820 Assert.AreEqual ("TypeLoadClass", (e as TypeLoadEvent).Type.FullName);
3824 public void TypeLoadTypeNameFilter () {
3825 Event e = run_until ("type_load");
3827 var req = vm.CreateTypeLoadRequest ();
3828 req.TypeNameFilter = new string [] { "TypeLoadClass2" };
3832 e = GetNextEvent ();
3833 Assert.IsTrue (e is TypeLoadEvent);
3834 Assert.AreEqual ("TypeLoadClass2", (e as TypeLoadEvent).Type.FullName);
3838 public void GetTypesForSourceFile () {
3841 var types = vm.GetTypesForSourceFile ("dtest-app.cs", false);
3842 Assert.IsTrue (types.Any (t => t.FullName == "Tests"));
3843 Assert.IsFalse (types.Any (t => t.FullName == "System.Int32"));
3845 types = vm.GetTypesForSourceFile ("DTEST-app.cs", true);
3846 Assert.IsTrue (types.Any (t => t.FullName == "Tests"));
3847 Assert.IsFalse (types.Any (t => t.FullName == "System.Int32"));
3851 public void GetTypesNamed () {
3854 var types = vm.GetTypes ("Tests", false);
3855 Assert.AreEqual (1, types.Count);
3856 Assert.AreEqual ("Tests", types [0].FullName);
3858 types = vm.GetTypes ("System.Exception", false);
3859 Assert.AreEqual (1, types.Count);
3860 Assert.AreEqual ("System.Exception", types [0].FullName);
3864 public void String_GetValue () {
3869 var e = run_until ("arg2");
3871 var frame = e.Thread.GetFrames () [0];
3873 val = frame.GetArgument (6);
3874 Assert.AreEqual ('\0'.ToString () + "A", (val as StringMirror).Value);
3878 public void String_GetChars () {
3882 var e = run_until ("arg2");
3884 var frame = e.Thread.GetFrames () [0];
3886 val = frame.GetArgument (0);
3887 Assert.IsTrue (val is StringMirror);
3888 AssertValue ("FOO", val);
3889 var s = (val as StringMirror);
3890 Assert.AreEqual (3, s.Length);
3892 var c = s.GetChars (0, 2);
3893 Assert.AreEqual (2, c.Length);
3894 Assert.AreEqual ('F', c [0]);
3895 Assert.AreEqual ('O', c [1]);
3897 AssertThrows<ArgumentException> (delegate () {
3903 public void GetInterfaces () {
3904 var e = run_until ("arg2");
3906 var frame = e.Thread.GetFrames () [0];
3908 var cl1 = frame.Method.DeclaringType.Assembly.GetType ("TestIfaces");
3909 var ifaces = cl1.GetInterfaces ();
3910 Assert.AreEqual (1, ifaces.Length);
3911 Assert.AreEqual ("ITest", ifaces [0].Name);
3913 var cl2 = cl1.GetMethod ("Baz").ReturnType;
3914 var ifaces2 = cl2.GetInterfaces ();
3915 Assert.AreEqual (1, ifaces2.Length);
3916 Assert.AreEqual ("ITest`1", ifaces2 [0].Name);
3920 public void GetInterfaceMap () {
3921 var e = run_until ("arg2");
3923 var frame = e.Thread.GetFrames () [0];
3925 var cl1 = frame.Method.DeclaringType.Assembly.GetType ("TestIfaces");
3926 var iface = cl1.Assembly.GetType ("ITest");
3927 var map = cl1.GetInterfaceMap (iface);
3928 Assert.AreEqual (cl1, map.TargetType);
3929 Assert.AreEqual (iface, map.InterfaceType);
3930 Assert.AreEqual (2, map.InterfaceMethods.Length);
3931 Assert.AreEqual (2, map.TargetMethods.Length);
3935 public void StackAlloc_Breakpoints_Regress2775 () {
3936 // Check that breakpoints on arm don't overwrite stackalloc-ed memory
3937 var e = run_until ("regress_2755");
3939 var frame = e.Thread.GetFrames () [0];
3941 // This breaks at the call site
3942 vm.SetBreakpoint (m, m.Locations [2].ILOffset);
3945 var e2 = GetNextEvent ();
3946 Assert.IsTrue (e2 is BreakpointEvent);
3948 e = run_until ("regress_2755_3");
3949 frame = e.Thread.GetFrames () [1];
3950 var res = frame.GetValue (m.GetLocal ("sum"));
3951 AssertValue (0, res);
3955 public void MethodInfo () {
3956 Event e = run_until ("locals2");
3958 StackFrame frame = e.Thread.GetFrames () [0];
3959 var m = frame.Method;
3961 Assert.IsTrue (m.IsGenericMethod);
3962 Assert.IsFalse (m.IsGenericMethodDefinition);
3964 var args = m.GetGenericArguments ();
3965 Assert.AreEqual (1, args.Length);
3966 Assert.AreEqual ("String", args [0].Name);
3968 var gmd = m.GetGenericMethodDefinition ();
3969 Assert.IsTrue (gmd.IsGenericMethod);
3970 Assert.IsTrue (gmd.IsGenericMethodDefinition);
3971 Assert.AreEqual (gmd, gmd.GetGenericMethodDefinition ());
3973 args = gmd.GetGenericArguments ();
3974 Assert.AreEqual (1, args.Length);
3975 Assert.AreEqual ("T", args [0].Name);
3977 var attrs = m.GetCustomAttributes (true);
3978 Assert.AreEqual (1, attrs.Length);
3979 Assert.AreEqual ("StateMachineAttribute", attrs [0].Constructor.DeclaringType.Name);
3983 public void UnhandledException () {
3986 Start (new string [] { "dtest-app.exe", "unhandled-exception" });
3988 var req = vm.CreateExceptionRequest (null, false, true);
3991 var e = run_until ("unhandled_exception");
3994 var e2 = GetNextEvent ();
3995 Assert.IsTrue (e2 is ExceptionEvent);
4002 public void UnhandledException_2 () {
4005 Start (new string [] { "dtest-app.exe", "unhandled-exception-endinvoke" });
4007 var req = vm.CreateExceptionRequest (null, false, true);
4010 MethodMirror m = entry_point.DeclaringType.GetMethod ("unhandled_exception_endinvoke_2");
4011 Assert.IsNotNull (m);
4012 vm.SetBreakpoint (m, m.ILOffsets [0]);
4014 var e = run_until ("unhandled_exception_endinvoke");
4017 var e2 = GetNextEvent ();
4018 Assert.IsFalse (e2 is ExceptionEvent);
4025 public void UnhandledExceptionUserCode () {
4028 // Exceptions caught in non-user code are treated as unhandled
4029 Start (new string [] { "dtest-app.exe", "unhandled-exception-user" });
4031 var req = vm.CreateExceptionRequest (null, false, true);
4032 req.AssemblyFilter = new List<AssemblyMirror> () { entry_point.DeclaringType.Assembly };
4035 var e = run_until ("unhandled_exception_user");
4038 var e2 = GetNextEvent ();
4039 Assert.IsTrue (e2 is ExceptionEvent);
4046 public void GCWhileSuspended () {
4047 // Check that objects are kept alive during suspensions
4048 Event e = run_until ("gc_suspend_1");
4050 MethodMirror m = entry_point.DeclaringType.GetMethod ("gc_suspend_invoke");
4052 var o = entry_point.DeclaringType.GetValue (entry_point.DeclaringType.GetField ("gc_suspend_field")) as ObjectMirror;
4053 //Console.WriteLine (o);
4055 StackFrame frame = e.Thread.GetFrames () [0];
4056 TypeMirror t = frame.Method.DeclaringType;
4057 for (int i = 0; i < 10; ++i)
4058 t.InvokeMethod (e.Thread, m, new Value [] { });
4060 // This throws an exception if the object is collected
4061 long addr = o.Address;
4063 var o2 = entry_point.DeclaringType.GetValue (entry_point.DeclaringType.GetField ("gc_suspend_field")) as ObjectMirror;
4068 public void MakeGenericMethod () {
4069 Event e = run_until ("bp1");
4071 var intm = vm.RootDomain.GetCorrespondingType (typeof (int));
4072 var stringm = vm.RootDomain.GetCorrespondingType (typeof (string));
4073 var gm = entry_point.DeclaringType.GetMethod ("generic_method");
4074 var res = gm.MakeGenericMethod (new TypeMirror [] { stringm });
4075 var args = res.GetGenericArguments ();
4076 Assert.AreEqual (1, args.Length);
4077 Assert.AreEqual (stringm, args [0]);
4080 AssertThrows<ArgumentNullException> (delegate {
4081 gm.MakeGenericMethod (null);
4083 AssertThrows<ArgumentNullException> (delegate {
4084 gm.MakeGenericMethod (new TypeMirror [] { null });
4086 AssertThrows<ArgumentException> (delegate {
4087 gm.MakeGenericMethod (new TypeMirror [] { stringm, stringm });
4089 AssertThrows<InvalidOperationException> (delegate {
4090 gm.MakeGenericMethod (new TypeMirror [] { intm });
4092 AssertThrows<InvalidOperationException> (delegate {
4093 entry_point.DeclaringType.GetMethod ("Main").MakeGenericMethod (new TypeMirror [] { intm });
4098 public void InspectThreadSuspenedOnWaitOne () {
4100 Start (true, "dtest-app.exe", "wait-one" );
4102 ThreadMirror.NativeTransitions = true;
4104 var evt = run_until ("wait_one");
4105 Assert.IsNotNull (evt, "#1");
4107 var thread = evt.Thread;
4108 Assert.AreEqual (ThreadState.Running, thread.ThreadState, "#1.1");
4110 var frames = thread.GetFrames ();
4111 Assert.IsNotNull (frames, "#2");
4112 Assert.AreEqual (2, frames.Length, "#3");
4113 Assert.AreEqual ("wait_one", frames [0].Method.Name, "#4");
4114 Assert.AreEqual ("Main", frames [1].Method.Name, "#5");
4118 Thread.Sleep (500); //FIXME this is racy, maybe single step? or something?
4121 Assert.AreEqual (ThreadState.WaitSleepJoin, thread.ThreadState, "#6");
4123 frames = thread.GetFrames ();
4124 Assert.AreEqual (8, frames.Length, "#7");
4125 Assert.AreEqual ("WaitOne_internal", frames [0].Method.Name, "#8.0");
4126 Assert.AreEqual ("WaitOneNative", frames [1].Method.Name, "#8.1");
4127 Assert.AreEqual ("InternalWaitOne", frames [2].Method.Name, "#8.2");
4128 Assert.AreEqual ("WaitOne", frames [3].Method.Name, "#8.3");
4129 Assert.AreEqual ("WaitOne", frames [4].Method.Name, "#8.4");
4130 Assert.AreEqual ("WaitOne", frames [5].Method.Name, "#8.5");
4131 Assert.AreEqual ("wait_one", frames [6].Method.Name, "#8.6");
4132 Assert.AreEqual ("Main", frames [7].Method.Name, "#8.7");
4134 var frame = frames [0];
4135 Assert.IsTrue (frame.IsNativeTransition, "#11.1");
4138 Assert.Fail ("Known limitation - can't get info from m2n frames");
4139 } catch (AbsentInformationException) {}
4142 Assert.IsFalse (frame.IsNativeTransition, "#12.1");
4143 var wait_one_this = frame.GetThis ();
4144 Assert.IsNotNull (wait_one_this, "#12.2");
4147 var locals = frame.GetVisibleVariables ();
4148 Assert.AreEqual (1, locals.Count, "#13.1");
4150 var local_0 = frame.GetValue (locals [0]);
4151 Assert.IsNotNull (local_0, "#13.2");
4153 Assert.AreEqual (wait_one_this, local_0, "#14.2");
4157 public void GetMethodBody () {
4158 var bevent = run_until ("Main");
4160 var m = bevent.Method.DeclaringType.GetMethod ("get_IntProperty");
4161 var body = m.GetMethodBody ();
4162 foreach (var ins in body.Instructions) {
4163 if (ins.OpCode == OpCodes.Ldfld) {
4164 var field = (FieldInfoMirror)ins.Operand;
4165 Assert.AreEqual ("field_i", field.Name);
4171 public void EvaluateMethod () {
4172 var bevent = run_until ("evaluate_method_2");
4174 var m = bevent.Method.DeclaringType.GetMethod ("get_IntProperty");
4176 var this_obj = bevent.Thread.GetFrames ()[0].GetThis ();
4177 var v = m.Evaluate (this_obj, null);
4178 AssertValue (42, v);
4182 public void SetIP () {
4183 var bevent = run_until ("set_ip_1");
4185 var invalid_loc = bevent.Thread.GetFrames ()[0].Location;
4187 var req = create_step (bevent);
4188 var e = step_out ();
4190 var frames = e.Thread.GetFrames ();
4191 var locs = frames [0].Method.Locations;
4193 var next_loc = locs.First (l => (l.LineNumber == frames [0].Location.LineNumber + 3));
4195 e.Thread.SetIP (next_loc);
4197 /* Check that i ++; j = 5; was skipped */
4198 bevent = run_until ("set_ip_2");
4199 var f = bevent.Thread.GetFrames ()[1];
4200 AssertValue (2, f.GetValue (f.Method.GetLocal ("i")));
4201 AssertValue (0, f.GetValue (f.Method.GetLocal ("j")));
4204 AssertThrows<ArgumentNullException> (delegate {
4205 e.Thread.SetIP (null);
4208 AssertThrows<ArgumentException> (delegate {
4209 e.Thread.SetIP (invalid_loc);
4214 public void SetIPSingleStep () {
4215 // Check that single stepping after set-ip steps from the new ip
4216 var bevent = run_until ("set_ip_1");
4218 var invalid_loc = bevent.Thread.GetFrames ()[0].Location;
4220 var req = create_step (bevent);
4221 req.Size = StepSize.Line;
4222 var e = step_out ();
4224 var frames = e.Thread.GetFrames ();
4225 var locs = frames [0].Method.Locations;
4226 var prev_loc = locs.First (l => (l.LineNumber == frames [0].Location.LineNumber - 1));
4227 AssertValue (2, frames [0].GetValue (frames [0].Method.GetLocal ("i")));
4229 // Set back the ip to the first i ++; line
4230 e.Thread.SetIP (prev_loc);
4233 var f = e.Thread.GetFrames ()[0];
4234 AssertValue (3, f.GetValue (f.Method.GetLocal ("i")));
4238 public void NewInstanceNoCtor () {
4239 var bevent = run_until ("Main");
4241 var stype = bevent.Method.DeclaringType.Assembly.GetType ("AStruct");
4242 var obj = stype.NewInstance ();
4243 Assert.IsTrue (obj is ObjectMirror);
4244 Assert.AreEqual ("AStruct", (obj as ObjectMirror).Type.Name);
4248 public void StaticCtorFilterInCctor () {
4249 // Check that single stepping when in a cctor only ignores
4250 // other cctors, not the current one
4251 var bevent = run_until ("step_filters");
4253 var assembly = entry_point.DeclaringType.Assembly;
4254 var type = assembly.GetType ("Tests/ClassWithCctor");
4255 var cctor = type.GetMethod (".cctor");
4256 vm.SetBreakpoint (cctor, 0);
4259 var e = GetNextEvent ();
4260 Assert.IsTrue (e is BreakpointEvent);
4262 var req = create_step (e);
4263 req.Filter = StepFilter.StaticCtor;
4265 // Make sure we are still in the cctor
4266 Assert.AreEqual (".cctor", e.Thread.GetFrames ()[0].Location.Method.Name);
4270 public void ThreadpoolIOsinglestep () {
4272 Start ("dtest-app.exe", "threadpool-io");
4273 // This is a regression test for #42625. It tests the
4274 // interaction (particularly in coop GC) of the
4275 // threadpool I/O mechanism and the soft debugger.
4276 Event e = run_until ("threadpool_io");
4277 // run until we sent the task half the bytes it
4278 // expects, so that it blocks waiting for the rest.
4279 e = run_until ("threadpool_bp");
4280 var req = create_step (e);
4281 e = step_out (); // leave threadpool_bp
4282 e = step_out (); // leave threadpool_io
4286 // Uses a fixed port
4287 [Category("NotWorking")]
4288 public void Attach () {
4291 // Launch the app using server=y,suspend=n
4292 var pi = CreateStartInfo (new string[] { "--debugger-agent=transport=dt_socket,address=127.0.0.1:10000,server=y,suspend=n", "dtest-app.exe", "attach" });
4293 var process = Diag.Process.Start (pi);
4295 // Wait for the app to reach the Sleep () in attach ().
4296 Thread.Sleep (1000);
4297 var ep = new IPEndPoint (IPAddress.Loopback, 10000);
4298 vm = VirtualMachineManager.Connect (ep);
4300 var load_req = vm.CreateAssemblyLoadRequest ();
4302 vm.EnableEvents (EventType.TypeLoad);
4304 Event vmstart = GetNextEvent ();
4305 Assert.AreEqual (EventType.VMStart, vmstart.EventType);
4307 // Get collected events
4308 bool assembly_load_found = false;
4309 bool type_load_found = false;
4311 Event e = GetNextEvent ();
4314 if (e is AssemblyLoadEvent) {
4315 var assemblyload = e as AssemblyLoadEvent;
4317 var amirror = assemblyload.Assembly;
4319 if (amirror.GetName ().Name == "System.Transactions") {
4320 assembly_load_found = true;
4321 Assert.AreEqual ("domain", amirror.Domain.FriendlyName);
4324 if (amirror.GetName ().Name == "dtest-app")
4325 // Set a bp so we can break the event loop
4326 vm.SetBreakpoint (amirror.EntryPoint.DeclaringType.GetMethod ("attach_break"), 0);
4328 if (e is TypeLoadEvent) {
4329 var typeload = e as TypeLoadEvent;
4331 if (typeload.Type.Name == "GCSettings") {
4332 type_load_found = true;
4333 Assert.AreEqual ("domain", typeload.Type.Assembly.Domain.FriendlyName);
4337 if (e is BreakpointEvent)
4340 Assert.IsTrue (assembly_load_found);
4341 Assert.IsTrue (type_load_found);