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 ss3_2 ()
425 assert_location (e, "ss3_2");
427 // Step over ss3_2_2 ()
429 assert_location (e, "ss3_2");
431 // Recreate the request
438 // Step back into single_stepping () with the new request
440 assert_location (e, "single_stepping");
444 assert_location (e, "ss4");
449 // Change to StepSize.Line
451 req.Depth = StepDepth.Over;
452 req.Size = StepSize.Line;
455 // Step over ss1 (); ss1 ();
460 req.Depth = StepDepth.Into;
464 assert_location (e, "ss2");
469 e = run_until ("ss5");
471 // Add an assembly filter
472 req.AssemblyFilter = new AssemblyMirror [] { (e as BreakpointEvent).Method.DeclaringType.Assembly };
478 // Step into is_even, skipping the linq stuff
480 assert_location (e, "is_even");
482 // FIXME: Check that single stepping works with lock (obj)
486 e = run_until ("ss6");
488 req = create_step (e);
489 req.Depth = StepDepth.Over;
492 // Check that single stepping works in out-of-line bblocks
495 assert_location (e, "ss6");
498 // Check that a step over stops at an EH clause
499 e = run_until ("ss7_2");
500 req = create_step (e);
501 req.Depth = StepDepth.Out;
504 assert_location (e, "ss7");
506 req = create_step (e);
507 req.Depth = StepDepth.Over;
510 assert_location (e, "ss7");
513 // Check that stepping stops between nested calls
514 e = run_until ("ss_nested_2");
516 assert_location (e, "ss_nested");
518 assert_location (e, "ss_nested_1");
520 assert_location (e, "ss_nested");
521 // Check that step over steps over nested calls
523 assert_location (e, "ss_nested");
525 assert_location (e, "ss_nested_3");
528 // Check DebuggerStepThrough support
529 e = run_until ("ss_step_through");
530 req = create_step (e);
531 req.Filter = StepFilter.DebuggerStepThrough;
533 // Step through step_through_1 ()
535 assert_location (e, "ss_step_through");
536 // Step through StepThroughClass.step_through_2 ()
538 assert_location (e, "ss_step_through");
540 req.Filter = StepFilter.None;
542 assert_location (e, "step_through_3");
545 // Check DebuggerNonUserCode support
546 e = run_until ("ss_non_user_code");
547 req = create_step (e);
548 req.Filter = StepFilter.DebuggerNonUserCode;
550 // Step through non_user_code_1 ()
552 assert_location (e, "ss_non_user_code");
553 // Step through StepThroughClass.non_user_code_2 ()
555 assert_location (e, "ss_non_user_code");
557 req.Filter = StepFilter.None;
559 assert_location (e, "non_user_code_3");
562 // Check that step-over doesn't stop at inner frames with recursive functions
563 e = run_until ("ss_recursive");
564 req = create_step (e);
568 var f = e.Thread.GetFrames () [0];
569 assert_location (e, "ss_recursive");
570 AssertValue (1, f.GetValue (f.Method.GetLocal ("n")));
573 // Check that single stepping doesn't clobber fp values
574 e = run_until ("ss_fp_clobber");
575 req = create_step (e);
577 f = e.Thread.GetFrames ()[0];
579 if ((e as StepEvent).Method.Name == "ss_fp_clobber_2")
583 f = e.Thread.GetFrames ()[0];
584 AssertValue (7.0, f.GetValue (f.Method.GetParameters ()[0]));
589 public void MethodEntryExit () {
590 run_until ("single_stepping");
592 var req1 = vm.CreateMethodEntryRequest ();
593 var req2 = vm.CreateMethodExitRequest ();
599 Event e = GetNextEvent ();
600 Assert.IsTrue (e is MethodEntryEvent);
601 Assert.AreEqual ("ss1", (e as MethodEntryEvent).Method.Name);
605 Assert.IsTrue (e is MethodExitEvent);
606 Assert.AreEqual ("ss1", (e as MethodExitEvent).Method.Name);
613 public void CountFilter () {
614 run_until ("single_stepping");
616 MethodMirror m2 = entry_point.DeclaringType.GetMethod ("ss3");
617 Assert.IsNotNull (m2);
618 vm.SetBreakpoint (m2, 0);
620 var req1 = vm.CreateMethodEntryRequest ();
624 // Enter ss2, ss1 is skipped
626 Event e = GetNextEvent ();
627 Assert.IsTrue (e is MethodEntryEvent);
628 Assert.AreEqual ("ss2", (e as MethodEntryEvent).Method.Name);
630 // Breakpoint on ss3, the entry event is no longer reported
633 Assert.IsTrue (e is BreakpointEvent);
639 public void Arguments () {
642 var e = run_until ("arg1");
644 StackFrame frame = e.Thread.GetFrames () [0];
646 check_arg_val (frame, 0, typeof (sbyte), SByte.MaxValue - 5);
647 check_arg_val (frame, 1, typeof (byte), Byte.MaxValue - 5);
648 check_arg_val (frame, 2, typeof (bool), true);
649 check_arg_val (frame, 3, typeof (short), Int16.MaxValue - 5);
650 check_arg_val (frame, 4, typeof (ushort), UInt16.MaxValue - 5);
651 check_arg_val (frame, 5, typeof (char), 'F');
652 check_arg_val (frame, 6, typeof (int), Int32.MaxValue - 5);
653 check_arg_val (frame, 7, typeof (uint), UInt32.MaxValue - 5);
654 check_arg_val (frame, 8, typeof (long), Int64.MaxValue - 5);
655 check_arg_val (frame, 9, typeof (ulong), UInt64.MaxValue - 5);
656 check_arg_val (frame, 10, typeof (float), 1.2345f);
657 check_arg_val (frame, 11, typeof (double), 6.78910);
659 e = run_until ("arg2");
661 frame = e.Thread.GetFrames () [0];
664 val = frame.GetArgument (0);
665 AssertValue ("FOO", val);
666 Assert.AreEqual ("String", (val as ObjectMirror).Type.Name);
669 val = frame.GetArgument (1);
670 AssertValue (null, val);
673 val = frame.GetArgument (2);
674 AssertValue ("BLA", val);
677 val = frame.GetArgument (3);
678 AssertValue (42, val);
681 val = frame.GetArgument (4);
682 Assert.IsTrue (val is ObjectMirror);
683 Assert.AreEqual ("GClass`1", (val as ObjectMirror).Type.Name);
686 val = frame.GetArgument (5);
687 Assert.IsTrue (val is ObjectMirror);
688 Assert.AreEqual ("Object", (val as ObjectMirror).Type.Name);
690 // this on static methods
691 val = frame.GetThis ();
692 AssertValue (null, val);
694 e = run_until ("arg3");
696 frame = e.Thread.GetFrames () [0];
699 val = frame.GetThis ();
700 Assert.IsTrue (val is ObjectMirror);
701 Assert.AreEqual ("Tests", (val as ObjectMirror).Type.Name);
703 // objref in register
704 val = frame.GetArgument (0);
705 AssertValue ("BLA", val);
709 public void Arrays () {
712 var e = run_until ("o2");
714 StackFrame frame = e.Thread.GetFrames () [0];
717 val = frame.GetArgument (0);
718 Assert.IsTrue (val is ArrayMirror);
719 ArrayMirror arr = val as ArrayMirror;
720 Assert.AreEqual (2, arr.Length);
721 AssertValue ("BAR", arr [0]);
722 AssertValue ("BAZ", arr [1]);
724 var vals = arr.GetValues (0, 2);
725 Assert.AreEqual (2, vals.Count);
726 AssertValue ("BAR", vals [0]);
727 AssertValue ("BAZ", vals [1]);
729 arr [0] = vm.RootDomain.CreateString ("ABC");
730 AssertValue ("ABC", arr [0]);
732 arr [0] = vm.CreateValue (null);
733 AssertValue (null, arr [0]);
735 arr.SetValues (0, new Value [] { vm.RootDomain.CreateString ("D1"), vm.RootDomain.CreateString ("D2") });
736 AssertValue ("D1", arr [0]);
737 AssertValue ("D2", arr [1]);
740 val = frame.GetArgument (1);
741 Assert.IsTrue (val is ArrayMirror);
742 arr = val as ArrayMirror;
743 Assert.AreEqual (2, arr.Length);
744 AssertValue (42, arr [0]);
745 AssertValue (43, arr [1]);
748 AssertThrows<IndexOutOfRangeException> (delegate () {
752 AssertThrows<IndexOutOfRangeException> (delegate () {
753 val = arr [Int32.MinValue];
756 AssertThrows<IndexOutOfRangeException> (delegate () {
757 vals = arr.GetValues (0, 3);
760 AssertThrows<IndexOutOfRangeException> (delegate () {
761 arr [2] = vm.CreateValue (null);
764 AssertThrows<IndexOutOfRangeException> (delegate () {
765 arr [Int32.MinValue] = vm.CreateValue (null);
768 AssertThrows<IndexOutOfRangeException> (delegate () {
769 arr.SetValues (0, new Value [] { null, null, null });
773 val = frame.GetArgument (2);
774 Assert.IsTrue (val is ArrayMirror);
775 arr = val as ArrayMirror;
776 Assert.AreEqual (2, arr.Rank);
777 Assert.AreEqual (4, arr.Length);
778 Assert.AreEqual (2, arr.GetLength (0));
779 Assert.AreEqual (2, arr.GetLength (1));
780 Assert.AreEqual (0, arr.GetLowerBound (0));
781 Assert.AreEqual (0, arr.GetLowerBound (1));
782 vals = arr.GetValues (0, 4);
783 AssertValue (1, vals [0]);
784 AssertValue (2, vals [1]);
785 AssertValue (3, vals [2]);
786 AssertValue (4, vals [3]);
788 val = frame.GetArgument (3);
789 Assert.IsTrue (val is ArrayMirror);
790 arr = val as ArrayMirror;
791 Assert.AreEqual (2, arr.Rank);
792 Assert.AreEqual (4, arr.Length);
793 Assert.AreEqual (2, arr.GetLength (0));
794 Assert.AreEqual (2, arr.GetLength (1));
795 Assert.AreEqual (1, arr.GetLowerBound (0));
796 Assert.AreEqual (3, arr.GetLowerBound (1));
798 AssertThrows<ArgumentOutOfRangeException> (delegate () {
801 AssertThrows<ArgumentOutOfRangeException> (delegate () {
805 AssertThrows<ArgumentOutOfRangeException> (delegate () {
806 arr.GetLowerBound (-1);
808 AssertThrows<ArgumentOutOfRangeException> (delegate () {
809 arr.GetLowerBound (2);
812 // arrays treated as generic collections
813 val = frame.GetArgument (4);
814 Assert.IsTrue (val is ArrayMirror);
815 arr = val as ArrayMirror;
819 public void Object_GetValue () {
820 var e = run_until ("o1");
821 var frame = e.Thread.GetFrames () [0];
823 object val = frame.GetThis ();
824 Assert.IsTrue (val is ObjectMirror);
825 Assert.AreEqual ("Tests", (val as ObjectMirror).Type.Name);
826 ObjectMirror o = (val as ObjectMirror);
828 TypeMirror t = o.Type;
831 object f = o.GetValue (t.GetField ("field_i"));
833 f = o.GetValue (t.GetField ("field_s"));
834 AssertValue ("S", f);
835 f = o.GetValue (t.GetField ("field_enum"));
836 Assert.IsTrue (f is EnumMirror);
837 Assert.AreEqual (1, (f as EnumMirror).Value);
838 Assert.AreEqual ("B", (f as EnumMirror).StringValue);
840 // Inherited object fields
841 TypeMirror parent = t.BaseType;
842 f = o.GetValue (parent.GetField ("base_field_i"));
844 f = o.GetValue (parent.GetField ("base_field_s"));
845 AssertValue ("T", f);
848 f = o.GetValue (o.Type.GetField ("static_i"));
852 ObjectMirror o2 = frame.GetValue (frame.Method.GetParameters ()[1]) as ObjectMirror;
853 Assert.AreEqual ("GClass`1", o2.Type.Name);
854 TypeMirror t2 = o2.Type;
855 f = o2.GetValue (t2.GetField ("field"));
858 ObjectMirror o3 = frame.GetValue (frame.Method.GetParameters ()[2]) as ObjectMirror;
859 Assert.AreEqual ("GClass`1", o3.Type.Name);
860 TypeMirror t3 = o3.Type;
861 f = o3.GetValue (t3.GetField ("field"));
862 AssertValue ("FOO", f);
865 AssertThrows<ArgumentNullException> (delegate () {
871 public void Object_GetValues () {
872 var e = run_until ("o1");
873 var frame = e.Thread.GetFrames () [0];
875 object val = frame.GetThis ();
876 Assert.IsTrue (val is ObjectMirror);
877 Assert.AreEqual ("Tests", (val as ObjectMirror).Type.Name);
878 ObjectMirror o = (val as ObjectMirror);
880 ObjectMirror val2 = frame.GetValue (frame.Method.GetParameters ()[0]) as ObjectMirror;
882 TypeMirror t = o.Type;
884 object[] vals = o.GetValues (new FieldInfoMirror [] { t.GetField ("field_i"), t.GetField ("field_s") });
888 AssertValue ("S", f);
891 AssertThrows<ArgumentNullException> (delegate () {
895 AssertThrows<ArgumentNullException> (delegate () {
896 o.GetValues (new FieldInfoMirror [] { null });
899 // field of another class
900 AssertThrows<ArgumentException> (delegate () {
901 o.GetValue (val2.Type.GetField ("field_j"));
905 void TestSetValue (ObjectMirror o, string field_name, object val) {
907 o.SetValue (o.Type.GetField (field_name), vm.RootDomain.CreateString ((string)val));
909 o.SetValue (o.Type.GetField (field_name), vm.CreateValue (val));
910 Value f = o.GetValue (o.Type.GetField (field_name));
911 AssertValue (val, f);
915 public void Object_SetValues () {
916 var e = run_until ("o1");
917 var frame = e.Thread.GetFrames () [0];
919 object val = frame.GetThis ();
920 Assert.IsTrue (val is ObjectMirror);
921 Assert.AreEqual ("Tests", (val as ObjectMirror).Type.Name);
922 ObjectMirror o = (val as ObjectMirror);
924 ObjectMirror val2 = frame.GetValue (frame.Method.GetParameters ()[0]) as ObjectMirror;
926 TestSetValue (o, "field_i", 22);
927 TestSetValue (o, "field_bool1", false);
928 TestSetValue (o, "field_bool2", true);
929 TestSetValue (o, "field_char", 'B');
930 TestSetValue (o, "field_byte", (byte)129);
931 TestSetValue (o, "field_sbyte", (sbyte)-33);
932 TestSetValue (o, "field_short", (short)(Int16.MaxValue - 5));
933 TestSetValue (o, "field_ushort", (ushort)(UInt16.MaxValue - 5));
934 TestSetValue (o, "field_long", Int64.MaxValue - 5);
935 TestSetValue (o, "field_ulong", (ulong)(UInt64.MaxValue - 5));
936 TestSetValue (o, "field_float", 6.28f);
937 TestSetValue (o, "field_double", 6.28);
938 TestSetValue (o, "static_i", 23);
939 TestSetValue (o, "field_s", "CDEF");
944 f = o.GetValue (o.Type.GetField ("field_intptr"));
945 Assert.IsInstanceOfType (typeof (StructMirror), f);
946 AssertValue (Int32.MaxValue - 5, (f as StructMirror).Fields [0]);
949 FieldInfoMirror field = o.Type.GetField ("field_enum");
950 f = o.GetValue (field);
951 (f as EnumMirror).Value = 5;
952 o.SetValue (field, f);
953 f = o.GetValue (field);
954 Assert.AreEqual (5, (f as EnumMirror).Value);
957 o.SetValue (o.Type.GetField ("field_s"), vm.CreateValue (null));
958 f = o.GetValue (o.Type.GetField ("field_s"));
959 AssertValue (null, f);
962 field = o.Type.GetField ("generic_field_struct");
963 f = o.GetValue (field);
964 o.SetValue (field, f);
967 field = o.Type.GetField ("field_nullable");
968 f = o.GetValue (field);
969 AssertValue (0, (f as StructMirror).Fields [0]);
970 AssertValue (false, (f as StructMirror).Fields [1]);
971 o.SetValue (field, vm.CreateValue (6));
972 f = o.GetValue (field);
973 AssertValue (6, (f as StructMirror).Fields [0]);
974 AssertValue (true, (f as StructMirror).Fields [1]);
975 o.SetValue (field, vm.CreateValue (null));
976 f = o.GetValue (field);
977 AssertValue (0, (f as StructMirror).Fields [0]);
978 AssertValue (false, (f as StructMirror).Fields [1]);
981 AssertThrows<ArgumentNullException> (delegate () {
982 o.SetValues (null, new Value [0]);
985 AssertThrows<ArgumentNullException> (delegate () {
986 o.SetValues (new FieldInfoMirror [0], null);
989 AssertThrows<ArgumentNullException> (delegate () {
990 o.SetValues (new FieldInfoMirror [] { null }, new Value [1] { null });
993 // vtype with a wrong type
994 AssertThrows<ArgumentException> (delegate () {
995 o.SetValue (o.Type.GetField ("field_struct"), o.GetValue (o.Type.GetField ("field_enum")));
998 // reference type not assignment compatible
999 AssertThrows<ArgumentException> (delegate () {
1000 o.SetValue (o.Type.GetField ("field_class"), o);
1003 // field of another class
1004 AssertThrows<ArgumentException> (delegate () {
1005 o.SetValue (val2.Type.GetField ("field_j"), vm.CreateValue (1));
1010 public void Type_SetValue () {
1011 var e = run_until ("o1");
1012 var frame = e.Thread.GetFrames () [0];
1015 object val = frame.GetThis ();
1016 Assert.IsTrue (val is ObjectMirror);
1017 Assert.AreEqual ("Tests", (val as ObjectMirror).Type.Name);
1018 ObjectMirror o = (val as ObjectMirror);
1020 ObjectMirror val2 = frame.GetValue (frame.Method.GetParameters ()[0]) as ObjectMirror;
1022 o.Type.SetValue (o.Type.GetField ("static_i"), vm.CreateValue (55));
1023 f = o.Type.GetValue (o.Type.GetField ("static_i"));
1024 AssertValue (55, f);
1026 o.Type.SetValue (o.Type.GetField ("static_s"), vm.RootDomain.CreateString ("B"));
1027 f = o.Type.GetValue (o.Type.GetField ("static_s"));
1028 AssertValue ("B", f);
1030 // Argument checking
1031 AssertThrows<ArgumentNullException> (delegate () {
1032 o.Type.SetValue (null, vm.CreateValue (0));
1035 AssertThrows<ArgumentNullException> (delegate () {
1036 o.Type.SetValue (o.Type.GetField ("static_i"), null);
1039 // field of another class
1040 AssertThrows<ArgumentException> (delegate () {
1041 o.SetValue (val2.Type.GetField ("field_j"), vm.CreateValue (1));
1046 public void TypeInfo () {
1047 Event e = run_until ("ti2");
1048 StackFrame frame = e.Thread.GetFrames () [0];
1053 t = frame.Method.GetParameters ()[0].ParameterType;
1055 Assert.AreEqual ("String[]", t.Name);
1056 Assert.AreEqual ("string[]", t.CSharpName);
1057 Assert.AreEqual ("Array", t.BaseType.Name);
1058 Assert.AreEqual (true, t.HasElementType);
1059 Assert.AreEqual (true, t.IsArray);
1060 Assert.AreEqual (1, t.GetArrayRank ());
1061 Assert.AreEqual ("String", t.GetElementType ().Name);
1063 t = frame.Method.GetParameters ()[2].ParameterType;
1065 Assert.AreEqual ("Int32[,]", t.Name);
1067 //Assert.AreEqual ("int[,]", t.CSharpName);
1068 Assert.AreEqual ("Array", t.BaseType.Name);
1069 Assert.AreEqual (true, t.HasElementType);
1070 Assert.AreEqual (true, t.IsArray);
1071 Assert.AreEqual (2, t.GetArrayRank ());
1072 Assert.AreEqual ("Int32", t.GetElementType ().Name);
1075 t = frame.Method.GetParameters ()[3].ParameterType;
1077 //Assert.AreEqual ("Int32&", t.Name);
1078 //Assert.AreEqual (true, t.IsByRef);
1079 //Assert.AreEqual (true, t.HasElementType);
1082 t = frame.Method.GetParameters ()[4].ParameterType;
1084 //Assert.AreEqual ("Int32*", t.Name);
1085 Assert.AreEqual (true, t.IsPointer);
1086 Assert.AreEqual (true, t.HasElementType);
1087 Assert.AreEqual ("Int32", t.GetElementType ().Name);
1088 Assert.AreEqual (false, t.IsPrimitive);
1091 t = frame.Method.GetParameters ()[5].ParameterType;
1092 Assert.AreEqual (true, t.IsPrimitive);
1095 t = frame.Method.GetParameters ()[6].ParameterType;
1096 Assert.AreEqual ("AStruct", t.Name);
1097 Assert.AreEqual (false, t.IsPrimitive);
1098 Assert.AreEqual (true, t.IsValueType);
1099 Assert.AreEqual (false, t.IsClass);
1102 t = frame.Method.GetParameters ()[7].ParameterType;
1103 Assert.AreEqual ("Tests", t.Name);
1104 var nested = (from nt in t.GetNestedTypes () where nt.IsNestedPublic select nt).ToArray ();
1105 Assert.AreEqual (1, nested.Length);
1106 Assert.AreEqual ("NestedClass", nested [0].Name);
1107 Assert.IsTrue (t.BaseType.IsAssignableFrom (t));
1108 Assert.IsTrue (!t.IsAssignableFrom (t.BaseType));
1110 // generic instances
1111 t = frame.Method.GetParameters ()[9].ParameterType;
1112 Assert.AreEqual ("GClass`1", t.Name);
1113 Assert.IsTrue (t.IsGenericType);
1114 Assert.IsFalse (t.IsGenericTypeDefinition);
1116 var args = t.GetGenericArguments ();
1117 Assert.AreEqual (1, args.Length);
1118 Assert.AreEqual ("Int32", args [0].Name);
1120 // generic type definitions
1121 var gtd = t.GetGenericTypeDefinition ();
1122 Assert.AreEqual ("GClass`1", gtd.Name);
1123 Assert.IsTrue (gtd.IsGenericType);
1124 Assert.IsTrue (gtd.IsGenericTypeDefinition);
1125 Assert.AreEqual (gtd, gtd.GetGenericTypeDefinition ());
1127 args = gtd.GetGenericArguments ();
1128 Assert.AreEqual (1, args.Length);
1129 Assert.AreEqual ("T", args [0].Name);
1132 t = frame.Method.GetParameters ()[10].ParameterType;
1133 Assert.AreEqual ("AnEnum", t.Name);
1134 Assert.IsTrue (t.IsEnum);
1135 Assert.AreEqual ("Int32", t.EnumUnderlyingType.Name);
1138 t = frame.Method.GetParameters ()[7].ParameterType;
1140 var props = t.GetProperties ();
1141 Assert.AreEqual (3, props.Length);
1142 foreach (PropertyInfoMirror prop in props) {
1143 ParameterInfoMirror[] indexes = prop.GetIndexParameters ();
1145 if (prop.Name == "IntProperty") {
1146 Assert.AreEqual ("Int32", prop.PropertyType.Name);
1147 Assert.AreEqual ("get_IntProperty", prop.GetGetMethod ().Name);
1148 Assert.AreEqual ("set_IntProperty", prop.GetSetMethod ().Name);
1149 Assert.AreEqual (0, indexes.Length);
1150 } else if (prop.Name == "ReadOnlyProperty") {
1151 Assert.AreEqual ("Int32", prop.PropertyType.Name);
1152 Assert.AreEqual ("get_ReadOnlyProperty", prop.GetGetMethod ().Name);
1153 Assert.AreEqual (null, prop.GetSetMethod ());
1154 Assert.AreEqual (0, indexes.Length);
1155 } else if (prop.Name == "IndexedProperty") {
1156 Assert.AreEqual (1, indexes.Length);
1157 Assert.AreEqual ("Int32", indexes [0].ParameterType.Name);
1161 // custom attributes
1162 t = frame.Method.GetParameters ()[8].ParameterType;
1163 Assert.AreEqual ("Tests2", t.Name);
1164 var attrs = t.GetCustomAttributes (true);
1165 Assert.AreEqual (5, attrs.Length);
1166 foreach (var attr in attrs) {
1167 if (attr.Constructor.DeclaringType.Name == "DebuggerDisplayAttribute") {
1168 Assert.AreEqual (1, attr.ConstructorArguments.Count);
1169 Assert.AreEqual ("Tests", attr.ConstructorArguments [0].Value);
1170 Assert.AreEqual (2, attr.NamedArguments.Count);
1171 Assert.AreEqual ("Name", attr.NamedArguments [0].Property.Name);
1172 Assert.AreEqual ("FOO", attr.NamedArguments [0].TypedValue.Value);
1173 Assert.AreEqual ("Target", attr.NamedArguments [1].Property.Name);
1174 Assert.IsInstanceOfType (typeof (TypeMirror), attr.NamedArguments [1].TypedValue.Value);
1175 Assert.AreEqual ("Int32", (attr.NamedArguments [1].TypedValue.Value as TypeMirror).Name);
1176 } else if (attr.Constructor.DeclaringType.Name == "DebuggerTypeProxyAttribute") {
1177 Assert.AreEqual (1, attr.ConstructorArguments.Count);
1178 Assert.IsInstanceOfType (typeof (TypeMirror), attr.ConstructorArguments [0].Value);
1179 Assert.AreEqual ("Tests", (attr.ConstructorArguments [0].Value as TypeMirror).Name);
1180 } else if (attr.Constructor.DeclaringType.Name == "BAttribute") {
1181 Assert.AreEqual (2, attr.NamedArguments.Count);
1182 Assert.AreEqual ("afield", attr.NamedArguments [0].Field.Name);
1183 Assert.AreEqual ("bfield", attr.NamedArguments [1].Field.Name);
1184 } else if (attr.Constructor.DeclaringType.Name == "ClassInterfaceAttribute") {
1185 // inherited from System.Object
1186 //} else if (attr.Constructor.DeclaringType.Name == "Serializable") {
1187 // inherited from System.Object
1188 } else if (attr.Constructor.DeclaringType.Name == "ComVisibleAttribute") {
1189 // inherited from System.Object
1191 Assert.Fail (attr.Constructor.DeclaringType.Name);
1195 var assembly = entry_point.DeclaringType.Assembly;
1196 var type = assembly.GetType ("Tests4");
1197 Assert.IsFalse (type.IsInitialized);
1201 public void FieldInfo () {
1202 Event e = run_until ("ti2");
1203 StackFrame frame = e.Thread.GetFrames () [0];
1207 t = frame.Method.GetParameters ()[8].ParameterType;
1208 Assert.AreEqual ("Tests2", t.Name);
1210 var fi = t.GetField ("field_j");
1211 var attrs = fi.GetCustomAttributes (true);
1212 Assert.AreEqual (1, attrs.Length);
1213 var attr = attrs [0];
1214 Assert.AreEqual ("DebuggerBrowsableAttribute", attr.Constructor.DeclaringType.Name);
1215 Assert.AreEqual (1, attr.ConstructorArguments.Count);
1216 Assert.IsInstanceOfType (typeof (EnumMirror), attr.ConstructorArguments [0].Value);
1217 Assert.AreEqual ((int)System.Diagnostics.DebuggerBrowsableState.Collapsed, (attr.ConstructorArguments [0].Value as EnumMirror).Value);
1221 public void PropertyInfo () {
1222 Event e = run_until ("ti2");
1223 StackFrame frame = e.Thread.GetFrames () [0];
1227 t = frame.Method.GetParameters ()[8].ParameterType;
1228 Assert.AreEqual ("Tests2", t.Name);
1230 var pi = t.GetProperty ("AProperty");
1231 var attrs = pi.GetCustomAttributes (true);
1232 Assert.AreEqual (1, attrs.Length);
1233 var attr = attrs [0];
1234 Assert.AreEqual ("DebuggerBrowsableAttribute", attr.Constructor.DeclaringType.Name);
1235 Assert.AreEqual (1, attr.ConstructorArguments.Count);
1236 Assert.IsInstanceOfType (typeof (EnumMirror), attr.ConstructorArguments [0].Value);
1237 Assert.AreEqual ((int)System.Diagnostics.DebuggerBrowsableState.Collapsed, (attr.ConstructorArguments [0].Value as EnumMirror).Value);
1241 [Category ("only5")]
1242 public void Type_GetValue () {
1243 Event e = run_until ("o1");
1244 StackFrame frame = e.Thread.GetFrames () [0];
1246 ObjectMirror o = (frame.GetThis () as ObjectMirror);
1248 TypeMirror t = o.Type;
1250 ObjectMirror val2 = frame.GetValue (frame.Method.GetParameters ()[0]) as ObjectMirror;
1253 object f = t.GetValue (o.Type.GetField ("static_i"));
1254 AssertValue (55, f);
1256 f = t.GetValue (o.Type.GetField ("static_s"));
1257 AssertValue ("A", f);
1259 // literal static fields
1260 f = t.GetValue (o.Type.GetField ("literal_i"));
1261 AssertValue (56, f);
1263 f = t.GetValue (o.Type.GetField ("literal_s"));
1264 AssertValue ("B", f);
1266 // Inherited static fields
1267 TypeMirror parent = t.BaseType;
1268 f = t.GetValue (parent.GetField ("base_static_i"));
1269 AssertValue (57, f);
1271 f = t.GetValue (parent.GetField ("base_static_s"));
1272 AssertValue ("C", f);
1274 // thread static field
1275 f = t.GetValue (t.GetField ("tls_i"), e.Thread);
1276 AssertValue (42, f);
1278 // Argument checking
1279 AssertThrows<ArgumentNullException> (delegate () {
1284 AssertThrows<ArgumentException> (delegate () {
1285 t.GetValue (o.Type.GetField ("field_i"));
1288 // field on another type
1289 AssertThrows<ArgumentException> (delegate () {
1290 t.GetValue (val2.Type.GetField ("static_field_j"));
1293 // special static field
1294 AssertThrows<ArgumentException> (delegate () {
1295 t.GetValue (t.GetField ("tls_i"));
1300 public void Type_GetValues () {
1301 Event e = run_until ("o1");
1302 StackFrame frame = e.Thread.GetFrames () [0];
1304 ObjectMirror o = (frame.GetThis () as ObjectMirror);
1306 TypeMirror t = o.Type;
1309 object[] vals = t.GetValues (new FieldInfoMirror [] { t.GetField ("static_i"), t.GetField ("static_s") });
1310 object f = vals [0];
1311 AssertValue (55, f);
1314 AssertValue ("A", f);
1316 // Argument checking
1317 AssertThrows<ArgumentNullException> (delegate () {
1321 AssertThrows<ArgumentNullException> (delegate () {
1322 t.GetValues (new FieldInfoMirror [] { null });
1327 public void ObjRefs () {
1328 Event e = run_until ("objrefs1");
1329 StackFrame frame = e.Thread.GetFrames () [0];
1331 ObjectMirror o = frame.GetThis () as ObjectMirror;
1332 ObjectMirror child = o.GetValue (o.Type.GetField ("child")) as ObjectMirror;
1334 Assert.IsTrue (child.Address != 0);
1336 // Check that object references are internalized correctly
1337 Assert.AreEqual (o, frame.GetThis ());
1339 run_until ("objrefs2");
1341 // child should be gc'd now
1342 // This is not deterministic
1343 //Assert.IsTrue (child.IsCollected);
1346 * No longer works since Type is read eagerly
1349 AssertThrows<ObjectCollectedException> (delegate () {
1350 TypeMirror t = child.Type;
1354 AssertThrows<ObjectCollectedException> (delegate () {
1355 long addr = child.Address;
1361 public void Type_GetObject () {
1362 Event e = run_until ("o1");
1363 StackFrame frame = e.Thread.GetFrames () [0];
1365 ObjectMirror o = (frame.GetThis () as ObjectMirror);
1367 TypeMirror t = o.Type;
1369 Assert.AreEqual ("MonoType", t.GetTypeObject ().Type.Name);
1373 public void VTypes () {
1374 Event e = run_until ("vtypes1");
1375 StackFrame frame = e.Thread.GetFrames () [0];
1378 ObjectMirror o = frame.GetThis () as ObjectMirror;
1379 var obj = o.GetValue (o.Type.GetField ("field_struct"));
1380 Assert.IsTrue (obj is StructMirror);
1381 var s = obj as StructMirror;
1382 Assert.AreEqual ("AStruct", s.Type.Name);
1383 AssertValue (42, s ["i"]);
1385 AssertValue ("S", obj);
1386 AssertValue (43, s ["k"]);
1387 obj = o.GetValue (o.Type.GetField ("field_boxed_struct"));
1388 Assert.IsTrue (obj is StructMirror);
1389 s = obj as StructMirror;
1390 Assert.AreEqual ("AStruct", s.Type.Name);
1391 AssertValue (42, s ["i"]);
1393 // Check decoding of nested structs (#14942)
1394 obj = o.GetValue (o.Type.GetField ("nested_struct"));
1395 o.SetValue (o.Type.GetField ("nested_struct"), obj);
1397 // Check round tripping of boxed struct fields (#12354)
1398 obj = o.GetValue (o.Type.GetField ("boxed_struct_field"));
1399 o.SetValue (o.Type.GetField ("boxed_struct_field"), obj);
1400 obj = o.GetValue (o.Type.GetField ("boxed_struct_field"));
1401 s = obj as StructMirror;
1402 AssertValue (1, s ["key"]);
1404 Assert.IsTrue (obj is StructMirror);
1405 s = obj as StructMirror;
1406 AssertValue (42, s ["m_value"]);
1408 // vtypes as arguments
1409 s = frame.GetArgument (0) as StructMirror;
1410 AssertValue (44, s ["i"]);
1412 AssertValue ("T", obj);
1413 AssertValue (45, s ["k"]);
1415 // vtypes as array entries
1416 var arr = frame.GetArgument (1) as ArrayMirror;
1418 Assert.IsTrue (obj is StructMirror);
1419 s = obj as StructMirror;
1420 AssertValue (1, s ["i"]);
1421 AssertValue ("S1", s ["s"]);
1423 Assert.IsTrue (obj is StructMirror);
1424 s = obj as StructMirror;
1425 AssertValue (2, s ["i"]);
1426 AssertValue ("S2", s ["s"]);
1428 // Argument checking
1429 s = frame.GetArgument (0) as StructMirror;
1430 AssertThrows<ArgumentException> (delegate () {
1434 // generic vtype instances
1435 o = frame.GetThis () as ObjectMirror;
1436 obj = o.GetValue (o.Type.GetField ("generic_field_struct"));
1437 Assert.IsTrue (obj is StructMirror);
1438 s = obj as StructMirror;
1439 Assert.AreEqual ("GStruct`1", s.Type.Name);
1440 AssertValue (42, s ["i"]);
1442 // this on vtype methods
1443 e = run_until ("vtypes2");
1444 e = step_until (e.Thread, "foo");
1446 frame = e.Thread.GetFrames () [0];
1448 Assert.AreEqual ("foo", (e as StepEvent).Method.Name);
1449 obj = frame.GetThis ();
1451 Assert.IsTrue (obj is StructMirror);
1452 s = obj as StructMirror;
1453 AssertValue (44, s ["i"]);
1454 AssertValue ("T", s ["s"]);
1455 AssertValue (45, s ["k"]);
1457 // this on static vtype methods
1458 e = run_until ("vtypes3");
1459 e = step_until (e.Thread, "static_foo");
1461 frame = e.Thread.GetFrames () [0];
1463 Assert.AreEqual ("static_foo", (e as StepEvent).Method.Name);
1464 obj = frame.GetThis ();
1465 AssertValue (null, obj);
1467 // vtypes which reference themselves recursively
1468 e = run_until ("vtypes4_2");
1469 frame = e.Thread.GetFrames () [0];
1471 Assert.IsTrue (frame.GetArgument (0) is StructMirror);
1475 public void AssemblyInfo () {
1476 Event e = run_until ("single_stepping");
1478 StackFrame frame = e.Thread.GetFrames () [0];
1480 var aname = frame.Method.DeclaringType.Assembly.GetName ();
1481 Assert.AreEqual ("dtest-app, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null", aname.ToString ());
1483 ModuleMirror m = frame.Method.DeclaringType.Module;
1485 Assert.AreEqual ("dtest-app.exe", m.Name);
1486 Assert.AreEqual ("dtest-app.exe", m.ScopeName);
1487 Assert.IsTrue (m.FullyQualifiedName.IndexOf ("dtest-app.exe") != -1);
1488 Guid guid = m.ModuleVersionId;
1489 Assert.AreEqual (frame.Method.DeclaringType.Assembly, m.Assembly);
1490 Assert.AreEqual (frame.Method.DeclaringType.Assembly.ManifestModule, m);
1492 // This is no longer true on 4.0
1493 //Assert.AreEqual ("Assembly", frame.Method.DeclaringType.Assembly.GetAssemblyObject ().Type.Name);
1495 TypeMirror t = vm.RootDomain.Corlib.GetType ("System.Diagnostics.DebuggerDisplayAttribute");
1496 Assert.AreEqual ("DebuggerDisplayAttribute", t.Name);
1500 public void LocalsInfo () {
1501 Event e = run_until ("locals2");
1503 StackFrame frame = e.Thread.GetFrames () [0];
1505 var locals = frame.Method.GetLocals ();
1506 Assert.AreEqual (8, locals.Length);
1507 for (int i = 0; i < 8; ++i) {
1508 if (locals [i].Name == "args") {
1509 Assert.IsTrue (locals [i].IsArg);
1510 Assert.AreEqual ("String[]", locals [i].Type.Name);
1511 } else if (locals [i].Name == "arg") {
1512 Assert.IsTrue (locals [i].IsArg);
1513 Assert.AreEqual ("Int32", locals [i].Type.Name);
1514 } else if (locals [i].Name == "i") {
1515 Assert.IsFalse (locals [i].IsArg);
1516 Assert.AreEqual ("Int64", locals [i].Type.Name);
1517 } else if (locals [i].Name == "j") {
1518 Assert.IsFalse (locals [i].IsArg);
1519 Assert.AreEqual ("Int32", locals [i].Type.Name);
1520 } else if (locals [i].Name == "s") {
1521 Assert.IsFalse (locals [i].IsArg);
1522 Assert.AreEqual ("String", locals [i].Type.Name);
1523 } else if (locals [i].Name == "t") {
1525 Assert.IsTrue (locals [i].IsArg);
1526 Assert.AreEqual ("String", locals [i].Type.Name);
1527 } else if (locals [i].Name == "rs") {
1528 Assert.IsTrue (locals [i].IsArg);
1529 Assert.AreEqual ("String", locals [i].Type.Name);
1530 } else if (locals [i].Name == "astruct") {
1537 Event step_once () {
1539 var e = GetNextEvent ();
1540 Assert.IsTrue (e is StepEvent);
1544 Event step_into () {
1545 step_req.Disable ();
1546 step_req.Depth = StepDepth.Into;
1548 return step_once ();
1551 Event step_over () {
1552 step_req.Disable ();
1553 step_req.Depth = StepDepth.Over;
1555 return step_once ();
1559 step_req.Disable ();
1560 step_req.Depth = StepDepth.Out;
1562 return step_once ();
1566 public void Locals () {
1567 var be = run_until ("locals1");
1569 StackFrame frame = be.Thread.GetFrames () [0];
1570 MethodMirror m1 = frame.Method;
1572 // Compiler generated byref local
1573 foreach (var l in m1.GetLocals ()) {
1574 // The byval flag is hidden from the type
1575 if (l.Name != "ri" && l.Type.Name == "Double")
1576 AssertValue (null, frame.GetValue (l));
1579 be = run_until ("locals2");
1581 frame = be.Thread.GetFrames () [0];
1583 object val = frame.GetValue (frame.Method.GetLocal ("i"));
1584 AssertValue (0, val);
1586 var req = create_step (be);
1593 var e = step_once ();
1594 Assert.AreEqual ("locals2", (e as StepEvent).Method.Name);
1596 // Execute s = "AB";
1598 Assert.AreEqual ("locals2", (e as StepEvent).Method.Name);
1600 frame = e.Thread.GetFrames () [0];
1602 val = frame.GetValue (frame.Method.GetLocal ("i"));
1603 AssertValue (42, val);
1605 LocalVariable[] locals = frame.Method.GetLocals ();
1606 var vals = frame.GetValues (locals);
1607 Assert.AreEqual (locals.Length, vals.Length);
1608 for (int i = 0; i < locals.Length; ++i) {
1609 if (locals [i].Name == "i")
1610 AssertValue (42, vals [i]);
1611 if (locals [i].Name == "s")
1612 AssertValue ("AB", vals [i]);
1613 if (locals [i].Name == "t")
1614 AssertValue ("ABC", vals [i]);
1617 // Argument checking
1620 AssertThrows<ArgumentNullException> (delegate () {
1621 frame.GetValue ((LocalVariable)null);
1623 // GetValue () local from another method
1624 AssertThrows<ArgumentException> (delegate () {
1625 frame.GetValue (m1.GetLocal ("foo"));
1629 AssertThrows<ArgumentNullException> (delegate () {
1630 frame.GetValue ((ParameterInfoMirror)null);
1632 // GetValue () local from another method
1633 AssertThrows<ArgumentException> (delegate () {
1634 frame.GetValue (m1.GetParameters ()[0]);
1637 // GetValues () null
1638 AssertThrows<ArgumentNullException> (delegate () {
1639 frame.GetValues (null);
1641 // GetValues () embedded null
1642 AssertThrows<ArgumentNullException> (delegate () {
1643 frame.GetValues (new LocalVariable [] { null });
1645 // GetValues () local from another method
1646 AssertThrows<ArgumentException> (delegate () {
1647 frame.GetValues (new LocalVariable [] { m1.GetLocal ("foo") });
1650 AssertThrows<ArgumentException> (delegate () {
1651 val = frame.GetValue (frame.Method.ReturnParameter);
1654 // invalid stack frames
1656 e = GetNextEvent ();
1657 Assert.IsTrue (e is StepEvent);
1658 Assert.AreEqual ("locals2", (e as StepEvent).Method.Name);
1660 AssertThrows<InvalidStackFrameException> (delegate () {
1661 frame.GetValue (frame.Method.GetLocal ("i"));
1667 be = run_until ("locals7");
1669 req = create_step (be);
1675 // Test that locals are initialized
1676 frame = e.Thread.GetFrames () [0];
1677 val = frame.GetValue (frame.Method.GetLocal ("t"));
1678 AssertValue (0, val);
1682 Assert.AreEqual ("locals7", (e as StepEvent).Method.Name);
1686 Assert.AreEqual ("locals7", (e as StepEvent).Method.Name);
1688 frame = e.Thread.GetFrames () [0];
1689 val = frame.GetValue (frame.Method.GetParameters ()[0]);
1690 AssertValue (22, val);
1691 val = frame.GetValue (frame.Method.GetLocal ("t"));
1692 AssertValue (22, val);
1693 val = frame.GetValue (frame.Method.GetLocal ("t2"));
1694 AssertValue (22, val);
1698 public void GetVisibleVariables () {
1699 Event e = run_until ("locals4");
1702 var locals = e.Thread.GetFrames ()[1].GetVisibleVariables ();
1703 Assert.AreEqual (2, locals.Count);
1704 var loc = locals.First (l => l.Name == "i");
1705 Assert.AreEqual ("Int64", loc.Type.Name);
1706 loc = locals.First (l => l.Name == "s");
1707 Assert.AreEqual ("String", loc.Type.Name);
1709 loc = e.Thread.GetFrames ()[1].GetVisibleVariableByName ("i");
1710 Assert.AreEqual ("i", loc.Name);
1711 Assert.AreEqual ("Int64", loc.Type.Name);
1713 e = run_until ("locals5");
1716 locals = e.Thread.GetFrames ()[1].GetVisibleVariables ();
1717 Assert.AreEqual (2, locals.Count);
1718 loc = locals.First (l => l.Name == "i");
1719 Assert.AreEqual ("String", loc.Type.Name);
1720 loc = locals.First (l => l.Name == "s");
1721 Assert.AreEqual ("String", loc.Type.Name);
1723 loc = e.Thread.GetFrames ()[1].GetVisibleVariableByName ("i");
1724 Assert.AreEqual ("i", loc.Name);
1725 Assert.AreEqual ("String", loc.Type.Name);
1727 // Variable in another scope
1728 loc = e.Thread.GetFrames ()[1].GetVisibleVariableByName ("j");
1729 Assert.IsNull (loc);
1733 public void Exit () {
1738 var e = GetNextEvent ();
1739 Assert.IsInstanceOfType (typeof (VMDeathEvent), e);
1741 Assert.AreEqual (5, (e as VMDeathEvent).ExitCode);
1744 /* Could be a remote vm with no process */
1747 Assert.AreEqual (5, p.ExitCode);
1750 AssertThrows<VMDisconnectedException> (delegate () {
1759 public void Dispose () {
1764 var e = GetNextEvent ();
1765 Assert.IsInstanceOfType (typeof (VMDisconnectEvent), e);
1768 /* Could be a remote vm with no process */
1771 Assert.AreEqual (3, p.ExitCode);
1774 AssertThrows<VMDisconnectedException> (delegate () {
1783 public void ColumnNumbers () {
1784 Event e = run_until ("line_numbers");
1786 // FIXME: Merge this with LineNumbers () when its fixed
1788 step_req = create_step (e);
1789 step_req.Depth = StepDepth.Into;
1797 e = GetNextEvent ();
1798 Assert.IsTrue (e is StepEvent);
1799 if (e.Thread.GetFrames ()[0].Method.Name == "ln1")
1803 // Do an additional step over so we are not on the beginning line of the method
1804 step_req.Disable ();
1805 step_req.Depth = StepDepth.Over;
1808 e = GetNextEvent ();
1809 Assert.IsTrue (e is StepEvent);
1811 l = e.Thread.GetFrames ()[0].Location;
1813 Assert.AreEqual (3, l.ColumnNumber);
1815 step_req.Disable ();
1819 // Broken by mcs+runtime changes (#5438)
1820 [Category("NotWorking")]
1821 public void LineNumbers () {
1822 Event e = run_until ("line_numbers");
1824 step_req = create_step (e);
1825 step_req.Depth = StepDepth.Into;
1832 e = GetNextEvent ();
1833 Assert.IsTrue (e is StepEvent);
1835 l = e.Thread.GetFrames ()[0].Location;
1837 Assert.IsTrue (l.SourceFile.IndexOf ("dtest-app.cs") != -1);
1838 Assert.AreEqual ("ln1", l.Method.Name);
1841 using (FileStream fs = new FileStream (l.SourceFile, FileMode.Open, FileAccess.Read)) {
1842 MD5 md5 = MD5.Create ();
1843 var hash = md5.ComputeHash (fs);
1845 for (int i = 0; i < 16; ++i)
1846 Assert.AreEqual (hash [i], l.SourceFileHash [i]);
1849 int line_base = l.LineNumber;
1852 e = GetNextEvent ();
1853 Assert.IsTrue (e is StepEvent);
1854 l = e.Thread.GetFrames ()[0].Location;
1855 Assert.AreEqual ("ln2", l.Method.Name);
1856 Assert.AreEqual (line_base + 6, l.LineNumber);
1859 e = GetNextEvent ();
1860 Assert.IsTrue (e is StepEvent);
1861 l = e.Thread.GetFrames ()[0].Location;
1862 Assert.AreEqual ("ln1", l.Method.Name);
1863 Assert.AreEqual (line_base + 1, l.LineNumber);
1866 e = GetNextEvent ();
1867 Assert.IsTrue (e is StepEvent);
1868 l = e.Thread.GetFrames ()[0].Location;
1869 Assert.AreEqual ("ln3", l.Method.Name);
1870 Assert.AreEqual (line_base + 11, l.LineNumber);
1873 e = GetNextEvent ();
1874 Assert.IsTrue (e is StepEvent);
1875 l = e.Thread.GetFrames ()[0].Location;
1876 Assert.AreEqual ("ln3", l.Method.Name);
1877 Assert.IsTrue (l.SourceFile.EndsWith ("FOO"));
1878 Assert.AreEqual (55, l.LineNumber);
1881 e = GetNextEvent ();
1882 Assert.IsTrue (e is StepEvent);
1883 l = e.Thread.GetFrames ()[0].Location;
1884 Assert.AreEqual ("ln1", l.Method.Name);
1885 Assert.AreEqual (line_base + 2, l.LineNumber);
1887 // GetSourceFiles ()
1888 string[] sources = l.Method.DeclaringType.GetSourceFiles ();
1889 Assert.AreEqual (2, sources.Length);
1890 Assert.AreEqual ("dtest-app.cs", sources [0]);
1891 Assert.AreEqual ("FOO", sources [1]);
1893 sources = l.Method.DeclaringType.GetSourceFiles (true);
1894 Assert.AreEqual (2, sources.Length);
1895 Assert.IsTrue (sources [0].EndsWith ("dtest-app.cs"));
1896 Assert.IsTrue (sources [1].EndsWith ("FOO"));
1900 public void Suspend () {
1903 Start (new string [] { "dtest-app.exe", "suspend-test" });
1905 Event e = run_until ("suspend");
1907 ThreadMirror main = e.Thread;
1915 // The debuggee should be suspended while it is running the infinite loop
1917 StackFrame frame = main.GetFrames ()[0];
1918 Assert.AreEqual ("suspend", frame.Method.Name);
1922 // resuming when not suspended
1923 AssertThrows<InvalidOperationException> (delegate () {
1933 public void AssemblyLoad () {
1934 Event e = run_until ("assembly_load");
1936 var load_req = vm.CreateAssemblyLoadRequest ();
1941 e = GetNextEvent ();
1942 Assert.IsInstanceOfType (typeof (AssemblyLoadEvent), e);
1943 Assert.IsTrue ((e as AssemblyLoadEvent).Assembly.Location.EndsWith ("System.dll"));
1945 var frames = e.Thread.GetFrames ();
1946 Assert.IsTrue (frames.Length > 0);
1947 Assert.AreEqual ("assembly_load", frames [0].Method.Name);
1951 public void CreateValue () {
1954 v = vm.CreateValue (1);
1955 Assert.AreEqual (vm, v.VirtualMachine);
1956 Assert.AreEqual (1, v.Value);
1958 v = vm.CreateValue (null);
1959 Assert.AreEqual (vm, v.VirtualMachine);
1960 Assert.AreEqual (null, v.Value);
1962 // Argument checking
1963 AssertThrows <ArgumentException> (delegate () {
1964 v = vm.CreateValue ("FOO");
1969 public void CreateString () {
1970 StringMirror s = vm.RootDomain.CreateString ("ABC");
1972 Assert.AreEqual (vm, s.VirtualMachine);
1973 Assert.AreEqual ("ABC", s.Value);
1974 Assert.AreEqual (vm.RootDomain, s.Domain);
1977 StringBuilder sb = new StringBuilder ();
1978 for (int i = 0; i < 1024; ++i)
1980 s = vm.RootDomain.CreateString (sb.ToString ());
1982 // Argument checking
1983 AssertThrows <ArgumentNullException> (delegate () {
1984 s = vm.RootDomain.CreateString (null);
1989 public void CreateBoxedValue () {
1990 ObjectMirror o = vm.RootDomain.CreateBoxedValue (new PrimitiveValue (vm, 42));
1992 Assert.AreEqual ("Int32", o.Type.Name);
1993 //AssertValue (42, m.GetValue (o.Type.GetField ("m_value")));
1995 // Argument checking
1996 AssertThrows <ArgumentNullException> (delegate () {
1997 vm.RootDomain.CreateBoxedValue (null);
2000 AssertThrows <ArgumentException> (delegate () {
2001 vm.RootDomain.CreateBoxedValue (o);
2006 public void Invoke () {
2007 Event e = run_until ("invoke1");
2009 StackFrame frame = e.Thread.GetFrames () [0];
2011 TypeMirror t = frame.Method.DeclaringType;
2012 ObjectMirror this_obj = (ObjectMirror)frame.GetThis ();
2014 TypeMirror t2 = frame.Method.GetParameters ()[0].ParameterType;
2020 m = t.GetMethod ("invoke_return_void");
2021 v = this_obj.InvokeMethod (e.Thread, m, null);
2025 m = t.GetMethod ("invoke_return_ref");
2026 v = this_obj.InvokeMethod (e.Thread, m, null);
2027 AssertValue ("ABC", v);
2030 m = t.GetMethod ("invoke_return_null");
2031 v = this_obj.InvokeMethod (e.Thread, m, null);
2032 AssertValue (null, v);
2035 m = t.GetMethod ("invoke_return_primitive");
2036 v = this_obj.InvokeMethod (e.Thread, m, null);
2037 AssertValue (42, v);
2040 m = t.GetMethod ("invoke_return_nullable");
2041 v = this_obj.InvokeMethod (e.Thread, m, null);
2042 Assert.IsInstanceOfType (typeof (StructMirror), v);
2043 var s = v as StructMirror;
2044 AssertValue (42, s.Fields [0]);
2045 AssertValue (true, s.Fields [1]);
2047 // pass nullable as this
2048 //m = vm.RootDomain.Corlib.GetType ("System.Object").GetMethod ("ToString");
2049 m = s.Type.GetMethod ("ToString");
2050 v = s.InvokeMethod (e.Thread, m, null);
2052 // return nullable null
2053 m = t.GetMethod ("invoke_return_nullable_null");
2054 v = this_obj.InvokeMethod (e.Thread, m, null);
2055 Assert.IsInstanceOfType (typeof (StructMirror), v);
2056 s = v as StructMirror;
2057 AssertValue (0, s.Fields [0]);
2058 AssertValue (false, s.Fields [1]);
2060 // pass nullable as this
2061 //m = vm.RootDomain.Corlib.GetType ("System.Object").GetMethod ("ToString");
2062 m = s.Type.GetMethod ("ToString");
2063 v = s.InvokeMethod (e.Thread, m, null);
2066 m = t.GetMethod ("invoke_pass_primitive");
2067 Value[] args = new Value [] {
2068 vm.CreateValue ((byte)Byte.MaxValue),
2069 vm.CreateValue ((sbyte)SByte.MaxValue),
2070 vm.CreateValue ((short)1),
2071 vm.CreateValue ((ushort)1),
2072 vm.CreateValue ((int)1),
2073 vm.CreateValue ((uint)1),
2074 vm.CreateValue ((long)1),
2075 vm.CreateValue ((ulong)1),
2076 vm.CreateValue ('A'),
2077 vm.CreateValue (true),
2078 vm.CreateValue (3.14f),
2079 vm.CreateValue (3.14) };
2081 v = this_obj.InvokeMethod (e.Thread, m, args);
2082 AssertValue ((int)Byte.MaxValue + (int)SByte.MaxValue + 1 + 1 + 1 + 1 + 1 + 1 + 'A' + 1 + 3 + 3, v);
2085 m = t.GetMethod ("invoke_pass_ref");
2086 v = this_obj.InvokeMethod (e.Thread, m, new Value [] { vm.RootDomain.CreateString ("ABC") });
2087 AssertValue ("ABC", v);
2090 m = t.GetMethod ("invoke_pass_ref");
2091 v = this_obj.InvokeMethod (e.Thread, m, new Value [] { vm.CreateValue (null) });
2092 AssertValue (null, v);
2095 m = t.GetMethod ("invoke_static_pass_ref");
2096 v = t.InvokeMethod (e.Thread, m, new Value [] { vm.RootDomain.CreateString ("ABC") });
2097 AssertValue ("ABC", v);
2099 // static invoked using ObjectMirror.InvokeMethod
2100 m = t.GetMethod ("invoke_static_pass_ref");
2101 v = this_obj.InvokeMethod (e.Thread, m, new Value [] { vm.RootDomain.CreateString ("ABC") });
2102 AssertValue ("ABC", v);
2104 // method which throws an exception
2106 m = t.GetMethod ("invoke_throws");
2107 v = this_obj.InvokeMethod (e.Thread, m, null);
2109 } catch (InvocationException ex) {
2110 Assert.AreEqual ("Exception", ex.Exception.Type.Name);
2115 m = t.GetMethod ("invoke_out");
2116 var out_task = this_obj.InvokeMethodAsyncWithResult (e.Thread, m, new Value [] { vm.CreateValue (1) }, InvokeOptions.ReturnOutArgs);
2117 var out_args = out_task.Result.OutArgs;
2118 AssertValue (5, out_args [0]);
2120 // without ReturnOutArgs flag
2121 out_task = this_obj.InvokeMethodAsyncWithResult (e.Thread, m, new Value [] { vm.CreateValue (1) });
2122 out_args = out_task.Result.OutArgs;
2123 Assert.IsNull (out_args);
2127 m = t.GetMethod (".ctor");
2128 v = t.InvokeMethod (e.Thread, m, null);
2129 Assert.IsInstanceOfType (typeof (ObjectMirror), v);
2130 Assert.AreEqual ("Tests", (v as ObjectMirror).Type.Name);
2133 var cl1 = frame.Method.DeclaringType.Assembly.GetType ("ITest2");
2134 m = cl1.GetMethod ("invoke_iface");
2135 v = this_obj.InvokeMethod (e.Thread, m, null);
2136 AssertValue (42, v);
2140 m = t.GetMethod ("invoke_pass_ref");
2141 var task = this_obj.InvokeMethodAsync (e.Thread, m, new Value [] { vm.RootDomain.CreateString ("ABC") });
2142 AssertValue ("ABC", task.Result);
2145 m = t.GetMethod ("invoke_static_pass_ref");
2146 task = t.InvokeMethodAsync (e.Thread, m, new Value [] { vm.RootDomain.CreateString ("ABC") });
2147 AssertValue ("ABC", task.Result);
2150 // Argument checking
2153 AssertThrows<ArgumentNullException> (delegate {
2154 m = t.GetMethod ("invoke_pass_ref");
2155 v = this_obj.InvokeMethod (null, m, new Value [] { vm.CreateValue (null) });
2159 AssertThrows<ArgumentNullException> (delegate {
2160 v = this_obj.InvokeMethod (e.Thread, null, new Value [] { vm.CreateValue (null) });
2163 // invalid number of arguments
2164 m = t.GetMethod ("invoke_pass_ref");
2165 AssertThrows<ArgumentException> (delegate {
2166 v = this_obj.InvokeMethod (e.Thread, m, null);
2169 // invalid type of argument (ref != primitive)
2170 m = t.GetMethod ("invoke_pass_ref");
2171 AssertThrows<ArgumentException> (delegate {
2172 v = this_obj.InvokeMethod (e.Thread, m, new Value [] { vm.CreateValue (1) });
2175 // invalid type of argument (primitive != primitive)
2176 m = t.GetMethod ("invoke_pass_primitive_2");
2177 AssertThrows<ArgumentException> (delegate {
2178 v = this_obj.InvokeMethod (e.Thread, m, new Value [] { vm.CreateValue (1) });
2181 // invoking a non-static method as static
2182 m = t.GetMethod ("invoke_pass_ref");
2183 AssertThrows<ArgumentException> (delegate {
2184 v = t.InvokeMethod (e.Thread, m, new Value [] { vm.RootDomain.CreateString ("ABC") });
2187 // invoking a method defined in another class
2188 m = t2.GetMethod ("invoke");
2189 AssertThrows<ArgumentException> (delegate {
2190 v = this_obj.InvokeMethod (e.Thread, m, null);
2195 public void InvokeVType () {
2196 Event e = run_until ("invoke1");
2198 StackFrame frame = e.Thread.GetFrames () [0];
2200 var s = frame.GetArgument (1) as StructMirror;
2202 TypeMirror t = s.Type;
2207 // Pass struct as this, receive int
2208 m = t.GetMethod ("invoke_return_int");
2209 v = s.InvokeMethod (e.Thread, m, null);
2210 AssertValue (42, v);
2212 // Pass struct as this, receive intptr
2213 m = t.GetMethod ("invoke_return_intptr");
2214 v = s.InvokeMethod (e.Thread, m, null);
2215 AssertValue (43, v);
2218 m = t.GetMethod ("invoke_static");
2219 v = t.InvokeMethod (e.Thread, m, null);
2222 // Pass generic struct as this
2223 s = frame.GetArgument (2) as StructMirror;
2225 m = t.GetMethod ("invoke_return_int");
2226 v = s.InvokeMethod (e.Thread, m, null);
2227 AssertValue (42, v);
2230 // Invoke a method which changes state
2231 s = frame.GetArgument (1) as StructMirror;
2233 m = t.GetMethod ("invoke_mutate");
2234 var task = s.InvokeMethodAsyncWithResult (e.Thread, m, null, InvokeOptions.ReturnOutThis);
2235 var out_this = task.Result.OutThis as StructMirror;
2236 AssertValue (5, out_this ["l"]);
2238 // Without the ReturnOutThis flag
2239 s = frame.GetArgument (1) as StructMirror;
2241 m = t.GetMethod ("invoke_mutate");
2242 task = s.InvokeMethodAsyncWithResult (e.Thread, m, null);
2243 out_this = task.Result.OutThis as StructMirror;
2244 Assert.AreEqual (null, out_this);
2249 public void BreakpointDuringInvoke () {
2250 Event e = run_until ("invoke1");
2252 MethodMirror m = entry_point.DeclaringType.GetMethod ("invoke2");
2253 Assert.IsNotNull (m);
2254 vm.SetBreakpoint (m, 0);
2256 StackFrame frame = e.Thread.GetFrames () [0];
2257 var o = frame.GetThis () as ObjectMirror;
2259 bool failed = false;
2261 bool finished = false;
2262 object wait = new object ();
2264 // Have to invoke in a separate thread as the invoke is suspended until we
2265 // resume after the breakpoint
2266 Thread t = new Thread (delegate () {
2268 o.InvokeMethod (e.Thread, m, null);
2274 Monitor.Pulse (wait);
2280 StackFrame invoke_frame = null;
2283 e = GetNextEvent ();
2284 Assert.IsInstanceOfType (typeof (BreakpointEvent), e);
2285 // Check stack trace support and invokes
2286 var frames = e.Thread.GetFrames ();
2287 invoke_frame = frames [0];
2288 Assert.AreEqual ("invoke2", frames [0].Method.Name);
2289 Assert.IsTrue (frames [0].IsDebuggerInvoke);
2290 Assert.AreEqual ("invoke1", frames [1].Method.Name);
2297 Monitor.Wait (wait);
2300 // Check that the invoke frames are no longer valid
2301 AssertThrows<InvalidStackFrameException> (delegate {
2302 invoke_frame.GetThis ();
2305 // Check InvokeOptions.DisableBreakpoints flag
2306 o.InvokeMethod (e.Thread, m, null, InvokeOptions.DisableBreakpoints);
2310 public void DisabledExceptionDuringInvoke () {
2311 Event e = run_until ("invoke_ex");
2313 MethodMirror m = entry_point.DeclaringType.GetMethod ("invoke_ex_inner");
2315 StackFrame frame = e.Thread.GetFrames () [0];
2316 var o = frame.GetThis () as ObjectMirror;
2318 var req = vm.CreateExceptionRequest (null);
2321 // Check InvokeOptions.DisableBreakpoints flag
2322 o.InvokeMethod (e.Thread, m, null, InvokeOptions.DisableBreakpoints);
2328 public void InvokeSingleThreaded () {
2331 Start (new string [] { "dtest-app.exe", "invoke-single-threaded" });
2333 Event e = run_until ("invoke_single_threaded_2");
2335 StackFrame f = e.Thread.GetFrames ()[0];
2337 var obj = f.GetThis () as ObjectMirror;
2339 // Check that the counter value incremented by the other thread does not increase
2340 // during the invoke.
2341 object counter1 = (obj.GetValue (obj.Type.GetField ("counter")) as PrimitiveValue).Value;
2343 var m = obj.Type.GetMethod ("invoke_return_void");
2344 obj.InvokeMethod (e.Thread, m, null, InvokeOptions.SingleThreaded);
2346 object counter2 = (obj.GetValue (obj.Type.GetField ("counter")) as PrimitiveValue).Value;
2348 Assert.AreEqual ((int)counter1, (int)counter2);
2350 // Test multiple invokes done in succession
2351 m = obj.Type.GetMethod ("invoke_return_void");
2352 obj.InvokeMethod (e.Thread, m, null, InvokeOptions.SingleThreaded);
2354 // Test events during single-threaded invokes
2355 vm.EnableEvents (EventType.TypeLoad);
2356 m = obj.Type.GetMethod ("invoke_type_load");
2357 obj.BeginInvokeMethod (e.Thread, m, null, InvokeOptions.SingleThreaded, delegate {
2361 e = GetNextEvent ();
2362 Assert.AreEqual (EventType.TypeLoad, e.EventType);
2365 List<Value> invoke_results;
2368 public void InvokeMultiple () {
2369 Event e = run_until ("invoke1");
2371 StackFrame frame = e.Thread.GetFrames () [0];
2373 TypeMirror t = frame.Method.DeclaringType;
2374 ObjectMirror this_obj = (ObjectMirror)frame.GetThis ();
2376 TypeMirror t2 = frame.Method.GetParameters ()[0].ParameterType;
2378 var methods = new MethodMirror [2];
2379 methods [0] = t.GetMethod ("invoke_return_ref");
2380 methods [1] = t.GetMethod ("invoke_return_primitive");
2382 invoke_results = new List<Value> ();
2384 var r = this_obj.BeginInvokeMultiple (e.Thread, methods, null, InvokeOptions.SingleThreaded, invoke_multiple_cb, this_obj);
2385 WaitHandle.WaitAll (new WaitHandle[] { r.AsyncWaitHandle });
2386 this_obj.EndInvokeMultiple (r);
2387 // The callback might still be running
2388 while (invoke_results.Count < 2) {
2391 if (invoke_results [0] is PrimitiveValue) {
2392 AssertValue ("ABC", invoke_results [1]);
2393 AssertValue (42, invoke_results [0]);
2395 AssertValue ("ABC", invoke_results [0]);
2396 AssertValue (42, invoke_results [1]);
2400 void invoke_multiple_cb (IAsyncResult ar) {
2401 ObjectMirror this_obj = (ObjectMirror)ar.AsyncState;
2403 var res = this_obj.EndInvokeMethod (ar);
2404 lock (invoke_results)
2405 invoke_results.Add (res);
2409 public void GetThreads () {
2414 public void Threads () {
2415 Event e = run_until ("threads");
2417 Assert.AreEqual (ThreadState.Running, e.Thread.ThreadState);
2419 Assert.IsTrue (e.Thread.ThreadId > 0);
2421 Assert.AreEqual (e.Thread.TID, e.Thread.TID);
2423 vm.EnableEvents (EventType.ThreadStart, EventType.ThreadDeath);
2427 e = GetNextEvent ();
2428 Assert.IsInstanceOfType (typeof (ThreadStartEvent), e);
2429 var state = e.Thread.ThreadState;
2430 Assert.IsTrue (state == ThreadState.Running || state == ThreadState.Unstarted);
2434 e = GetNextEvent ();
2435 Assert.IsInstanceOfType (typeof (ThreadDeathEvent), e);
2436 Assert.AreEqual (ThreadState.Stopped, e.Thread.ThreadState);
2440 public void Frame_SetValue () {
2441 Event e = run_until ("locals2");
2443 StackFrame frame = e.Thread.GetFrames () [0];
2446 var l = frame.Method.GetLocal ("i");
2447 frame.SetValue (l, vm.CreateValue ((long)55));
2448 AssertValue (55, frame.GetValue (l));
2451 l = frame.Method.GetLocal ("s");
2452 frame.SetValue (l, vm.RootDomain.CreateString ("DEF"));
2453 AssertValue ("DEF", frame.GetValue (l));
2455 // argument as local
2456 l = frame.Method.GetLocal ("arg");
2457 frame.SetValue (l, vm.CreateValue (6));
2458 AssertValue (6, frame.GetValue (l));
2461 var p = frame.Method.GetParameters ()[1];
2462 frame.SetValue (p, vm.CreateValue (7));
2463 AssertValue (7, frame.GetValue (p));
2466 p = frame.Method.GetParameters ()[2];
2467 frame.SetValue (p, vm.RootDomain.CreateString ("DEF"));
2468 AssertValue ("DEF", frame.GetValue (p));
2471 p = frame.Method.GetParameters ()[3];
2472 frame.SetValue (p, vm.RootDomain.CreateString ("DEF2"));
2473 AssertValue ("DEF2", frame.GetValue (p));
2476 p = frame.Method.GetParameters ()[4];
2477 var v = frame.GetValue (p) as StructMirror;
2478 v ["i"] = vm.CreateValue (43);
2479 frame.SetValue (p, v);
2480 v = frame.GetValue (p) as StructMirror;
2481 AssertValue (43, v ["i"]);
2483 // argument checking
2486 AssertThrows<ArgumentNullException> (delegate () {
2487 frame.SetValue ((LocalVariable)null, vm.CreateValue (55));
2491 AssertThrows<ArgumentNullException> (delegate () {
2492 l = frame.Method.GetLocal ("i");
2493 frame.SetValue (l, null);
2496 // value of invalid type
2497 AssertThrows<ArgumentException> (delegate () {
2498 l = frame.Method.GetLocal ("i");
2499 frame.SetValue (l, vm.CreateValue (55));
2505 public void Frame_SetValue_Registers () {
2506 Event e = run_until ("locals6_1");
2508 StackFrame frame = e.Thread.GetFrames () [1];
2511 var l = frame.Method.GetLocal ("j");
2512 frame.SetValue (l, vm.CreateValue (99));
2513 AssertValue (99, frame.GetValue (l));
2515 // Check it during execution
2516 e = run_until ("locals6_2");
2517 frame = e.Thread.GetFrames () [0];
2518 AssertValue (99, frame.GetValue (frame.Method.GetParameters ()[0]));
2520 // Set it while in a frame which clobbers its register
2521 e = run_until ("locals6_3");
2522 frame = e.Thread.GetFrames () [1];
2523 frame.SetValue (l, vm.CreateValue (100));
2524 AssertValue (100, frame.GetValue (l));
2526 // Check it during execution
2527 e = run_until ("locals6_4");
2528 frame = e.Thread.GetFrames () [0];
2529 AssertValue (100, frame.GetValue (frame.Method.GetParameters ()[0]));
2531 // Signed byte value
2532 e = run_until ("locals6_5");
2533 frame = e.Thread.GetFrames () [1];
2534 var l2 = frame.Method.GetLocal ("sb");
2535 frame.SetValue (l2, vm.CreateValue ((sbyte)-99));
2536 AssertValue (-99, frame.GetValue (l2));
2538 // Check it during execution
2539 e = run_until ("locals6_6");
2540 frame = e.Thread.GetFrames () [0];
2541 AssertValue (-99, frame.GetValue (frame.Method.GetParameters ()[0]));
2545 public void InvokeRegress () {
2546 Event e = run_until ("invoke1");
2548 StackFrame frame = e.Thread.GetFrames () [0];
2550 TypeMirror t = frame.Method.DeclaringType;
2551 ObjectMirror this_obj = (ObjectMirror)frame.GetThis ();
2553 TypeMirror t2 = frame.Method.GetParameters ()[0].ParameterType;
2559 m = t.GetMethod ("invoke_return_void");
2560 v = this_obj.InvokeMethod (e.Thread, m, null);
2563 // Check that the stack frames remain valid during the invoke
2564 Assert.AreEqual ("Tests", (frame.GetThis () as ObjectMirror).Type.Name);
2566 // do another invoke
2567 m = t.GetMethod ("invoke_return_void");
2568 v = this_obj.InvokeMethod (e.Thread, m, null);
2571 // Try a single step after the invoke
2572 var req = create_step (e);
2573 req.Depth = StepDepth.Into;
2574 req.Size = StepSize.Line;
2580 // Step into invoke2
2582 e = GetNextEvent ();
2583 Assert.IsTrue (e is StepEvent);
2584 Assert.AreEqual ("invoke2", (e as StepEvent).Method.Name);
2588 frame = e.Thread.GetFrames () [0];
2592 public void Exceptions () {
2593 Event e = run_until ("exceptions");
2594 var req = vm.CreateExceptionRequest (null);
2599 e = GetNextEvent ();
2600 Assert.IsInstanceOfType (typeof (ExceptionEvent), e);
2601 Assert.AreEqual ("OverflowException", (e as ExceptionEvent).Exception.Type.Name);
2603 var frames = e.Thread.GetFrames ();
2604 Assert.AreEqual ("exceptions", frames [0].Method.Name);
2607 // exception type filter
2609 req = vm.CreateExceptionRequest (vm.RootDomain.Corlib.GetType ("System.ArgumentException"));
2612 // Skip the throwing of the second OverflowException
2615 e = GetNextEvent ();
2616 Assert.IsInstanceOfType (typeof (ExceptionEvent), e);
2617 Assert.AreEqual ("ArgumentException", (e as ExceptionEvent).Exception.Type.Name);
2620 // exception type filter for subclasses
2621 req = vm.CreateExceptionRequest (vm.RootDomain.Corlib.GetType ("System.Exception"));
2626 e = GetNextEvent ();
2627 Assert.IsInstanceOfType (typeof (ExceptionEvent), e);
2628 Assert.AreEqual ("OverflowException", (e as ExceptionEvent).Exception.Type.Name);
2632 req.IncludeSubclasses = false;
2637 e = GetNextEvent ();
2638 Assert.IsInstanceOfType (typeof (ExceptionEvent), e);
2639 Assert.AreEqual ("Exception", (e as ExceptionEvent).Exception.Type.Name);
2642 // Implicit exceptions
2643 req = vm.CreateExceptionRequest (null);
2648 e = GetNextEvent ();
2649 Assert.IsInstanceOfType (typeof (ExceptionEvent), e);
2650 Assert.AreEqual ("NullReferenceException", (e as ExceptionEvent).Exception.Type.Name);
2653 // Single stepping after an exception
2654 req = vm.CreateExceptionRequest (null);
2659 e = GetNextEvent ();
2660 Assert.IsInstanceOfType (typeof (ExceptionEvent), e);
2661 Assert.AreEqual ("Exception", (e as ExceptionEvent).Exception.Type.Name);
2662 frames = e.Thread.GetFrames ();
2663 Assert.AreEqual ("exceptions2", frames [0].Method.Name);
2666 var sreq = create_step (e);
2667 sreq.Depth = StepDepth.Over;
2668 sreq.Size = StepSize.Line;
2672 e = GetNextEvent ();
2673 Assert.IsInstanceOfType (typeof (StepEvent), e);
2674 frames = e.Thread.GetFrames ();
2675 Assert.AreEqual ("exceptions", frames [0].Method.Name);
2678 // Argument checking
2679 AssertThrows<ArgumentException> (delegate {
2680 vm.CreateExceptionRequest (e.Thread.Type);
2685 public void ExceptionFilter () {
2686 Event e = run_until ("exception_filter");
2688 MethodMirror m = entry_point.DeclaringType.GetMethod ("exception_filter_filter");
2689 Assert.IsNotNull (m);
2691 vm.SetBreakpoint (m, 0);
2695 e = GetNextEvent ();
2696 Assert.AreEqual (EventType.Breakpoint, e.EventType);
2697 Assert.IsTrue (e is BreakpointEvent);
2698 Assert.AreEqual (m.Name, (e as BreakpointEvent).Method.Name);
2700 var frames = e.Thread.GetFrames ();
2702 Assert.IsTrue (frames [0].Location.SourceFile.IndexOf ("dtest-app.cs") != -1);
2703 Assert.AreEqual ("exception_filter_filter", frames [0].Location.Method.Name);
2705 Assert.AreEqual (0, frames [1].Location.Method.MetadataToken);
2706 Assert.AreEqual (0x0f, frames [1].Location.ILOffset);
2708 Assert.AreEqual ("exception_filter_method", frames [2].Location.Method.Name);
2709 Assert.AreEqual (0x06, frames [2].Location.ILOffset);
2711 Assert.AreEqual (0, frames [3].Location.Method.MetadataToken, 0);
2712 Assert.AreEqual (0, frames [3].Location.ILOffset);
2714 Assert.AreEqual ("exception_filter", frames [4].Location.Method.Name);
2718 public void ExceptionFilter2 () {
2721 Start (new string [] { "dtest-excfilter.exe" });
2723 MethodMirror filter_method = entry_point.DeclaringType.GetMethod ("Filter");
2724 Assert.IsNotNull (filter_method);
2726 MethodMirror test_method = entry_point.DeclaringType.GetMethod ("Test");
2727 Assert.IsNotNull (test_method);
2729 vm.SetBreakpoint (filter_method, 0);
2733 var e = GetNextEvent ();
2734 Assert.AreEqual (EventType.Breakpoint, e.EventType);
2735 Assert.IsTrue (e is BreakpointEvent);
2736 Assert.AreEqual (filter_method.Name, (e as BreakpointEvent).Method.Name);
2738 var frames = e.Thread.GetFrames ();
2740 Assert.AreEqual (4, frames.Count ());
2742 Assert.AreEqual (filter_method.Name, frames [0].Location.Method.Name);
2743 Assert.AreEqual (20, frames [0].Location.LineNumber);
2744 Assert.AreEqual (0, frames [0].Location.ILOffset);
2746 Assert.AreEqual (test_method.Name, frames [1].Location.Method.Name);
2747 Assert.AreEqual (37, frames [1].Location.LineNumber);
2748 Assert.AreEqual (0x0b, frames [1].Location.ILOffset);
2750 Assert.AreEqual (test_method.Name, frames [2].Location.Method.Name);
2751 Assert.AreEqual (33, frames [2].Location.LineNumber);
2752 Assert.AreEqual (0x05, frames [2].Location.ILOffset);
2754 Assert.AreEqual (entry_point.Name, frames [3].Location.Method.Name);
2755 Assert.AreEqual (14, frames [3].Location.LineNumber);
2756 Assert.AreEqual (0x00, frames [3].Location.ILOffset);
2764 public void EventSets () {
2766 // Create two filter which both match the same exception
2768 Event e = run_until ("exceptions");
2770 var req = vm.CreateExceptionRequest (null);
2773 var req2 = vm.CreateExceptionRequest (vm.RootDomain.Corlib.GetType ("System.OverflowException"));
2778 var es = vm.GetNextEventSet ();
2779 Assert.AreEqual (2, es.Events.Length);
2782 Assert.IsInstanceOfType (typeof (ExceptionEvent), e);
2783 Assert.AreEqual ("OverflowException", (e as ExceptionEvent).Exception.Type.Name);
2786 Assert.IsInstanceOfType (typeof (ExceptionEvent), e);
2787 Assert.AreEqual ("OverflowException", (e as ExceptionEvent).Exception.Type.Name);
2794 // Test single threaded invokes during processing of nullref exceptions.
2795 // These won't work if the exception handling is done from the sigsegv signal
2796 // handler, since the sigsegv signal is disabled until control returns from the
2800 [Category ("only3")]
2801 public void NullRefExceptionAndSingleThreadedInvoke () {
2802 Event e = run_until ("exceptions");
2803 var req = vm.CreateExceptionRequest (vm.RootDomain.Corlib.GetType ("System.NullReferenceException"));
2808 e = GetNextEvent ();
2809 Assert.IsInstanceOfType (typeof (ExceptionEvent), e);
2810 Assert.AreEqual ("NullReferenceException", (e as ExceptionEvent).Exception.Type.Name);
2812 var ex = (e as ExceptionEvent).Exception;
2813 var tostring_method = vm.RootDomain.Corlib.GetType ("System.Object").GetMethod ("ToString");
2814 ex.InvokeMethod (e.Thread, tostring_method, null, InvokeOptions.SingleThreaded);
2818 public void Domains () {
2821 Start (new string [] { "dtest-app.exe", "domain-test" });
2823 vm.EnableEvents (EventType.AppDomainCreate, EventType.AppDomainUnload, EventType.AssemblyUnload);
2825 Event e = run_until ("domains");
2829 e = GetNextEvent ();
2830 Assert.IsInstanceOfType (typeof (AppDomainCreateEvent), e);
2832 var domain = (e as AppDomainCreateEvent).Domain;
2834 // Check the object type
2835 e = run_until ("domains_2");
2836 var frame = e.Thread.GetFrames ()[0];
2837 var o = frame.GetArgument (0) as ObjectMirror;
2838 Assert.AreEqual ("CrossDomain", o.Type.Name);
2840 // Do a remoting invoke
2841 var cross_domain_type = o.Type;
2842 var v = o.InvokeMethod (e.Thread, cross_domain_type.GetMethod ("invoke_3"), null);
2843 AssertValue (42, v);
2845 // Run until the callback in the domain
2846 MethodMirror m = entry_point.DeclaringType.GetMethod ("invoke_in_domain");
2847 Assert.IsNotNull (m);
2848 vm.SetBreakpoint (m, 0);
2852 e = GetNextEvent ();
2853 if (e is BreakpointEvent)
2857 Assert.AreEqual ("invoke_in_domain", (e as BreakpointEvent).Method.Name);
2859 // d_method is from another domain
2860 MethodMirror d_method = (e as BreakpointEvent).Method;
2861 Assert.IsTrue (m != d_method);
2863 var frames = e.Thread.GetFrames ();
2864 Assert.AreEqual ("invoke_in_domain", frames [0].Method.Name);
2865 Assert.AreEqual ("invoke", frames [1].Method.Name);
2866 Assert.AreEqual ("domains", frames [2].Method.Name);
2868 // Test breakpoints on already JITted methods in other domains
2869 m = entry_point.DeclaringType.GetMethod ("invoke_in_domain_2");
2870 Assert.IsNotNull (m);
2871 vm.SetBreakpoint (m, 0);
2875 e = GetNextEvent ();
2876 if (e is BreakpointEvent)
2880 Assert.AreEqual ("invoke_in_domain_2", (e as BreakpointEvent).Method.Name);
2882 // This is empty when receiving the AppDomainCreateEvent
2883 Assert.AreEqual ("domain", domain.FriendlyName);
2885 // Run until the unload
2888 e = GetNextEvent ();
2889 if (e is AssemblyUnloadEvent) {
2895 Assert.IsInstanceOfType (typeof (AppDomainUnloadEvent), e);
2896 Assert.AreEqual (domain, (e as AppDomainUnloadEvent).Domain);
2898 // Run past the unload
2899 e = run_until ("domains_3");
2901 // Test access to unloaded types
2902 // FIXME: Add an exception type for this
2903 AssertThrows<Exception> (delegate {
2904 d_method.DeclaringType.GetValue (d_method.DeclaringType.GetField ("static_i"));
2909 public void DynamicMethods () {
2910 Event e = run_until ("dyn_call");
2912 var m = e.Thread.GetFrames ()[1].Method;
2913 Assert.AreEqual ("dyn_method", m.Name);
2915 // Test access to IL
2916 var body = m.GetMethodBody ();
2918 ILInstruction ins = body.Instructions [0];
2919 Assert.AreEqual (OpCodes.Ldstr, ins.OpCode);
2920 Assert.AreEqual ("FOO", ins.Operand);
2924 public void RefEmit () {
2927 Start (new string [] { "dtest-app.exe", "ref-emit-test" });
2929 Event e = run_until ("ref_emit_call");
2931 var m = e.Thread.GetFrames ()[1].Method;
2932 Assert.AreEqual ("ref_emit_method", m.Name);
2934 // Test access to IL
2935 var body = m.GetMethodBody ();
2939 ins = body.Instructions [0];
2940 Assert.AreEqual (OpCodes.Ldstr, ins.OpCode);
2941 Assert.AreEqual ("FOO", ins.Operand);
2943 ins = body.Instructions [1];
2944 Assert.AreEqual (OpCodes.Call, ins.OpCode);
2945 Assert.IsInstanceOfType (typeof (MethodMirror), ins.Operand);
2946 Assert.AreEqual ("ref_emit_call", (ins.Operand as MethodMirror).Name);
2950 public void IsAttached () {
2951 var f = entry_point.DeclaringType.GetField ("is_attached");
2953 Event e = run_until ("Main");
2955 AssertValue (true, entry_point.DeclaringType.GetValue (f));
2959 public void StackTraceInNative () {
2960 // Check that stack traces can be produced for threads in native code
2963 Start (new string [] { "dtest-app.exe", "frames-in-native" });
2965 var e = run_until ("frames_in_native");
2967 // FIXME: This is racy
2974 StackFrame[] frames = e.Thread.GetFrames ();
2976 int frame_index = -1;
2977 for (int i = 0; i < frames.Length; ++i) {
2978 if (frames [i].Method.Name == "Sleep") {
2984 Assert.IsTrue (frame_index != -1);
2985 Assert.AreEqual ("Sleep", frames [frame_index].Method.Name);
2986 Assert.AreEqual ("frames_in_native", frames [frame_index + 1].Method.Name);
2987 Assert.AreEqual ("Main", frames [frame_index + 2].Method.Name);
2989 // Check that invokes are disabled for such threads
2990 TypeMirror t = frames [frame_index + 1].Method.DeclaringType;
2992 var m = t.GetMethod ("invoke_static_return_void");
2993 AssertThrows<InvalidOperationException> (delegate {
2994 t.InvokeMethod (e.Thread, m, null);
2997 // Check that the frame info is invalidated
2998 run_until ("frames_in_native_2");
3000 AssertThrows<InvalidStackFrameException> (delegate {
3001 Console.WriteLine (frames [frame_index].GetThis ());
3006 public void VirtualMachine_CreateEnumMirror () {
3007 var e = run_until ("o1");
3008 var frame = e.Thread.GetFrames () [0];
3010 object val = frame.GetThis ();
3011 Assert.IsTrue (val is ObjectMirror);
3012 Assert.AreEqual ("Tests", (val as ObjectMirror).Type.Name);
3013 ObjectMirror o = (val as ObjectMirror);
3015 FieldInfoMirror field = o.Type.GetField ("field_enum");
3016 Value f = o.GetValue (field);
3017 TypeMirror enumType = (f as EnumMirror).Type;
3019 o.SetValue (field, vm.CreateEnumMirror (enumType, vm.CreateValue (1)));
3020 f = o.GetValue (field);
3021 Assert.AreEqual (1, (f as EnumMirror).Value);
3023 // Argument checking
3024 AssertThrows<ArgumentNullException> (delegate () {
3025 vm.CreateEnumMirror (enumType, null);
3028 AssertThrows<ArgumentNullException> (delegate () {
3029 vm.CreateEnumMirror (null, vm.CreateValue (1));
3033 AssertThrows<ArgumentException> (delegate () {
3034 vm.CreateEnumMirror (enumType, vm.CreateValue (null));
3037 // value of a wrong type
3038 AssertThrows<ArgumentException> (delegate () {
3039 vm.CreateEnumMirror (enumType, vm.CreateValue ((long)1));
3044 public void VirtualMachine_EnableEvents_Breakpoint () {
3045 AssertThrows<ArgumentException> (delegate () {
3046 vm.EnableEvents (EventType.Breakpoint);
3051 public void SingleStepRegress654694 () {
3054 MethodMirror m = entry_point.DeclaringType.GetMethod ("ss_regress_654694");
3055 foreach (Location l in m.Locations) {
3056 if (l.ILOffset > 0 && il_offset == -1)
3057 il_offset = l.ILOffset;
3060 Event e = run_until ("ss_regress_654694");
3062 Assert.IsNotNull (m);
3063 vm.SetBreakpoint (m, il_offset);
3067 e = GetNextEvent ();
3068 Assert.IsTrue (e is BreakpointEvent);
3070 var req = create_step (e);
3071 req.Depth = StepDepth.Over;
3072 req.Size = StepSize.Line;
3077 e = GetNextEvent ();
3078 Assert.IsTrue (e is StepEvent);
3084 public void DebugBreak () {
3085 vm.EnableEvents (EventType.UserBreak);
3090 var e = GetNextEvent ();
3091 Assert.IsTrue (e is UserBreakEvent);
3095 public void DebugLog () {
3096 vm.EnableEvents (EventType.UserLog);
3101 var e = GetNextEvent ();
3102 Assert.IsTrue (e is UserLogEvent);
3103 var le = e as UserLogEvent;
3105 Assert.AreEqual (5, le.Level);
3106 Assert.AreEqual ("A", le.Category);
3107 Assert.AreEqual ("B", le.Message);
3111 public void TypeGetMethodsByNameFlags () {
3113 var assembly = entry_point.DeclaringType.Assembly;
3114 var type = assembly.GetType ("Tests3");
3116 Assert.IsNotNull (type);
3118 mm = type.GetMethodsByNameFlags (null, BindingFlags.Static | BindingFlags.Public, false);
3119 Assert.AreEqual (1, mm.Length, "#1");
3120 Assert.AreEqual ("M1", mm[0].Name, "#2");
3122 mm = type.GetMethodsByNameFlags (null, BindingFlags.Static | BindingFlags.NonPublic, false);
3123 Assert.AreEqual (1, mm.Length, "#3");
3124 Assert.AreEqual ("M2", mm[0].Name, "#4");
3126 mm = type.GetMethodsByNameFlags (null, BindingFlags.Instance | BindingFlags.Public, false);
3127 Assert.AreEqual (7, mm.Length, "#5"); //M3 plus Equals, GetHashCode, GetType, ToString, .ctor
3129 mm = type.GetMethodsByNameFlags (null, BindingFlags.Instance | BindingFlags.Public | BindingFlags.DeclaredOnly, false);
3130 Assert.AreEqual (2, mm.Length, "#7");
3132 mm = type.GetMethodsByNameFlags (null, BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.DeclaredOnly, false);
3133 Assert.AreEqual (1, mm.Length, "#9");
3135 mm = type.GetMethodsByNameFlags (null, BindingFlags.Static | BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.DeclaredOnly, false);
3136 Assert.AreEqual (5, mm.Length, "#11");
3139 mm = type.GetMethodsByNameFlags ("M1", BindingFlags.Static | BindingFlags.Public, false);
3140 Assert.AreEqual (1, mm.Length, "#12");
3141 Assert.AreEqual ("M1", mm[0].Name, "#13");
3143 mm = type.GetMethodsByNameFlags ("m1", BindingFlags.Static | BindingFlags.Public, true);
3144 Assert.AreEqual (1, mm.Length, "#14");
3145 Assert.AreEqual ("M1", mm[0].Name, "#15");
3147 mm = type.GetMethodsByNameFlags ("M1", BindingFlags.Static | BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, false);
3148 Assert.AreEqual (1, mm.Length, "#16");
3149 Assert.AreEqual ("M1", mm[0].Name, "#17");
3153 [Category ("only88")]
3154 public void TypeLoadSourceFileFilter () {
3155 Event e = run_until ("type_load");
3157 if (!vm.Version.AtLeast (2, 7))
3160 string srcfile = (e as BreakpointEvent).Method.DeclaringType.GetSourceFiles (true)[0];
3162 var req = vm.CreateTypeLoadRequest ();
3163 req.SourceFileFilter = new string [] { srcfile.ToUpper () };
3167 e = GetNextEvent ();
3168 Assert.IsTrue (e is TypeLoadEvent);
3169 Assert.AreEqual ("TypeLoadClass", (e as TypeLoadEvent).Type.FullName);
3173 public void TypeLoadTypeNameFilter () {
3174 Event e = run_until ("type_load");
3176 var req = vm.CreateTypeLoadRequest ();
3177 req.TypeNameFilter = new string [] { "TypeLoadClass2" };
3181 e = GetNextEvent ();
3182 Assert.IsTrue (e is TypeLoadEvent);
3183 Assert.AreEqual ("TypeLoadClass2", (e as TypeLoadEvent).Type.FullName);
3187 public void GetTypesForSourceFile () {
3190 var types = vm.GetTypesForSourceFile ("dtest-app.cs", false);
3191 Assert.IsTrue (types.Any (t => t.FullName == "Tests"));
3192 Assert.IsFalse (types.Any (t => t.FullName == "System.Int32"));
3194 types = vm.GetTypesForSourceFile ("DTEST-app.cs", true);
3195 Assert.IsTrue (types.Any (t => t.FullName == "Tests"));
3196 Assert.IsFalse (types.Any (t => t.FullName == "System.Int32"));
3200 public void GetTypesNamed () {
3203 var types = vm.GetTypes ("Tests", false);
3204 Assert.AreEqual (1, types.Count);
3205 Assert.AreEqual ("Tests", types [0].FullName);
3207 types = vm.GetTypes ("System.Exception", false);
3208 Assert.AreEqual (1, types.Count);
3209 Assert.AreEqual ("System.Exception", types [0].FullName);
3213 public void String_GetChars () {
3217 var e = run_until ("arg2");
3219 var frame = e.Thread.GetFrames () [0];
3221 val = frame.GetArgument (0);
3222 Assert.IsTrue (val is StringMirror);
3223 AssertValue ("FOO", val);
3224 var s = (val as StringMirror);
3225 Assert.AreEqual (3, s.Length);
3227 var c = s.GetChars (0, 2);
3228 Assert.AreEqual (2, c.Length);
3229 Assert.AreEqual ('F', c [0]);
3230 Assert.AreEqual ('O', c [1]);
3232 AssertThrows<ArgumentException> (delegate () {
3238 public void GetInterfaces () {
3239 var e = run_until ("arg2");
3241 var frame = e.Thread.GetFrames () [0];
3243 var cl1 = frame.Method.DeclaringType.Assembly.GetType ("TestIfaces");
3244 var ifaces = cl1.GetInterfaces ();
3245 Assert.AreEqual (1, ifaces.Length);
3246 Assert.AreEqual ("ITest", ifaces [0].Name);
3248 var cl2 = cl1.GetMethod ("Baz").ReturnType;
3249 var ifaces2 = cl2.GetInterfaces ();
3250 Assert.AreEqual (1, ifaces2.Length);
3251 Assert.AreEqual ("ITest`1", ifaces2 [0].Name);
3255 public void GetInterfaceMap () {
3256 var e = run_until ("arg2");
3258 var frame = e.Thread.GetFrames () [0];
3260 var cl1 = frame.Method.DeclaringType.Assembly.GetType ("TestIfaces");
3261 var iface = cl1.Assembly.GetType ("ITest");
3262 var map = cl1.GetInterfaceMap (iface);
3263 Assert.AreEqual (cl1, map.TargetType);
3264 Assert.AreEqual (iface, map.InterfaceType);
3265 Assert.AreEqual (2, map.InterfaceMethods.Length);
3266 Assert.AreEqual (2, map.TargetMethods.Length);
3270 public void StackAlloc_Breakpoints_Regress2775 () {
3271 // Check that breakpoints on arm don't overwrite stackalloc-ed memory
3272 var e = run_until ("regress_2755");
3274 var frame = e.Thread.GetFrames () [0];
3276 // This breaks at the call site
3277 vm.SetBreakpoint (m, m.Locations [2].ILOffset);
3280 var e2 = GetNextEvent ();
3281 Assert.IsTrue (e2 is BreakpointEvent);
3283 e = run_until ("regress_2755_3");
3284 frame = e.Thread.GetFrames () [1];
3285 var res = frame.GetValue (m.GetLocal ("sum"));
3286 AssertValue (0, res);
3290 public void MethodInfo () {
3291 Event e = run_until ("locals2");
3293 StackFrame frame = e.Thread.GetFrames () [0];
3294 var m = frame.Method;
3296 Assert.IsTrue (m.IsGenericMethod);
3297 Assert.IsFalse (m.IsGenericMethodDefinition);
3299 var args = m.GetGenericArguments ();
3300 Assert.AreEqual (1, args.Length);
3301 Assert.AreEqual ("String", args [0].Name);
3303 var gmd = m.GetGenericMethodDefinition ();
3304 Assert.IsTrue (gmd.IsGenericMethod);
3305 Assert.IsTrue (gmd.IsGenericMethodDefinition);
3306 Assert.AreEqual (gmd, gmd.GetGenericMethodDefinition ());
3308 args = gmd.GetGenericArguments ();
3309 Assert.AreEqual (1, args.Length);
3310 Assert.AreEqual ("T", args [0].Name);
3312 var attrs = m.GetCustomAttributes (true);
3313 Assert.AreEqual (1, attrs.Length);
3314 Assert.AreEqual ("StateMachineAttribute", attrs [0].Constructor.DeclaringType.Name);
3318 public void UnhandledException () {
3321 Start (new string [] { "dtest-app.exe", "unhandled-exception" });
3323 var req = vm.CreateExceptionRequest (null, false, true);
3326 var e = run_until ("unhandled_exception");
3329 var e2 = GetNextEvent ();
3330 Assert.IsTrue (e2 is ExceptionEvent);
3337 public void UnhandledException_2 () {
3340 Start (new string [] { "dtest-app.exe", "unhandled-exception-endinvoke" });
3342 var req = vm.CreateExceptionRequest (null, false, true);
3345 MethodMirror m = entry_point.DeclaringType.GetMethod ("unhandled_exception_endinvoke_2");
3346 Assert.IsNotNull (m);
3347 vm.SetBreakpoint (m, m.ILOffsets [0]);
3349 var e = run_until ("unhandled_exception_endinvoke");
3352 var e2 = GetNextEvent ();
3353 Assert.IsFalse (e2 is ExceptionEvent);
3361 public void UnhandledExceptionUserCode () {
3364 // Exceptions caught in non-user code are treated as unhandled
3365 Start (new string [] { "dtest-app.exe", "unhandled-exception-user" });
3367 var req = vm.CreateExceptionRequest (null, false, true);
3368 req.AssemblyFilter = new List<AssemblyMirror> () { entry_point.DeclaringType.Assembly };
3371 var e = run_until ("unhandled_exception_user");
3374 var e2 = GetNextEvent ();
3375 Assert.IsTrue (e2 is ExceptionEvent);
3383 public void GCWhileSuspended () {
3384 // Check that objects are kept alive during suspensions
3385 Event e = run_until ("gc_suspend_1");
3387 MethodMirror m = entry_point.DeclaringType.GetMethod ("gc_suspend_invoke");
3389 var o = entry_point.DeclaringType.GetValue (entry_point.DeclaringType.GetField ("gc_suspend_field")) as ObjectMirror;
3390 //Console.WriteLine (o);
3392 StackFrame frame = e.Thread.GetFrames () [0];
3393 TypeMirror t = frame.Method.DeclaringType;
3394 for (int i = 0; i < 10; ++i)
3395 t.InvokeMethod (e.Thread, m, new Value [] { });
3397 // This throws an exception if the object is collected
3398 long addr = o.Address;
3400 var o2 = entry_point.DeclaringType.GetValue (entry_point.DeclaringType.GetField ("gc_suspend_field")) as ObjectMirror;
3405 public void MakeGenericMethod () {
3406 Event e = run_until ("bp1");
3408 var intm = vm.RootDomain.GetCorrespondingType (typeof (int));
3409 var stringm = vm.RootDomain.GetCorrespondingType (typeof (string));
3410 var gm = entry_point.DeclaringType.GetMethod ("generic_method");
3411 var res = gm.MakeGenericMethod (new TypeMirror [] { stringm });
3412 var args = res.GetGenericArguments ();
3413 Assert.AreEqual (1, args.Length);
3414 Assert.AreEqual (stringm, args [0]);
3417 AssertThrows<ArgumentNullException> (delegate {
3418 gm.MakeGenericMethod (null);
3420 AssertThrows<ArgumentNullException> (delegate {
3421 gm.MakeGenericMethod (new TypeMirror [] { null });
3423 AssertThrows<ArgumentException> (delegate {
3424 gm.MakeGenericMethod (new TypeMirror [] { stringm, stringm });
3426 AssertThrows<InvalidOperationException> (delegate {
3427 gm.MakeGenericMethod (new TypeMirror [] { intm });
3429 AssertThrows<InvalidOperationException> (delegate {
3430 entry_point.DeclaringType.GetMethod ("Main").MakeGenericMethod (new TypeMirror [] { intm });
3435 public void InspectThreadSuspenedOnWaitOne () {
3437 Start (true, "dtest-app.exe", "wait-one" );
3439 ThreadMirror.NativeTransitions = true;
3441 var evt = run_until ("wait_one");
3442 Assert.IsNotNull (evt, "#1");
3444 var thread = evt.Thread;
3445 Assert.AreEqual (ThreadState.Running, thread.ThreadState, "#1.1");
3447 var frames = thread.GetFrames ();
3448 Assert.IsNotNull (frames, "#2");
3449 Assert.AreEqual (2, frames.Length, "#3");
3450 Assert.AreEqual ("wait_one", frames [0].Method.Name, "#4");
3451 Assert.AreEqual ("Main", frames [1].Method.Name, "#5");
3455 Thread.Sleep (500); //FIXME this is racy, maybe single step? or something?
3458 Assert.AreEqual (ThreadState.WaitSleepJoin, thread.ThreadState, "#6");
3460 frames = thread.GetFrames ();
3461 Assert.AreEqual (4, frames.Length, "#7");
3462 Assert.AreEqual ("WaitOne_internal", frames [0].Method.Name, "#8");
3463 Assert.AreEqual ("WaitOne", frames [1].Method.Name, "#8.1");
3464 Assert.AreEqual ("wait_one", frames [2].Method.Name, "#9");
3465 Assert.AreEqual ("Main", frames [3].Method.Name, "#10");
3468 var frame = frames [0];
3469 Assert.IsTrue (frame.IsNativeTransition, "#11.1");
3472 Assert.Fail ("Known limitation - can't get info from m2n frames");
3473 } catch (AbsentInformationException) {}
3476 Assert.IsFalse (frame.IsNativeTransition, "#12.1");
3477 var wait_one_this = frame.GetThis ();
3478 Assert.IsNotNull (wait_one_this, "#12.2");
3481 var locals = frame.GetVisibleVariables ();
3482 Assert.AreEqual (1, locals.Count, "#13.1");
3484 var local_0 = frame.GetValue (locals [0]);
3485 Assert.IsNotNull (local_0, "#13.2");
3487 Assert.AreEqual (wait_one_this, local_0, "#14.2");
3491 public void GetMethodBody () {
3492 var bevent = run_until ("Main");
3494 var m = bevent.Method.DeclaringType.GetMethod ("get_IntProperty");
3495 var body = m.GetMethodBody ();
3496 foreach (var ins in body.Instructions) {
3497 if (ins.OpCode == OpCodes.Ldfld) {
3498 var field = (FieldInfoMirror)ins.Operand;
3499 Assert.AreEqual ("field_i", field.Name);
3505 public void EvaluateMethod () {
3506 var bevent = run_until ("evaluate_method_2");
3508 var m = bevent.Method.DeclaringType.GetMethod ("get_IntProperty");
3510 var this_obj = bevent.Thread.GetFrames ()[0].GetThis ();
3511 var v = m.Evaluate (this_obj, null);
3512 AssertValue (42, v);
3516 public void SetIP () {
3517 var bevent = run_until ("set_ip_1");
3519 var invalid_loc = bevent.Thread.GetFrames ()[0].Location;
3521 var req = create_step (bevent);
3522 var e = step_out ();
3524 var frames = e.Thread.GetFrames ();
3525 var locs = frames [0].Method.Locations;
3526 var next_loc = locs.First (l => (l.LineNumber == frames [0].Location.LineNumber + 2));
3528 e.Thread.SetIP (next_loc);
3530 /* Check that i = 5; j = 5; was skipped */
3531 bevent = run_until ("set_ip_2");
3532 var f = bevent.Thread.GetFrames ()[1];
3533 AssertValue (1, f.GetValue (f.Method.GetLocal ("i")));
3534 AssertValue (0, f.GetValue (f.Method.GetLocal ("j")));
3537 AssertThrows<ArgumentNullException> (delegate {
3538 e.Thread.SetIP (null);
3541 AssertThrows<ArgumentException> (delegate {
3542 e.Thread.SetIP (invalid_loc);
3547 public void NewInstanceNoCtor () {
3548 var bevent = run_until ("Main");
3550 var stype = bevent.Method.DeclaringType.Assembly.GetType ("AStruct");
3551 var obj = stype.NewInstance ();
3552 Assert.IsTrue (obj is ObjectMirror);
3553 Assert.AreEqual ("AStruct", (obj as ObjectMirror).Type.Name);