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 Event GetNextEvent () {
46 var es = vm.GetNextEventSet ();
47 Assert.AreEqual (1, es.Events.Length);
51 void Start (params string[] args) {
55 void Start (bool forceExit, params string[] args) {
56 this.forceExit = forceExit;
59 var pi = new Diag.ProcessStartInfo ();
62 pi.FileName = runtime;
65 pi.Arguments = String.Join (" ", args);
66 vm = VirtualMachineManager.Launch (pi, new LaunchOptions { AgentArgs = agent_args });
68 var ep = new IPEndPoint (IPAddress.Any, 10000);
69 Console.WriteLine ("Listening on " + ep + "...");
70 vm = VirtualMachineManager.Listen (ep);
73 var load_req = vm.CreateAssemblyLoadRequest ();
76 Event vmstart = GetNextEvent ();
77 Assert.AreEqual (EventType.VMStart, vmstart.EventType);
86 /* Find out the entry point */
90 if (e is AssemblyLoadEvent) {
91 AssemblyLoadEvent ae = (AssemblyLoadEvent)e;
92 entry_point = ae.Assembly.EntryPoint;
93 if (entry_point != null)
103 BreakpointEvent run_until (string name) {
105 MethodMirror m = entry_point.DeclaringType.GetMethod (name);
106 Assert.IsNotNull (m);
107 //Console.WriteLine ("X: " + name + " " + m.ILOffsets.Count + " " + m.Locations.Count);
108 var req = vm.SetBreakpoint (m, m.ILOffsets [0]);
115 if (e is BreakpointEvent)
121 Assert.IsInstanceOfType (typeof (BreakpointEvent), e);
122 Assert.AreEqual (m.Name, (e as BreakpointEvent).Method.Name);
124 return (e as BreakpointEvent);
127 Event single_step (ThreadMirror t) {
128 var req = vm.CreateStepRequest (t);
132 Event e = GetNextEvent ();
133 Assert.IsTrue (e is StepEvent);
140 Event step_until (ThreadMirror t, string method_name) {
144 if ((e as StepEvent).Method.Name == method_name)
150 void check_arg_val (StackFrame frame, int pos, Type type, object eval) {
151 object val = frame.GetArgument (pos);
152 Assert.IsTrue (val is PrimitiveValue);
153 object v = (val as PrimitiveValue).Value;
154 Assert.AreEqual (type, v.GetType ());
156 Assert.IsTrue (Math.Abs ((float)eval - (float)v) < 0.0001);
157 else if (eval is double)
158 Assert.IsTrue (Math.Abs ((double)eval - (double)v) < 0.0001);
160 Assert.AreEqual (eval, v);
163 void AssertValue (object expected, object val) {
164 if (expected is string) {
165 Assert.IsTrue (val is StringMirror);
166 Assert.AreEqual (expected, (val as StringMirror).Value);
167 } else if (val is StructMirror && (val as StructMirror).Type.Name == "IntPtr") {
168 AssertValue (expected, (val as StructMirror).Fields [0]);
170 Assert.IsTrue (val is PrimitiveValue);
171 Assert.AreEqual (expected, (val as PrimitiveValue).Value);
176 public void SetUp () {
177 ThreadMirror.NativeTransitions = false;
178 Start (new string [] { "dtest-app.exe" });
182 public void TearDown () {
186 if (step_req != null)
194 Event e = GetNextEvent ();
196 if (e is VMDeathEvent)
205 public void SimpleBreakpoint () {
208 MethodMirror m = entry_point.DeclaringType.GetMethod ("bp1");
209 Assert.IsNotNull (m);
211 vm.SetBreakpoint (m, 0);
216 Assert.AreEqual (EventType.Breakpoint, e.EventType);
217 Assert.IsTrue (e is BreakpointEvent);
218 Assert.AreEqual (m.Name, (e as BreakpointEvent).Method.Name);
221 AssertThrows<ArgumentException> (delegate {
223 vm.SetBreakpoint (m, 2);
228 public void BreakpointsSameLocation () {
229 MethodMirror m = entry_point.DeclaringType.GetMethod ("bp2");
230 Assert.IsNotNull (m);
232 vm.SetBreakpoint (m, 0);
233 vm.SetBreakpoint (m, 0);
237 var es = vm.GetNextEventSet ();
238 Assert.AreEqual (2, es.Events.Length);
239 Assert.IsTrue (es [0] is BreakpointEvent);
240 Assert.AreEqual (m, (es [0] as BreakpointEvent).Method);
242 Assert.IsTrue (es [1] is BreakpointEvent);
243 Assert.AreEqual (m.Name, (es [1] as BreakpointEvent).Method.Name);
247 public void BreakpointAlreadyJITted () {
248 Event e = run_until ("bp1");
250 /* Place a breakpoint on bp3 */
251 MethodMirror m = entry_point.DeclaringType.GetMethod ("bp3");
252 Assert.IsNotNull (m);
253 vm.SetBreakpoint (m, 0);
255 /* Same with generic instances */
256 MethodMirror m2 = entry_point.DeclaringType.GetMethod ("bp7");
257 Assert.IsNotNull (m2);
258 vm.SetBreakpoint (m2, 0);
263 Assert.AreEqual (EventType.Breakpoint, e.EventType);
264 Assert.AreEqual (m.Name, (e as BreakpointEvent).Method.Name);
268 /* Non-shared instance */
270 Assert.AreEqual (EventType.Breakpoint, e.EventType);
271 Assert.AreEqual (m2.Name, (e as BreakpointEvent).Method.Name);
275 /* Shared instance */
277 Assert.AreEqual (EventType.Breakpoint, e.EventType);
278 Assert.AreEqual (m2.Name, (e as BreakpointEvent).Method.Name);
282 public void ClearBreakpoint () {
285 MethodMirror m = entry_point.DeclaringType.GetMethod ("bp4");
286 Assert.IsNotNull (m);
287 EventRequest req1 = vm.SetBreakpoint (m, 0);
288 EventRequest req2 = vm.SetBreakpoint (m, 0);
290 MethodMirror m2 = entry_point.DeclaringType.GetMethod ("bp5");
291 Assert.IsNotNull (m2);
292 vm.SetBreakpoint (m2, 0);
297 var es = vm.GetNextEventSet ();
298 Assert.AreEqual (2, es.Events.Length);
299 Assert.AreEqual (EventType.Breakpoint, es [0].EventType);
300 Assert.AreEqual (m.Name, (es [0] as BreakpointEvent).Method.Name);
301 Assert.AreEqual (EventType.Breakpoint, es [1].EventType);
302 Assert.AreEqual (m.Name, (es [1] as BreakpointEvent).Method.Name);
304 /* Clear one of them */
310 Assert.AreEqual (EventType.Breakpoint, e.EventType);
311 Assert.AreEqual (m.Name, (e as BreakpointEvent).Method.Name);
313 /* Clear the other */
319 Assert.AreEqual (EventType.Breakpoint, e.EventType);
320 Assert.AreEqual (m2.Name, (e as BreakpointEvent).Method.Name);
324 public void ClearAllBreakpoints () {
327 MethodMirror m = entry_point.DeclaringType.GetMethod ("bp4");
328 Assert.IsNotNull (m);
329 vm.SetBreakpoint (m, 0);
331 MethodMirror m2 = entry_point.DeclaringType.GetMethod ("bp5");
332 Assert.IsNotNull (m2);
333 vm.SetBreakpoint (m2, 0);
335 vm.ClearAllBreakpoints ();
340 Assert.IsTrue (!(e is BreakpointEvent));
341 if (e is VMDeathEvent)
346 public void BreakpointOnGShared () {
349 MethodMirror m = entry_point.DeclaringType.GetMethod ("bp6");
350 Assert.IsNotNull (m);
352 vm.SetBreakpoint (m, 0);
357 Assert.AreEqual (EventType.Breakpoint, e.EventType);
358 Assert.IsTrue (e is BreakpointEvent);
359 Assert.AreEqual (m.Name, (e as BreakpointEvent).Method.Name);
361 // Breakpoint on an open generic method of a closed generic class (#3422)
362 var frame = e.Thread.GetFrames ()[0];
363 var ginst = frame.GetValue (frame.Method.GetLocal ("gc"));
364 var m2 = (ginst as ObjectMirror).Type.GetMethod ("bp");
365 vm.SetBreakpoint (m2, 0);
370 Assert.AreEqual (EventType.Breakpoint, e.EventType);
371 Assert.IsTrue (e is BreakpointEvent);
372 Assert.AreEqual (m2.Name, (e as BreakpointEvent).Method.Name);
375 void assert_location (Event e, string method) {
376 Assert.IsTrue (e is StepEvent);
377 Assert.AreEqual (method, (e as StepEvent).Method.Name);
380 StepEventRequest create_step (Event e) {
381 var req = vm.CreateStepRequest (e.Thread);
387 public void SingleStepping () {
388 Event e = run_until ("single_stepping");
390 var req = create_step (e);
393 // Step over 'bool b = true'
395 assert_location (e, "single_stepping");
402 assert_location (e, "ss1");
409 assert_location (e, "single_stepping");
413 assert_location (e, "single_stepping");
417 assert_location (e, "ss3");
419 // Step back into single_stepping
421 assert_location (e, "single_stepping");
423 // Step into next line
425 assert_location (e, "single_stepping");
427 // Step into ss3_2 ()
429 assert_location (e, "ss3_2");
431 // Step over ss3_2_2 ()
433 assert_location (e, "ss3_2");
435 // Recreate the request
442 // Step back into single_stepping () with the new request
444 assert_location (e, "single_stepping");
448 assert_location (e, "ss4");
453 // Change to StepSize.Line
455 req.Depth = StepDepth.Over;
456 req.Size = StepSize.Line;
459 // Step over ss1 (); ss1 ();
464 req.Depth = StepDepth.Into;
468 assert_location (e, "ss2");
473 e = run_until ("ss5");
475 // Add an assembly filter
476 req.AssemblyFilter = new AssemblyMirror [] { (e as BreakpointEvent).Method.DeclaringType.Assembly };
482 // Step into is_even, skipping the linq stuff
484 assert_location (e, "is_even");
486 // FIXME: Check that single stepping works with lock (obj)
490 e = run_until ("ss6");
492 req = create_step (e);
493 req.Depth = StepDepth.Over;
496 // Check that single stepping works in out-of-line bblocks
499 assert_location (e, "ss6");
502 // Check that a step over stops at an EH clause
503 e = run_until ("ss7_2");
504 req = create_step (e);
505 req.Depth = StepDepth.Out;
508 assert_location (e, "ss7");
510 req = create_step (e);
511 req.Depth = StepDepth.Over;
514 assert_location (e, "ss7");
517 // Check that stepping stops between nested calls
518 e = run_until ("ss_nested_2");
520 assert_location (e, "ss_nested");
522 assert_location (e, "ss_nested_1");
524 assert_location (e, "ss_nested");
525 // Check that step over steps over nested calls
527 assert_location (e, "ss_nested");
529 assert_location (e, "ss_nested_3");
532 // Check DebuggerStepThrough support
533 e = run_until ("ss_step_through");
534 req = create_step (e);
535 req.Filter = StepFilter.DebuggerStepThrough;
537 // Step through step_through_1 ()
539 assert_location (e, "ss_step_through");
540 // Step through StepThroughClass.step_through_2 ()
542 assert_location (e, "ss_step_through");
544 req.Filter = StepFilter.None;
546 assert_location (e, "step_through_3");
549 // Check DebuggerNonUserCode support
550 e = run_until ("ss_non_user_code");
551 req = create_step (e);
552 req.Filter = StepFilter.DebuggerNonUserCode;
554 // Step through non_user_code_1 ()
556 assert_location (e, "ss_non_user_code");
557 // Step through StepThroughClass.non_user_code_2 ()
559 assert_location (e, "ss_non_user_code");
561 req.Filter = StepFilter.None;
563 assert_location (e, "non_user_code_3");
566 // Check that step-over doesn't stop at inner frames with recursive functions
567 e = run_until ("ss_recursive");
568 req = create_step (e);
572 var f = e.Thread.GetFrames () [0];
573 assert_location (e, "ss_recursive");
574 AssertValue (1, f.GetValue (f.Method.GetLocal ("n")));
577 // Check that single stepping doesn't clobber fp values
578 e = run_until ("ss_fp_clobber");
579 req = create_step (e);
581 f = e.Thread.GetFrames ()[0];
583 if ((e as StepEvent).Method.Name == "ss_fp_clobber_2")
587 f = e.Thread.GetFrames ()[0];
588 AssertValue (7.0, f.GetValue (f.Method.GetParameters ()[0]));
593 public void MethodEntryExit () {
594 run_until ("single_stepping");
596 var req1 = vm.CreateMethodEntryRequest ();
597 var req2 = vm.CreateMethodExitRequest ();
603 Event e = GetNextEvent ();
604 Assert.IsTrue (e is MethodEntryEvent);
605 Assert.AreEqual ("ss1", (e as MethodEntryEvent).Method.Name);
609 Assert.IsTrue (e is MethodExitEvent);
610 Assert.AreEqual ("ss1", (e as MethodExitEvent).Method.Name);
617 public void CountFilter () {
618 run_until ("single_stepping");
620 MethodMirror m2 = entry_point.DeclaringType.GetMethod ("ss3");
621 Assert.IsNotNull (m2);
622 vm.SetBreakpoint (m2, 0);
624 var req1 = vm.CreateMethodEntryRequest ();
628 // Enter ss2, ss1 is skipped
630 Event e = GetNextEvent ();
631 Assert.IsTrue (e is MethodEntryEvent);
632 Assert.AreEqual ("ss2", (e as MethodEntryEvent).Method.Name);
634 // Breakpoint on ss3, the entry event is no longer reported
637 Assert.IsTrue (e is BreakpointEvent);
643 public void Arguments () {
646 var e = run_until ("arg1");
648 StackFrame frame = e.Thread.GetFrames () [0];
650 check_arg_val (frame, 0, typeof (sbyte), SByte.MaxValue - 5);
651 check_arg_val (frame, 1, typeof (byte), Byte.MaxValue - 5);
652 check_arg_val (frame, 2, typeof (bool), true);
653 check_arg_val (frame, 3, typeof (short), Int16.MaxValue - 5);
654 check_arg_val (frame, 4, typeof (ushort), UInt16.MaxValue - 5);
655 check_arg_val (frame, 5, typeof (char), 'F');
656 check_arg_val (frame, 6, typeof (int), Int32.MaxValue - 5);
657 check_arg_val (frame, 7, typeof (uint), UInt32.MaxValue - 5);
658 check_arg_val (frame, 8, typeof (long), Int64.MaxValue - 5);
659 check_arg_val (frame, 9, typeof (ulong), UInt64.MaxValue - 5);
660 check_arg_val (frame, 10, typeof (float), 1.2345f);
661 check_arg_val (frame, 11, typeof (double), 6.78910);
663 e = run_until ("arg2");
665 frame = e.Thread.GetFrames () [0];
668 val = frame.GetArgument (0);
669 AssertValue ("FOO", val);
670 Assert.AreEqual ("String", (val as ObjectMirror).Type.Name);
673 val = frame.GetArgument (1);
674 AssertValue (null, val);
677 val = frame.GetArgument (2);
678 AssertValue ("BLA", val);
681 val = frame.GetArgument (3);
682 AssertValue (42, val);
685 val = frame.GetArgument (4);
686 Assert.IsTrue (val is ObjectMirror);
687 Assert.AreEqual ("GClass`1", (val as ObjectMirror).Type.Name);
690 val = frame.GetArgument (5);
691 Assert.IsTrue (val is ObjectMirror);
692 Assert.AreEqual ("Object", (val as ObjectMirror).Type.Name);
694 // this on static methods
695 val = frame.GetThis ();
696 AssertValue (null, val);
698 e = run_until ("arg3");
700 frame = e.Thread.GetFrames () [0];
703 val = frame.GetThis ();
704 Assert.IsTrue (val is ObjectMirror);
705 Assert.AreEqual ("Tests", (val as ObjectMirror).Type.Name);
707 // objref in register
708 val = frame.GetArgument (0);
709 AssertValue ("BLA", val);
713 public void Arrays () {
716 var e = run_until ("o2");
718 StackFrame frame = e.Thread.GetFrames () [0];
721 val = frame.GetArgument (0);
722 Assert.IsTrue (val is ArrayMirror);
723 ArrayMirror arr = val as ArrayMirror;
724 Assert.AreEqual (2, arr.Length);
725 AssertValue ("BAR", arr [0]);
726 AssertValue ("BAZ", arr [1]);
728 var vals = arr.GetValues (0, 2);
729 Assert.AreEqual (2, vals.Count);
730 AssertValue ("BAR", vals [0]);
731 AssertValue ("BAZ", vals [1]);
733 arr [0] = vm.RootDomain.CreateString ("ABC");
734 AssertValue ("ABC", arr [0]);
736 arr [0] = vm.CreateValue (null);
737 AssertValue (null, arr [0]);
739 arr.SetValues (0, new Value [] { vm.RootDomain.CreateString ("D1"), vm.RootDomain.CreateString ("D2") });
740 AssertValue ("D1", arr [0]);
741 AssertValue ("D2", arr [1]);
744 val = frame.GetArgument (1);
745 Assert.IsTrue (val is ArrayMirror);
746 arr = val as ArrayMirror;
747 Assert.AreEqual (2, arr.Length);
748 AssertValue (42, arr [0]);
749 AssertValue (43, arr [1]);
752 AssertThrows<IndexOutOfRangeException> (delegate () {
756 AssertThrows<IndexOutOfRangeException> (delegate () {
757 val = arr [Int32.MinValue];
760 AssertThrows<IndexOutOfRangeException> (delegate () {
761 vals = arr.GetValues (0, 3);
764 AssertThrows<IndexOutOfRangeException> (delegate () {
765 arr [2] = vm.CreateValue (null);
768 AssertThrows<IndexOutOfRangeException> (delegate () {
769 arr [Int32.MinValue] = vm.CreateValue (null);
772 AssertThrows<IndexOutOfRangeException> (delegate () {
773 arr.SetValues (0, new Value [] { null, null, null });
777 val = frame.GetArgument (2);
778 Assert.IsTrue (val is ArrayMirror);
779 arr = val as ArrayMirror;
780 Assert.AreEqual (2, arr.Rank);
781 Assert.AreEqual (4, arr.Length);
782 Assert.AreEqual (2, arr.GetLength (0));
783 Assert.AreEqual (2, arr.GetLength (1));
784 Assert.AreEqual (0, arr.GetLowerBound (0));
785 Assert.AreEqual (0, arr.GetLowerBound (1));
786 vals = arr.GetValues (0, 4);
787 AssertValue (1, vals [0]);
788 AssertValue (2, vals [1]);
789 AssertValue (3, vals [2]);
790 AssertValue (4, vals [3]);
792 val = frame.GetArgument (3);
793 Assert.IsTrue (val is ArrayMirror);
794 arr = val as ArrayMirror;
795 Assert.AreEqual (2, arr.Rank);
796 Assert.AreEqual (4, arr.Length);
797 Assert.AreEqual (2, arr.GetLength (0));
798 Assert.AreEqual (2, arr.GetLength (1));
799 Assert.AreEqual (1, arr.GetLowerBound (0));
800 Assert.AreEqual (3, arr.GetLowerBound (1));
802 AssertThrows<ArgumentOutOfRangeException> (delegate () {
805 AssertThrows<ArgumentOutOfRangeException> (delegate () {
809 AssertThrows<ArgumentOutOfRangeException> (delegate () {
810 arr.GetLowerBound (-1);
812 AssertThrows<ArgumentOutOfRangeException> (delegate () {
813 arr.GetLowerBound (2);
816 // arrays treated as generic collections
817 val = frame.GetArgument (4);
818 Assert.IsTrue (val is ArrayMirror);
819 arr = val as ArrayMirror;
823 public void Object_GetValue () {
824 var e = run_until ("o1");
825 var frame = e.Thread.GetFrames () [0];
827 object val = frame.GetThis ();
828 Assert.IsTrue (val is ObjectMirror);
829 Assert.AreEqual ("Tests", (val as ObjectMirror).Type.Name);
830 ObjectMirror o = (val as ObjectMirror);
832 TypeMirror t = o.Type;
835 object f = o.GetValue (t.GetField ("field_i"));
837 f = o.GetValue (t.GetField ("field_s"));
838 AssertValue ("S", f);
839 f = o.GetValue (t.GetField ("field_enum"));
840 Assert.IsTrue (f is EnumMirror);
841 Assert.AreEqual (1, (f as EnumMirror).Value);
842 Assert.AreEqual ("B", (f as EnumMirror).StringValue);
844 // Inherited object fields
845 TypeMirror parent = t.BaseType;
846 f = o.GetValue (parent.GetField ("base_field_i"));
848 f = o.GetValue (parent.GetField ("base_field_s"));
849 AssertValue ("T", f);
852 f = o.GetValue (o.Type.GetField ("static_i"));
856 ObjectMirror o2 = frame.GetValue (frame.Method.GetParameters ()[1]) as ObjectMirror;
857 Assert.AreEqual ("GClass`1", o2.Type.Name);
858 TypeMirror t2 = o2.Type;
859 f = o2.GetValue (t2.GetField ("field"));
862 ObjectMirror o3 = frame.GetValue (frame.Method.GetParameters ()[2]) as ObjectMirror;
863 Assert.AreEqual ("GClass`1", o3.Type.Name);
864 TypeMirror t3 = o3.Type;
865 f = o3.GetValue (t3.GetField ("field"));
866 AssertValue ("FOO", f);
869 AssertThrows<ArgumentNullException> (delegate () {
875 public void Object_GetValues () {
876 var e = run_until ("o1");
877 var frame = e.Thread.GetFrames () [0];
879 object val = frame.GetThis ();
880 Assert.IsTrue (val is ObjectMirror);
881 Assert.AreEqual ("Tests", (val as ObjectMirror).Type.Name);
882 ObjectMirror o = (val as ObjectMirror);
884 ObjectMirror val2 = frame.GetValue (frame.Method.GetParameters ()[0]) as ObjectMirror;
886 TypeMirror t = o.Type;
888 object[] vals = o.GetValues (new FieldInfoMirror [] { t.GetField ("field_i"), t.GetField ("field_s") });
892 AssertValue ("S", f);
895 AssertThrows<ArgumentNullException> (delegate () {
899 AssertThrows<ArgumentNullException> (delegate () {
900 o.GetValues (new FieldInfoMirror [] { null });
903 // field of another class
904 AssertThrows<ArgumentException> (delegate () {
905 o.GetValue (val2.Type.GetField ("field_j"));
909 void TestSetValue (ObjectMirror o, string field_name, object val) {
911 o.SetValue (o.Type.GetField (field_name), vm.RootDomain.CreateString ((string)val));
913 o.SetValue (o.Type.GetField (field_name), vm.CreateValue (val));
914 Value f = o.GetValue (o.Type.GetField (field_name));
915 AssertValue (val, f);
919 public void Object_SetValues () {
920 var e = run_until ("o1");
921 var frame = e.Thread.GetFrames () [0];
923 object val = frame.GetThis ();
924 Assert.IsTrue (val is ObjectMirror);
925 Assert.AreEqual ("Tests", (val as ObjectMirror).Type.Name);
926 ObjectMirror o = (val as ObjectMirror);
928 ObjectMirror val2 = frame.GetValue (frame.Method.GetParameters ()[0]) as ObjectMirror;
930 TestSetValue (o, "field_i", 22);
931 TestSetValue (o, "field_bool1", false);
932 TestSetValue (o, "field_bool2", true);
933 TestSetValue (o, "field_char", 'B');
934 TestSetValue (o, "field_byte", (byte)129);
935 TestSetValue (o, "field_sbyte", (sbyte)-33);
936 TestSetValue (o, "field_short", (short)(Int16.MaxValue - 5));
937 TestSetValue (o, "field_ushort", (ushort)(UInt16.MaxValue - 5));
938 TestSetValue (o, "field_long", Int64.MaxValue - 5);
939 TestSetValue (o, "field_ulong", (ulong)(UInt64.MaxValue - 5));
940 TestSetValue (o, "field_float", 6.28f);
941 TestSetValue (o, "field_double", 6.28);
942 TestSetValue (o, "static_i", 23);
943 TestSetValue (o, "field_s", "CDEF");
948 f = o.GetValue (o.Type.GetField ("field_intptr"));
949 Assert.IsInstanceOfType (typeof (StructMirror), f);
950 AssertValue (Int32.MaxValue - 5, (f as StructMirror).Fields [0]);
953 FieldInfoMirror field = o.Type.GetField ("field_enum");
954 f = o.GetValue (field);
955 (f as EnumMirror).Value = 5;
956 o.SetValue (field, f);
957 f = o.GetValue (field);
958 Assert.AreEqual (5, (f as EnumMirror).Value);
961 o.SetValue (o.Type.GetField ("field_s"), vm.CreateValue (null));
962 f = o.GetValue (o.Type.GetField ("field_s"));
963 AssertValue (null, f);
966 field = o.Type.GetField ("generic_field_struct");
967 f = o.GetValue (field);
968 o.SetValue (field, f);
971 field = o.Type.GetField ("field_nullable");
972 f = o.GetValue (field);
973 AssertValue (0, (f as StructMirror).Fields [0]);
974 AssertValue (false, (f as StructMirror).Fields [1]);
975 o.SetValue (field, vm.CreateValue (6));
976 f = o.GetValue (field);
977 AssertValue (6, (f as StructMirror).Fields [0]);
978 AssertValue (true, (f as StructMirror).Fields [1]);
979 o.SetValue (field, vm.CreateValue (null));
980 f = o.GetValue (field);
981 AssertValue (0, (f as StructMirror).Fields [0]);
982 AssertValue (false, (f as StructMirror).Fields [1]);
985 AssertThrows<ArgumentNullException> (delegate () {
986 o.SetValues (null, new Value [0]);
989 AssertThrows<ArgumentNullException> (delegate () {
990 o.SetValues (new FieldInfoMirror [0], null);
993 AssertThrows<ArgumentNullException> (delegate () {
994 o.SetValues (new FieldInfoMirror [] { null }, new Value [1] { null });
997 // vtype with a wrong type
998 AssertThrows<ArgumentException> (delegate () {
999 o.SetValue (o.Type.GetField ("field_struct"), o.GetValue (o.Type.GetField ("field_enum")));
1002 // reference type not assignment compatible
1003 AssertThrows<ArgumentException> (delegate () {
1004 o.SetValue (o.Type.GetField ("field_class"), o);
1007 // field of another class
1008 AssertThrows<ArgumentException> (delegate () {
1009 o.SetValue (val2.Type.GetField ("field_j"), vm.CreateValue (1));
1014 public void Type_SetValue () {
1015 var e = run_until ("o1");
1016 var frame = e.Thread.GetFrames () [0];
1019 object val = frame.GetThis ();
1020 Assert.IsTrue (val is ObjectMirror);
1021 Assert.AreEqual ("Tests", (val as ObjectMirror).Type.Name);
1022 ObjectMirror o = (val as ObjectMirror);
1024 ObjectMirror val2 = frame.GetValue (frame.Method.GetParameters ()[0]) as ObjectMirror;
1026 o.Type.SetValue (o.Type.GetField ("static_i"), vm.CreateValue (55));
1027 f = o.Type.GetValue (o.Type.GetField ("static_i"));
1028 AssertValue (55, f);
1030 o.Type.SetValue (o.Type.GetField ("static_s"), vm.RootDomain.CreateString ("B"));
1031 f = o.Type.GetValue (o.Type.GetField ("static_s"));
1032 AssertValue ("B", f);
1034 // Argument checking
1035 AssertThrows<ArgumentNullException> (delegate () {
1036 o.Type.SetValue (null, vm.CreateValue (0));
1039 AssertThrows<ArgumentNullException> (delegate () {
1040 o.Type.SetValue (o.Type.GetField ("static_i"), null);
1043 // field of another class
1044 AssertThrows<ArgumentException> (delegate () {
1045 o.SetValue (val2.Type.GetField ("field_j"), vm.CreateValue (1));
1050 public void TypeInfo () {
1051 Event e = run_until ("ti2");
1052 StackFrame frame = e.Thread.GetFrames () [0];
1057 t = frame.Method.GetParameters ()[0].ParameterType;
1059 Assert.AreEqual ("String[]", t.Name);
1060 Assert.AreEqual ("string[]", t.CSharpName);
1061 Assert.AreEqual ("Array", t.BaseType.Name);
1062 Assert.AreEqual (true, t.HasElementType);
1063 Assert.AreEqual (true, t.IsArray);
1064 Assert.AreEqual (1, t.GetArrayRank ());
1065 Assert.AreEqual ("String", t.GetElementType ().Name);
1067 t = frame.Method.GetParameters ()[2].ParameterType;
1069 Assert.AreEqual ("Int32[,]", t.Name);
1071 //Assert.AreEqual ("int[,]", t.CSharpName);
1072 Assert.AreEqual ("Array", t.BaseType.Name);
1073 Assert.AreEqual (true, t.HasElementType);
1074 Assert.AreEqual (true, t.IsArray);
1075 Assert.AreEqual (2, t.GetArrayRank ());
1076 Assert.AreEqual ("Int32", t.GetElementType ().Name);
1079 t = frame.Method.GetParameters ()[3].ParameterType;
1081 //Assert.AreEqual ("Int32&", t.Name);
1082 //Assert.AreEqual (true, t.IsByRef);
1083 //Assert.AreEqual (true, t.HasElementType);
1086 t = frame.Method.GetParameters ()[4].ParameterType;
1088 //Assert.AreEqual ("Int32*", t.Name);
1089 Assert.AreEqual (true, t.IsPointer);
1090 Assert.AreEqual (true, t.HasElementType);
1091 Assert.AreEqual ("Int32", t.GetElementType ().Name);
1092 Assert.AreEqual (false, t.IsPrimitive);
1095 t = frame.Method.GetParameters ()[5].ParameterType;
1096 Assert.AreEqual (true, t.IsPrimitive);
1099 t = frame.Method.GetParameters ()[6].ParameterType;
1100 Assert.AreEqual ("AStruct", t.Name);
1101 Assert.AreEqual (false, t.IsPrimitive);
1102 Assert.AreEqual (true, t.IsValueType);
1103 Assert.AreEqual (false, t.IsClass);
1106 t = frame.Method.GetParameters ()[7].ParameterType;
1107 Assert.AreEqual ("Tests", t.Name);
1108 var nested = (from nt in t.GetNestedTypes () where nt.IsNestedPublic select nt).ToArray ();
1109 Assert.AreEqual (1, nested.Length);
1110 Assert.AreEqual ("NestedClass", nested [0].Name);
1111 Assert.IsTrue (t.BaseType.IsAssignableFrom (t));
1112 Assert.IsTrue (!t.IsAssignableFrom (t.BaseType));
1114 // generic instances
1115 t = frame.Method.GetParameters ()[9].ParameterType;
1116 Assert.AreEqual ("GClass`1", t.Name);
1117 Assert.IsTrue (t.IsGenericType);
1118 Assert.IsFalse (t.IsGenericTypeDefinition);
1120 var args = t.GetGenericArguments ();
1121 Assert.AreEqual (1, args.Length);
1122 Assert.AreEqual ("Int32", args [0].Name);
1124 // generic type definitions
1125 var gtd = t.GetGenericTypeDefinition ();
1126 Assert.AreEqual ("GClass`1", gtd.Name);
1127 Assert.IsTrue (gtd.IsGenericType);
1128 Assert.IsTrue (gtd.IsGenericTypeDefinition);
1129 Assert.AreEqual (gtd, gtd.GetGenericTypeDefinition ());
1131 args = gtd.GetGenericArguments ();
1132 Assert.AreEqual (1, args.Length);
1133 Assert.AreEqual ("T", args [0].Name);
1136 t = frame.Method.GetParameters ()[10].ParameterType;
1137 Assert.AreEqual ("AnEnum", t.Name);
1138 Assert.IsTrue (t.IsEnum);
1139 Assert.AreEqual ("Int32", t.EnumUnderlyingType.Name);
1142 t = frame.Method.GetParameters ()[7].ParameterType;
1144 var props = t.GetProperties ();
1145 Assert.AreEqual (3, props.Length);
1146 foreach (PropertyInfoMirror prop in props) {
1147 ParameterInfoMirror[] indexes = prop.GetIndexParameters ();
1149 if (prop.Name == "IntProperty") {
1150 Assert.AreEqual ("Int32", prop.PropertyType.Name);
1151 Assert.AreEqual ("get_IntProperty", prop.GetGetMethod ().Name);
1152 Assert.AreEqual ("set_IntProperty", prop.GetSetMethod ().Name);
1153 Assert.AreEqual (0, indexes.Length);
1154 } else if (prop.Name == "ReadOnlyProperty") {
1155 Assert.AreEqual ("Int32", prop.PropertyType.Name);
1156 Assert.AreEqual ("get_ReadOnlyProperty", prop.GetGetMethod ().Name);
1157 Assert.AreEqual (null, prop.GetSetMethod ());
1158 Assert.AreEqual (0, indexes.Length);
1159 } else if (prop.Name == "IndexedProperty") {
1160 Assert.AreEqual (1, indexes.Length);
1161 Assert.AreEqual ("Int32", indexes [0].ParameterType.Name);
1165 // custom attributes
1166 t = frame.Method.GetParameters ()[8].ParameterType;
1167 Assert.AreEqual ("Tests2", t.Name);
1168 var attrs = t.GetCustomAttributes (true);
1169 Assert.AreEqual (5, attrs.Length);
1170 foreach (var attr in attrs) {
1171 if (attr.Constructor.DeclaringType.Name == "DebuggerDisplayAttribute") {
1172 Assert.AreEqual (1, attr.ConstructorArguments.Count);
1173 Assert.AreEqual ("Tests", attr.ConstructorArguments [0].Value);
1174 Assert.AreEqual (2, attr.NamedArguments.Count);
1175 Assert.AreEqual ("Name", attr.NamedArguments [0].Property.Name);
1176 Assert.AreEqual ("FOO", attr.NamedArguments [0].TypedValue.Value);
1177 Assert.AreEqual ("Target", attr.NamedArguments [1].Property.Name);
1178 Assert.IsInstanceOfType (typeof (TypeMirror), attr.NamedArguments [1].TypedValue.Value);
1179 Assert.AreEqual ("Int32", (attr.NamedArguments [1].TypedValue.Value as TypeMirror).Name);
1180 } else if (attr.Constructor.DeclaringType.Name == "DebuggerTypeProxyAttribute") {
1181 Assert.AreEqual (1, attr.ConstructorArguments.Count);
1182 Assert.IsInstanceOfType (typeof (TypeMirror), attr.ConstructorArguments [0].Value);
1183 Assert.AreEqual ("Tests", (attr.ConstructorArguments [0].Value as TypeMirror).Name);
1184 } else if (attr.Constructor.DeclaringType.Name == "BAttribute") {
1185 Assert.AreEqual (2, attr.NamedArguments.Count);
1186 Assert.AreEqual ("afield", attr.NamedArguments [0].Field.Name);
1187 Assert.AreEqual ("bfield", attr.NamedArguments [1].Field.Name);
1188 } else if (attr.Constructor.DeclaringType.Name == "ClassInterfaceAttribute") {
1189 // inherited from System.Object
1190 //} else if (attr.Constructor.DeclaringType.Name == "Serializable") {
1191 // inherited from System.Object
1192 } else if (attr.Constructor.DeclaringType.Name == "ComVisibleAttribute") {
1193 // inherited from System.Object
1195 Assert.Fail (attr.Constructor.DeclaringType.Name);
1199 var assembly = entry_point.DeclaringType.Assembly;
1200 var type = assembly.GetType ("Tests4");
1201 Assert.IsFalse (type.IsInitialized);
1205 public void FieldInfo () {
1206 Event e = run_until ("ti2");
1207 StackFrame frame = e.Thread.GetFrames () [0];
1211 t = frame.Method.GetParameters ()[8].ParameterType;
1212 Assert.AreEqual ("Tests2", t.Name);
1214 var fi = t.GetField ("field_j");
1215 var attrs = fi.GetCustomAttributes (true);
1216 Assert.AreEqual (1, attrs.Length);
1217 var attr = attrs [0];
1218 Assert.AreEqual ("DebuggerBrowsableAttribute", attr.Constructor.DeclaringType.Name);
1219 Assert.AreEqual (1, attr.ConstructorArguments.Count);
1220 Assert.IsInstanceOfType (typeof (EnumMirror), attr.ConstructorArguments [0].Value);
1221 Assert.AreEqual ((int)System.Diagnostics.DebuggerBrowsableState.Collapsed, (attr.ConstructorArguments [0].Value as EnumMirror).Value);
1225 public void PropertyInfo () {
1226 Event e = run_until ("ti2");
1227 StackFrame frame = e.Thread.GetFrames () [0];
1231 t = frame.Method.GetParameters ()[8].ParameterType;
1232 Assert.AreEqual ("Tests2", t.Name);
1234 var pi = t.GetProperty ("AProperty");
1235 var attrs = pi.GetCustomAttributes (true);
1236 Assert.AreEqual (1, attrs.Length);
1237 var attr = attrs [0];
1238 Assert.AreEqual ("DebuggerBrowsableAttribute", attr.Constructor.DeclaringType.Name);
1239 Assert.AreEqual (1, attr.ConstructorArguments.Count);
1240 Assert.IsInstanceOfType (typeof (EnumMirror), attr.ConstructorArguments [0].Value);
1241 Assert.AreEqual ((int)System.Diagnostics.DebuggerBrowsableState.Collapsed, (attr.ConstructorArguments [0].Value as EnumMirror).Value);
1245 [Category ("only5")]
1246 public void Type_GetValue () {
1247 Event e = run_until ("o1");
1248 StackFrame frame = e.Thread.GetFrames () [0];
1250 ObjectMirror o = (frame.GetThis () as ObjectMirror);
1252 TypeMirror t = o.Type;
1254 ObjectMirror val2 = frame.GetValue (frame.Method.GetParameters ()[0]) as ObjectMirror;
1257 object f = t.GetValue (o.Type.GetField ("static_i"));
1258 AssertValue (55, f);
1260 f = t.GetValue (o.Type.GetField ("static_s"));
1261 AssertValue ("A", f);
1263 // literal static fields
1264 f = t.GetValue (o.Type.GetField ("literal_i"));
1265 AssertValue (56, f);
1267 f = t.GetValue (o.Type.GetField ("literal_s"));
1268 AssertValue ("B", f);
1270 // Inherited static fields
1271 TypeMirror parent = t.BaseType;
1272 f = t.GetValue (parent.GetField ("base_static_i"));
1273 AssertValue (57, f);
1275 f = t.GetValue (parent.GetField ("base_static_s"));
1276 AssertValue ("C", f);
1278 // thread static field
1279 f = t.GetValue (t.GetField ("tls_i"), e.Thread);
1280 AssertValue (42, f);
1282 // Argument checking
1283 AssertThrows<ArgumentNullException> (delegate () {
1288 AssertThrows<ArgumentException> (delegate () {
1289 t.GetValue (o.Type.GetField ("field_i"));
1292 // field on another type
1293 AssertThrows<ArgumentException> (delegate () {
1294 t.GetValue (val2.Type.GetField ("static_field_j"));
1297 // special static field
1298 AssertThrows<ArgumentException> (delegate () {
1299 t.GetValue (t.GetField ("tls_i"));
1304 public void Type_GetValues () {
1305 Event e = run_until ("o1");
1306 StackFrame frame = e.Thread.GetFrames () [0];
1308 ObjectMirror o = (frame.GetThis () as ObjectMirror);
1310 TypeMirror t = o.Type;
1313 object[] vals = t.GetValues (new FieldInfoMirror [] { t.GetField ("static_i"), t.GetField ("static_s") });
1314 object f = vals [0];
1315 AssertValue (55, f);
1318 AssertValue ("A", f);
1320 // Argument checking
1321 AssertThrows<ArgumentNullException> (delegate () {
1325 AssertThrows<ArgumentNullException> (delegate () {
1326 t.GetValues (new FieldInfoMirror [] { null });
1331 public void ObjRefs () {
1332 Event e = run_until ("objrefs1");
1333 StackFrame frame = e.Thread.GetFrames () [0];
1335 ObjectMirror o = frame.GetThis () as ObjectMirror;
1336 ObjectMirror child = o.GetValue (o.Type.GetField ("child")) as ObjectMirror;
1338 Assert.IsTrue (child.Address != 0);
1340 // Check that object references are internalized correctly
1341 Assert.AreEqual (o, frame.GetThis ());
1343 run_until ("objrefs2");
1345 // child should be gc'd now
1346 // This is not deterministic
1347 //Assert.IsTrue (child.IsCollected);
1350 * No longer works since Type is read eagerly
1353 AssertThrows<ObjectCollectedException> (delegate () {
1354 TypeMirror t = child.Type;
1358 AssertThrows<ObjectCollectedException> (delegate () {
1359 long addr = child.Address;
1365 public void Type_GetObject () {
1366 Event e = run_until ("o1");
1367 StackFrame frame = e.Thread.GetFrames () [0];
1369 ObjectMirror o = (frame.GetThis () as ObjectMirror);
1371 TypeMirror t = o.Type;
1373 Assert.AreEqual ("MonoType", t.GetTypeObject ().Type.Name);
1377 public void VTypes () {
1378 Event e = run_until ("vtypes1");
1379 StackFrame frame = e.Thread.GetFrames () [0];
1382 ObjectMirror o = frame.GetThis () as ObjectMirror;
1383 var obj = o.GetValue (o.Type.GetField ("field_struct"));
1384 Assert.IsTrue (obj is StructMirror);
1385 var s = obj as StructMirror;
1386 Assert.AreEqual ("AStruct", s.Type.Name);
1387 AssertValue (42, s ["i"]);
1389 AssertValue ("S", obj);
1390 AssertValue (43, s ["k"]);
1391 obj = o.GetValue (o.Type.GetField ("field_boxed_struct"));
1392 Assert.IsTrue (obj is StructMirror);
1393 s = obj as StructMirror;
1394 Assert.AreEqual ("AStruct", s.Type.Name);
1395 AssertValue (42, s ["i"]);
1397 // Check decoding of nested structs (#14942)
1398 obj = o.GetValue (o.Type.GetField ("nested_struct"));
1399 o.SetValue (o.Type.GetField ("nested_struct"), obj);
1401 // Check round tripping of boxed struct fields (#12354)
1402 obj = o.GetValue (o.Type.GetField ("boxed_struct_field"));
1403 o.SetValue (o.Type.GetField ("boxed_struct_field"), obj);
1404 obj = o.GetValue (o.Type.GetField ("boxed_struct_field"));
1405 s = obj as StructMirror;
1406 AssertValue (1, s ["key"]);
1408 Assert.IsTrue (obj is StructMirror);
1409 s = obj as StructMirror;
1410 AssertValue (42, s ["m_value"]);
1412 // vtypes as arguments
1413 s = frame.GetArgument (0) as StructMirror;
1414 AssertValue (44, s ["i"]);
1416 AssertValue ("T", obj);
1417 AssertValue (45, s ["k"]);
1419 // vtypes as array entries
1420 var arr = frame.GetArgument (1) as ArrayMirror;
1422 Assert.IsTrue (obj is StructMirror);
1423 s = obj as StructMirror;
1424 AssertValue (1, s ["i"]);
1425 AssertValue ("S1", s ["s"]);
1427 Assert.IsTrue (obj is StructMirror);
1428 s = obj as StructMirror;
1429 AssertValue (2, s ["i"]);
1430 AssertValue ("S2", s ["s"]);
1432 // Argument checking
1433 s = frame.GetArgument (0) as StructMirror;
1434 AssertThrows<ArgumentException> (delegate () {
1438 // generic vtype instances
1439 o = frame.GetThis () as ObjectMirror;
1440 obj = o.GetValue (o.Type.GetField ("generic_field_struct"));
1441 Assert.IsTrue (obj is StructMirror);
1442 s = obj as StructMirror;
1443 Assert.AreEqual ("GStruct`1", s.Type.Name);
1444 AssertValue (42, s ["i"]);
1446 // this on vtype methods
1447 e = run_until ("vtypes2");
1448 e = step_until (e.Thread, "foo");
1450 frame = e.Thread.GetFrames () [0];
1452 Assert.AreEqual ("foo", (e as StepEvent).Method.Name);
1453 obj = frame.GetThis ();
1455 Assert.IsTrue (obj is StructMirror);
1456 s = obj as StructMirror;
1457 AssertValue (44, s ["i"]);
1458 AssertValue ("T", s ["s"]);
1459 AssertValue (45, s ["k"]);
1461 // this on static vtype methods
1462 e = run_until ("vtypes3");
1463 e = step_until (e.Thread, "static_foo");
1465 frame = e.Thread.GetFrames () [0];
1467 Assert.AreEqual ("static_foo", (e as StepEvent).Method.Name);
1468 obj = frame.GetThis ();
1469 AssertValue (null, obj);
1471 // vtypes which reference themselves recursively
1472 e = run_until ("vtypes4_2");
1473 frame = e.Thread.GetFrames () [0];
1475 Assert.IsTrue (frame.GetArgument (0) is StructMirror);
1479 public void AssemblyInfo () {
1480 Event e = run_until ("single_stepping");
1482 StackFrame frame = e.Thread.GetFrames () [0];
1484 var aname = frame.Method.DeclaringType.Assembly.GetName ();
1485 Assert.AreEqual ("dtest-app, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null", aname.ToString ());
1487 ModuleMirror m = frame.Method.DeclaringType.Module;
1489 Assert.AreEqual ("dtest-app.exe", m.Name);
1490 Assert.AreEqual ("dtest-app.exe", m.ScopeName);
1491 Assert.IsTrue (m.FullyQualifiedName.IndexOf ("dtest-app.exe") != -1);
1492 Guid guid = m.ModuleVersionId;
1493 Assert.AreEqual (frame.Method.DeclaringType.Assembly, m.Assembly);
1494 Assert.AreEqual (frame.Method.DeclaringType.Assembly.ManifestModule, m);
1496 // This is no longer true on 4.0
1497 //Assert.AreEqual ("Assembly", frame.Method.DeclaringType.Assembly.GetAssemblyObject ().Type.Name);
1499 TypeMirror t = vm.RootDomain.Corlib.GetType ("System.Diagnostics.DebuggerDisplayAttribute");
1500 Assert.AreEqual ("DebuggerDisplayAttribute", t.Name);
1504 public void LocalsInfo () {
1505 Event e = run_until ("locals2");
1507 StackFrame frame = e.Thread.GetFrames () [0];
1509 var locals = frame.Method.GetLocals ();
1510 Assert.AreEqual (8, locals.Length);
1511 for (int i = 0; i < 8; ++i) {
1512 if (locals [i].Name == "args") {
1513 Assert.IsTrue (locals [i].IsArg);
1514 Assert.AreEqual ("String[]", locals [i].Type.Name);
1515 } else if (locals [i].Name == "arg") {
1516 Assert.IsTrue (locals [i].IsArg);
1517 Assert.AreEqual ("Int32", locals [i].Type.Name);
1518 } else if (locals [i].Name == "i") {
1519 Assert.IsFalse (locals [i].IsArg);
1520 Assert.AreEqual ("Int64", locals [i].Type.Name);
1521 } else if (locals [i].Name == "j") {
1522 Assert.IsFalse (locals [i].IsArg);
1523 Assert.AreEqual ("Int32", locals [i].Type.Name);
1524 } else if (locals [i].Name == "s") {
1525 Assert.IsFalse (locals [i].IsArg);
1526 Assert.AreEqual ("String", locals [i].Type.Name);
1527 } else if (locals [i].Name == "t") {
1529 Assert.IsTrue (locals [i].IsArg);
1530 Assert.AreEqual ("String", locals [i].Type.Name);
1531 } else if (locals [i].Name == "rs") {
1532 Assert.IsTrue (locals [i].IsArg);
1533 Assert.AreEqual ("String", locals [i].Type.Name);
1534 } else if (locals [i].Name == "astruct") {
1541 Event step_once () {
1543 var e = GetNextEvent ();
1544 Assert.IsTrue (e is StepEvent);
1548 Event step_into () {
1549 step_req.Disable ();
1550 step_req.Depth = StepDepth.Into;
1552 return step_once ();
1555 Event step_over () {
1556 step_req.Disable ();
1557 step_req.Depth = StepDepth.Over;
1559 return step_once ();
1563 step_req.Disable ();
1564 step_req.Depth = StepDepth.Out;
1566 return step_once ();
1570 public void Locals () {
1571 var be = run_until ("locals1");
1573 StackFrame frame = be.Thread.GetFrames () [0];
1574 MethodMirror m1 = frame.Method;
1576 // Compiler generated byref local
1577 foreach (var l in m1.GetLocals ()) {
1578 // The byval flag is hidden from the type
1579 if (l.Name != "ri" && l.Type.Name == "Double")
1580 AssertValue (null, frame.GetValue (l));
1583 be = run_until ("locals2");
1585 frame = be.Thread.GetFrames () [0];
1587 object val = frame.GetValue (frame.Method.GetLocal ("i"));
1588 AssertValue (0, val);
1590 var req = create_step (be);
1597 var e = step_once ();
1598 Assert.AreEqual ("locals2", (e as StepEvent).Method.Name);
1600 // Execute s = "AB";
1602 Assert.AreEqual ("locals2", (e as StepEvent).Method.Name);
1604 frame = e.Thread.GetFrames () [0];
1606 val = frame.GetValue (frame.Method.GetLocal ("i"));
1607 AssertValue (42, val);
1609 LocalVariable[] locals = frame.Method.GetLocals ();
1610 var vals = frame.GetValues (locals);
1611 Assert.AreEqual (locals.Length, vals.Length);
1612 for (int i = 0; i < locals.Length; ++i) {
1613 if (locals [i].Name == "i")
1614 AssertValue (42, vals [i]);
1615 if (locals [i].Name == "s")
1616 AssertValue ("AB", vals [i]);
1617 if (locals [i].Name == "t")
1618 AssertValue ("ABC", vals [i]);
1621 // Argument checking
1624 AssertThrows<ArgumentNullException> (delegate () {
1625 frame.GetValue ((LocalVariable)null);
1627 // GetValue () local from another method
1628 AssertThrows<ArgumentException> (delegate () {
1629 frame.GetValue (m1.GetLocal ("foo"));
1633 AssertThrows<ArgumentNullException> (delegate () {
1634 frame.GetValue ((ParameterInfoMirror)null);
1636 // GetValue () local from another method
1637 AssertThrows<ArgumentException> (delegate () {
1638 frame.GetValue (m1.GetParameters ()[0]);
1641 // GetValues () null
1642 AssertThrows<ArgumentNullException> (delegate () {
1643 frame.GetValues (null);
1645 // GetValues () embedded null
1646 AssertThrows<ArgumentNullException> (delegate () {
1647 frame.GetValues (new LocalVariable [] { null });
1649 // GetValues () local from another method
1650 AssertThrows<ArgumentException> (delegate () {
1651 frame.GetValues (new LocalVariable [] { m1.GetLocal ("foo") });
1654 AssertThrows<ArgumentException> (delegate () {
1655 val = frame.GetValue (frame.Method.ReturnParameter);
1658 // invalid stack frames
1660 e = GetNextEvent ();
1661 Assert.IsTrue (e is StepEvent);
1662 Assert.AreEqual ("locals2", (e as StepEvent).Method.Name);
1664 AssertThrows<InvalidStackFrameException> (delegate () {
1665 frame.GetValue (frame.Method.GetLocal ("i"));
1671 be = run_until ("locals7");
1673 req = create_step (be);
1679 // Test that locals are initialized
1680 frame = e.Thread.GetFrames () [0];
1681 val = frame.GetValue (frame.Method.GetLocal ("t"));
1682 AssertValue (0, val);
1686 Assert.AreEqual ("locals7", (e as StepEvent).Method.Name);
1690 Assert.AreEqual ("locals7", (e as StepEvent).Method.Name);
1692 frame = e.Thread.GetFrames () [0];
1693 val = frame.GetValue (frame.Method.GetParameters ()[0]);
1694 AssertValue (22, val);
1695 val = frame.GetValue (frame.Method.GetLocal ("t"));
1696 AssertValue (22, val);
1697 val = frame.GetValue (frame.Method.GetLocal ("t2"));
1698 AssertValue (22, val);
1702 public void GetVisibleVariables () {
1703 Event e = run_until ("locals4");
1706 var locals = e.Thread.GetFrames ()[1].GetVisibleVariables ();
1707 Assert.AreEqual (2, locals.Count);
1708 var loc = locals.First (l => l.Name == "i");
1709 Assert.AreEqual ("Int64", loc.Type.Name);
1710 loc = locals.First (l => l.Name == "s");
1711 Assert.AreEqual ("String", loc.Type.Name);
1713 loc = e.Thread.GetFrames ()[1].GetVisibleVariableByName ("i");
1714 Assert.AreEqual ("i", loc.Name);
1715 Assert.AreEqual ("Int64", loc.Type.Name);
1717 e = run_until ("locals5");
1720 locals = e.Thread.GetFrames ()[1].GetVisibleVariables ();
1721 Assert.AreEqual (2, locals.Count);
1722 loc = locals.First (l => l.Name == "i");
1723 Assert.AreEqual ("String", loc.Type.Name);
1724 loc = locals.First (l => l.Name == "s");
1725 Assert.AreEqual ("String", loc.Type.Name);
1727 loc = e.Thread.GetFrames ()[1].GetVisibleVariableByName ("i");
1728 Assert.AreEqual ("i", loc.Name);
1729 Assert.AreEqual ("String", loc.Type.Name);
1731 // Variable in another scope
1732 loc = e.Thread.GetFrames ()[1].GetVisibleVariableByName ("j");
1733 Assert.IsNull (loc);
1737 public void Exit () {
1742 var e = GetNextEvent ();
1743 Assert.IsInstanceOfType (typeof (VMDeathEvent), e);
1745 Assert.AreEqual (5, (e as VMDeathEvent).ExitCode);
1748 /* Could be a remote vm with no process */
1751 Assert.AreEqual (5, p.ExitCode);
1754 AssertThrows<VMDisconnectedException> (delegate () {
1763 public void Dispose () {
1768 var e = GetNextEvent ();
1769 Assert.IsInstanceOfType (typeof (VMDisconnectEvent), e);
1772 /* Could be a remote vm with no process */
1775 Assert.AreEqual (3, p.ExitCode);
1778 AssertThrows<VMDisconnectedException> (delegate () {
1787 public void ColumnNumbers () {
1788 Event e = run_until ("line_numbers");
1790 // FIXME: Merge this with LineNumbers () when its fixed
1792 step_req = create_step (e);
1793 step_req.Depth = StepDepth.Into;
1801 e = GetNextEvent ();
1802 Assert.IsTrue (e is StepEvent);
1803 if (e.Thread.GetFrames ()[0].Method.Name == "ln1")
1807 // Do an additional step over so we are not on the beginning line of the method
1808 step_req.Disable ();
1809 step_req.Depth = StepDepth.Over;
1812 e = GetNextEvent ();
1813 Assert.IsTrue (e is StepEvent);
1815 l = e.Thread.GetFrames ()[0].Location;
1817 Assert.AreEqual (3, l.ColumnNumber);
1819 step_req.Disable ();
1823 // Broken by mcs+runtime changes (#5438)
1824 [Category("NotWorking")]
1825 public void LineNumbers () {
1826 Event e = run_until ("line_numbers");
1828 step_req = create_step (e);
1829 step_req.Depth = StepDepth.Into;
1836 e = GetNextEvent ();
1837 Assert.IsTrue (e is StepEvent);
1839 l = e.Thread.GetFrames ()[0].Location;
1841 Assert.IsTrue (l.SourceFile.IndexOf ("dtest-app.cs") != -1);
1842 Assert.AreEqual ("ln1", l.Method.Name);
1845 using (FileStream fs = new FileStream (l.SourceFile, FileMode.Open, FileAccess.Read)) {
1846 MD5 md5 = MD5.Create ();
1847 var hash = md5.ComputeHash (fs);
1849 for (int i = 0; i < 16; ++i)
1850 Assert.AreEqual (hash [i], l.SourceFileHash [i]);
1853 int line_base = l.LineNumber;
1856 e = GetNextEvent ();
1857 Assert.IsTrue (e is StepEvent);
1858 l = e.Thread.GetFrames ()[0].Location;
1859 Assert.AreEqual ("ln2", l.Method.Name);
1860 Assert.AreEqual (line_base + 6, l.LineNumber);
1863 e = GetNextEvent ();
1864 Assert.IsTrue (e is StepEvent);
1865 l = e.Thread.GetFrames ()[0].Location;
1866 Assert.AreEqual ("ln1", l.Method.Name);
1867 Assert.AreEqual (line_base + 1, l.LineNumber);
1870 e = GetNextEvent ();
1871 Assert.IsTrue (e is StepEvent);
1872 l = e.Thread.GetFrames ()[0].Location;
1873 Assert.AreEqual ("ln3", l.Method.Name);
1874 Assert.AreEqual (line_base + 11, l.LineNumber);
1877 e = GetNextEvent ();
1878 Assert.IsTrue (e is StepEvent);
1879 l = e.Thread.GetFrames ()[0].Location;
1880 Assert.AreEqual ("ln3", l.Method.Name);
1881 Assert.IsTrue (l.SourceFile.EndsWith ("FOO"));
1882 Assert.AreEqual (55, l.LineNumber);
1885 e = GetNextEvent ();
1886 Assert.IsTrue (e is StepEvent);
1887 l = e.Thread.GetFrames ()[0].Location;
1888 Assert.AreEqual ("ln1", l.Method.Name);
1889 Assert.AreEqual (line_base + 2, l.LineNumber);
1891 // GetSourceFiles ()
1892 string[] sources = l.Method.DeclaringType.GetSourceFiles ();
1893 Assert.AreEqual (2, sources.Length);
1894 Assert.AreEqual ("dtest-app.cs", sources [0]);
1895 Assert.AreEqual ("FOO", sources [1]);
1897 sources = l.Method.DeclaringType.GetSourceFiles (true);
1898 Assert.AreEqual (2, sources.Length);
1899 Assert.IsTrue (sources [0].EndsWith ("dtest-app.cs"));
1900 Assert.IsTrue (sources [1].EndsWith ("FOO"));
1904 public void Suspend () {
1907 Start (new string [] { "dtest-app.exe", "suspend-test" });
1909 Event e = run_until ("suspend");
1911 ThreadMirror main = e.Thread;
1919 // The debuggee should be suspended while it is running the infinite loop
1921 StackFrame frame = main.GetFrames ()[0];
1922 Assert.AreEqual ("suspend", frame.Method.Name);
1926 // resuming when not suspended
1927 AssertThrows<InvalidOperationException> (delegate () {
1937 public void AssemblyLoad () {
1938 Event e = run_until ("assembly_load");
1940 var load_req = vm.CreateAssemblyLoadRequest ();
1945 e = GetNextEvent ();
1946 Assert.IsInstanceOfType (typeof (AssemblyLoadEvent), e);
1947 Assert.IsTrue ((e as AssemblyLoadEvent).Assembly.Location.EndsWith ("System.dll"));
1949 var frames = e.Thread.GetFrames ();
1950 Assert.IsTrue (frames.Length > 0);
1951 Assert.AreEqual ("assembly_load", frames [0].Method.Name);
1955 public void CreateValue () {
1958 v = vm.CreateValue (1);
1959 Assert.AreEqual (vm, v.VirtualMachine);
1960 Assert.AreEqual (1, v.Value);
1962 v = vm.CreateValue (null);
1963 Assert.AreEqual (vm, v.VirtualMachine);
1964 Assert.AreEqual (null, v.Value);
1966 // Argument checking
1967 AssertThrows <ArgumentException> (delegate () {
1968 v = vm.CreateValue ("FOO");
1973 public void CreateString () {
1974 StringMirror s = vm.RootDomain.CreateString ("ABC");
1976 Assert.AreEqual (vm, s.VirtualMachine);
1977 Assert.AreEqual ("ABC", s.Value);
1978 Assert.AreEqual (vm.RootDomain, s.Domain);
1981 StringBuilder sb = new StringBuilder ();
1982 for (int i = 0; i < 1024; ++i)
1984 s = vm.RootDomain.CreateString (sb.ToString ());
1986 // Argument checking
1987 AssertThrows <ArgumentNullException> (delegate () {
1988 s = vm.RootDomain.CreateString (null);
1993 public void CreateBoxedValue () {
1994 ObjectMirror o = vm.RootDomain.CreateBoxedValue (new PrimitiveValue (vm, 42));
1996 Assert.AreEqual ("Int32", o.Type.Name);
1997 //AssertValue (42, m.GetValue (o.Type.GetField ("m_value")));
1999 // Argument checking
2000 AssertThrows <ArgumentNullException> (delegate () {
2001 vm.RootDomain.CreateBoxedValue (null);
2004 AssertThrows <ArgumentException> (delegate () {
2005 vm.RootDomain.CreateBoxedValue (o);
2010 public void Invoke () {
2011 Event e = run_until ("invoke1");
2013 StackFrame frame = e.Thread.GetFrames () [0];
2015 TypeMirror t = frame.Method.DeclaringType;
2016 ObjectMirror this_obj = (ObjectMirror)frame.GetThis ();
2018 TypeMirror t2 = frame.Method.GetParameters ()[0].ParameterType;
2024 m = t.GetMethod ("invoke_return_void");
2025 v = this_obj.InvokeMethod (e.Thread, m, null);
2029 m = t.GetMethod ("invoke_return_ref");
2030 v = this_obj.InvokeMethod (e.Thread, m, null);
2031 AssertValue ("ABC", v);
2034 m = t.GetMethod ("invoke_return_null");
2035 v = this_obj.InvokeMethod (e.Thread, m, null);
2036 AssertValue (null, v);
2039 m = t.GetMethod ("invoke_return_primitive");
2040 v = this_obj.InvokeMethod (e.Thread, m, null);
2041 AssertValue (42, v);
2044 m = t.GetMethod ("invoke_return_nullable");
2045 v = this_obj.InvokeMethod (e.Thread, m, null);
2046 Assert.IsInstanceOfType (typeof (StructMirror), v);
2047 var s = v as StructMirror;
2048 AssertValue (42, s.Fields [0]);
2049 AssertValue (true, s.Fields [1]);
2051 // pass nullable as this
2052 //m = vm.RootDomain.Corlib.GetType ("System.Object").GetMethod ("ToString");
2053 m = s.Type.GetMethod ("ToString");
2054 v = s.InvokeMethod (e.Thread, m, null);
2056 // return nullable null
2057 m = t.GetMethod ("invoke_return_nullable_null");
2058 v = this_obj.InvokeMethod (e.Thread, m, null);
2059 Assert.IsInstanceOfType (typeof (StructMirror), v);
2060 s = v as StructMirror;
2061 AssertValue (0, s.Fields [0]);
2062 AssertValue (false, s.Fields [1]);
2064 // pass nullable as this
2065 //m = vm.RootDomain.Corlib.GetType ("System.Object").GetMethod ("ToString");
2066 m = s.Type.GetMethod ("ToString");
2067 v = s.InvokeMethod (e.Thread, m, null);
2070 m = t.GetMethod ("invoke_pass_primitive");
2071 Value[] args = new Value [] {
2072 vm.CreateValue ((byte)Byte.MaxValue),
2073 vm.CreateValue ((sbyte)SByte.MaxValue),
2074 vm.CreateValue ((short)1),
2075 vm.CreateValue ((ushort)1),
2076 vm.CreateValue ((int)1),
2077 vm.CreateValue ((uint)1),
2078 vm.CreateValue ((long)1),
2079 vm.CreateValue ((ulong)1),
2080 vm.CreateValue ('A'),
2081 vm.CreateValue (true),
2082 vm.CreateValue (3.14f),
2083 vm.CreateValue (3.14) };
2085 v = this_obj.InvokeMethod (e.Thread, m, args);
2086 AssertValue ((int)Byte.MaxValue + (int)SByte.MaxValue + 1 + 1 + 1 + 1 + 1 + 1 + 'A' + 1 + 3 + 3, v);
2089 m = t.GetMethod ("invoke_pass_ref");
2090 v = this_obj.InvokeMethod (e.Thread, m, new Value [] { vm.RootDomain.CreateString ("ABC") });
2091 AssertValue ("ABC", v);
2094 m = t.GetMethod ("invoke_pass_ref");
2095 v = this_obj.InvokeMethod (e.Thread, m, new Value [] { vm.CreateValue (null) });
2096 AssertValue (null, v);
2099 m = t.GetMethod ("invoke_static_pass_ref");
2100 v = t.InvokeMethod (e.Thread, m, new Value [] { vm.RootDomain.CreateString ("ABC") });
2101 AssertValue ("ABC", v);
2103 // static invoked using ObjectMirror.InvokeMethod
2104 m = t.GetMethod ("invoke_static_pass_ref");
2105 v = this_obj.InvokeMethod (e.Thread, m, new Value [] { vm.RootDomain.CreateString ("ABC") });
2106 AssertValue ("ABC", v);
2108 // method which throws an exception
2110 m = t.GetMethod ("invoke_throws");
2111 v = this_obj.InvokeMethod (e.Thread, m, null);
2113 } catch (InvocationException ex) {
2114 Assert.AreEqual ("Exception", ex.Exception.Type.Name);
2119 m = t.GetMethod ("invoke_out");
2120 var out_task = this_obj.InvokeMethodAsyncWithResult (e.Thread, m, new Value [] { vm.CreateValue (1), vm.CreateValue (null) }, InvokeOptions.ReturnOutArgs);
2121 var out_args = out_task.Result.OutArgs;
2122 AssertValue (5, out_args [0]);
2123 Assert.IsTrue (out_args [1] is ArrayMirror);
2124 Assert.AreEqual (10, (out_args [1] as ArrayMirror).Length);
2126 // without ReturnOutArgs flag
2127 out_task = this_obj.InvokeMethodAsyncWithResult (e.Thread, m, new Value [] { vm.CreateValue (1), vm.CreateValue (null) });
2128 out_args = out_task.Result.OutArgs;
2129 Assert.IsNull (out_args);
2133 m = t.GetMethod (".ctor");
2134 v = t.InvokeMethod (e.Thread, m, null);
2135 Assert.IsInstanceOfType (typeof (ObjectMirror), v);
2136 Assert.AreEqual ("Tests", (v as ObjectMirror).Type.Name);
2139 var cl1 = frame.Method.DeclaringType.Assembly.GetType ("ITest2");
2140 m = cl1.GetMethod ("invoke_iface");
2141 v = this_obj.InvokeMethod (e.Thread, m, null);
2142 AssertValue (42, v);
2145 m = t.BaseType.GetMethod ("virtual_method");
2146 v = this_obj.InvokeMethod (e.Thread, m, null, InvokeOptions.Virtual);
2147 AssertValue ("V2", v);
2149 // virtual call on static method
2150 m = t.GetMethod ("invoke_static_pass_ref");
2151 v = t.InvokeMethod (e.Thread, m, new Value [] { vm.RootDomain.CreateString ("ABC") }, InvokeOptions.Virtual);
2152 AssertValue ("ABC", v);
2156 m = t.GetMethod ("invoke_pass_ref");
2157 var task = this_obj.InvokeMethodAsync (e.Thread, m, new Value [] { vm.RootDomain.CreateString ("ABC") });
2158 AssertValue ("ABC", task.Result);
2161 m = t.GetMethod ("invoke_static_pass_ref");
2162 task = t.InvokeMethodAsync (e.Thread, m, new Value [] { vm.RootDomain.CreateString ("ABC") });
2163 AssertValue ("ABC", task.Result);
2166 // Argument checking
2169 AssertThrows<ArgumentNullException> (delegate {
2170 m = t.GetMethod ("invoke_pass_ref");
2171 v = this_obj.InvokeMethod (null, m, new Value [] { vm.CreateValue (null) });
2175 AssertThrows<ArgumentNullException> (delegate {
2176 v = this_obj.InvokeMethod (e.Thread, null, new Value [] { vm.CreateValue (null) });
2179 // invalid number of arguments
2180 m = t.GetMethod ("invoke_pass_ref");
2181 AssertThrows<ArgumentException> (delegate {
2182 v = this_obj.InvokeMethod (e.Thread, m, null);
2185 // invalid type of argument (ref != primitive)
2186 m = t.GetMethod ("invoke_pass_ref");
2187 AssertThrows<ArgumentException> (delegate {
2188 v = this_obj.InvokeMethod (e.Thread, m, new Value [] { vm.CreateValue (1) });
2191 // invalid type of argument (primitive != primitive)
2192 m = t.GetMethod ("invoke_pass_primitive_2");
2193 AssertThrows<ArgumentException> (delegate {
2194 v = this_obj.InvokeMethod (e.Thread, m, new Value [] { vm.CreateValue (1) });
2197 // invoking a non-static method as static
2198 m = t.GetMethod ("invoke_pass_ref");
2199 AssertThrows<ArgumentException> (delegate {
2200 v = t.InvokeMethod (e.Thread, m, new Value [] { vm.RootDomain.CreateString ("ABC") });
2203 // invoking a method defined in another class
2204 m = t2.GetMethod ("invoke");
2205 AssertThrows<ArgumentException> (delegate {
2206 v = this_obj.InvokeMethod (e.Thread, m, null);
2211 public void InvokeVType () {
2212 Event e = run_until ("invoke1");
2214 StackFrame frame = e.Thread.GetFrames () [0];
2216 var s = frame.GetArgument (1) as StructMirror;
2218 TypeMirror t = s.Type;
2223 // Pass struct as this, receive int
2224 m = t.GetMethod ("invoke_return_int");
2225 v = s.InvokeMethod (e.Thread, m, null);
2226 AssertValue (42, v);
2228 // Pass struct as this, receive intptr
2229 m = t.GetMethod ("invoke_return_intptr");
2230 v = s.InvokeMethod (e.Thread, m, null);
2231 AssertValue (43, v);
2234 m = t.GetMethod ("invoke_static");
2235 v = t.InvokeMethod (e.Thread, m, null);
2238 // Pass generic struct as this
2239 s = frame.GetArgument (2) as StructMirror;
2241 m = t.GetMethod ("invoke_return_int");
2242 v = s.InvokeMethod (e.Thread, m, null);
2243 AssertValue (42, v);
2246 // Invoke a method which changes state
2247 s = frame.GetArgument (1) as StructMirror;
2249 m = t.GetMethod ("invoke_mutate");
2250 var task = s.InvokeMethodAsyncWithResult (e.Thread, m, null, InvokeOptions.ReturnOutThis);
2251 var out_this = task.Result.OutThis as StructMirror;
2252 AssertValue (5, out_this ["l"]);
2254 // Without the ReturnOutThis flag
2255 s = frame.GetArgument (1) as StructMirror;
2257 m = t.GetMethod ("invoke_mutate");
2258 task = s.InvokeMethodAsyncWithResult (e.Thread, m, null);
2259 out_this = task.Result.OutThis as StructMirror;
2260 Assert.AreEqual (null, out_this);
2265 public void BreakpointDuringInvoke () {
2266 Event e = run_until ("invoke1");
2268 MethodMirror m = entry_point.DeclaringType.GetMethod ("invoke2");
2269 Assert.IsNotNull (m);
2270 vm.SetBreakpoint (m, 0);
2272 StackFrame frame = e.Thread.GetFrames () [0];
2273 var o = frame.GetThis () as ObjectMirror;
2275 bool failed = false;
2277 bool finished = false;
2278 object wait = new object ();
2280 // Have to invoke in a separate thread as the invoke is suspended until we
2281 // resume after the breakpoint
2282 Thread t = new Thread (delegate () {
2284 o.InvokeMethod (e.Thread, m, null);
2290 Monitor.Pulse (wait);
2296 StackFrame invoke_frame = null;
2299 e = GetNextEvent ();
2300 Assert.IsInstanceOfType (typeof (BreakpointEvent), e);
2301 // Check stack trace support and invokes
2302 var frames = e.Thread.GetFrames ();
2303 invoke_frame = frames [0];
2304 Assert.AreEqual ("invoke2", frames [0].Method.Name);
2305 Assert.IsTrue (frames [0].IsDebuggerInvoke);
2306 Assert.AreEqual ("invoke1", frames [1].Method.Name);
2313 Monitor.Wait (wait);
2316 // Check that the invoke frames are no longer valid
2317 AssertThrows<InvalidStackFrameException> (delegate {
2318 invoke_frame.GetThis ();
2321 // Check InvokeOptions.DisableBreakpoints flag
2322 o.InvokeMethod (e.Thread, m, null, InvokeOptions.DisableBreakpoints);
2326 public void DisabledExceptionDuringInvoke () {
2327 Event e = run_until ("invoke_ex");
2329 MethodMirror m = entry_point.DeclaringType.GetMethod ("invoke_ex_inner");
2331 StackFrame frame = e.Thread.GetFrames () [0];
2332 var o = frame.GetThis () as ObjectMirror;
2334 var req = vm.CreateExceptionRequest (null);
2337 // Check InvokeOptions.DisableBreakpoints flag
2338 o.InvokeMethod (e.Thread, m, null, InvokeOptions.DisableBreakpoints);
2344 public void InvokeSingleThreaded () {
2347 Start (new string [] { "dtest-app.exe", "invoke-single-threaded" });
2349 Event e = run_until ("invoke_single_threaded_2");
2351 StackFrame f = e.Thread.GetFrames ()[0];
2353 var obj = f.GetThis () as ObjectMirror;
2355 // Check that the counter value incremented by the other thread does not increase
2356 // during the invoke.
2357 object counter1 = (obj.GetValue (obj.Type.GetField ("counter")) as PrimitiveValue).Value;
2359 var m = obj.Type.GetMethod ("invoke_return_void");
2360 obj.InvokeMethod (e.Thread, m, null, InvokeOptions.SingleThreaded);
2362 object counter2 = (obj.GetValue (obj.Type.GetField ("counter")) as PrimitiveValue).Value;
2364 Assert.AreEqual ((int)counter1, (int)counter2);
2366 // Test multiple invokes done in succession
2367 m = obj.Type.GetMethod ("invoke_return_void");
2368 obj.InvokeMethod (e.Thread, m, null, InvokeOptions.SingleThreaded);
2370 // Test events during single-threaded invokes
2371 vm.EnableEvents (EventType.TypeLoad);
2372 m = obj.Type.GetMethod ("invoke_type_load");
2373 obj.BeginInvokeMethod (e.Thread, m, null, InvokeOptions.SingleThreaded, delegate {
2377 e = GetNextEvent ();
2378 Assert.AreEqual (EventType.TypeLoad, e.EventType);
2381 List<Value> invoke_results;
2384 public void InvokeMultiple () {
2385 Event e = run_until ("invoke1");
2387 StackFrame frame = e.Thread.GetFrames () [0];
2389 TypeMirror t = frame.Method.DeclaringType;
2390 ObjectMirror this_obj = (ObjectMirror)frame.GetThis ();
2392 TypeMirror t2 = frame.Method.GetParameters ()[0].ParameterType;
2394 var methods = new MethodMirror [2];
2395 methods [0] = t.GetMethod ("invoke_return_ref");
2396 methods [1] = t.GetMethod ("invoke_return_primitive");
2398 invoke_results = new List<Value> ();
2400 var r = this_obj.BeginInvokeMultiple (e.Thread, methods, null, InvokeOptions.SingleThreaded, invoke_multiple_cb, this_obj);
2401 WaitHandle.WaitAll (new WaitHandle[] { r.AsyncWaitHandle });
2402 this_obj.EndInvokeMultiple (r);
2403 // The callback might still be running
2404 while (invoke_results.Count < 2) {
2407 if (invoke_results [0] is PrimitiveValue) {
2408 AssertValue ("ABC", invoke_results [1]);
2409 AssertValue (42, invoke_results [0]);
2411 AssertValue ("ABC", invoke_results [0]);
2412 AssertValue (42, invoke_results [1]);
2416 void invoke_multiple_cb (IAsyncResult ar) {
2417 ObjectMirror this_obj = (ObjectMirror)ar.AsyncState;
2419 var res = this_obj.EndInvokeMethod (ar);
2420 lock (invoke_results)
2421 invoke_results.Add (res);
2425 public void GetThreads () {
2430 public void Threads () {
2431 Event e = run_until ("threads");
2433 Assert.AreEqual (ThreadState.Running, e.Thread.ThreadState);
2435 Assert.IsTrue (e.Thread.ThreadId > 0);
2437 Assert.AreEqual (e.Thread.TID, e.Thread.TID);
2439 vm.EnableEvents (EventType.ThreadStart, EventType.ThreadDeath);
2443 e = GetNextEvent ();
2444 Assert.IsInstanceOfType (typeof (ThreadStartEvent), e);
2445 var state = e.Thread.ThreadState;
2446 Assert.IsTrue (state == ThreadState.Running || state == ThreadState.Unstarted);
2450 e = GetNextEvent ();
2451 Assert.IsInstanceOfType (typeof (ThreadDeathEvent), e);
2452 Assert.AreEqual (ThreadState.Stopped, e.Thread.ThreadState);
2456 public void Frame_SetValue () {
2457 Event e = run_until ("locals2");
2459 StackFrame frame = e.Thread.GetFrames () [0];
2462 var l = frame.Method.GetLocal ("i");
2463 frame.SetValue (l, vm.CreateValue ((long)55));
2464 AssertValue (55, frame.GetValue (l));
2467 l = frame.Method.GetLocal ("s");
2468 frame.SetValue (l, vm.RootDomain.CreateString ("DEF"));
2469 AssertValue ("DEF", frame.GetValue (l));
2471 // argument as local
2472 l = frame.Method.GetLocal ("arg");
2473 frame.SetValue (l, vm.CreateValue (6));
2474 AssertValue (6, frame.GetValue (l));
2477 var p = frame.Method.GetParameters ()[1];
2478 frame.SetValue (p, vm.CreateValue (7));
2479 AssertValue (7, frame.GetValue (p));
2482 p = frame.Method.GetParameters ()[2];
2483 frame.SetValue (p, vm.RootDomain.CreateString ("DEF"));
2484 AssertValue ("DEF", frame.GetValue (p));
2487 p = frame.Method.GetParameters ()[3];
2488 frame.SetValue (p, vm.RootDomain.CreateString ("DEF2"));
2489 AssertValue ("DEF2", frame.GetValue (p));
2492 p = frame.Method.GetParameters ()[4];
2493 var v = frame.GetValue (p) as StructMirror;
2494 v ["i"] = vm.CreateValue (43);
2495 frame.SetValue (p, v);
2496 v = frame.GetValue (p) as StructMirror;
2497 AssertValue (43, v ["i"]);
2499 // argument checking
2502 AssertThrows<ArgumentNullException> (delegate () {
2503 frame.SetValue ((LocalVariable)null, vm.CreateValue (55));
2507 AssertThrows<ArgumentNullException> (delegate () {
2508 l = frame.Method.GetLocal ("i");
2509 frame.SetValue (l, null);
2512 // value of invalid type
2513 AssertThrows<ArgumentException> (delegate () {
2514 l = frame.Method.GetLocal ("i");
2515 frame.SetValue (l, vm.CreateValue (55));
2521 public void Frame_SetValue_Registers () {
2522 Event e = run_until ("locals6_1");
2524 StackFrame frame = e.Thread.GetFrames () [1];
2527 var l = frame.Method.GetLocal ("j");
2528 frame.SetValue (l, vm.CreateValue (99));
2529 AssertValue (99, frame.GetValue (l));
2531 // Check it during execution
2532 e = run_until ("locals6_2");
2533 frame = e.Thread.GetFrames () [0];
2534 AssertValue (99, frame.GetValue (frame.Method.GetParameters ()[0]));
2536 // Set it while in a frame which clobbers its register
2537 e = run_until ("locals6_3");
2538 frame = e.Thread.GetFrames () [1];
2539 frame.SetValue (l, vm.CreateValue (100));
2540 AssertValue (100, frame.GetValue (l));
2542 // Check it during execution
2543 e = run_until ("locals6_4");
2544 frame = e.Thread.GetFrames () [0];
2545 AssertValue (100, frame.GetValue (frame.Method.GetParameters ()[0]));
2547 // Signed byte value
2548 e = run_until ("locals6_5");
2549 frame = e.Thread.GetFrames () [1];
2550 var l2 = frame.Method.GetLocal ("sb");
2551 frame.SetValue (l2, vm.CreateValue ((sbyte)-99));
2552 AssertValue (-99, frame.GetValue (l2));
2554 // Check it during execution
2555 e = run_until ("locals6_6");
2556 frame = e.Thread.GetFrames () [0];
2557 AssertValue (-99, frame.GetValue (frame.Method.GetParameters ()[0]));
2561 public void InvokeRegress () {
2562 Event e = run_until ("invoke1");
2564 StackFrame frame = e.Thread.GetFrames () [0];
2566 TypeMirror t = frame.Method.DeclaringType;
2567 ObjectMirror this_obj = (ObjectMirror)frame.GetThis ();
2569 TypeMirror t2 = frame.Method.GetParameters ()[0].ParameterType;
2575 m = t.GetMethod ("invoke_return_void");
2576 v = this_obj.InvokeMethod (e.Thread, m, null);
2579 // Check that the stack frames remain valid during the invoke
2580 Assert.AreEqual ("Tests", (frame.GetThis () as ObjectMirror).Type.Name);
2582 // do another invoke
2583 m = t.GetMethod ("invoke_return_void");
2584 v = this_obj.InvokeMethod (e.Thread, m, null);
2587 // Try a single step after the invoke
2588 var req = create_step (e);
2589 req.Depth = StepDepth.Into;
2590 req.Size = StepSize.Line;
2596 // Step into invoke2
2598 e = GetNextEvent ();
2599 Assert.IsTrue (e is StepEvent);
2600 Assert.AreEqual ("invoke2", (e as StepEvent).Method.Name);
2604 frame = e.Thread.GetFrames () [0];
2608 public void Exceptions () {
2609 Event e = run_until ("exceptions");
2610 var req = vm.CreateExceptionRequest (null);
2615 e = GetNextEvent ();
2616 Assert.IsInstanceOfType (typeof (ExceptionEvent), e);
2617 Assert.AreEqual ("OverflowException", (e as ExceptionEvent).Exception.Type.Name);
2619 var frames = e.Thread.GetFrames ();
2620 Assert.AreEqual ("exceptions", frames [0].Method.Name);
2623 // exception type filter
2625 req = vm.CreateExceptionRequest (vm.RootDomain.Corlib.GetType ("System.ArgumentException"));
2628 // Skip the throwing of the second OverflowException
2631 e = GetNextEvent ();
2632 Assert.IsInstanceOfType (typeof (ExceptionEvent), e);
2633 Assert.AreEqual ("ArgumentException", (e as ExceptionEvent).Exception.Type.Name);
2636 // exception type filter for subclasses
2637 req = vm.CreateExceptionRequest (vm.RootDomain.Corlib.GetType ("System.Exception"));
2642 e = GetNextEvent ();
2643 Assert.IsInstanceOfType (typeof (ExceptionEvent), e);
2644 Assert.AreEqual ("OverflowException", (e as ExceptionEvent).Exception.Type.Name);
2648 req.IncludeSubclasses = false;
2653 e = GetNextEvent ();
2654 Assert.IsInstanceOfType (typeof (ExceptionEvent), e);
2655 Assert.AreEqual ("Exception", (e as ExceptionEvent).Exception.Type.Name);
2658 // Implicit exceptions
2659 req = vm.CreateExceptionRequest (null);
2664 e = GetNextEvent ();
2665 Assert.IsInstanceOfType (typeof (ExceptionEvent), e);
2666 Assert.AreEqual ("NullReferenceException", (e as ExceptionEvent).Exception.Type.Name);
2669 // Single stepping after an exception
2670 req = vm.CreateExceptionRequest (null);
2675 e = GetNextEvent ();
2676 Assert.IsInstanceOfType (typeof (ExceptionEvent), e);
2677 Assert.AreEqual ("Exception", (e as ExceptionEvent).Exception.Type.Name);
2678 frames = e.Thread.GetFrames ();
2679 Assert.AreEqual ("exceptions2", frames [0].Method.Name);
2682 var sreq = create_step (e);
2683 sreq.Depth = StepDepth.Over;
2684 sreq.Size = StepSize.Line;
2688 e = GetNextEvent ();
2689 Assert.IsInstanceOfType (typeof (StepEvent), e);
2690 frames = e.Thread.GetFrames ();
2691 Assert.AreEqual ("exceptions", frames [0].Method.Name);
2694 // Argument checking
2695 AssertThrows<ArgumentException> (delegate {
2696 vm.CreateExceptionRequest (e.Thread.Type);
2701 public void ExceptionFilter () {
2702 Event e = run_until ("exception_filter");
2704 MethodMirror m = entry_point.DeclaringType.GetMethod ("exception_filter_filter");
2705 Assert.IsNotNull (m);
2707 vm.SetBreakpoint (m, 0);
2711 e = GetNextEvent ();
2712 Assert.AreEqual (EventType.Breakpoint, e.EventType);
2713 Assert.IsTrue (e is BreakpointEvent);
2714 Assert.AreEqual (m.Name, (e as BreakpointEvent).Method.Name);
2716 var frames = e.Thread.GetFrames ();
2718 Assert.IsTrue (frames [0].Location.SourceFile.IndexOf ("dtest-app.cs") != -1);
2719 Assert.AreEqual ("exception_filter_filter", frames [0].Location.Method.Name);
2721 Assert.AreEqual (0, frames [1].Location.Method.MetadataToken);
2722 Assert.AreEqual (0x0f, frames [1].Location.ILOffset);
2724 Assert.AreEqual ("exception_filter_method", frames [2].Location.Method.Name);
2725 Assert.AreEqual (0x06, frames [2].Location.ILOffset);
2727 Assert.AreEqual (0, frames [3].Location.Method.MetadataToken, 0);
2728 Assert.AreEqual (0, frames [3].Location.ILOffset);
2730 Assert.AreEqual ("exception_filter", frames [4].Location.Method.Name);
2734 public void ExceptionFilter2 () {
2737 Start (new string [] { "dtest-excfilter.exe" });
2739 MethodMirror filter_method = entry_point.DeclaringType.GetMethod ("Filter");
2740 Assert.IsNotNull (filter_method);
2742 MethodMirror test_method = entry_point.DeclaringType.GetMethod ("Test");
2743 Assert.IsNotNull (test_method);
2745 vm.SetBreakpoint (filter_method, 0);
2749 var e = GetNextEvent ();
2750 Assert.AreEqual (EventType.Breakpoint, e.EventType);
2751 Assert.IsTrue (e is BreakpointEvent);
2752 Assert.AreEqual (filter_method.Name, (e as BreakpointEvent).Method.Name);
2754 var frames = e.Thread.GetFrames ();
2756 Assert.AreEqual (4, frames.Count ());
2758 Assert.AreEqual (filter_method.Name, frames [0].Location.Method.Name);
2759 Assert.AreEqual (20, frames [0].Location.LineNumber);
2760 Assert.AreEqual (0, frames [0].Location.ILOffset);
2762 Assert.AreEqual (test_method.Name, frames [1].Location.Method.Name);
2763 Assert.AreEqual (37, frames [1].Location.LineNumber);
2764 Assert.AreEqual (0x0b, frames [1].Location.ILOffset);
2766 Assert.AreEqual (test_method.Name, frames [2].Location.Method.Name);
2767 Assert.AreEqual (33, frames [2].Location.LineNumber);
2768 Assert.AreEqual (0x05, frames [2].Location.ILOffset);
2770 Assert.AreEqual (entry_point.Name, frames [3].Location.Method.Name);
2771 Assert.AreEqual (14, frames [3].Location.LineNumber);
2772 Assert.AreEqual (0x00, frames [3].Location.ILOffset);
2780 public void EventSets () {
2782 // Create two filter which both match the same exception
2784 Event e = run_until ("exceptions");
2786 var req = vm.CreateExceptionRequest (null);
2789 var req2 = vm.CreateExceptionRequest (vm.RootDomain.Corlib.GetType ("System.OverflowException"));
2794 var es = vm.GetNextEventSet ();
2795 Assert.AreEqual (2, es.Events.Length);
2798 Assert.IsInstanceOfType (typeof (ExceptionEvent), e);
2799 Assert.AreEqual ("OverflowException", (e as ExceptionEvent).Exception.Type.Name);
2802 Assert.IsInstanceOfType (typeof (ExceptionEvent), e);
2803 Assert.AreEqual ("OverflowException", (e as ExceptionEvent).Exception.Type.Name);
2810 // Test single threaded invokes during processing of nullref exceptions.
2811 // These won't work if the exception handling is done from the sigsegv signal
2812 // handler, since the sigsegv signal is disabled until control returns from the
2816 [Category ("only3")]
2817 public void NullRefExceptionAndSingleThreadedInvoke () {
2818 Event e = run_until ("exceptions");
2819 var req = vm.CreateExceptionRequest (vm.RootDomain.Corlib.GetType ("System.NullReferenceException"));
2824 e = GetNextEvent ();
2825 Assert.IsInstanceOfType (typeof (ExceptionEvent), e);
2826 Assert.AreEqual ("NullReferenceException", (e as ExceptionEvent).Exception.Type.Name);
2828 var ex = (e as ExceptionEvent).Exception;
2829 var tostring_method = vm.RootDomain.Corlib.GetType ("System.Object").GetMethod ("ToString");
2830 ex.InvokeMethod (e.Thread, tostring_method, null, InvokeOptions.SingleThreaded);
2834 public void Domains () {
2837 Start (new string [] { "dtest-app.exe", "domain-test" });
2839 vm.EnableEvents (EventType.AppDomainCreate, EventType.AppDomainUnload, EventType.AssemblyUnload);
2841 Event e = run_until ("domains");
2845 e = GetNextEvent ();
2846 Assert.IsInstanceOfType (typeof (AppDomainCreateEvent), e);
2848 var domain = (e as AppDomainCreateEvent).Domain;
2850 // Check the object type
2851 e = run_until ("domains_2");
2852 var frame = e.Thread.GetFrames ()[0];
2853 var o = frame.GetArgument (0) as ObjectMirror;
2854 Assert.AreEqual ("CrossDomain", o.Type.Name);
2856 // Do a remoting invoke
2857 var cross_domain_type = o.Type;
2858 var v = o.InvokeMethod (e.Thread, cross_domain_type.GetMethod ("invoke_3"), null);
2859 AssertValue (42, v);
2861 // Run until the callback in the domain
2862 MethodMirror m = entry_point.DeclaringType.GetMethod ("invoke_in_domain");
2863 Assert.IsNotNull (m);
2864 vm.SetBreakpoint (m, 0);
2868 e = GetNextEvent ();
2869 if (e is BreakpointEvent)
2873 Assert.AreEqual ("invoke_in_domain", (e as BreakpointEvent).Method.Name);
2875 // d_method is from another domain
2876 MethodMirror d_method = (e as BreakpointEvent).Method;
2877 Assert.IsTrue (m != d_method);
2879 var frames = e.Thread.GetFrames ();
2880 Assert.AreEqual ("invoke_in_domain", frames [0].Method.Name);
2881 Assert.AreEqual (domain, frames [0].Domain);
2882 Assert.AreEqual ("invoke", frames [1].Method.Name);
2883 Assert.AreEqual ("domains", frames [2].Method.Name);
2884 Assert.AreEqual (vm.RootDomain, frames [2].Domain);
2886 // Test breakpoints on already JITted methods in other domains
2887 m = entry_point.DeclaringType.GetMethod ("invoke_in_domain_2");
2888 Assert.IsNotNull (m);
2889 vm.SetBreakpoint (m, 0);
2893 e = GetNextEvent ();
2894 if (e is BreakpointEvent)
2898 Assert.AreEqual ("invoke_in_domain_2", (e as BreakpointEvent).Method.Name);
2900 // This is empty when receiving the AppDomainCreateEvent
2901 Assert.AreEqual ("domain", domain.FriendlyName);
2903 // Run until the unload
2906 e = GetNextEvent ();
2907 if (e is AssemblyUnloadEvent) {
2913 Assert.IsInstanceOfType (typeof (AppDomainUnloadEvent), e);
2914 Assert.AreEqual (domain, (e as AppDomainUnloadEvent).Domain);
2916 // Run past the unload
2917 e = run_until ("domains_3");
2919 // Test access to unloaded types
2920 // FIXME: Add an exception type for this
2921 AssertThrows<Exception> (delegate {
2922 d_method.DeclaringType.GetValue (d_method.DeclaringType.GetField ("static_i"));
2925 // Check that .Domain is accessible for stack frames with native transitions
2926 e = run_until ("called_from_invoke");
2927 ThreadMirror.NativeTransitions = true;
2928 foreach (var f in e.Thread.GetFrames ()) {
2934 public void DynamicMethods () {
2935 Event e = run_until ("dyn_call");
2937 var m = e.Thread.GetFrames ()[1].Method;
2938 Assert.AreEqual ("dyn_method", m.Name);
2940 // Test access to IL
2941 var body = m.GetMethodBody ();
2943 ILInstruction ins = body.Instructions [0];
2944 Assert.AreEqual (OpCodes.Ldstr, ins.OpCode);
2945 Assert.AreEqual ("FOO", ins.Operand);
2949 public void RefEmit () {
2952 Start (new string [] { "dtest-app.exe", "ref-emit-test" });
2954 Event e = run_until ("ref_emit_call");
2956 var m = e.Thread.GetFrames ()[1].Method;
2957 Assert.AreEqual ("ref_emit_method", m.Name);
2959 // Test access to IL
2960 var body = m.GetMethodBody ();
2964 ins = body.Instructions [0];
2965 Assert.AreEqual (OpCodes.Ldstr, ins.OpCode);
2966 Assert.AreEqual ("FOO", ins.Operand);
2968 ins = body.Instructions [1];
2969 Assert.AreEqual (OpCodes.Call, ins.OpCode);
2970 Assert.IsInstanceOfType (typeof (MethodMirror), ins.Operand);
2971 Assert.AreEqual ("ref_emit_call", (ins.Operand as MethodMirror).Name);
2975 public void IsAttached () {
2976 var f = entry_point.DeclaringType.GetField ("is_attached");
2978 Event e = run_until ("Main");
2980 AssertValue (true, entry_point.DeclaringType.GetValue (f));
2984 public void StackTraceInNative () {
2985 // Check that stack traces can be produced for threads in native code
2988 Start (new string [] { "dtest-app.exe", "frames-in-native" });
2990 var e = run_until ("frames_in_native");
2992 // FIXME: This is racy
2999 StackFrame[] frames = e.Thread.GetFrames ();
3001 int frame_index = -1;
3002 for (int i = 0; i < frames.Length; ++i) {
3003 if (frames [i].Method.Name == "Sleep") {
3009 Assert.IsTrue (frame_index != -1);
3010 Assert.AreEqual ("Sleep", frames [frame_index].Method.Name);
3011 Assert.AreEqual ("frames_in_native", frames [frame_index + 1].Method.Name);
3012 Assert.AreEqual ("Main", frames [frame_index + 2].Method.Name);
3014 // Check that invokes are disabled for such threads
3015 TypeMirror t = frames [frame_index + 1].Method.DeclaringType;
3017 var m = t.GetMethod ("invoke_static_return_void");
3018 AssertThrows<InvalidOperationException> (delegate {
3019 t.InvokeMethod (e.Thread, m, null);
3022 // Check that the frame info is invalidated
3023 run_until ("frames_in_native_2");
3025 AssertThrows<InvalidStackFrameException> (delegate {
3026 Console.WriteLine (frames [frame_index].GetThis ());
3031 public void VirtualMachine_CreateEnumMirror () {
3032 var e = run_until ("o1");
3033 var frame = e.Thread.GetFrames () [0];
3035 object val = frame.GetThis ();
3036 Assert.IsTrue (val is ObjectMirror);
3037 Assert.AreEqual ("Tests", (val as ObjectMirror).Type.Name);
3038 ObjectMirror o = (val as ObjectMirror);
3040 FieldInfoMirror field = o.Type.GetField ("field_enum");
3041 Value f = o.GetValue (field);
3042 TypeMirror enumType = (f as EnumMirror).Type;
3044 o.SetValue (field, vm.CreateEnumMirror (enumType, vm.CreateValue (1)));
3045 f = o.GetValue (field);
3046 Assert.AreEqual (1, (f as EnumMirror).Value);
3048 // Argument checking
3049 AssertThrows<ArgumentNullException> (delegate () {
3050 vm.CreateEnumMirror (enumType, null);
3053 AssertThrows<ArgumentNullException> (delegate () {
3054 vm.CreateEnumMirror (null, vm.CreateValue (1));
3058 AssertThrows<ArgumentException> (delegate () {
3059 vm.CreateEnumMirror (enumType, vm.CreateValue (null));
3062 // value of a wrong type
3063 AssertThrows<ArgumentException> (delegate () {
3064 vm.CreateEnumMirror (enumType, vm.CreateValue ((long)1));
3069 public void VirtualMachine_EnableEvents_Breakpoint () {
3070 AssertThrows<ArgumentException> (delegate () {
3071 vm.EnableEvents (EventType.Breakpoint);
3076 public void SingleStepRegress654694 () {
3079 MethodMirror m = entry_point.DeclaringType.GetMethod ("ss_regress_654694");
3080 foreach (Location l in m.Locations) {
3081 if (l.ILOffset > 0 && il_offset == -1)
3082 il_offset = l.ILOffset;
3085 Event e = run_until ("ss_regress_654694");
3087 Assert.IsNotNull (m);
3088 vm.SetBreakpoint (m, il_offset);
3092 e = GetNextEvent ();
3093 Assert.IsTrue (e is BreakpointEvent);
3095 var req = create_step (e);
3096 req.Depth = StepDepth.Over;
3097 req.Size = StepSize.Line;
3102 e = GetNextEvent ();
3103 Assert.IsTrue (e is StepEvent);
3109 public void DebugBreak () {
3110 vm.EnableEvents (EventType.UserBreak);
3115 var e = GetNextEvent ();
3116 Assert.IsTrue (e is UserBreakEvent);
3120 public void DebugLog () {
3121 vm.EnableEvents (EventType.UserLog);
3126 var e = GetNextEvent ();
3127 Assert.IsTrue (e is UserLogEvent);
3128 var le = e as UserLogEvent;
3130 Assert.AreEqual (5, le.Level);
3131 Assert.AreEqual ("A", le.Category);
3132 Assert.AreEqual ("B", le.Message);
3136 public void TypeGetMethodsByNameFlags () {
3138 var assembly = entry_point.DeclaringType.Assembly;
3139 var type = assembly.GetType ("Tests3");
3141 Assert.IsNotNull (type);
3143 mm = type.GetMethodsByNameFlags (null, BindingFlags.Static | BindingFlags.Public, false);
3144 Assert.AreEqual (1, mm.Length, "#1");
3145 Assert.AreEqual ("M1", mm[0].Name, "#2");
3147 mm = type.GetMethodsByNameFlags (null, BindingFlags.Static | BindingFlags.NonPublic, false);
3148 Assert.AreEqual (1, mm.Length, "#3");
3149 Assert.AreEqual ("M2", mm[0].Name, "#4");
3151 mm = type.GetMethodsByNameFlags (null, BindingFlags.Instance | BindingFlags.Public, false);
3152 Assert.AreEqual (7, mm.Length, "#5"); //M3 plus Equals, GetHashCode, GetType, ToString, .ctor
3154 mm = type.GetMethodsByNameFlags (null, BindingFlags.Instance | BindingFlags.Public | BindingFlags.DeclaredOnly, false);
3155 Assert.AreEqual (2, mm.Length, "#7");
3157 mm = type.GetMethodsByNameFlags (null, BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.DeclaredOnly, false);
3158 Assert.AreEqual (1, mm.Length, "#9");
3160 mm = type.GetMethodsByNameFlags (null, BindingFlags.Static | BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.DeclaredOnly, false);
3161 Assert.AreEqual (5, mm.Length, "#11");
3164 mm = type.GetMethodsByNameFlags ("M1", BindingFlags.Static | BindingFlags.Public, false);
3165 Assert.AreEqual (1, mm.Length, "#12");
3166 Assert.AreEqual ("M1", mm[0].Name, "#13");
3168 mm = type.GetMethodsByNameFlags ("m1", BindingFlags.Static | BindingFlags.Public, true);
3169 Assert.AreEqual (1, mm.Length, "#14");
3170 Assert.AreEqual ("M1", mm[0].Name, "#15");
3172 mm = type.GetMethodsByNameFlags ("M1", BindingFlags.Static | BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, false);
3173 Assert.AreEqual (1, mm.Length, "#16");
3174 Assert.AreEqual ("M1", mm[0].Name, "#17");
3178 [Category ("only88")]
3179 public void TypeLoadSourceFileFilter () {
3180 Event e = run_until ("type_load");
3182 if (!vm.Version.AtLeast (2, 7))
3185 string srcfile = (e as BreakpointEvent).Method.DeclaringType.GetSourceFiles (true)[0];
3187 var req = vm.CreateTypeLoadRequest ();
3188 req.SourceFileFilter = new string [] { srcfile.ToUpper () };
3192 e = GetNextEvent ();
3193 Assert.IsTrue (e is TypeLoadEvent);
3194 Assert.AreEqual ("TypeLoadClass", (e as TypeLoadEvent).Type.FullName);
3198 public void TypeLoadTypeNameFilter () {
3199 Event e = run_until ("type_load");
3201 var req = vm.CreateTypeLoadRequest ();
3202 req.TypeNameFilter = new string [] { "TypeLoadClass2" };
3206 e = GetNextEvent ();
3207 Assert.IsTrue (e is TypeLoadEvent);
3208 Assert.AreEqual ("TypeLoadClass2", (e as TypeLoadEvent).Type.FullName);
3212 public void GetTypesForSourceFile () {
3215 var types = vm.GetTypesForSourceFile ("dtest-app.cs", false);
3216 Assert.IsTrue (types.Any (t => t.FullName == "Tests"));
3217 Assert.IsFalse (types.Any (t => t.FullName == "System.Int32"));
3219 types = vm.GetTypesForSourceFile ("DTEST-app.cs", true);
3220 Assert.IsTrue (types.Any (t => t.FullName == "Tests"));
3221 Assert.IsFalse (types.Any (t => t.FullName == "System.Int32"));
3225 public void GetTypesNamed () {
3228 var types = vm.GetTypes ("Tests", false);
3229 Assert.AreEqual (1, types.Count);
3230 Assert.AreEqual ("Tests", types [0].FullName);
3232 types = vm.GetTypes ("System.Exception", false);
3233 Assert.AreEqual (1, types.Count);
3234 Assert.AreEqual ("System.Exception", types [0].FullName);
3238 public void String_GetChars () {
3242 var e = run_until ("arg2");
3244 var frame = e.Thread.GetFrames () [0];
3246 val = frame.GetArgument (0);
3247 Assert.IsTrue (val is StringMirror);
3248 AssertValue ("FOO", val);
3249 var s = (val as StringMirror);
3250 Assert.AreEqual (3, s.Length);
3252 var c = s.GetChars (0, 2);
3253 Assert.AreEqual (2, c.Length);
3254 Assert.AreEqual ('F', c [0]);
3255 Assert.AreEqual ('O', c [1]);
3257 AssertThrows<ArgumentException> (delegate () {
3263 public void GetInterfaces () {
3264 var e = run_until ("arg2");
3266 var frame = e.Thread.GetFrames () [0];
3268 var cl1 = frame.Method.DeclaringType.Assembly.GetType ("TestIfaces");
3269 var ifaces = cl1.GetInterfaces ();
3270 Assert.AreEqual (1, ifaces.Length);
3271 Assert.AreEqual ("ITest", ifaces [0].Name);
3273 var cl2 = cl1.GetMethod ("Baz").ReturnType;
3274 var ifaces2 = cl2.GetInterfaces ();
3275 Assert.AreEqual (1, ifaces2.Length);
3276 Assert.AreEqual ("ITest`1", ifaces2 [0].Name);
3280 public void GetInterfaceMap () {
3281 var e = run_until ("arg2");
3283 var frame = e.Thread.GetFrames () [0];
3285 var cl1 = frame.Method.DeclaringType.Assembly.GetType ("TestIfaces");
3286 var iface = cl1.Assembly.GetType ("ITest");
3287 var map = cl1.GetInterfaceMap (iface);
3288 Assert.AreEqual (cl1, map.TargetType);
3289 Assert.AreEqual (iface, map.InterfaceType);
3290 Assert.AreEqual (2, map.InterfaceMethods.Length);
3291 Assert.AreEqual (2, map.TargetMethods.Length);
3295 public void StackAlloc_Breakpoints_Regress2775 () {
3296 // Check that breakpoints on arm don't overwrite stackalloc-ed memory
3297 var e = run_until ("regress_2755");
3299 var frame = e.Thread.GetFrames () [0];
3301 // This breaks at the call site
3302 vm.SetBreakpoint (m, m.Locations [2].ILOffset);
3305 var e2 = GetNextEvent ();
3306 Assert.IsTrue (e2 is BreakpointEvent);
3308 e = run_until ("regress_2755_3");
3309 frame = e.Thread.GetFrames () [1];
3310 var res = frame.GetValue (m.GetLocal ("sum"));
3311 AssertValue (0, res);
3315 public void MethodInfo () {
3316 Event e = run_until ("locals2");
3318 StackFrame frame = e.Thread.GetFrames () [0];
3319 var m = frame.Method;
3321 Assert.IsTrue (m.IsGenericMethod);
3322 Assert.IsFalse (m.IsGenericMethodDefinition);
3324 var args = m.GetGenericArguments ();
3325 Assert.AreEqual (1, args.Length);
3326 Assert.AreEqual ("String", args [0].Name);
3328 var gmd = m.GetGenericMethodDefinition ();
3329 Assert.IsTrue (gmd.IsGenericMethod);
3330 Assert.IsTrue (gmd.IsGenericMethodDefinition);
3331 Assert.AreEqual (gmd, gmd.GetGenericMethodDefinition ());
3333 args = gmd.GetGenericArguments ();
3334 Assert.AreEqual (1, args.Length);
3335 Assert.AreEqual ("T", args [0].Name);
3337 var attrs = m.GetCustomAttributes (true);
3338 Assert.AreEqual (1, attrs.Length);
3339 Assert.AreEqual ("StateMachineAttribute", attrs [0].Constructor.DeclaringType.Name);
3343 public void UnhandledException () {
3346 Start (new string [] { "dtest-app.exe", "unhandled-exception" });
3348 var req = vm.CreateExceptionRequest (null, false, true);
3351 var e = run_until ("unhandled_exception");
3354 var e2 = GetNextEvent ();
3355 Assert.IsTrue (e2 is ExceptionEvent);
3362 public void UnhandledException_2 () {
3365 Start (new string [] { "dtest-app.exe", "unhandled-exception-endinvoke" });
3367 var req = vm.CreateExceptionRequest (null, false, true);
3370 MethodMirror m = entry_point.DeclaringType.GetMethod ("unhandled_exception_endinvoke_2");
3371 Assert.IsNotNull (m);
3372 vm.SetBreakpoint (m, m.ILOffsets [0]);
3374 var e = run_until ("unhandled_exception_endinvoke");
3377 var e2 = GetNextEvent ();
3378 Assert.IsFalse (e2 is ExceptionEvent);
3386 public void UnhandledExceptionUserCode () {
3389 // Exceptions caught in non-user code are treated as unhandled
3390 Start (new string [] { "dtest-app.exe", "unhandled-exception-user" });
3392 var req = vm.CreateExceptionRequest (null, false, true);
3393 req.AssemblyFilter = new List<AssemblyMirror> () { entry_point.DeclaringType.Assembly };
3396 var e = run_until ("unhandled_exception_user");
3399 var e2 = GetNextEvent ();
3400 Assert.IsTrue (e2 is ExceptionEvent);
3408 public void GCWhileSuspended () {
3409 // Check that objects are kept alive during suspensions
3410 Event e = run_until ("gc_suspend_1");
3412 MethodMirror m = entry_point.DeclaringType.GetMethod ("gc_suspend_invoke");
3414 var o = entry_point.DeclaringType.GetValue (entry_point.DeclaringType.GetField ("gc_suspend_field")) as ObjectMirror;
3415 //Console.WriteLine (o);
3417 StackFrame frame = e.Thread.GetFrames () [0];
3418 TypeMirror t = frame.Method.DeclaringType;
3419 for (int i = 0; i < 10; ++i)
3420 t.InvokeMethod (e.Thread, m, new Value [] { });
3422 // This throws an exception if the object is collected
3423 long addr = o.Address;
3425 var o2 = entry_point.DeclaringType.GetValue (entry_point.DeclaringType.GetField ("gc_suspend_field")) as ObjectMirror;
3430 public void MakeGenericMethod () {
3431 Event e = run_until ("bp1");
3433 var intm = vm.RootDomain.GetCorrespondingType (typeof (int));
3434 var stringm = vm.RootDomain.GetCorrespondingType (typeof (string));
3435 var gm = entry_point.DeclaringType.GetMethod ("generic_method");
3436 var res = gm.MakeGenericMethod (new TypeMirror [] { stringm });
3437 var args = res.GetGenericArguments ();
3438 Assert.AreEqual (1, args.Length);
3439 Assert.AreEqual (stringm, args [0]);
3442 AssertThrows<ArgumentNullException> (delegate {
3443 gm.MakeGenericMethod (null);
3445 AssertThrows<ArgumentNullException> (delegate {
3446 gm.MakeGenericMethod (new TypeMirror [] { null });
3448 AssertThrows<ArgumentException> (delegate {
3449 gm.MakeGenericMethod (new TypeMirror [] { stringm, stringm });
3451 AssertThrows<InvalidOperationException> (delegate {
3452 gm.MakeGenericMethod (new TypeMirror [] { intm });
3454 AssertThrows<InvalidOperationException> (delegate {
3455 entry_point.DeclaringType.GetMethod ("Main").MakeGenericMethod (new TypeMirror [] { intm });
3460 public void InspectThreadSuspenedOnWaitOne () {
3462 Start (true, "dtest-app.exe", "wait-one" );
3464 ThreadMirror.NativeTransitions = true;
3466 var evt = run_until ("wait_one");
3467 Assert.IsNotNull (evt, "#1");
3469 var thread = evt.Thread;
3470 Assert.AreEqual (ThreadState.Running, thread.ThreadState, "#1.1");
3472 var frames = thread.GetFrames ();
3473 Assert.IsNotNull (frames, "#2");
3474 Assert.AreEqual (2, frames.Length, "#3");
3475 Assert.AreEqual ("wait_one", frames [0].Method.Name, "#4");
3476 Assert.AreEqual ("Main", frames [1].Method.Name, "#5");
3480 Thread.Sleep (500); //FIXME this is racy, maybe single step? or something?
3483 Assert.AreEqual (ThreadState.WaitSleepJoin, thread.ThreadState, "#6");
3485 frames = thread.GetFrames ();
3486 Assert.AreEqual (4, frames.Length, "#7");
3487 Assert.AreEqual ("WaitOne_internal", frames [0].Method.Name, "#8");
3488 Assert.AreEqual ("WaitOne", frames [1].Method.Name, "#8.1");
3489 Assert.AreEqual ("wait_one", frames [2].Method.Name, "#9");
3490 Assert.AreEqual ("Main", frames [3].Method.Name, "#10");
3493 var frame = frames [0];
3494 Assert.IsTrue (frame.IsNativeTransition, "#11.1");
3497 Assert.Fail ("Known limitation - can't get info from m2n frames");
3498 } catch (AbsentInformationException) {}
3501 Assert.IsFalse (frame.IsNativeTransition, "#12.1");
3502 var wait_one_this = frame.GetThis ();
3503 Assert.IsNotNull (wait_one_this, "#12.2");
3506 var locals = frame.GetVisibleVariables ();
3507 Assert.AreEqual (1, locals.Count, "#13.1");
3509 var local_0 = frame.GetValue (locals [0]);
3510 Assert.IsNotNull (local_0, "#13.2");
3512 Assert.AreEqual (wait_one_this, local_0, "#14.2");
3516 public void GetMethodBody () {
3517 var bevent = run_until ("Main");
3519 var m = bevent.Method.DeclaringType.GetMethod ("get_IntProperty");
3520 var body = m.GetMethodBody ();
3521 foreach (var ins in body.Instructions) {
3522 if (ins.OpCode == OpCodes.Ldfld) {
3523 var field = (FieldInfoMirror)ins.Operand;
3524 Assert.AreEqual ("field_i", field.Name);
3530 public void EvaluateMethod () {
3531 var bevent = run_until ("evaluate_method_2");
3533 var m = bevent.Method.DeclaringType.GetMethod ("get_IntProperty");
3535 var this_obj = bevent.Thread.GetFrames ()[0].GetThis ();
3536 var v = m.Evaluate (this_obj, null);
3537 AssertValue (42, v);
3541 public void SetIP () {
3542 var bevent = run_until ("set_ip_1");
3544 var invalid_loc = bevent.Thread.GetFrames ()[0].Location;
3546 var req = create_step (bevent);
3547 var e = step_out ();
3549 var frames = e.Thread.GetFrames ();
3550 var locs = frames [0].Method.Locations;
3551 var next_loc = locs.First (l => (l.LineNumber == frames [0].Location.LineNumber + 2));
3553 e.Thread.SetIP (next_loc);
3555 /* Check that i ++; j = 5; was skipped */
3556 bevent = run_until ("set_ip_2");
3557 var f = bevent.Thread.GetFrames ()[1];
3558 AssertValue (2, f.GetValue (f.Method.GetLocal ("i")));
3559 AssertValue (0, f.GetValue (f.Method.GetLocal ("j")));
3562 AssertThrows<ArgumentNullException> (delegate {
3563 e.Thread.SetIP (null);
3566 AssertThrows<ArgumentException> (delegate {
3567 e.Thread.SetIP (invalid_loc);
3572 public void SetIPSingleStep () {
3573 // Check that single stepping after set-ip steps from the new ip
3574 var bevent = run_until ("set_ip_1");
3576 var invalid_loc = bevent.Thread.GetFrames ()[0].Location;
3578 var req = create_step (bevent);
3579 req.Size = StepSize.Line;
3580 var e = step_out ();
3582 var frames = e.Thread.GetFrames ();
3583 var locs = frames [0].Method.Locations;
3584 var prev_loc = locs.First (l => (l.LineNumber == frames [0].Location.LineNumber - 3));
3585 AssertValue (2, frames [0].GetValue (frames [0].Method.GetLocal ("i")));
3587 Console.WriteLine ("X: " + frames [0].Location.LineNumber);
3588 // Set back the ip to the first i ++; line
3589 e.Thread.SetIP (prev_loc);
3592 var f = e.Thread.GetFrames ()[0];
3593 Console.WriteLine (f.GetValue (f.Method.GetLocal ("i")));
3594 AssertValue (3, f.GetValue (f.Method.GetLocal ("i")));
3598 public void NewInstanceNoCtor () {
3599 var bevent = run_until ("Main");
3601 var stype = bevent.Method.DeclaringType.Assembly.GetType ("AStruct");
3602 var obj = stype.NewInstance ();
3603 Assert.IsTrue (obj is ObjectMirror);
3604 Assert.AreEqual ("AStruct", (obj as ObjectMirror).Type.Name);
3608 public void StaticCtorFilterInCctor () {
3609 // Check that single stepping when in a cctor only ignores
3610 // other cctors, not the current one
3611 var bevent = run_until ("step_filters");
3613 var assembly = entry_point.DeclaringType.Assembly;
3614 var type = assembly.GetType ("Tests/ClassWithCctor");
3615 var cctor = type.GetMethod (".cctor");
3616 vm.SetBreakpoint (cctor, 0);
3619 var e = vm.GetNextEvent ();
3620 Assert.IsTrue (e is BreakpointEvent);
3622 var req = create_step (e);
3623 req.Filter = StepFilter.StaticCtor;
3625 // Make sure we are still in the cctor
3626 Assert.AreEqual (".cctor", e.Thread.GetFrames ()[0].Location.Method.Name);