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);
1469 public void AssemblyInfo () {
1470 Event e = run_until ("single_stepping");
1472 StackFrame frame = e.Thread.GetFrames () [0];
1474 var aname = frame.Method.DeclaringType.Assembly.GetName ();
1475 Assert.AreEqual ("dtest-app, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null", aname.ToString ());
1477 ModuleMirror m = frame.Method.DeclaringType.Module;
1479 Assert.AreEqual ("dtest-app.exe", m.Name);
1480 Assert.AreEqual ("dtest-app.exe", m.ScopeName);
1481 Assert.IsTrue (m.FullyQualifiedName.IndexOf ("dtest-app.exe") != -1);
1482 Guid guid = m.ModuleVersionId;
1483 Assert.AreEqual (frame.Method.DeclaringType.Assembly, m.Assembly);
1484 Assert.AreEqual (frame.Method.DeclaringType.Assembly.ManifestModule, m);
1486 // This is no longer true on 4.0
1487 //Assert.AreEqual ("Assembly", frame.Method.DeclaringType.Assembly.GetAssemblyObject ().Type.Name);
1489 TypeMirror t = vm.RootDomain.Corlib.GetType ("System.Diagnostics.DebuggerDisplayAttribute");
1490 Assert.AreEqual ("DebuggerDisplayAttribute", t.Name);
1494 public void LocalsInfo () {
1495 Event e = run_until ("locals2");
1497 StackFrame frame = e.Thread.GetFrames () [0];
1499 var locals = frame.Method.GetLocals ();
1500 Assert.AreEqual (8, locals.Length);
1501 for (int i = 0; i < 8; ++i) {
1502 if (locals [i].Name == "args") {
1503 Assert.IsTrue (locals [i].IsArg);
1504 Assert.AreEqual ("String[]", locals [i].Type.Name);
1505 } else if (locals [i].Name == "arg") {
1506 Assert.IsTrue (locals [i].IsArg);
1507 Assert.AreEqual ("Int32", locals [i].Type.Name);
1508 } else if (locals [i].Name == "i") {
1509 Assert.IsFalse (locals [i].IsArg);
1510 Assert.AreEqual ("Int64", locals [i].Type.Name);
1511 } else if (locals [i].Name == "j") {
1512 Assert.IsFalse (locals [i].IsArg);
1513 Assert.AreEqual ("Int32", locals [i].Type.Name);
1514 } else if (locals [i].Name == "s") {
1515 Assert.IsFalse (locals [i].IsArg);
1516 Assert.AreEqual ("String", locals [i].Type.Name);
1517 } else if (locals [i].Name == "t") {
1519 Assert.IsTrue (locals [i].IsArg);
1520 Assert.AreEqual ("String", locals [i].Type.Name);
1521 } else if (locals [i].Name == "rs") {
1522 Assert.IsTrue (locals [i].IsArg);
1523 Assert.AreEqual ("String", locals [i].Type.Name);
1524 } else if (locals [i].Name == "astruct") {
1531 Event step_once () {
1533 var e = GetNextEvent ();
1534 Assert.IsTrue (e is StepEvent);
1538 Event step_into () {
1539 step_req.Disable ();
1540 step_req.Depth = StepDepth.Into;
1542 return step_once ();
1545 Event step_over () {
1546 step_req.Disable ();
1547 step_req.Depth = StepDepth.Over;
1549 return step_once ();
1553 step_req.Disable ();
1554 step_req.Depth = StepDepth.Out;
1556 return step_once ();
1560 public void Locals () {
1561 var be = run_until ("locals1");
1563 StackFrame frame = be.Thread.GetFrames () [0];
1564 MethodMirror m1 = frame.Method;
1566 // Compiler generated byref local
1567 foreach (var l in m1.GetLocals ()) {
1568 // The byval flag is hidden from the type
1569 if (l.Name != "ri" && l.Type.Name == "Double")
1570 AssertValue (null, frame.GetValue (l));
1573 be = run_until ("locals2");
1575 frame = be.Thread.GetFrames () [0];
1577 object val = frame.GetValue (frame.Method.GetLocal ("i"));
1578 AssertValue (0, val);
1580 var req = create_step (be);
1587 var e = step_once ();
1588 Assert.AreEqual ("locals2", (e as StepEvent).Method.Name);
1590 // Execute s = "AB";
1592 Assert.AreEqual ("locals2", (e as StepEvent).Method.Name);
1594 frame = e.Thread.GetFrames () [0];
1596 val = frame.GetValue (frame.Method.GetLocal ("i"));
1597 AssertValue (42, val);
1599 LocalVariable[] locals = frame.Method.GetLocals ();
1600 var vals = frame.GetValues (locals);
1601 Assert.AreEqual (locals.Length, vals.Length);
1602 for (int i = 0; i < locals.Length; ++i) {
1603 if (locals [i].Name == "i")
1604 AssertValue (42, vals [i]);
1605 if (locals [i].Name == "s")
1606 AssertValue ("AB", vals [i]);
1607 if (locals [i].Name == "t")
1608 AssertValue ("ABC", vals [i]);
1611 // Argument checking
1614 AssertThrows<ArgumentNullException> (delegate () {
1615 frame.GetValue ((LocalVariable)null);
1617 // GetValue () local from another method
1618 AssertThrows<ArgumentException> (delegate () {
1619 frame.GetValue (m1.GetLocal ("foo"));
1623 AssertThrows<ArgumentNullException> (delegate () {
1624 frame.GetValue ((ParameterInfoMirror)null);
1626 // GetValue () local from another method
1627 AssertThrows<ArgumentException> (delegate () {
1628 frame.GetValue (m1.GetParameters ()[0]);
1631 // GetValues () null
1632 AssertThrows<ArgumentNullException> (delegate () {
1633 frame.GetValues (null);
1635 // GetValues () embedded null
1636 AssertThrows<ArgumentNullException> (delegate () {
1637 frame.GetValues (new LocalVariable [] { null });
1639 // GetValues () local from another method
1640 AssertThrows<ArgumentException> (delegate () {
1641 frame.GetValues (new LocalVariable [] { m1.GetLocal ("foo") });
1644 AssertThrows<ArgumentException> (delegate () {
1645 val = frame.GetValue (frame.Method.ReturnParameter);
1648 // invalid stack frames
1650 e = GetNextEvent ();
1651 Assert.IsTrue (e is StepEvent);
1652 Assert.AreEqual ("locals2", (e as StepEvent).Method.Name);
1654 AssertThrows<InvalidStackFrameException> (delegate () {
1655 frame.GetValue (frame.Method.GetLocal ("i"));
1661 be = run_until ("locals7");
1663 req = create_step (be);
1669 // Test that locals are initialized
1670 frame = e.Thread.GetFrames () [0];
1671 val = frame.GetValue (frame.Method.GetLocal ("t"));
1672 AssertValue (0, val);
1676 Assert.AreEqual ("locals7", (e as StepEvent).Method.Name);
1680 Assert.AreEqual ("locals7", (e as StepEvent).Method.Name);
1682 frame = e.Thread.GetFrames () [0];
1683 val = frame.GetValue (frame.Method.GetParameters ()[0]);
1684 AssertValue (22, val);
1685 val = frame.GetValue (frame.Method.GetLocal ("t"));
1686 AssertValue (22, val);
1687 val = frame.GetValue (frame.Method.GetLocal ("t2"));
1688 AssertValue (22, val);
1692 public void GetVisibleVariables () {
1693 Event e = run_until ("locals4");
1696 var locals = e.Thread.GetFrames ()[1].GetVisibleVariables ();
1697 Assert.AreEqual (2, locals.Count);
1698 var loc = locals.First (l => l.Name == "i");
1699 Assert.AreEqual ("Int64", loc.Type.Name);
1700 loc = locals.First (l => l.Name == "s");
1701 Assert.AreEqual ("String", loc.Type.Name);
1703 loc = e.Thread.GetFrames ()[1].GetVisibleVariableByName ("i");
1704 Assert.AreEqual ("i", loc.Name);
1705 Assert.AreEqual ("Int64", loc.Type.Name);
1707 e = run_until ("locals5");
1710 locals = e.Thread.GetFrames ()[1].GetVisibleVariables ();
1711 Assert.AreEqual (2, locals.Count);
1712 loc = locals.First (l => l.Name == "i");
1713 Assert.AreEqual ("String", loc.Type.Name);
1714 loc = locals.First (l => l.Name == "s");
1715 Assert.AreEqual ("String", loc.Type.Name);
1717 loc = e.Thread.GetFrames ()[1].GetVisibleVariableByName ("i");
1718 Assert.AreEqual ("i", loc.Name);
1719 Assert.AreEqual ("String", loc.Type.Name);
1721 // Variable in another scope
1722 loc = e.Thread.GetFrames ()[1].GetVisibleVariableByName ("j");
1723 Assert.IsNull (loc);
1727 public void Exit () {
1732 var e = GetNextEvent ();
1733 Assert.IsInstanceOfType (typeof (VMDeathEvent), e);
1735 Assert.AreEqual (5, (e as VMDeathEvent).ExitCode);
1738 /* Could be a remote vm with no process */
1741 Assert.AreEqual (5, p.ExitCode);
1744 AssertThrows<VMDisconnectedException> (delegate () {
1753 public void Dispose () {
1758 var e = GetNextEvent ();
1759 Assert.IsInstanceOfType (typeof (VMDisconnectEvent), e);
1762 /* Could be a remote vm with no process */
1765 Assert.AreEqual (3, p.ExitCode);
1768 AssertThrows<VMDisconnectedException> (delegate () {
1777 public void ColumnNumbers () {
1778 Event e = run_until ("line_numbers");
1780 // FIXME: Merge this with LineNumbers () when its fixed
1782 step_req = create_step (e);
1783 step_req.Depth = StepDepth.Into;
1791 e = GetNextEvent ();
1792 Assert.IsTrue (e is StepEvent);
1793 if (e.Thread.GetFrames ()[0].Method.Name == "ln1")
1797 // Do an additional step over so we are not on the beginning line of the method
1798 step_req.Disable ();
1799 step_req.Depth = StepDepth.Over;
1802 e = GetNextEvent ();
1803 Assert.IsTrue (e is StepEvent);
1805 l = e.Thread.GetFrames ()[0].Location;
1807 Assert.AreEqual (3, l.ColumnNumber);
1809 step_req.Disable ();
1813 // Broken by mcs+runtime changes (#5438)
1814 [Category("NotWorking")]
1815 public void LineNumbers () {
1816 Event e = run_until ("line_numbers");
1818 step_req = create_step (e);
1819 step_req.Depth = StepDepth.Into;
1826 e = GetNextEvent ();
1827 Assert.IsTrue (e is StepEvent);
1829 l = e.Thread.GetFrames ()[0].Location;
1831 Assert.IsTrue (l.SourceFile.IndexOf ("dtest-app.cs") != -1);
1832 Assert.AreEqual ("ln1", l.Method.Name);
1835 using (FileStream fs = new FileStream (l.SourceFile, FileMode.Open, FileAccess.Read)) {
1836 MD5 md5 = MD5.Create ();
1837 var hash = md5.ComputeHash (fs);
1839 for (int i = 0; i < 16; ++i)
1840 Assert.AreEqual (hash [i], l.SourceFileHash [i]);
1843 int line_base = l.LineNumber;
1846 e = GetNextEvent ();
1847 Assert.IsTrue (e is StepEvent);
1848 l = e.Thread.GetFrames ()[0].Location;
1849 Assert.AreEqual ("ln2", l.Method.Name);
1850 Assert.AreEqual (line_base + 6, l.LineNumber);
1853 e = GetNextEvent ();
1854 Assert.IsTrue (e is StepEvent);
1855 l = e.Thread.GetFrames ()[0].Location;
1856 Assert.AreEqual ("ln1", l.Method.Name);
1857 Assert.AreEqual (line_base + 1, l.LineNumber);
1860 e = GetNextEvent ();
1861 Assert.IsTrue (e is StepEvent);
1862 l = e.Thread.GetFrames ()[0].Location;
1863 Assert.AreEqual ("ln3", l.Method.Name);
1864 Assert.AreEqual (line_base + 11, l.LineNumber);
1867 e = GetNextEvent ();
1868 Assert.IsTrue (e is StepEvent);
1869 l = e.Thread.GetFrames ()[0].Location;
1870 Assert.AreEqual ("ln3", l.Method.Name);
1871 Assert.IsTrue (l.SourceFile.EndsWith ("FOO"));
1872 Assert.AreEqual (55, l.LineNumber);
1875 e = GetNextEvent ();
1876 Assert.IsTrue (e is StepEvent);
1877 l = e.Thread.GetFrames ()[0].Location;
1878 Assert.AreEqual ("ln1", l.Method.Name);
1879 Assert.AreEqual (line_base + 2, l.LineNumber);
1881 // GetSourceFiles ()
1882 string[] sources = l.Method.DeclaringType.GetSourceFiles ();
1883 Assert.AreEqual (2, sources.Length);
1884 Assert.AreEqual ("dtest-app.cs", sources [0]);
1885 Assert.AreEqual ("FOO", sources [1]);
1887 sources = l.Method.DeclaringType.GetSourceFiles (true);
1888 Assert.AreEqual (2, sources.Length);
1889 Assert.IsTrue (sources [0].EndsWith ("dtest-app.cs"));
1890 Assert.IsTrue (sources [1].EndsWith ("FOO"));
1894 public void Suspend () {
1897 Start (new string [] { "dtest-app.exe", "suspend-test" });
1899 Event e = run_until ("suspend");
1901 ThreadMirror main = e.Thread;
1909 // The debuggee should be suspended while it is running the infinite loop
1911 StackFrame frame = main.GetFrames ()[0];
1912 Assert.AreEqual ("suspend", frame.Method.Name);
1916 // resuming when not suspended
1917 AssertThrows<InvalidOperationException> (delegate () {
1927 public void AssemblyLoad () {
1928 Event e = run_until ("assembly_load");
1930 var load_req = vm.CreateAssemblyLoadRequest ();
1935 e = GetNextEvent ();
1936 Assert.IsInstanceOfType (typeof (AssemblyLoadEvent), e);
1937 Assert.IsTrue ((e as AssemblyLoadEvent).Assembly.Location.EndsWith ("System.dll"));
1939 var frames = e.Thread.GetFrames ();
1940 Assert.IsTrue (frames.Length > 0);
1941 Assert.AreEqual ("assembly_load", frames [0].Method.Name);
1945 public void CreateValue () {
1948 v = vm.CreateValue (1);
1949 Assert.AreEqual (vm, v.VirtualMachine);
1950 Assert.AreEqual (1, v.Value);
1952 v = vm.CreateValue (null);
1953 Assert.AreEqual (vm, v.VirtualMachine);
1954 Assert.AreEqual (null, v.Value);
1956 // Argument checking
1957 AssertThrows <ArgumentException> (delegate () {
1958 v = vm.CreateValue ("FOO");
1963 public void CreateString () {
1964 StringMirror s = vm.RootDomain.CreateString ("ABC");
1966 Assert.AreEqual (vm, s.VirtualMachine);
1967 Assert.AreEqual ("ABC", s.Value);
1968 Assert.AreEqual (vm.RootDomain, s.Domain);
1971 StringBuilder sb = new StringBuilder ();
1972 for (int i = 0; i < 1024; ++i)
1974 s = vm.RootDomain.CreateString (sb.ToString ());
1976 // Argument checking
1977 AssertThrows <ArgumentNullException> (delegate () {
1978 s = vm.RootDomain.CreateString (null);
1983 public void CreateBoxedValue () {
1984 ObjectMirror o = vm.RootDomain.CreateBoxedValue (new PrimitiveValue (vm, 42));
1986 Assert.AreEqual ("Int32", o.Type.Name);
1987 //AssertValue (42, m.GetValue (o.Type.GetField ("m_value")));
1989 // Argument checking
1990 AssertThrows <ArgumentNullException> (delegate () {
1991 vm.RootDomain.CreateBoxedValue (null);
1994 AssertThrows <ArgumentException> (delegate () {
1995 vm.RootDomain.CreateBoxedValue (o);
2000 public void Invoke () {
2001 Event e = run_until ("invoke1");
2003 StackFrame frame = e.Thread.GetFrames () [0];
2005 TypeMirror t = frame.Method.DeclaringType;
2006 ObjectMirror this_obj = (ObjectMirror)frame.GetThis ();
2008 TypeMirror t2 = frame.Method.GetParameters ()[0].ParameterType;
2014 m = t.GetMethod ("invoke_return_void");
2015 v = this_obj.InvokeMethod (e.Thread, m, null);
2019 m = t.GetMethod ("invoke_return_ref");
2020 v = this_obj.InvokeMethod (e.Thread, m, null);
2021 AssertValue ("ABC", v);
2024 m = t.GetMethod ("invoke_return_null");
2025 v = this_obj.InvokeMethod (e.Thread, m, null);
2026 AssertValue (null, v);
2029 m = t.GetMethod ("invoke_return_primitive");
2030 v = this_obj.InvokeMethod (e.Thread, m, null);
2031 AssertValue (42, v);
2034 m = t.GetMethod ("invoke_return_nullable");
2035 v = this_obj.InvokeMethod (e.Thread, m, null);
2036 Assert.IsInstanceOfType (typeof (StructMirror), v);
2037 var s = v as StructMirror;
2038 AssertValue (42, s.Fields [0]);
2039 AssertValue (true, s.Fields [1]);
2041 // pass nullable as this
2042 //m = vm.RootDomain.Corlib.GetType ("System.Object").GetMethod ("ToString");
2043 m = s.Type.GetMethod ("ToString");
2044 v = s.InvokeMethod (e.Thread, m, null);
2046 // return nullable null
2047 m = t.GetMethod ("invoke_return_nullable_null");
2048 v = this_obj.InvokeMethod (e.Thread, m, null);
2049 Assert.IsInstanceOfType (typeof (StructMirror), v);
2050 s = v as StructMirror;
2051 AssertValue (0, s.Fields [0]);
2052 AssertValue (false, s.Fields [1]);
2054 // pass nullable as this
2055 //m = vm.RootDomain.Corlib.GetType ("System.Object").GetMethod ("ToString");
2056 m = s.Type.GetMethod ("ToString");
2057 v = s.InvokeMethod (e.Thread, m, null);
2060 m = t.GetMethod ("invoke_pass_primitive");
2061 Value[] args = new Value [] {
2062 vm.CreateValue ((byte)Byte.MaxValue),
2063 vm.CreateValue ((sbyte)SByte.MaxValue),
2064 vm.CreateValue ((short)1),
2065 vm.CreateValue ((ushort)1),
2066 vm.CreateValue ((int)1),
2067 vm.CreateValue ((uint)1),
2068 vm.CreateValue ((long)1),
2069 vm.CreateValue ((ulong)1),
2070 vm.CreateValue ('A'),
2071 vm.CreateValue (true),
2072 vm.CreateValue (3.14f),
2073 vm.CreateValue (3.14) };
2075 v = this_obj.InvokeMethod (e.Thread, m, args);
2076 AssertValue ((int)Byte.MaxValue + (int)SByte.MaxValue + 1 + 1 + 1 + 1 + 1 + 1 + 'A' + 1 + 3 + 3, v);
2079 m = t.GetMethod ("invoke_pass_ref");
2080 v = this_obj.InvokeMethod (e.Thread, m, new Value [] { vm.RootDomain.CreateString ("ABC") });
2081 AssertValue ("ABC", v);
2084 m = t.GetMethod ("invoke_pass_ref");
2085 v = this_obj.InvokeMethod (e.Thread, m, new Value [] { vm.CreateValue (null) });
2086 AssertValue (null, v);
2089 m = t.GetMethod ("invoke_static_pass_ref");
2090 v = t.InvokeMethod (e.Thread, m, new Value [] { vm.RootDomain.CreateString ("ABC") });
2091 AssertValue ("ABC", v);
2093 // static invoked using ObjectMirror.InvokeMethod
2094 m = t.GetMethod ("invoke_static_pass_ref");
2095 v = this_obj.InvokeMethod (e.Thread, m, new Value [] { vm.RootDomain.CreateString ("ABC") });
2096 AssertValue ("ABC", v);
2098 // method which throws an exception
2100 m = t.GetMethod ("invoke_throws");
2101 v = this_obj.InvokeMethod (e.Thread, m, null);
2103 } catch (InvocationException ex) {
2104 Assert.AreEqual ("Exception", ex.Exception.Type.Name);
2108 m = t.GetMethod (".ctor");
2109 v = t.InvokeMethod (e.Thread, m, null);
2110 Assert.IsInstanceOfType (typeof (ObjectMirror), v);
2111 Assert.AreEqual ("Tests", (v as ObjectMirror).Type.Name);
2114 var cl1 = frame.Method.DeclaringType.Assembly.GetType ("ITest2");
2115 m = cl1.GetMethod ("invoke_iface");
2116 v = this_obj.InvokeMethod (e.Thread, m, null);
2117 AssertValue (42, v);
2121 m = t.GetMethod ("invoke_pass_ref");
2122 var task = this_obj.InvokeMethodAsync (e.Thread, m, new Value [] { vm.RootDomain.CreateString ("ABC") });
2123 AssertValue ("ABC", task.Result);
2126 m = t.GetMethod ("invoke_static_pass_ref");
2127 task = t.InvokeMethodAsync (e.Thread, m, new Value [] { vm.RootDomain.CreateString ("ABC") });
2128 AssertValue ("ABC", task.Result);
2131 // Argument checking
2134 AssertThrows<ArgumentNullException> (delegate {
2135 m = t.GetMethod ("invoke_pass_ref");
2136 v = this_obj.InvokeMethod (null, m, new Value [] { vm.CreateValue (null) });
2140 AssertThrows<ArgumentNullException> (delegate {
2141 v = this_obj.InvokeMethod (e.Thread, null, new Value [] { vm.CreateValue (null) });
2144 // invalid number of arguments
2145 m = t.GetMethod ("invoke_pass_ref");
2146 AssertThrows<ArgumentException> (delegate {
2147 v = this_obj.InvokeMethod (e.Thread, m, null);
2150 // invalid type of argument (ref != primitive)
2151 m = t.GetMethod ("invoke_pass_ref");
2152 AssertThrows<ArgumentException> (delegate {
2153 v = this_obj.InvokeMethod (e.Thread, m, new Value [] { vm.CreateValue (1) });
2156 // invalid type of argument (primitive != primitive)
2157 m = t.GetMethod ("invoke_pass_primitive_2");
2158 AssertThrows<ArgumentException> (delegate {
2159 v = this_obj.InvokeMethod (e.Thread, m, new Value [] { vm.CreateValue (1) });
2162 // invoking a non-static method as static
2163 m = t.GetMethod ("invoke_pass_ref");
2164 AssertThrows<ArgumentException> (delegate {
2165 v = t.InvokeMethod (e.Thread, m, new Value [] { vm.RootDomain.CreateString ("ABC") });
2168 // invoking a method defined in another class
2169 m = t2.GetMethod ("invoke");
2170 AssertThrows<ArgumentException> (delegate {
2171 v = this_obj.InvokeMethod (e.Thread, m, null);
2176 public void InvokeVType () {
2177 Event e = run_until ("invoke1");
2179 StackFrame frame = e.Thread.GetFrames () [0];
2181 var s = frame.GetArgument (1) as StructMirror;
2183 TypeMirror t = s.Type;
2188 // Pass struct as this, receive int
2189 m = t.GetMethod ("invoke_return_int");
2190 v = s.InvokeMethod (e.Thread, m, null);
2191 AssertValue (42, v);
2193 // Pass struct as this, receive intptr
2194 m = t.GetMethod ("invoke_return_intptr");
2195 v = s.InvokeMethod (e.Thread, m, null);
2196 AssertValue (43, v);
2199 m = t.GetMethod ("invoke_static");
2200 v = t.InvokeMethod (e.Thread, m, null);
2203 // Pass generic struct as this
2204 s = frame.GetArgument (2) as StructMirror;
2206 m = t.GetMethod ("invoke_return_int");
2207 v = s.InvokeMethod (e.Thread, m, null);
2208 AssertValue (42, v);
2212 public void BreakpointDuringInvoke () {
2213 Event e = run_until ("invoke1");
2215 MethodMirror m = entry_point.DeclaringType.GetMethod ("invoke2");
2216 Assert.IsNotNull (m);
2217 vm.SetBreakpoint (m, 0);
2219 StackFrame frame = e.Thread.GetFrames () [0];
2220 var o = frame.GetThis () as ObjectMirror;
2222 bool failed = false;
2224 bool finished = false;
2225 object wait = new object ();
2227 // Have to invoke in a separate thread as the invoke is suspended until we
2228 // resume after the breakpoint
2229 Thread t = new Thread (delegate () {
2231 o.InvokeMethod (e.Thread, m, null);
2237 Monitor.Pulse (wait);
2243 StackFrame invoke_frame = null;
2246 e = GetNextEvent ();
2247 Assert.IsInstanceOfType (typeof (BreakpointEvent), e);
2248 // Check stack trace support and invokes
2249 var frames = e.Thread.GetFrames ();
2250 invoke_frame = frames [0];
2251 Assert.AreEqual ("invoke2", frames [0].Method.Name);
2252 Assert.IsTrue (frames [0].IsDebuggerInvoke);
2253 Assert.AreEqual ("invoke1", frames [1].Method.Name);
2260 Monitor.Wait (wait);
2263 // Check that the invoke frames are no longer valid
2264 AssertThrows<InvalidStackFrameException> (delegate {
2265 invoke_frame.GetThis ();
2268 // Check InvokeOptions.DisableBreakpoints flag
2269 o.InvokeMethod (e.Thread, m, null, InvokeOptions.DisableBreakpoints);
2273 public void DisabledExceptionDuringInvoke () {
2274 Event e = run_until ("invoke_ex");
2276 MethodMirror m = entry_point.DeclaringType.GetMethod ("invoke_ex_inner");
2278 StackFrame frame = e.Thread.GetFrames () [0];
2279 var o = frame.GetThis () as ObjectMirror;
2281 var req = vm.CreateExceptionRequest (null);
2284 // Check InvokeOptions.DisableBreakpoints flag
2285 o.InvokeMethod (e.Thread, m, null, InvokeOptions.DisableBreakpoints);
2291 public void InvokeSingleThreaded () {
2294 Start (new string [] { "dtest-app.exe", "invoke-single-threaded" });
2296 Event e = run_until ("invoke_single_threaded_2");
2298 StackFrame f = e.Thread.GetFrames ()[0];
2300 var obj = f.GetThis () as ObjectMirror;
2302 // Check that the counter value incremented by the other thread does not increase
2303 // during the invoke.
2304 object counter1 = (obj.GetValue (obj.Type.GetField ("counter")) as PrimitiveValue).Value;
2306 var m = obj.Type.GetMethod ("invoke_return_void");
2307 obj.InvokeMethod (e.Thread, m, null, InvokeOptions.SingleThreaded);
2309 object counter2 = (obj.GetValue (obj.Type.GetField ("counter")) as PrimitiveValue).Value;
2311 Assert.AreEqual ((int)counter1, (int)counter2);
2313 // Test multiple invokes done in succession
2314 m = obj.Type.GetMethod ("invoke_return_void");
2315 obj.InvokeMethod (e.Thread, m, null, InvokeOptions.SingleThreaded);
2317 // Test events during single-threaded invokes
2318 vm.EnableEvents (EventType.TypeLoad);
2319 m = obj.Type.GetMethod ("invoke_type_load");
2320 obj.BeginInvokeMethod (e.Thread, m, null, InvokeOptions.SingleThreaded, delegate {
2324 e = GetNextEvent ();
2325 Assert.AreEqual (EventType.TypeLoad, e.EventType);
2328 List<Value> invoke_results;
2331 public void InvokeMultiple () {
2332 Event e = run_until ("invoke1");
2334 StackFrame frame = e.Thread.GetFrames () [0];
2336 TypeMirror t = frame.Method.DeclaringType;
2337 ObjectMirror this_obj = (ObjectMirror)frame.GetThis ();
2339 TypeMirror t2 = frame.Method.GetParameters ()[0].ParameterType;
2341 var methods = new MethodMirror [2];
2342 methods [0] = t.GetMethod ("invoke_return_ref");
2343 methods [1] = t.GetMethod ("invoke_return_primitive");
2345 invoke_results = new List<Value> ();
2347 var r = this_obj.BeginInvokeMultiple (e.Thread, methods, null, InvokeOptions.SingleThreaded, invoke_multiple_cb, this_obj);
2348 WaitHandle.WaitAll (new WaitHandle[] { r.AsyncWaitHandle });
2349 this_obj.EndInvokeMultiple (r);
2350 // The callback might still be running
2351 while (invoke_results.Count < 2) {
2354 if (invoke_results [0] is PrimitiveValue) {
2355 AssertValue ("ABC", invoke_results [1]);
2356 AssertValue (42, invoke_results [0]);
2358 AssertValue ("ABC", invoke_results [0]);
2359 AssertValue (42, invoke_results [1]);
2363 void invoke_multiple_cb (IAsyncResult ar) {
2364 ObjectMirror this_obj = (ObjectMirror)ar.AsyncState;
2366 var res = this_obj.EndInvokeMethod (ar);
2367 lock (invoke_results)
2368 invoke_results.Add (res);
2372 public void GetThreads () {
2377 public void Threads () {
2378 Event e = run_until ("threads");
2380 Assert.AreEqual (ThreadState.Running, e.Thread.ThreadState);
2382 Assert.IsTrue (e.Thread.ThreadId > 0);
2384 Assert.AreEqual (e.Thread.TID, e.Thread.TID);
2386 vm.EnableEvents (EventType.ThreadStart, EventType.ThreadDeath);
2390 e = GetNextEvent ();
2391 Assert.IsInstanceOfType (typeof (ThreadStartEvent), e);
2392 var state = e.Thread.ThreadState;
2393 Assert.IsTrue (state == ThreadState.Running || state == ThreadState.Unstarted);
2397 e = GetNextEvent ();
2398 Assert.IsInstanceOfType (typeof (ThreadDeathEvent), e);
2399 Assert.AreEqual (ThreadState.Stopped, e.Thread.ThreadState);
2403 public void Frame_SetValue () {
2404 Event e = run_until ("locals2");
2406 StackFrame frame = e.Thread.GetFrames () [0];
2409 var l = frame.Method.GetLocal ("i");
2410 frame.SetValue (l, vm.CreateValue ((long)55));
2411 AssertValue (55, frame.GetValue (l));
2414 l = frame.Method.GetLocal ("s");
2415 frame.SetValue (l, vm.RootDomain.CreateString ("DEF"));
2416 AssertValue ("DEF", frame.GetValue (l));
2418 // argument as local
2419 l = frame.Method.GetLocal ("arg");
2420 frame.SetValue (l, vm.CreateValue (6));
2421 AssertValue (6, frame.GetValue (l));
2424 var p = frame.Method.GetParameters ()[1];
2425 frame.SetValue (p, vm.CreateValue (7));
2426 AssertValue (7, frame.GetValue (p));
2429 p = frame.Method.GetParameters ()[2];
2430 frame.SetValue (p, vm.RootDomain.CreateString ("DEF"));
2431 AssertValue ("DEF", frame.GetValue (p));
2434 p = frame.Method.GetParameters ()[3];
2435 frame.SetValue (p, vm.RootDomain.CreateString ("DEF2"));
2436 AssertValue ("DEF2", frame.GetValue (p));
2439 p = frame.Method.GetParameters ()[4];
2440 var v = frame.GetValue (p) as StructMirror;
2441 v ["i"] = vm.CreateValue (43);
2442 frame.SetValue (p, v);
2443 v = frame.GetValue (p) as StructMirror;
2444 AssertValue (43, v ["i"]);
2446 // argument checking
2449 AssertThrows<ArgumentNullException> (delegate () {
2450 frame.SetValue ((LocalVariable)null, vm.CreateValue (55));
2454 AssertThrows<ArgumentNullException> (delegate () {
2455 l = frame.Method.GetLocal ("i");
2456 frame.SetValue (l, null);
2459 // value of invalid type
2460 AssertThrows<ArgumentException> (delegate () {
2461 l = frame.Method.GetLocal ("i");
2462 frame.SetValue (l, vm.CreateValue (55));
2468 public void Frame_SetValue_Registers () {
2469 Event e = run_until ("locals6_1");
2471 StackFrame frame = e.Thread.GetFrames () [1];
2474 var l = frame.Method.GetLocal ("j");
2475 frame.SetValue (l, vm.CreateValue (99));
2476 AssertValue (99, frame.GetValue (l));
2478 // Check it during execution
2479 e = run_until ("locals6_2");
2480 frame = e.Thread.GetFrames () [0];
2481 AssertValue (99, frame.GetValue (frame.Method.GetParameters ()[0]));
2483 // Set it while in a frame which clobbers its register
2484 e = run_until ("locals6_3");
2485 frame = e.Thread.GetFrames () [1];
2486 frame.SetValue (l, vm.CreateValue (100));
2487 AssertValue (100, frame.GetValue (l));
2489 // Check it during execution
2490 e = run_until ("locals6_4");
2491 frame = e.Thread.GetFrames () [0];
2492 AssertValue (100, frame.GetValue (frame.Method.GetParameters ()[0]));
2494 // Signed byte value
2495 e = run_until ("locals6_5");
2496 frame = e.Thread.GetFrames () [1];
2497 var l2 = frame.Method.GetLocal ("sb");
2498 frame.SetValue (l2, vm.CreateValue ((sbyte)-99));
2499 AssertValue (-99, frame.GetValue (l2));
2501 // Check it during execution
2502 e = run_until ("locals6_6");
2503 frame = e.Thread.GetFrames () [0];
2504 AssertValue (-99, frame.GetValue (frame.Method.GetParameters ()[0]));
2508 public void InvokeRegress () {
2509 Event e = run_until ("invoke1");
2511 StackFrame frame = e.Thread.GetFrames () [0];
2513 TypeMirror t = frame.Method.DeclaringType;
2514 ObjectMirror this_obj = (ObjectMirror)frame.GetThis ();
2516 TypeMirror t2 = frame.Method.GetParameters ()[0].ParameterType;
2522 m = t.GetMethod ("invoke_return_void");
2523 v = this_obj.InvokeMethod (e.Thread, m, null);
2526 // Check that the stack frames remain valid during the invoke
2527 Assert.AreEqual ("Tests", (frame.GetThis () as ObjectMirror).Type.Name);
2529 // do another invoke
2530 m = t.GetMethod ("invoke_return_void");
2531 v = this_obj.InvokeMethod (e.Thread, m, null);
2534 // Try a single step after the invoke
2535 var req = create_step (e);
2536 req.Depth = StepDepth.Into;
2537 req.Size = StepSize.Line;
2543 // Step into invoke2
2545 e = GetNextEvent ();
2546 Assert.IsTrue (e is StepEvent);
2547 Assert.AreEqual ("invoke2", (e as StepEvent).Method.Name);
2551 frame = e.Thread.GetFrames () [0];
2555 public void Exceptions () {
2556 Event e = run_until ("exceptions");
2557 var req = vm.CreateExceptionRequest (null);
2562 e = GetNextEvent ();
2563 Assert.IsInstanceOfType (typeof (ExceptionEvent), e);
2564 Assert.AreEqual ("OverflowException", (e as ExceptionEvent).Exception.Type.Name);
2566 var frames = e.Thread.GetFrames ();
2567 Assert.AreEqual ("exceptions", frames [0].Method.Name);
2570 // exception type filter
2572 req = vm.CreateExceptionRequest (vm.RootDomain.Corlib.GetType ("System.ArgumentException"));
2575 // Skip the throwing of the second OverflowException
2578 e = GetNextEvent ();
2579 Assert.IsInstanceOfType (typeof (ExceptionEvent), e);
2580 Assert.AreEqual ("ArgumentException", (e as ExceptionEvent).Exception.Type.Name);
2583 // exception type filter for subclasses
2584 req = vm.CreateExceptionRequest (vm.RootDomain.Corlib.GetType ("System.Exception"));
2589 e = GetNextEvent ();
2590 Assert.IsInstanceOfType (typeof (ExceptionEvent), e);
2591 Assert.AreEqual ("OverflowException", (e as ExceptionEvent).Exception.Type.Name);
2595 req.IncludeSubclasses = false;
2600 e = GetNextEvent ();
2601 Assert.IsInstanceOfType (typeof (ExceptionEvent), e);
2602 Assert.AreEqual ("Exception", (e as ExceptionEvent).Exception.Type.Name);
2605 // Implicit exceptions
2606 req = vm.CreateExceptionRequest (null);
2611 e = GetNextEvent ();
2612 Assert.IsInstanceOfType (typeof (ExceptionEvent), e);
2613 Assert.AreEqual ("NullReferenceException", (e as ExceptionEvent).Exception.Type.Name);
2616 // Single stepping after an exception
2617 req = vm.CreateExceptionRequest (null);
2622 e = GetNextEvent ();
2623 Assert.IsInstanceOfType (typeof (ExceptionEvent), e);
2624 Assert.AreEqual ("Exception", (e as ExceptionEvent).Exception.Type.Name);
2625 frames = e.Thread.GetFrames ();
2626 Assert.AreEqual ("exceptions2", frames [0].Method.Name);
2629 var sreq = create_step (e);
2630 sreq.Depth = StepDepth.Over;
2631 sreq.Size = StepSize.Line;
2635 e = GetNextEvent ();
2636 Assert.IsInstanceOfType (typeof (StepEvent), e);
2637 frames = e.Thread.GetFrames ();
2638 Assert.AreEqual ("exceptions", frames [0].Method.Name);
2641 // Argument checking
2642 AssertThrows<ArgumentException> (delegate {
2643 vm.CreateExceptionRequest (e.Thread.Type);
2648 public void ExceptionFilter () {
2649 Event e = run_until ("exception_filter");
2651 MethodMirror m = entry_point.DeclaringType.GetMethod ("exception_filter_filter");
2652 Assert.IsNotNull (m);
2654 vm.SetBreakpoint (m, 0);
2658 e = GetNextEvent ();
2659 Assert.AreEqual (EventType.Breakpoint, e.EventType);
2660 Assert.IsTrue (e is BreakpointEvent);
2661 Assert.AreEqual (m.Name, (e as BreakpointEvent).Method.Name);
2663 var frames = e.Thread.GetFrames ();
2665 Assert.IsTrue (frames [0].Location.SourceFile.IndexOf ("dtest-app.cs") != -1);
2666 Assert.AreEqual ("exception_filter_filter", frames [0].Location.Method.Name);
2668 Assert.AreEqual (0, frames [1].Location.Method.MetadataToken);
2669 Assert.AreEqual (0x0f, frames [1].Location.ILOffset);
2671 Assert.AreEqual ("exception_filter_method", frames [2].Location.Method.Name);
2672 Assert.AreEqual (0x06, frames [2].Location.ILOffset);
2674 Assert.AreEqual (0, frames [3].Location.Method.MetadataToken, 0);
2675 Assert.AreEqual (0, frames [3].Location.ILOffset);
2677 Assert.AreEqual ("exception_filter", frames [4].Location.Method.Name);
2681 public void ExceptionFilter2 () {
2684 Start (new string [] { "dtest-excfilter.exe" });
2686 MethodMirror filter_method = entry_point.DeclaringType.GetMethod ("Filter");
2687 Assert.IsNotNull (filter_method);
2689 MethodMirror test_method = entry_point.DeclaringType.GetMethod ("Test");
2690 Assert.IsNotNull (test_method);
2692 vm.SetBreakpoint (filter_method, 0);
2696 var e = GetNextEvent ();
2697 Assert.AreEqual (EventType.Breakpoint, e.EventType);
2698 Assert.IsTrue (e is BreakpointEvent);
2699 Assert.AreEqual (filter_method.Name, (e as BreakpointEvent).Method.Name);
2701 var frames = e.Thread.GetFrames ();
2703 Assert.AreEqual (4, frames.Count ());
2705 Assert.AreEqual (filter_method.Name, frames [0].Location.Method.Name);
2706 Assert.AreEqual (20, frames [0].Location.LineNumber);
2707 Assert.AreEqual (0, frames [0].Location.ILOffset);
2709 Assert.AreEqual (test_method.Name, frames [1].Location.Method.Name);
2710 Assert.AreEqual (37, frames [1].Location.LineNumber);
2711 Assert.AreEqual (0x0b, frames [1].Location.ILOffset);
2713 Assert.AreEqual (test_method.Name, frames [2].Location.Method.Name);
2714 Assert.AreEqual (33, frames [2].Location.LineNumber);
2715 Assert.AreEqual (0x05, frames [2].Location.ILOffset);
2717 Assert.AreEqual (entry_point.Name, frames [3].Location.Method.Name);
2718 Assert.AreEqual (14, frames [3].Location.LineNumber);
2719 Assert.AreEqual (0x00, frames [3].Location.ILOffset);
2727 public void EventSets () {
2729 // Create two filter which both match the same exception
2731 Event e = run_until ("exceptions");
2733 var req = vm.CreateExceptionRequest (null);
2736 var req2 = vm.CreateExceptionRequest (vm.RootDomain.Corlib.GetType ("System.OverflowException"));
2741 var es = vm.GetNextEventSet ();
2742 Assert.AreEqual (2, es.Events.Length);
2745 Assert.IsInstanceOfType (typeof (ExceptionEvent), e);
2746 Assert.AreEqual ("OverflowException", (e as ExceptionEvent).Exception.Type.Name);
2749 Assert.IsInstanceOfType (typeof (ExceptionEvent), e);
2750 Assert.AreEqual ("OverflowException", (e as ExceptionEvent).Exception.Type.Name);
2757 // Test single threaded invokes during processing of nullref exceptions.
2758 // These won't work if the exception handling is done from the sigsegv signal
2759 // handler, since the sigsegv signal is disabled until control returns from the
2763 [Category ("only3")]
2764 public void NullRefExceptionAndSingleThreadedInvoke () {
2765 Event e = run_until ("exceptions");
2766 var req = vm.CreateExceptionRequest (vm.RootDomain.Corlib.GetType ("System.NullReferenceException"));
2771 e = GetNextEvent ();
2772 Assert.IsInstanceOfType (typeof (ExceptionEvent), e);
2773 Assert.AreEqual ("NullReferenceException", (e as ExceptionEvent).Exception.Type.Name);
2775 var ex = (e as ExceptionEvent).Exception;
2776 var tostring_method = vm.RootDomain.Corlib.GetType ("System.Object").GetMethod ("ToString");
2777 ex.InvokeMethod (e.Thread, tostring_method, null, InvokeOptions.SingleThreaded);
2781 public void Domains () {
2784 Start (new string [] { "dtest-app.exe", "domain-test" });
2786 vm.EnableEvents (EventType.AppDomainCreate, EventType.AppDomainUnload, EventType.AssemblyUnload);
2788 Event e = run_until ("domains");
2792 e = GetNextEvent ();
2793 Assert.IsInstanceOfType (typeof (AppDomainCreateEvent), e);
2795 var domain = (e as AppDomainCreateEvent).Domain;
2797 // Check the object type
2798 e = run_until ("domains_2");
2799 var frame = e.Thread.GetFrames ()[0];
2800 var o = frame.GetArgument (0) as ObjectMirror;
2801 Assert.AreEqual ("CrossDomain", o.Type.Name);
2803 // Do a remoting invoke
2804 var cross_domain_type = o.Type;
2805 var v = o.InvokeMethod (e.Thread, cross_domain_type.GetMethod ("invoke_3"), null);
2806 AssertValue (42, v);
2808 // Run until the callback in the domain
2809 MethodMirror m = entry_point.DeclaringType.GetMethod ("invoke_in_domain");
2810 Assert.IsNotNull (m);
2811 vm.SetBreakpoint (m, 0);
2815 e = GetNextEvent ();
2816 if (e is BreakpointEvent)
2820 Assert.AreEqual ("invoke_in_domain", (e as BreakpointEvent).Method.Name);
2822 // d_method is from another domain
2823 MethodMirror d_method = (e as BreakpointEvent).Method;
2824 Assert.IsTrue (m != d_method);
2826 var frames = e.Thread.GetFrames ();
2827 Assert.AreEqual ("invoke_in_domain", frames [0].Method.Name);
2828 Assert.AreEqual ("invoke", frames [1].Method.Name);
2829 Assert.AreEqual ("domains", frames [2].Method.Name);
2831 // Test breakpoints on already JITted methods in other domains
2832 m = entry_point.DeclaringType.GetMethod ("invoke_in_domain_2");
2833 Assert.IsNotNull (m);
2834 vm.SetBreakpoint (m, 0);
2838 e = GetNextEvent ();
2839 if (e is BreakpointEvent)
2843 Assert.AreEqual ("invoke_in_domain_2", (e as BreakpointEvent).Method.Name);
2845 // This is empty when receiving the AppDomainCreateEvent
2846 Assert.AreEqual ("domain", domain.FriendlyName);
2848 // Run until the unload
2851 e = GetNextEvent ();
2852 if (e is AssemblyUnloadEvent) {
2858 Assert.IsInstanceOfType (typeof (AppDomainUnloadEvent), e);
2859 Assert.AreEqual (domain, (e as AppDomainUnloadEvent).Domain);
2861 // Run past the unload
2862 e = run_until ("domains_3");
2864 // Test access to unloaded types
2865 // FIXME: Add an exception type for this
2866 AssertThrows<Exception> (delegate {
2867 d_method.DeclaringType.GetValue (d_method.DeclaringType.GetField ("static_i"));
2872 public void DynamicMethods () {
2873 Event e = run_until ("dyn_call");
2875 var m = e.Thread.GetFrames ()[1].Method;
2876 Assert.AreEqual ("dyn_method", m.Name);
2878 // Test access to IL
2879 var body = m.GetMethodBody ();
2881 ILInstruction ins = body.Instructions [0];
2882 Assert.AreEqual (OpCodes.Ldstr, ins.OpCode);
2883 Assert.AreEqual ("FOO", ins.Operand);
2887 public void RefEmit () {
2890 Start (new string [] { "dtest-app.exe", "ref-emit-test" });
2892 Event e = run_until ("ref_emit_call");
2894 var m = e.Thread.GetFrames ()[1].Method;
2895 Assert.AreEqual ("ref_emit_method", m.Name);
2897 // Test access to IL
2898 var body = m.GetMethodBody ();
2902 ins = body.Instructions [0];
2903 Assert.AreEqual (OpCodes.Ldstr, ins.OpCode);
2904 Assert.AreEqual ("FOO", ins.Operand);
2906 ins = body.Instructions [1];
2907 Assert.AreEqual (OpCodes.Call, ins.OpCode);
2908 Assert.IsInstanceOfType (typeof (MethodMirror), ins.Operand);
2909 Assert.AreEqual ("ref_emit_call", (ins.Operand as MethodMirror).Name);
2913 public void IsAttached () {
2914 var f = entry_point.DeclaringType.GetField ("is_attached");
2916 Event e = run_until ("Main");
2918 AssertValue (true, entry_point.DeclaringType.GetValue (f));
2922 public void StackTraceInNative () {
2923 // Check that stack traces can be produced for threads in native code
2926 Start (new string [] { "dtest-app.exe", "frames-in-native" });
2928 var e = run_until ("frames_in_native");
2930 // FIXME: This is racy
2937 StackFrame[] frames = e.Thread.GetFrames ();
2939 int frame_index = -1;
2940 for (int i = 0; i < frames.Length; ++i) {
2941 if (frames [i].Method.Name == "Sleep") {
2947 Assert.IsTrue (frame_index != -1);
2948 Assert.AreEqual ("Sleep", frames [frame_index].Method.Name);
2949 Assert.AreEqual ("frames_in_native", frames [frame_index + 1].Method.Name);
2950 Assert.AreEqual ("Main", frames [frame_index + 2].Method.Name);
2952 // Check that invokes are disabled for such threads
2953 TypeMirror t = frames [frame_index + 1].Method.DeclaringType;
2955 var m = t.GetMethod ("invoke_static_return_void");
2956 AssertThrows<InvalidOperationException> (delegate {
2957 t.InvokeMethod (e.Thread, m, null);
2960 // Check that the frame info is invalidated
2961 run_until ("frames_in_native_2");
2963 AssertThrows<InvalidStackFrameException> (delegate {
2964 Console.WriteLine (frames [frame_index].GetThis ());
2969 public void VirtualMachine_CreateEnumMirror () {
2970 var e = run_until ("o1");
2971 var frame = e.Thread.GetFrames () [0];
2973 object val = frame.GetThis ();
2974 Assert.IsTrue (val is ObjectMirror);
2975 Assert.AreEqual ("Tests", (val as ObjectMirror).Type.Name);
2976 ObjectMirror o = (val as ObjectMirror);
2978 FieldInfoMirror field = o.Type.GetField ("field_enum");
2979 Value f = o.GetValue (field);
2980 TypeMirror enumType = (f as EnumMirror).Type;
2982 o.SetValue (field, vm.CreateEnumMirror (enumType, vm.CreateValue (1)));
2983 f = o.GetValue (field);
2984 Assert.AreEqual (1, (f as EnumMirror).Value);
2986 // Argument checking
2987 AssertThrows<ArgumentNullException> (delegate () {
2988 vm.CreateEnumMirror (enumType, null);
2991 AssertThrows<ArgumentNullException> (delegate () {
2992 vm.CreateEnumMirror (null, vm.CreateValue (1));
2996 AssertThrows<ArgumentException> (delegate () {
2997 vm.CreateEnumMirror (enumType, vm.CreateValue (null));
3000 // value of a wrong type
3001 AssertThrows<ArgumentException> (delegate () {
3002 vm.CreateEnumMirror (enumType, vm.CreateValue ((long)1));
3007 public void VirtualMachine_EnableEvents_Breakpoint () {
3008 AssertThrows<ArgumentException> (delegate () {
3009 vm.EnableEvents (EventType.Breakpoint);
3014 public void SingleStepRegress654694 () {
3017 MethodMirror m = entry_point.DeclaringType.GetMethod ("ss_regress_654694");
3018 foreach (Location l in m.Locations) {
3019 if (l.ILOffset > 0 && il_offset == -1)
3020 il_offset = l.ILOffset;
3023 Event e = run_until ("ss_regress_654694");
3025 Assert.IsNotNull (m);
3026 vm.SetBreakpoint (m, il_offset);
3030 e = GetNextEvent ();
3031 Assert.IsTrue (e is BreakpointEvent);
3033 var req = create_step (e);
3034 req.Depth = StepDepth.Over;
3035 req.Size = StepSize.Line;
3040 e = GetNextEvent ();
3041 Assert.IsTrue (e is StepEvent);
3047 public void DebugBreak () {
3048 vm.EnableEvents (EventType.UserBreak);
3053 var e = GetNextEvent ();
3054 Assert.IsTrue (e is UserBreakEvent);
3058 public void DebugLog () {
3059 vm.EnableEvents (EventType.UserLog);
3064 var e = GetNextEvent ();
3065 Assert.IsTrue (e is UserLogEvent);
3066 var le = e as UserLogEvent;
3068 Assert.AreEqual (5, le.Level);
3069 Assert.AreEqual ("A", le.Category);
3070 Assert.AreEqual ("B", le.Message);
3074 public void TypeGetMethodsByNameFlags () {
3076 var assembly = entry_point.DeclaringType.Assembly;
3077 var type = assembly.GetType ("Tests3");
3079 Assert.IsNotNull (type);
3081 mm = type.GetMethodsByNameFlags (null, BindingFlags.Static | BindingFlags.Public, false);
3082 Assert.AreEqual (1, mm.Length, "#1");
3083 Assert.AreEqual ("M1", mm[0].Name, "#2");
3085 mm = type.GetMethodsByNameFlags (null, BindingFlags.Static | BindingFlags.NonPublic, false);
3086 Assert.AreEqual (1, mm.Length, "#3");
3087 Assert.AreEqual ("M2", mm[0].Name, "#4");
3089 mm = type.GetMethodsByNameFlags (null, BindingFlags.Instance | BindingFlags.Public, false);
3090 Assert.AreEqual (7, mm.Length, "#5"); //M3 plus Equals, GetHashCode, GetType, ToString, .ctor
3092 mm = type.GetMethodsByNameFlags (null, BindingFlags.Instance | BindingFlags.Public | BindingFlags.DeclaredOnly, false);
3093 Assert.AreEqual (2, mm.Length, "#7");
3095 mm = type.GetMethodsByNameFlags (null, BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.DeclaredOnly, false);
3096 Assert.AreEqual (1, mm.Length, "#9");
3098 mm = type.GetMethodsByNameFlags (null, BindingFlags.Static | BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.DeclaredOnly, false);
3099 Assert.AreEqual (5, mm.Length, "#11");
3102 mm = type.GetMethodsByNameFlags ("M1", BindingFlags.Static | BindingFlags.Public, false);
3103 Assert.AreEqual (1, mm.Length, "#12");
3104 Assert.AreEqual ("M1", mm[0].Name, "#13");
3106 mm = type.GetMethodsByNameFlags ("m1", BindingFlags.Static | BindingFlags.Public, true);
3107 Assert.AreEqual (1, mm.Length, "#14");
3108 Assert.AreEqual ("M1", mm[0].Name, "#15");
3110 mm = type.GetMethodsByNameFlags ("M1", BindingFlags.Static | BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, false);
3111 Assert.AreEqual (1, mm.Length, "#16");
3112 Assert.AreEqual ("M1", mm[0].Name, "#17");
3116 [Category ("only88")]
3117 public void TypeLoadSourceFileFilter () {
3118 Event e = run_until ("type_load");
3120 if (!vm.Version.AtLeast (2, 7))
3123 string srcfile = (e as BreakpointEvent).Method.DeclaringType.GetSourceFiles (true)[0];
3125 var req = vm.CreateTypeLoadRequest ();
3126 req.SourceFileFilter = new string [] { srcfile.ToUpper () };
3130 e = GetNextEvent ();
3131 Assert.IsTrue (e is TypeLoadEvent);
3132 Assert.AreEqual ("TypeLoadClass", (e as TypeLoadEvent).Type.FullName);
3136 public void TypeLoadTypeNameFilter () {
3137 Event e = run_until ("type_load");
3139 var req = vm.CreateTypeLoadRequest ();
3140 req.TypeNameFilter = new string [] { "TypeLoadClass2" };
3144 e = GetNextEvent ();
3145 Assert.IsTrue (e is TypeLoadEvent);
3146 Assert.AreEqual ("TypeLoadClass2", (e as TypeLoadEvent).Type.FullName);
3150 public void GetTypesForSourceFile () {
3153 var types = vm.GetTypesForSourceFile ("dtest-app.cs", false);
3154 Assert.IsTrue (types.Any (t => t.FullName == "Tests"));
3155 Assert.IsFalse (types.Any (t => t.FullName == "System.Int32"));
3157 types = vm.GetTypesForSourceFile ("DTEST-app.cs", true);
3158 Assert.IsTrue (types.Any (t => t.FullName == "Tests"));
3159 Assert.IsFalse (types.Any (t => t.FullName == "System.Int32"));
3163 public void GetTypesNamed () {
3166 var types = vm.GetTypes ("Tests", false);
3167 Assert.AreEqual (1, types.Count);
3168 Assert.AreEqual ("Tests", types [0].FullName);
3170 types = vm.GetTypes ("System.Exception", false);
3171 Assert.AreEqual (1, types.Count);
3172 Assert.AreEqual ("System.Exception", types [0].FullName);
3176 public void String_GetChars () {
3180 var e = run_until ("arg2");
3182 var frame = e.Thread.GetFrames () [0];
3184 val = frame.GetArgument (0);
3185 Assert.IsTrue (val is StringMirror);
3186 AssertValue ("FOO", val);
3187 var s = (val as StringMirror);
3188 Assert.AreEqual (3, s.Length);
3190 var c = s.GetChars (0, 2);
3191 Assert.AreEqual (2, c.Length);
3192 Assert.AreEqual ('F', c [0]);
3193 Assert.AreEqual ('O', c [1]);
3195 AssertThrows<ArgumentException> (delegate () {
3201 public void GetInterfaces () {
3202 var e = run_until ("arg2");
3204 var frame = e.Thread.GetFrames () [0];
3206 var cl1 = frame.Method.DeclaringType.Assembly.GetType ("TestIfaces");
3207 var ifaces = cl1.GetInterfaces ();
3208 Assert.AreEqual (1, ifaces.Length);
3209 Assert.AreEqual ("ITest", ifaces [0].Name);
3211 var cl2 = cl1.GetMethod ("Baz").ReturnType;
3212 var ifaces2 = cl2.GetInterfaces ();
3213 Assert.AreEqual (1, ifaces2.Length);
3214 Assert.AreEqual ("ITest`1", ifaces2 [0].Name);
3218 public void GetInterfaceMap () {
3219 var e = run_until ("arg2");
3221 var frame = e.Thread.GetFrames () [0];
3223 var cl1 = frame.Method.DeclaringType.Assembly.GetType ("TestIfaces");
3224 var iface = cl1.Assembly.GetType ("ITest");
3225 var map = cl1.GetInterfaceMap (iface);
3226 Assert.AreEqual (cl1, map.TargetType);
3227 Assert.AreEqual (iface, map.InterfaceType);
3228 Assert.AreEqual (2, map.InterfaceMethods.Length);
3229 Assert.AreEqual (2, map.TargetMethods.Length);
3233 public void StackAlloc_Breakpoints_Regress2775 () {
3234 // Check that breakpoints on arm don't overwrite stackalloc-ed memory
3235 var e = run_until ("regress_2755");
3237 var frame = e.Thread.GetFrames () [0];
3239 // This breaks at the call site
3240 vm.SetBreakpoint (m, m.Locations [2].ILOffset);
3243 var e2 = GetNextEvent ();
3244 Assert.IsTrue (e2 is BreakpointEvent);
3246 e = run_until ("regress_2755_3");
3247 frame = e.Thread.GetFrames () [1];
3248 var res = frame.GetValue (m.GetLocal ("sum"));
3249 AssertValue (0, res);
3253 public void MethodInfo () {
3254 Event e = run_until ("locals2");
3256 StackFrame frame = e.Thread.GetFrames () [0];
3257 var m = frame.Method;
3259 Assert.IsTrue (m.IsGenericMethod);
3260 Assert.IsFalse (m.IsGenericMethodDefinition);
3262 var args = m.GetGenericArguments ();
3263 Assert.AreEqual (1, args.Length);
3264 Assert.AreEqual ("String", args [0].Name);
3266 var gmd = m.GetGenericMethodDefinition ();
3267 Assert.IsTrue (gmd.IsGenericMethod);
3268 Assert.IsTrue (gmd.IsGenericMethodDefinition);
3269 Assert.AreEqual (gmd, gmd.GetGenericMethodDefinition ());
3271 args = gmd.GetGenericArguments ();
3272 Assert.AreEqual (1, args.Length);
3273 Assert.AreEqual ("T", args [0].Name);
3275 var attrs = m.GetCustomAttributes (true);
3276 Assert.AreEqual (1, attrs.Length);
3277 Assert.AreEqual ("StateMachineAttribute", attrs [0].Constructor.DeclaringType.Name);
3281 public void UnhandledException () {
3284 Start (new string [] { "dtest-app.exe", "unhandled-exception" });
3286 var req = vm.CreateExceptionRequest (null, false, true);
3289 var e = run_until ("unhandled_exception");
3292 var e2 = GetNextEvent ();
3293 Assert.IsTrue (e2 is ExceptionEvent);
3300 public void UnhandledException_2 () {
3303 Start (new string [] { "dtest-app.exe", "unhandled-exception-endinvoke" });
3305 var req = vm.CreateExceptionRequest (null, false, true);
3308 MethodMirror m = entry_point.DeclaringType.GetMethod ("unhandled_exception_endinvoke_2");
3309 Assert.IsNotNull (m);
3310 vm.SetBreakpoint (m, m.ILOffsets [0]);
3312 var e = run_until ("unhandled_exception_endinvoke");
3315 var e2 = GetNextEvent ();
3316 Assert.IsFalse (e2 is ExceptionEvent);
3324 public void UnhandledExceptionUserCode () {
3327 // Exceptions caught in non-user code are treated as unhandled
3328 Start (new string [] { "dtest-app.exe", "unhandled-exception-user" });
3330 var req = vm.CreateExceptionRequest (null, false, true);
3331 req.AssemblyFilter = new List<AssemblyMirror> () { entry_point.DeclaringType.Assembly };
3334 var e = run_until ("unhandled_exception_user");
3337 var e2 = GetNextEvent ();
3338 Assert.IsTrue (e2 is ExceptionEvent);
3346 public void GCWhileSuspended () {
3347 // Check that objects are kept alive during suspensions
3348 Event e = run_until ("gc_suspend_1");
3350 MethodMirror m = entry_point.DeclaringType.GetMethod ("gc_suspend_invoke");
3352 var o = entry_point.DeclaringType.GetValue (entry_point.DeclaringType.GetField ("gc_suspend_field")) as ObjectMirror;
3353 //Console.WriteLine (o);
3355 StackFrame frame = e.Thread.GetFrames () [0];
3356 TypeMirror t = frame.Method.DeclaringType;
3357 for (int i = 0; i < 10; ++i)
3358 t.InvokeMethod (e.Thread, m, new Value [] { });
3360 // This throws an exception if the object is collected
3361 long addr = o.Address;
3363 var o2 = entry_point.DeclaringType.GetValue (entry_point.DeclaringType.GetField ("gc_suspend_field")) as ObjectMirror;
3368 public void MakeGenericMethod () {
3369 Event e = run_until ("bp1");
3371 var intm = vm.RootDomain.GetCorrespondingType (typeof (int));
3372 var stringm = vm.RootDomain.GetCorrespondingType (typeof (string));
3373 var gm = entry_point.DeclaringType.GetMethod ("generic_method");
3374 var res = gm.MakeGenericMethod (new TypeMirror [] { stringm });
3375 var args = res.GetGenericArguments ();
3376 Assert.AreEqual (1, args.Length);
3377 Assert.AreEqual (stringm, args [0]);
3380 AssertThrows<ArgumentNullException> (delegate {
3381 gm.MakeGenericMethod (null);
3383 AssertThrows<ArgumentNullException> (delegate {
3384 gm.MakeGenericMethod (new TypeMirror [] { null });
3386 AssertThrows<ArgumentException> (delegate {
3387 gm.MakeGenericMethod (new TypeMirror [] { stringm, stringm });
3389 AssertThrows<InvalidOperationException> (delegate {
3390 gm.MakeGenericMethod (new TypeMirror [] { intm });
3392 AssertThrows<InvalidOperationException> (delegate {
3393 entry_point.DeclaringType.GetMethod ("Main").MakeGenericMethod (new TypeMirror [] { intm });
3398 public void InspectThreadSuspenedOnWaitOne () {
3400 Start (true, "dtest-app.exe", "wait-one" );
3402 ThreadMirror.NativeTransitions = true;
3404 var evt = run_until ("wait_one");
3405 Assert.IsNotNull (evt, "#1");
3407 var thread = evt.Thread;
3408 Assert.AreEqual (ThreadState.Running, thread.ThreadState, "#1.1");
3410 var frames = thread.GetFrames ();
3411 Assert.IsNotNull (frames, "#2");
3412 Assert.AreEqual (2, frames.Length, "#3");
3413 Assert.AreEqual ("wait_one", frames [0].Method.Name, "#4");
3414 Assert.AreEqual ("Main", frames [1].Method.Name, "#5");
3418 Thread.Sleep (500); //FIXME this is racy, maybe single step? or something?
3421 Assert.AreEqual (ThreadState.WaitSleepJoin, thread.ThreadState, "#6");
3423 frames = thread.GetFrames ();
3424 Assert.AreEqual (4, frames.Length, "#7");
3425 Assert.AreEqual ("WaitOne_internal", frames [0].Method.Name, "#8");
3426 Assert.AreEqual ("WaitOne", frames [1].Method.Name, "#8.1");
3427 Assert.AreEqual ("wait_one", frames [2].Method.Name, "#9");
3428 Assert.AreEqual ("Main", frames [3].Method.Name, "#10");
3431 var frame = frames [0];
3432 Assert.IsTrue (frame.IsNativeTransition, "#11.1");
3435 Assert.Fail ("Known limitation - can't get info from m2n frames");
3436 } catch (AbsentInformationException) {}
3439 Assert.IsFalse (frame.IsNativeTransition, "#12.1");
3440 var wait_one_this = frame.GetThis ();
3441 Assert.IsNotNull (wait_one_this, "#12.2");
3444 var locals = frame.GetVisibleVariables ();
3445 Assert.AreEqual (1, locals.Count, "#13.1");
3447 var local_0 = frame.GetValue (locals [0]);
3448 Assert.IsNotNull (local_0, "#13.2");
3450 Assert.AreEqual (wait_one_this, local_0, "#14.2");
3454 public void GetMethodBody () {
3455 var bevent = run_until ("Main");
3457 var m = bevent.Method.DeclaringType.GetMethod ("get_IntProperty");
3458 var body = m.GetMethodBody ();
3459 foreach (var ins in body.Instructions) {
3460 if (ins.OpCode == OpCodes.Ldfld) {
3461 var field = (FieldInfoMirror)ins.Operand;
3462 Assert.AreEqual ("field_i", field.Name);
3468 public void EvaluateMethod () {
3469 var bevent = run_until ("evaluate_method_2");
3471 var m = bevent.Method.DeclaringType.GetMethod ("get_IntProperty");
3473 var this_obj = bevent.Thread.GetFrames ()[0].GetThis ();
3474 var v = m.Evaluate (this_obj, null);
3475 AssertValue (42, v);
3479 public void SetIP () {
3480 var bevent = run_until ("set_ip_1");
3482 var invalid_loc = bevent.Thread.GetFrames ()[0].Location;
3484 var req = create_step (bevent);
3485 var e = step_out ();
3487 var frames = e.Thread.GetFrames ();
3488 var locs = frames [0].Method.Locations;
3489 var next_loc = locs.First (l => (l.LineNumber == frames [0].Location.LineNumber + 2));
3491 e.Thread.SetIP (next_loc);
3493 /* Check that i = 5; j = 5; was skipped */
3494 bevent = run_until ("set_ip_2");
3495 var f = bevent.Thread.GetFrames ()[1];
3496 AssertValue (1, f.GetValue (f.Method.GetLocal ("i")));
3497 AssertValue (0, f.GetValue (f.Method.GetLocal ("j")));
3500 AssertThrows<ArgumentNullException> (delegate {
3501 e.Thread.SetIP (null);
3504 AssertThrows<ArgumentException> (delegate {
3505 e.Thread.SetIP (invalid_loc);