2 using System.Collections.Generic;
3 using System.Threading;
5 using System.Reflection;
8 using Mono.Debugger.Soft;
9 using Diag = System.Diagnostics;
12 using System.Security.Cryptography;
14 using NUnit.Framework;
16 #pragma warning disable 0219
22 public class DebuggerTests
25 MethodMirror entry_point;
26 StepEventRequest step_req;
29 void AssertThrows<ExType> (Action del) where ExType : Exception {
37 Assert.IsTrue (thrown);
40 // No other way to pass arguments to the tests ?
41 public static bool listening = Environment.GetEnvironmentVariable ("DBG_SUSPEND") != null;
42 public static string runtime = Environment.GetEnvironmentVariable ("DBG_RUNTIME");
43 public static string agent_args = Environment.GetEnvironmentVariable ("DBG_AGENT_ARGS");
45 // Not currently used, but can be useful when debugging individual tests.
46 void StackTraceDump (Event e)
49 foreach (var frame in e.Thread.GetFrames ())
52 Console.WriteLine ("Frame " + i + ", " + frame.Method.Name);
56 Event GetNextEvent () {
57 var es = vm.GetNextEventSet ();
58 Assert.AreEqual (1, es.Events.Length);
62 void Start (params string[] args) {
66 Diag.ProcessStartInfo CreateStartInfo (string[] args) {
67 var pi = new Diag.ProcessStartInfo ();
69 if (runtime != null) {
70 pi.FileName = runtime;
71 } else if (Path.DirectorySeparatorChar == '\\') {
72 string processExe = Diag.Process.GetCurrentProcess ().MainModule.FileName;
73 if (processExe != null) {
74 string fileName = Path.GetFileName (processExe);
75 if (fileName.StartsWith ("mono") && fileName.EndsWith (".exe"))
76 pi.FileName = processExe;
79 if (string.IsNullOrEmpty (pi.FileName))
81 pi.Arguments = String.Join (" ", args);
85 void Start (bool forceExit, params string[] args) {
86 this.forceExit = forceExit;
89 var pi = CreateStartInfo (args);
90 vm = VirtualMachineManager.Launch (pi, new LaunchOptions { AgentArgs = agent_args });
92 var ep = new IPEndPoint (IPAddress.Any, 10000);
93 Console.WriteLine ("Listening on " + ep + "...");
94 vm = VirtualMachineManager.Listen (ep);
97 var load_req = vm.CreateAssemblyLoadRequest ();
100 Event vmstart = GetNextEvent ();
101 Assert.AreEqual (EventType.VMStart, vmstart.EventType);
110 /* Find out the entry point */
114 if (e is AssemblyLoadEvent) {
115 AssemblyLoadEvent ae = (AssemblyLoadEvent)e;
116 entry_point = ae.Assembly.EntryPoint;
117 if (entry_point != null)
127 BreakpointEvent run_until (string name) {
129 MethodMirror m = entry_point.DeclaringType.GetMethod (name);
130 Assert.IsNotNull (m);
131 //Console.WriteLine ("X: " + name + " " + m.ILOffsets.Count + " " + m.Locations.Count);
132 var req = vm.SetBreakpoint (m, m.ILOffsets [0]);
139 if (e is BreakpointEvent)
145 Assert.IsInstanceOfType (typeof (BreakpointEvent), e);
146 Assert.AreEqual (m.Name, (e as BreakpointEvent).Method.Name);
148 return (e as BreakpointEvent);
151 class ReusableBreakpoint {
153 public string method_name;
154 public BreakpointEventRequest req;
155 public BreakpointEvent lastEvent = null;
156 public ReusableBreakpoint (DebuggerTests owner, string method_name)
159 this.method_name = method_name;
160 MethodMirror m = owner.entry_point.DeclaringType.GetMethod (method_name);
161 Assert.IsNotNull (m);
162 req = owner.vm.SetBreakpoint (m, m.ILOffsets [0]);
165 public void Continue ()
167 bool survived = false;
174 e = owner.GetNextEvent ();
175 if (e is BreakpointEvent)
179 Assert.IsInstanceOfType (typeof (BreakpointEvent), e);
180 Assert.AreEqual (method_name, (e as BreakpointEvent).Method.Name);
182 lastEvent = e as BreakpointEvent;
186 if (!survived) { // Ensure cleanup if we triggered an assert
192 public void Disable ()
198 /* One of the tests executes a complex tree of recursive functions.
199 The only good way to specify how its behavior should appear from this side
200 is to just run the function tree once over here and record what it does. */
201 public struct RecursiveChaoticPoint
203 public bool breakpoint;
207 public RecursiveChaoticPoint (bool breakpoint, string name, int depth)
209 this.breakpoint = breakpoint;
215 // The breakpoint is placed here in dtest-app.cs
216 public static void ss_recursive_chaotic_trap (int n, List<RecursiveChaoticPoint> trace, ref bool didLast, ref bool didAny)
218 // Depth is calculated as:
219 // Main + single_stepping + ss_recursive_chaotic + (n is 5 at outermost frame and 0 at innermost frame) + ss_recursive_chaotic_trap
220 trace.Add (new RecursiveChaoticPoint (true, "ss_recursive_chaotic_trap", 5 - n + 5));
224 public static void ss_recursive_chaotic_at (string at, int n, List<RecursiveChaoticPoint> trace, ref bool didLast, ref bool didAny)
226 // This will be called after every return from a function. The other function will return whether "step out" is currently active, and it will be passed in here as didLast.
228 // Depth is calculated as:
229 // Main + single_stepping + ss_recursive_chaotic + (n is 5 at outermost frame and 0 at innermost frame)
230 trace.Add (new RecursiveChaoticPoint (false, "ss_recursive_chaotic_" + at, 5 - n + 4));
236 public static bool ss_recursive_chaotic_fizz (int n, List<RecursiveChaoticPoint> trace)
238 bool didLast = false, didAny = false;
241 didLast = ss_recursive_chaotic_buzz (next, trace);
242 ss_recursive_chaotic_at ("fizz", n, trace, ref didLast, ref didAny);
243 didLast = ss_recursive_chaotic_fizzbuzz (next, trace);
244 ss_recursive_chaotic_at ("fizz", n, trace, ref didLast, ref didAny);
246 ss_recursive_chaotic_trap (n, trace, ref didLast, ref didAny);
247 ss_recursive_chaotic_at ("fizz", n, trace, ref didLast, ref didAny);
252 public static bool ss_recursive_chaotic_buzz (int n, List<RecursiveChaoticPoint> trace)
254 bool didLast = false, didAny = false;
257 didLast = ss_recursive_chaotic_fizz (next, trace);
258 ss_recursive_chaotic_at ("buzz", n, trace, ref didLast, ref didAny);
259 didLast = ss_recursive_chaotic_fizzbuzz (next, trace);
260 ss_recursive_chaotic_at ("buzz", n, trace, ref didLast, ref didAny);
265 public static bool ss_recursive_chaotic_fizzbuzz (int n, List<RecursiveChaoticPoint> trace)
267 bool didLast = false, didAny = false;
270 didLast = ss_recursive_chaotic_fizz (next, trace);
271 ss_recursive_chaotic_at ("fizzbuzz", n, trace, ref didLast, ref didAny);
272 didLast = ss_recursive_chaotic_buzz (next, trace);
273 ss_recursive_chaotic_at ("fizzbuzz", n, trace, ref didLast, ref didAny);
274 didLast = ss_recursive_chaotic_fizzbuzz (next, trace);
275 ss_recursive_chaotic_at ("fizzbuzz", n, trace, ref didLast, ref didAny);
280 public static void trace_ss_recursive_chaotic (List<RecursiveChaoticPoint> trace)
282 ss_recursive_chaotic_fizz (5, trace);
285 Event single_step (ThreadMirror t) {
286 var req = vm.CreateStepRequest (t);
290 Event e = GetNextEvent ();
291 Assert.IsTrue (e is StepEvent);
298 Event step_until (ThreadMirror t, string method_name) {
302 if ((e as StepEvent).Method.Name == method_name)
308 void check_arg_val (StackFrame frame, int pos, Type type, object eval) {
309 object val = frame.GetArgument (pos);
310 Assert.IsTrue (val is PrimitiveValue);
311 object v = (val as PrimitiveValue).Value;
312 Assert.AreEqual (type, v.GetType ());
314 Assert.IsTrue (Math.Abs ((float)eval - (float)v) < 0.0001);
315 else if (eval is double)
316 Assert.IsTrue (Math.Abs ((double)eval - (double)v) < 0.0001);
318 Assert.AreEqual (eval, v);
321 void AssertValue (object expected, object val) {
322 if (expected is string) {
323 Assert.IsTrue (val is StringMirror);
324 Assert.AreEqual (expected, (val as StringMirror).Value);
325 } else if (val is StructMirror && (val as StructMirror).Type.Name == "IntPtr") {
326 AssertValue (expected, (val as StructMirror).Fields [0]);
328 Assert.IsTrue (val is PrimitiveValue);
329 Assert.AreEqual (expected, (val as PrimitiveValue).Value);
334 public void SetUp () {
335 ThreadMirror.NativeTransitions = false;
336 Start (new string [] { "dtest-app.exe" });
340 public void TearDown () {
344 if (step_req != null)
352 Event e = GetNextEvent ();
354 if (e is VMDeathEvent)
363 public void SimpleBreakpoint () {
366 MethodMirror m = entry_point.DeclaringType.GetMethod ("bp1");
367 Assert.IsNotNull (m);
369 vm.SetBreakpoint (m, 0);
374 Assert.AreEqual (EventType.Breakpoint, e.EventType);
375 Assert.IsTrue (e is BreakpointEvent);
376 Assert.AreEqual (m.Name, (e as BreakpointEvent).Method.Name);
379 AssertThrows<ArgumentException> (delegate {
381 vm.SetBreakpoint (m, 2);
386 public void BreakpointsSameLocation () {
387 MethodMirror m = entry_point.DeclaringType.GetMethod ("bp2");
388 Assert.IsNotNull (m);
390 vm.SetBreakpoint (m, 0);
391 vm.SetBreakpoint (m, 0);
395 var es = vm.GetNextEventSet ();
396 Assert.AreEqual (2, es.Events.Length);
397 Assert.IsTrue (es [0] is BreakpointEvent);
398 Assert.AreEqual (m, (es [0] as BreakpointEvent).Method);
400 Assert.IsTrue (es [1] is BreakpointEvent);
401 Assert.AreEqual (m.Name, (es [1] as BreakpointEvent).Method.Name);
405 public void BreakpointAlreadyJITted () {
406 Event e = run_until ("bp1");
408 /* Place a breakpoint on bp3 */
409 MethodMirror m = entry_point.DeclaringType.GetMethod ("bp3");
410 Assert.IsNotNull (m);
411 vm.SetBreakpoint (m, 0);
413 /* Same with generic instances */
414 MethodMirror m2 = entry_point.DeclaringType.GetMethod ("bp7");
415 Assert.IsNotNull (m2);
416 vm.SetBreakpoint (m2, 0);
421 Assert.AreEqual (EventType.Breakpoint, e.EventType);
422 Assert.AreEqual (m.Name, (e as BreakpointEvent).Method.Name);
426 /* Non-shared instance */
428 Assert.AreEqual (EventType.Breakpoint, e.EventType);
429 Assert.AreEqual (m2.Name, (e as BreakpointEvent).Method.Name);
433 /* Shared instance */
435 Assert.AreEqual (EventType.Breakpoint, e.EventType);
436 Assert.AreEqual (m2.Name, (e as BreakpointEvent).Method.Name);
440 public void ClearBreakpoint () {
443 MethodMirror m = entry_point.DeclaringType.GetMethod ("bp4");
444 Assert.IsNotNull (m);
445 EventRequest req1 = vm.SetBreakpoint (m, 0);
446 EventRequest req2 = vm.SetBreakpoint (m, 0);
448 MethodMirror m2 = entry_point.DeclaringType.GetMethod ("bp5");
449 Assert.IsNotNull (m2);
450 vm.SetBreakpoint (m2, 0);
455 var es = vm.GetNextEventSet ();
456 Assert.AreEqual (2, es.Events.Length);
457 Assert.AreEqual (EventType.Breakpoint, es [0].EventType);
458 Assert.AreEqual (m.Name, (es [0] as BreakpointEvent).Method.Name);
459 Assert.AreEqual (EventType.Breakpoint, es [1].EventType);
460 Assert.AreEqual (m.Name, (es [1] as BreakpointEvent).Method.Name);
462 /* Clear one of them */
468 Assert.AreEqual (EventType.Breakpoint, e.EventType);
469 Assert.AreEqual (m.Name, (e as BreakpointEvent).Method.Name);
471 /* Clear the other */
477 Assert.AreEqual (EventType.Breakpoint, e.EventType);
478 Assert.AreEqual (m2.Name, (e as BreakpointEvent).Method.Name);
482 public void ClearAllBreakpoints () {
485 MethodMirror m = entry_point.DeclaringType.GetMethod ("bp4");
486 Assert.IsNotNull (m);
487 vm.SetBreakpoint (m, 0);
489 MethodMirror m2 = entry_point.DeclaringType.GetMethod ("bp5");
490 Assert.IsNotNull (m2);
491 vm.SetBreakpoint (m2, 0);
493 vm.ClearAllBreakpoints ();
498 Assert.IsTrue (!(e is BreakpointEvent));
499 if (e is VMDeathEvent)
504 public void BreakpointOnGShared () {
507 MethodMirror m = entry_point.DeclaringType.GetMethod ("bp6");
508 Assert.IsNotNull (m);
510 vm.SetBreakpoint (m, 0);
515 Assert.AreEqual (EventType.Breakpoint, e.EventType);
516 Assert.IsTrue (e is BreakpointEvent);
517 Assert.AreEqual (m.Name, (e as BreakpointEvent).Method.Name);
519 // Breakpoint on an open generic method of a closed generic class (#3422)
520 var frame = e.Thread.GetFrames ()[0];
521 var ginst = frame.GetValue (frame.Method.GetLocal ("gc"));
522 var m2 = (ginst as ObjectMirror).Type.GetMethod ("bp");
523 vm.SetBreakpoint (m2, 0);
528 Assert.AreEqual (EventType.Breakpoint, e.EventType);
529 Assert.IsTrue (e is BreakpointEvent);
530 Assert.AreEqual (m2.Name, (e as BreakpointEvent).Method.Name);
533 // Assert we have stepped to a location
534 void assert_location (Event e, string method) {
535 Assert.IsTrue (e is StepEvent);
536 Assert.AreEqual (method, (e as StepEvent).Method.Name);
539 // Assert we have breakpointed at a location
540 void assert_location_at_breakpoint (Event e, string method) {
541 Assert.IsTrue (e is BreakpointEvent);
542 Assert.AreEqual (method, (e as BreakpointEvent).Method.Name);
545 // Assert we have stepped to or breakpointed at a location
546 void assert_location_allow_breakpoint (Event e, string method) {
548 Assert.AreEqual (method, (e as StepEvent).Method.Name);
549 else if (e is BreakpointEvent)
550 Assert.AreEqual (method, (e as BreakpointEvent).Method.Name);
552 Assert.Fail ("Neither step nor breakpoint event");
555 StepEventRequest create_step (Event e) {
556 var req = vm.CreateStepRequest (e.Thread);
562 public void ClassLocalReflection () {
563 MethodMirror m = entry_point.DeclaringType.Assembly.GetType ("LocalReflectClass").GetMethod ("RunMe");
565 Assert.IsNotNull (m);
567 // foreach (var x in m.Locations) {
568 // Console.WriteLine (x);
572 int method_base_linum = m.Locations [0].LineNumber;
573 foreach (var location in m.Locations)
574 if (location.LineNumber == method_base_linum + 2) {
575 offset = location.ILOffset;
579 var req = vm.SetBreakpoint (m, offset);
586 if (e is BreakpointEvent)
592 Assert.IsInstanceOfType (typeof (BreakpointEvent), e);
593 Assert.AreEqual (m.Name, (e as BreakpointEvent).Method.Name);
595 e = single_step (e.Thread);
597 var frame = e.Thread.GetFrames ()[0];
599 Assert.IsNotNull (frame);
600 var field = frame.Method.GetLocal ("reflectMe");
601 Assert.IsNotNull (field);
602 Value variable = frame.GetValue (field);
604 ObjectMirror thisObj = (ObjectMirror)variable;
605 TypeMirror thisType = thisObj.Type;
606 FieldInfoMirror thisFi = null;
607 foreach (var fi in thisType.GetFields ())
608 if (fi.Name == "someField")
611 var gotVal = thisObj.GetValue (thisFi);
612 // If we got this far, we're good.
616 public void SingleStepping () {
617 Event e = run_until ("single_stepping");
619 var req = create_step (e);
622 // Step over 'bool b = true'
624 assert_location (e, "single_stepping");
631 assert_location (e, "ss1");
638 assert_location (e, "single_stepping");
642 assert_location (e, "single_stepping");
646 assert_location (e, "ss3");
648 // Step back into single_stepping
650 assert_location (e, "single_stepping");
652 // Step into next line
654 assert_location (e, "single_stepping");
656 // Step into ss3_2 ()
658 assert_location (e, "ss3_2");
660 // Step over ss3_2_2 ()
662 assert_location (e, "ss3_2");
664 // Recreate the request
671 // Step back into single_stepping () with the new request
673 assert_location (e, "single_stepping");
677 assert_location (e, "ss4");
682 // Change to StepSize.Line
684 req.Depth = StepDepth.Over;
685 req.Size = StepSize.Line;
688 // Step over ss1 (); ss1 ();
693 req.Depth = StepDepth.Into;
697 assert_location (e, "ss2");
702 e = run_until ("ss5");
704 // Add an assembly filter
705 req.AssemblyFilter = new AssemblyMirror [] { (e as BreakpointEvent).Method.DeclaringType.Assembly };
711 // Step into is_even, skipping the linq stuff
713 assert_location (e, "is_even");
715 // FIXME: Check that single stepping works with lock (obj)
719 e = run_until ("ss6");
721 req = create_step (e);
722 req.Depth = StepDepth.Over;
725 // Check that single stepping works in out-of-line bblocks
728 assert_location (e, "ss6");
731 // Testing stepping in, over and out with exception handlers in same or caller method
733 //stepout in ss7_2, which may not go to catch(instead out to ss7)
734 e = run_until ("ss7_2");
736 assert_location (step_out(), "ss7");
738 //stepout in ss7_2_1, which must go to catch
739 run_until ("ss7_2_1");
740 assert_location (step_out (), "ss7_2");
742 //stepover over ss7_2, which must go to catch
744 assert_location (step_over (), "ss7_2");//move to "try {" line
745 assert_location (step_over (), "ss7_2");//move to "ss7_2_2();" line
746 assert_location (step_over (), "ss7_2");//step over ss7_2_2();, assume we are at "catch" now
747 assert_location (step_over (), "ss7_2");//move to { of catch
748 assert_location (step_over (), "ss7_2");//move to } of catch
749 assert_location (step_over (), "ss7_2");//move to } of method
750 assert_location (step_over (), "ss7");//finish method
752 //stepover over ss7_2_1, which must go to catch
753 run_until ("ss7_2_1");
754 assert_location (step_over (), "ss7_2_1");//move from { of method to "throw new Exception ();"
755 assert_location (step_over (), "ss7_2");//step over exception, being in ss7_2 means we are at catch
757 //stepin in ss7_3, which must go to catch
759 assert_location (step_into (), "ss7_3");//move to "try {"
760 assert_location (step_into (), "ss7_3");//move to "throw new Exception ();"
762 step_req.AssemblyFilter = new AssemblyMirror [] { (e as BreakpointEvent).Method.DeclaringType.Assembly };
763 assert_location (step_into (), "ss7_3");//call "throw new Exception ();", we assume we end up at "catch"
764 assert_location (step_into (), "ss7_3");//move to { of catch
765 assert_location (step_into (), "ss7_3");//move to } of catch
766 assert_location (step_into (), "ss7_3");//move to } of method
767 assert_location (step_into (), "ss7");//move out to ss7
769 //stepover in ss7_2_1, which must go to catch
770 run_until ("ss7_2_1");
771 assert_location (step_into (), "ss7_2_1");//move from { of method to "throw new Exception ();"
772 assert_location (step_into (), "ss7_2");//step in exception, being in ss7_2 means we are at catch
775 // Check that stepping stops between nested calls
776 e = run_until ("ss_nested_2");
777 req = create_step (e);
779 assert_location (e, "ss_nested");
781 assert_location (e, "ss_nested_1");
783 assert_location (e, "ss_nested");
784 // Check that step over steps over nested calls
786 assert_location (e, "ss_nested");
788 assert_location (e, "ss_nested_2");
790 assert_location (e, "ss_nested_2");
792 assert_location (e, "ss_nested_2");
794 assert_location (e, "ss_nested");
796 assert_location (e, "ss_nested_1");
798 assert_location (e, "ss_nested_1");
800 assert_location (e, "ss_nested");
803 // Check DebuggerStepThrough support
804 e = run_until ("ss_step_through");
805 req = create_step (e);
806 req.Filter = StepFilter.DebuggerStepThrough;
808 // Step through step_through_1 ()
810 assert_location (e, "ss_step_through");
811 // Step through StepThroughClass.step_through_2 ()
813 assert_location (e, "ss_step_through");
815 req.Filter = StepFilter.None;
817 assert_location (e, "step_through_3");
820 // Check DebuggerNonUserCode support
821 e = run_until ("ss_non_user_code");
822 req = create_step (e);
823 req.Filter = StepFilter.DebuggerNonUserCode;
825 // Step through non_user_code_1 ()
827 assert_location (e, "ss_non_user_code");
828 // Step through StepThroughClass.non_user_code_2 ()
830 assert_location (e, "ss_non_user_code");
832 req.Filter = StepFilter.None;
834 assert_location (e, "non_user_code_3");
837 // Check that step-over doesn't stop at inner frames with recursive functions
838 e = run_until ("ss_recursive");
839 req = create_step (e);
843 var f = e.Thread.GetFrames () [0];
844 assert_location (e, "ss_recursive");
845 AssertValue (1, f.GetValue (f.Method.GetLocal ("n")));
848 // Check that step-over stops correctly when inner frames with recursive functions contain breakpoints
849 e = run_until ("ss_recursive2");
850 ReusableBreakpoint breakpoint = new ReusableBreakpoint (this, "ss_recursive2_trap");
852 breakpoint.Continue ();
853 e = breakpoint.lastEvent;
854 req = create_step (e);
855 for (int c = 1; c <= 4; c++) {
856 // The first five times we try to step over this function, the breakpoint will stop us
857 assert_location_at_breakpoint (e, "ss_recursive2_trap");
860 req = create_step (e);
861 req.Size = StepSize.Line;
864 e = step_over ();//Stepout gets us to ss_recursive2_trap ();, move to ss_recursive2 (next); line
865 assert_location (e, "ss_recursive2");
867 // Stack should consist of Main + single_stepping + (1 ss_recursive2 frame per loop iteration)
868 Assert.AreEqual (c+2, e.Thread.GetFrames ().Length);
869 e = step_over_or_breakpoint ();
871 // At this point we should have escaped the breakpoints and this will be a normal step stop
872 assert_location (e, "ss_recursive2");
873 Assert.AreEqual (6, e.Thread.GetFrames ().Length);
876 breakpoint.Disable ();
879 // Check that step-out stops correctly when inner frames with recursive functions contain breakpoints
880 e = run_until ("ss_recursive2");
881 breakpoint = new ReusableBreakpoint (this, "ss_recursive2_trap");
883 breakpoint.Continue ();
884 e = breakpoint.lastEvent;
885 req = create_step (e);
886 for (int c = 1; c <= 4; c++) {
887 // The first five times we try to step over this function, the breakpoint will stop us
888 assert_location_at_breakpoint (e, "ss_recursive2_trap");
891 req = create_step (e);
892 req.Size = StepSize.Line;
895 assert_location (e, "ss_recursive2");
897 // Stack should consist of Main + single_stepping + (1 ss_recursive2 frame per loop iteration)
898 Assert.AreEqual (c+2, e.Thread.GetFrames ().Length);
899 e = step_out_or_breakpoint ();
901 for (int c = 3; c >= 1; c--) {
902 assert_location (e, "ss_recursive2");
903 Assert.AreEqual (c + 2, e.Thread.GetFrames ().Length);
909 breakpoint.Disable ();
912 // Test step out with a really complicated call tree
913 List<RecursiveChaoticPoint> trace = new List<RecursiveChaoticPoint>();
914 trace_ss_recursive_chaotic (trace);
915 e = run_until ("ss_recursive_chaotic");
917 breakpoint = new ReusableBreakpoint (this, "ss_recursive_chaotic_trap");
918 breakpoint.Continue ();
919 e = breakpoint.lastEvent;
920 foreach (RecursiveChaoticPoint point in trace)
922 if (point.breakpoint)
923 assert_location_at_breakpoint (e, point.name);
925 assert_location (e, point.name);
926 Assert.AreEqual (point.depth, e.Thread.GetFrames ().Length);
929 req = create_step (e);
930 req.Size = StepSize.Line;
931 e = step_out_or_breakpoint ();
935 breakpoint.Disable ();
938 // Check that single stepping doesn't clobber fp values
939 e = run_until ("ss_fp_clobber");
940 req = create_step (e);
942 f = e.Thread.GetFrames ()[0];
944 if ((e as StepEvent).Method.Name == "ss_fp_clobber_2")
948 f = e.Thread.GetFrames ()[0];
949 AssertValue (7.0, f.GetValue (f.Method.GetParameters ()[0]));
952 e = run_until ("ss_await");
953 e = step_in_await ("ss_await", e);//ss_await_1 ().Wait ();//in
954 e = step_in_await ("MoveNext", e);//{
955 e = step_in_await ("MoveNext", e);//var a = 1;
956 e = step_in_await ("MoveNext", e);//await Task.Delay (10);
957 e = step_in_await ("MoveNext", e);//return a + 2;
958 e = step_in_await ("MoveNext", e);//}
959 e = step_in_await ("ss_await", e);//ss_await_1 ().Wait ();//in
961 e = step_in_await ("ss_await", e);//ss_await_1 ().Wait ();//over
962 e = step_in_await ("MoveNext", e);//{
963 e = step_over_await ("MoveNext", e);//var a = 1;
964 e = step_over_await ("MoveNext", e);//await Task.Delay (10);
965 e = step_over_await ("MoveNext", e);//return a + 2;
966 e = step_over_await ("MoveNext", e);//}
967 e = step_over_await ("ss_await", e);//ss_await_1 ().Wait ();//over
969 e = step_in_await ("ss_await", e);//ss_await_1 ().Wait ();//out before
970 e = step_in_await ("MoveNext", e);//{
971 e = step_out_await ("ss_await", e);//ss_await_1 ().Wait ();//out before
973 e = step_in_await ("ss_await", e);//ss_await_1 ().Wait ();//out after
974 e = step_in_await ("MoveNext", e);//{
975 e = step_in_await ("MoveNext", e);//var a = 1;
976 e = step_in_await ("MoveNext", e);//await Task.Delay (10);
977 e = step_in_await ("MoveNext", e);//return a + 2;
978 e = step_out_await ("ss_await", e);//ss_await_1 ().Wait ();//out after
980 e = step_in_await ("ss_await", e);//ss_await_1_exc (true, true).Wait ();//in
981 e = step_in_await ("MoveNext", e);//{
982 e = step_in_await ("MoveNext", e);//var a = 1;
983 e = step_in_await ("MoveNext", e);//await Task.Delay (10);
984 e = step_in_await ("MoveNext", e);//if (exc)
985 e = step_in_await ("MoveNext", e);//{
986 e = step_in_await ("MoveNext", e);//if (handled)
987 e = step_in_await ("MoveNext", e);//{
988 e = step_in_await ("MoveNext", e);//try {
989 e = step_in_await ("MoveNext", e);//throw new Exception ();
990 e = step_in_await ("MoveNext", e);//catch
991 e = step_in_await ("MoveNext", e);//{
992 e = step_in_await ("MoveNext", e);//}
993 e = step_in_await ("MoveNext", e);//}
994 e = step_in_await ("MoveNext", e);//}
995 e = step_in_await ("MoveNext", e);//return a + 2;
996 e = step_in_await ("MoveNext", e);//}
997 e = step_in_await ("ss_await", e);//ss_await_1_exc (true, true).Wait ();//in
999 e = step_in_await ("ss_await", e);//ss_await_1_exc (true, true).Wait ();//over
1000 e = step_in_await ("MoveNext", e);//{
1001 e = step_over_await ("MoveNext", e);//var a = 1;
1002 e = step_over_await ("MoveNext", e);//await Task.Delay (10);
1003 e = step_over_await ("MoveNext", e);//if (exc)
1004 e = step_over_await ("MoveNext", e);//{
1005 e = step_over_await ("MoveNext", e);//if (handled)
1006 e = step_over_await ("MoveNext", e);//{
1007 e = step_over_await ("MoveNext", e);//try {
1008 e = step_over_await ("MoveNext", e);//throw new Exception ();
1009 e = step_over_await ("MoveNext", e);//catch
1010 e = step_over_await ("MoveNext", e);//{
1011 e = step_over_await ("MoveNext", e);//}
1012 e = step_over_await ("MoveNext", e);//}
1013 e = step_over_await ("MoveNext", e);//}
1014 e = step_over_await ("MoveNext", e);//return a + 2;
1015 e = step_over_await ("MoveNext", e);//}
1016 e = step_over_await ("ss_await", e);//ss_await_1_exc (true, true).Wait ();//over
1018 e = step_in_await ("ss_await", e);//ss_await_1_exc (true, true).Wait ();//out
1019 e = step_in_await ("MoveNext", e);//{
1020 e = step_out_await ("ss_await", e);//ss_await_1_exc (true, true).Wait ();//out
1022 e = step_in_await ("ss_await", e);//try {
1023 e = step_in_await ("ss_await", e);//ss_await_1_exc (true, false).Wait ();//in
1024 e = step_in_await ("MoveNext", e);//{
1025 e = step_in_await ("MoveNext", e);//var a = 1;
1026 e = step_in_await ("MoveNext", e);//await Task.Delay (10);
1027 e = step_in_await ("MoveNext", e);//if (exc)
1028 e = step_in_await ("MoveNext", e);//{
1029 e = step_in_await ("MoveNext", e);//if (handled)
1030 e = step_in_await ("MoveNext", e);//} else {
1031 e = step_in_await ("MoveNext", e);//throw new Exception ();
1032 e = step_in_await ("ss_await", e);//catch
1033 e = step_in_await ("ss_await", e);//{
1034 e = step_in_await ("ss_await", e);//}
1035 e = step_in_await ("ss_await", e);//try {
1037 e = step_in_await ("ss_await", e);//ss_await_1_exc (true, false).Wait ();//over
1038 e = step_in_await ("MoveNext", e);//{
1039 e = step_over_await ("MoveNext", e);//var a = 1;
1040 e = step_over_await ("MoveNext", e);//await Task.Delay (10);
1041 e = step_over_await ("MoveNext", e);//if (exc)
1042 e = step_over_await ("MoveNext", e);//{
1043 e = step_over_await ("MoveNext", e);//if (handled)
1044 e = step_over_await ("MoveNext", e);//} else {
1045 e = step_over_await ("MoveNext", e);//throw new Exception ();
1046 e = step_over_await ("ss_await", e);//catch
1047 e = step_over_await ("ss_await", e);//{
1048 e = step_over_await ("ss_await", e);//}
1049 e = step_over_await ("ss_await", e);//try {
1051 e = step_in_await ("ss_await", e);//ss_await_1_exc (true, false).Wait ();//out
1052 e = step_in_await ("MoveNext", e);//{
1054 // Check hoisted scope information
1055 var hoisted = (e as StepEvent).Method.GetHoistedScopes ();
1056 Assert.AreEqual (2, hoisted.Length);
1058 e = step_out_await ("ss_await", e);//ss_await_1_exc (true, true).Wait ();//out
1061 Event step_in_await (string method, Event e)
1063 if (step_req != null)
1064 step_req.Disable ();
1066 step_req.AssemblyFilter = new List<AssemblyMirror> () { entry_point.DeclaringType.Assembly };
1067 var ef = step_into ();
1068 assert_location (ef, method);
1072 Event step_over_await (string method, Event e)
1074 if (step_req != null)
1075 step_req.Disable ();
1077 step_req.AssemblyFilter = new List<AssemblyMirror> () { entry_point.DeclaringType.Assembly };
1078 var ef = step_over ();
1079 assert_location (ef, method);
1083 Event step_out_await (string method, Event e)
1085 if (step_req != null)
1086 step_req.Disable ();
1088 step_req.AssemblyFilter = new List<AssemblyMirror> () { entry_point.DeclaringType.Assembly };
1089 var ef = step_out ();
1090 assert_location (ef, method);
1095 public void SingleSteppingNoFrames () {
1097 // Test what happens when starting a single step operation on a thread
1098 // with no managed frames
1100 // Run a delegate on a tp thread
1101 var e = run_until ("ss_no_frames_2");
1103 var this_type = e.Thread.GetFrames ()[0].Method.DeclaringType;
1104 this_type.SetValue (this_type.GetField ("static_i"), vm.CreateValue (56));
1106 var thread = e.Thread;
1107 var e2 = run_until ("ss_no_frames_3");
1108 // The tp thread should be idle now
1109 step_req = vm.CreateStepRequest (thread);
1110 step_req.Depth = StepDepth.Over;
1111 AssertThrows<Exception> (delegate {
1117 public void MethodEntryExit () {
1118 run_until ("single_stepping");
1120 var req1 = vm.CreateMethodEntryRequest ();
1121 var req2 = vm.CreateMethodExitRequest ();
1127 Event e = GetNextEvent ();
1128 Assert.IsTrue (e is MethodEntryEvent);
1129 Assert.AreEqual ("ss1", (e as MethodEntryEvent).Method.Name);
1132 e = GetNextEvent ();
1133 Assert.IsTrue (e is MethodExitEvent);
1134 Assert.AreEqual ("ss1", (e as MethodExitEvent).Method.Name);
1141 public void CountFilter () {
1142 run_until ("single_stepping");
1144 MethodMirror m2 = entry_point.DeclaringType.GetMethod ("ss3");
1145 Assert.IsNotNull (m2);
1146 vm.SetBreakpoint (m2, 0);
1148 var req1 = vm.CreateMethodEntryRequest ();
1152 // Enter ss2, ss1 is skipped
1154 Event e = GetNextEvent ();
1155 Assert.IsTrue (e is MethodEntryEvent);
1156 Assert.AreEqual ("ss2", (e as MethodEntryEvent).Method.Name);
1158 // Breakpoint on ss3, the entry event is no longer reported
1160 e = GetNextEvent ();
1161 Assert.IsTrue (e is BreakpointEvent);
1167 public void Arguments () {
1170 var e = run_until ("arg1");
1172 StackFrame frame = e.Thread.GetFrames () [0];
1174 check_arg_val (frame, 0, typeof (sbyte), SByte.MaxValue - 5);
1175 check_arg_val (frame, 1, typeof (byte), Byte.MaxValue - 5);
1176 check_arg_val (frame, 2, typeof (bool), true);
1177 check_arg_val (frame, 3, typeof (short), Int16.MaxValue - 5);
1178 check_arg_val (frame, 4, typeof (ushort), UInt16.MaxValue - 5);
1179 check_arg_val (frame, 5, typeof (char), 'F');
1180 check_arg_val (frame, 6, typeof (int), Int32.MaxValue - 5);
1181 check_arg_val (frame, 7, typeof (uint), UInt32.MaxValue - 5);
1182 check_arg_val (frame, 8, typeof (long), Int64.MaxValue - 5);
1183 check_arg_val (frame, 9, typeof (ulong), UInt64.MaxValue - 5);
1184 check_arg_val (frame, 10, typeof (float), 1.2345f);
1185 check_arg_val (frame, 11, typeof (double), 6.78910);
1187 e = run_until ("arg2");
1189 frame = e.Thread.GetFrames () [0];
1192 val = frame.GetArgument (0);
1193 AssertValue ("FOO", val);
1194 Assert.AreEqual ("String", (val as ObjectMirror).Type.Name);
1197 val = frame.GetArgument (1);
1198 AssertValue (null, val);
1201 val = frame.GetArgument (2);
1202 AssertValue ("BLA", val);
1205 val = frame.GetArgument (3);
1206 AssertValue (42, val);
1209 val = frame.GetArgument (4);
1210 Assert.IsTrue (val is ObjectMirror);
1211 Assert.AreEqual ("GClass`1", (val as ObjectMirror).Type.Name);
1214 val = frame.GetArgument (5);
1215 Assert.IsTrue (val is ObjectMirror);
1216 Assert.AreEqual ("Object", (val as ObjectMirror).Type.Name);
1218 // this on static methods
1219 val = frame.GetThis ();
1220 AssertValue (null, val);
1222 e = run_until ("arg3");
1224 frame = e.Thread.GetFrames () [0];
1227 val = frame.GetThis ();
1228 Assert.IsTrue (val is ObjectMirror);
1229 Assert.AreEqual ("Tests", (val as ObjectMirror).Type.Name);
1231 // objref in register
1232 val = frame.GetArgument (0);
1233 AssertValue ("BLA", val);
1237 public void Arrays () {
1240 var e = run_until ("o2");
1242 StackFrame frame = e.Thread.GetFrames () [0];
1245 val = frame.GetArgument (0);
1246 Assert.IsTrue (val is ArrayMirror);
1247 ArrayMirror arr = val as ArrayMirror;
1248 Assert.AreEqual (2, arr.Length);
1249 AssertValue ("BAR", arr [0]);
1250 AssertValue ("BAZ", arr [1]);
1252 var vals = arr.GetValues (0, 2);
1253 Assert.AreEqual (2, vals.Count);
1254 AssertValue ("BAR", vals [0]);
1255 AssertValue ("BAZ", vals [1]);
1257 arr [0] = vm.RootDomain.CreateString ("ABC");
1258 AssertValue ("ABC", arr [0]);
1260 arr [0] = vm.CreateValue (null);
1261 AssertValue (null, arr [0]);
1263 arr.SetValues (0, new Value [] { vm.RootDomain.CreateString ("D1"), vm.RootDomain.CreateString ("D2") });
1264 AssertValue ("D1", arr [0]);
1265 AssertValue ("D2", arr [1]);
1268 val = frame.GetArgument (1);
1269 Assert.IsTrue (val is ArrayMirror);
1270 arr = val as ArrayMirror;
1271 Assert.AreEqual (2, arr.Length);
1272 AssertValue (42, arr [0]);
1273 AssertValue (43, arr [1]);
1275 // Argument checking
1276 AssertThrows<IndexOutOfRangeException> (delegate () {
1280 AssertThrows<IndexOutOfRangeException> (delegate () {
1281 val = arr [Int32.MinValue];
1284 AssertThrows<IndexOutOfRangeException> (delegate () {
1285 vals = arr.GetValues (0, 3);
1288 AssertThrows<IndexOutOfRangeException> (delegate () {
1289 arr [2] = vm.CreateValue (null);
1292 AssertThrows<IndexOutOfRangeException> (delegate () {
1293 arr [Int32.MinValue] = vm.CreateValue (null);
1296 AssertThrows<IndexOutOfRangeException> (delegate () {
1297 arr.SetValues (0, new Value [] { null, null, null });
1301 val = frame.GetArgument (2);
1302 Assert.IsTrue (val is ArrayMirror);
1303 arr = val as ArrayMirror;
1304 Assert.AreEqual (2, arr.Rank);
1305 Assert.AreEqual (4, arr.Length);
1306 Assert.AreEqual (2, arr.GetLength (0));
1307 Assert.AreEqual (2, arr.GetLength (1));
1308 Assert.AreEqual (0, arr.GetLowerBound (0));
1309 Assert.AreEqual (0, arr.GetLowerBound (1));
1310 vals = arr.GetValues (0, 4);
1311 AssertValue (1, vals [0]);
1312 AssertValue (2, vals [1]);
1313 AssertValue (3, vals [2]);
1314 AssertValue (4, vals [3]);
1316 val = frame.GetArgument (3);
1317 Assert.IsTrue (val is ArrayMirror);
1318 arr = val as ArrayMirror;
1319 Assert.AreEqual (2, arr.Rank);
1320 Assert.AreEqual (4, arr.Length);
1321 Assert.AreEqual (2, arr.GetLength (0));
1322 Assert.AreEqual (2, arr.GetLength (1));
1323 Assert.AreEqual (1, arr.GetLowerBound (0));
1324 Assert.AreEqual (3, arr.GetLowerBound (1));
1326 AssertThrows<ArgumentOutOfRangeException> (delegate () {
1329 AssertThrows<ArgumentOutOfRangeException> (delegate () {
1333 AssertThrows<ArgumentOutOfRangeException> (delegate () {
1334 arr.GetLowerBound (-1);
1336 AssertThrows<ArgumentOutOfRangeException> (delegate () {
1337 arr.GetLowerBound (2);
1340 // arrays treated as generic collections
1341 val = frame.GetArgument (4);
1342 Assert.IsTrue (val is ArrayMirror);
1343 arr = val as ArrayMirror;
1347 public void Object_GetValue () {
1348 var e = run_until ("o1");
1349 var frame = e.Thread.GetFrames () [0];
1351 object val = frame.GetThis ();
1352 Assert.IsTrue (val is ObjectMirror);
1353 Assert.AreEqual ("Tests", (val as ObjectMirror).Type.Name);
1354 ObjectMirror o = (val as ObjectMirror);
1356 TypeMirror t = o.Type;
1359 object f = o.GetValue (t.GetField ("field_i"));
1360 AssertValue (42, f);
1361 f = o.GetValue (t.GetField ("field_s"));
1362 AssertValue ("S", f);
1363 f = o.GetValue (t.GetField ("field_enum"));
1364 Assert.IsTrue (f is EnumMirror);
1365 Assert.AreEqual (1, (f as EnumMirror).Value);
1366 Assert.AreEqual ("B", (f as EnumMirror).StringValue);
1368 // Inherited object fields
1369 TypeMirror parent = t.BaseType;
1370 f = o.GetValue (parent.GetField ("base_field_i"));
1371 AssertValue (43, f);
1372 f = o.GetValue (parent.GetField ("base_field_s"));
1373 AssertValue ("T", f);
1376 f = o.GetValue (o.Type.GetField ("static_i"));
1377 AssertValue (55, f);
1379 // generic instances
1380 ObjectMirror o2 = frame.GetValue (frame.Method.GetParameters ()[1]) as ObjectMirror;
1381 Assert.AreEqual ("GClass`1", o2.Type.Name);
1382 TypeMirror t2 = o2.Type;
1383 f = o2.GetValue (t2.GetField ("field"));
1384 AssertValue (42, f);
1386 ObjectMirror o3 = frame.GetValue (frame.Method.GetParameters ()[2]) as ObjectMirror;
1387 Assert.AreEqual ("GClass`1", o3.Type.Name);
1388 TypeMirror t3 = o3.Type;
1389 f = o3.GetValue (t3.GetField ("field"));
1390 AssertValue ("FOO", f);
1392 // Argument checking
1393 AssertThrows<ArgumentNullException> (delegate () {
1399 public void Object_GetValues () {
1400 var e = run_until ("o1");
1401 var frame = e.Thread.GetFrames () [0];
1403 object val = frame.GetThis ();
1404 Assert.IsTrue (val is ObjectMirror);
1405 Assert.AreEqual ("Tests", (val as ObjectMirror).Type.Name);
1406 ObjectMirror o = (val as ObjectMirror);
1408 ObjectMirror val2 = frame.GetValue (frame.Method.GetParameters ()[0]) as ObjectMirror;
1410 TypeMirror t = o.Type;
1412 object[] vals = o.GetValues (new FieldInfoMirror [] { t.GetField ("field_i"), t.GetField ("field_s") });
1413 object f = vals [0];
1414 AssertValue (42, f);
1416 AssertValue ("S", f);
1418 // Argument checking
1419 AssertThrows<ArgumentNullException> (delegate () {
1423 AssertThrows<ArgumentNullException> (delegate () {
1424 o.GetValues (new FieldInfoMirror [] { null });
1427 // field of another class
1428 AssertThrows<ArgumentException> (delegate () {
1429 o.GetValue (val2.Type.GetField ("field_j"));
1433 void TestSetValue (ObjectMirror o, string field_name, object val) {
1435 o.SetValue (o.Type.GetField (field_name), vm.RootDomain.CreateString ((string)val));
1437 o.SetValue (o.Type.GetField (field_name), vm.CreateValue (val));
1438 Value f = o.GetValue (o.Type.GetField (field_name));
1439 AssertValue (val, f);
1443 public void Object_SetValues () {
1444 var e = run_until ("o1");
1445 var frame = e.Thread.GetFrames () [0];
1447 object val = frame.GetThis ();
1448 Assert.IsTrue (val is ObjectMirror);
1449 Assert.AreEqual ("Tests", (val as ObjectMirror).Type.Name);
1450 ObjectMirror o = (val as ObjectMirror);
1452 ObjectMirror val2 = frame.GetValue (frame.Method.GetParameters ()[0]) as ObjectMirror;
1454 TestSetValue (o, "field_i", 22);
1455 TestSetValue (o, "field_bool1", false);
1456 TestSetValue (o, "field_bool2", true);
1457 TestSetValue (o, "field_char", 'B');
1458 TestSetValue (o, "field_byte", (byte)129);
1459 TestSetValue (o, "field_sbyte", (sbyte)-33);
1460 TestSetValue (o, "field_short", (short)(Int16.MaxValue - 5));
1461 TestSetValue (o, "field_ushort", (ushort)(UInt16.MaxValue - 5));
1462 TestSetValue (o, "field_long", Int64.MaxValue - 5);
1463 TestSetValue (o, "field_ulong", (ulong)(UInt64.MaxValue - 5));
1464 TestSetValue (o, "field_float", 6.28f);
1465 TestSetValue (o, "field_double", 6.28);
1466 TestSetValue (o, "static_i", 23);
1467 TestSetValue (o, "field_s", "CDEF");
1472 f = o.GetValue (o.Type.GetField ("field_intptr"));
1473 Assert.IsInstanceOfType (typeof (StructMirror), f);
1474 AssertValue (Int32.MaxValue - 5, (f as StructMirror).Fields [0]);
1477 FieldInfoMirror field = o.Type.GetField ("field_enum");
1478 f = o.GetValue (field);
1479 (f as EnumMirror).Value = 5;
1480 o.SetValue (field, f);
1481 f = o.GetValue (field);
1482 Assert.AreEqual (5, (f as EnumMirror).Value);
1485 o.SetValue (o.Type.GetField ("field_s"), vm.CreateValue (null));
1486 f = o.GetValue (o.Type.GetField ("field_s"));
1487 AssertValue (null, f);
1490 field = o.Type.GetField ("generic_field_struct");
1491 f = o.GetValue (field);
1492 o.SetValue (field, f);
1495 field = o.Type.GetField ("field_nullable");
1496 f = o.GetValue (field);
1497 AssertValue (0, (f as StructMirror).Fields [0]);
1498 AssertValue (false, (f as StructMirror).Fields [1]);
1499 o.SetValue (field, vm.CreateValue (6));
1500 f = o.GetValue (field);
1501 AssertValue (6, (f as StructMirror).Fields [0]);
1502 AssertValue (true, (f as StructMirror).Fields [1]);
1503 o.SetValue (field, vm.CreateValue (null));
1504 f = o.GetValue (field);
1505 AssertValue (0, (f as StructMirror).Fields [0]);
1506 AssertValue (false, (f as StructMirror).Fields [1]);
1508 // Argument checking
1509 AssertThrows<ArgumentNullException> (delegate () {
1510 o.SetValues (null, new Value [0]);
1513 AssertThrows<ArgumentNullException> (delegate () {
1514 o.SetValues (new FieldInfoMirror [0], null);
1517 AssertThrows<ArgumentNullException> (delegate () {
1518 o.SetValues (new FieldInfoMirror [] { null }, new Value [1] { null });
1521 // vtype with a wrong type
1522 AssertThrows<ArgumentException> (delegate () {
1523 o.SetValue (o.Type.GetField ("field_struct"), o.GetValue (o.Type.GetField ("field_enum")));
1526 // reference type not assignment compatible
1527 AssertThrows<ArgumentException> (delegate () {
1528 o.SetValue (o.Type.GetField ("field_class"), o);
1531 // field of another class
1532 AssertThrows<ArgumentException> (delegate () {
1533 o.SetValue (val2.Type.GetField ("field_j"), vm.CreateValue (1));
1538 public void Type_SetValue () {
1539 var e = run_until ("o1");
1540 var frame = e.Thread.GetFrames () [0];
1543 object val = frame.GetThis ();
1544 Assert.IsTrue (val is ObjectMirror);
1545 Assert.AreEqual ("Tests", (val as ObjectMirror).Type.Name);
1546 ObjectMirror o = (val as ObjectMirror);
1548 ObjectMirror val2 = frame.GetValue (frame.Method.GetParameters ()[0]) as ObjectMirror;
1550 o.Type.SetValue (o.Type.GetField ("static_i"), vm.CreateValue (55));
1551 f = o.Type.GetValue (o.Type.GetField ("static_i"));
1552 AssertValue (55, f);
1554 o.Type.SetValue (o.Type.GetField ("static_s"), vm.RootDomain.CreateString ("B"));
1555 f = o.Type.GetValue (o.Type.GetField ("static_s"));
1556 AssertValue ("B", f);
1558 // Argument checking
1559 AssertThrows<ArgumentNullException> (delegate () {
1560 o.Type.SetValue (null, vm.CreateValue (0));
1563 AssertThrows<ArgumentNullException> (delegate () {
1564 o.Type.SetValue (o.Type.GetField ("static_i"), null);
1567 // field of another class
1568 AssertThrows<ArgumentException> (delegate () {
1569 o.SetValue (val2.Type.GetField ("field_j"), vm.CreateValue (1));
1574 public void TypeInfo () {
1575 Event e = run_until ("ti2");
1576 StackFrame frame = e.Thread.GetFrames () [0];
1581 t = frame.Method.GetParameters ()[0].ParameterType;
1583 Assert.AreEqual ("String[]", t.Name);
1584 Assert.AreEqual ("string[]", t.CSharpName);
1585 Assert.AreEqual ("Array", t.BaseType.Name);
1586 Assert.AreEqual (true, t.HasElementType);
1587 Assert.AreEqual (true, t.IsArray);
1588 Assert.AreEqual (1, t.GetArrayRank ());
1589 Assert.AreEqual ("String", t.GetElementType ().Name);
1591 t = frame.Method.GetParameters ()[2].ParameterType;
1593 Assert.AreEqual ("Int32[,]", t.Name);
1595 //Assert.AreEqual ("int[,]", t.CSharpName);
1596 Assert.AreEqual ("Array", t.BaseType.Name);
1597 Assert.AreEqual (true, t.HasElementType);
1598 Assert.AreEqual (true, t.IsArray);
1599 Assert.AreEqual (2, t.GetArrayRank ());
1600 Assert.AreEqual ("Int32", t.GetElementType ().Name);
1603 t = frame.Method.GetParameters ()[3].ParameterType;
1605 //Assert.AreEqual ("Int32&", t.Name);
1606 //Assert.AreEqual (true, t.IsByRef);
1607 //Assert.AreEqual (true, t.HasElementType);
1610 t = frame.Method.GetParameters ()[4].ParameterType;
1612 //Assert.AreEqual ("Int32*", t.Name);
1613 Assert.AreEqual (true, t.IsPointer);
1614 Assert.AreEqual (true, t.HasElementType);
1615 Assert.AreEqual ("Int32", t.GetElementType ().Name);
1616 Assert.AreEqual (false, t.IsPrimitive);
1619 t = frame.Method.GetParameters ()[5].ParameterType;
1620 Assert.AreEqual (true, t.IsPrimitive);
1623 t = frame.Method.GetParameters ()[6].ParameterType;
1624 Assert.AreEqual ("AStruct", t.Name);
1625 Assert.AreEqual (false, t.IsPrimitive);
1626 Assert.AreEqual (true, t.IsValueType);
1627 Assert.AreEqual (false, t.IsClass);
1630 t = frame.Method.GetParameters ()[7].ParameterType;
1631 Assert.AreEqual ("Tests", t.Name);
1632 var nested = (from nt in t.GetNestedTypes () where nt.IsNestedPublic select nt).ToArray ();
1633 Assert.AreEqual (1, nested.Length);
1634 Assert.AreEqual ("NestedClass", nested [0].Name);
1635 Assert.IsTrue (t.BaseType.IsAssignableFrom (t));
1636 Assert.IsTrue (!t.IsAssignableFrom (t.BaseType));
1638 // generic instances
1639 t = frame.Method.GetParameters ()[9].ParameterType;
1640 Assert.AreEqual ("GClass`1", t.Name);
1641 Assert.IsTrue (t.IsGenericType);
1642 Assert.IsFalse (t.IsGenericTypeDefinition);
1644 var args = t.GetGenericArguments ();
1645 Assert.AreEqual (1, args.Length);
1646 Assert.AreEqual ("Int32", args [0].Name);
1648 // generic type definitions
1649 var gtd = t.GetGenericTypeDefinition ();
1650 Assert.AreEqual ("GClass`1", gtd.Name);
1651 Assert.IsTrue (gtd.IsGenericType);
1652 Assert.IsTrue (gtd.IsGenericTypeDefinition);
1653 Assert.AreEqual (gtd, gtd.GetGenericTypeDefinition ());
1655 args = gtd.GetGenericArguments ();
1656 Assert.AreEqual (1, args.Length);
1657 Assert.AreEqual ("T", args [0].Name);
1660 t = frame.Method.GetParameters ()[10].ParameterType;
1661 Assert.AreEqual ("AnEnum", t.Name);
1662 Assert.IsTrue (t.IsEnum);
1663 Assert.AreEqual ("Int32", t.EnumUnderlyingType.Name);
1666 t = frame.Method.GetParameters ()[11].ParameterType;
1667 Assert.AreEqual ("TypedReference", t.Name);
1670 t = frame.Method.GetParameters ()[7].ParameterType;
1672 var props = t.GetProperties ();
1673 Assert.AreEqual (3, props.Length);
1674 foreach (PropertyInfoMirror prop in props) {
1675 ParameterInfoMirror[] indexes = prop.GetIndexParameters ();
1677 if (prop.Name == "IntProperty") {
1678 Assert.AreEqual ("Int32", prop.PropertyType.Name);
1679 Assert.AreEqual ("get_IntProperty", prop.GetGetMethod ().Name);
1680 Assert.AreEqual ("set_IntProperty", prop.GetSetMethod ().Name);
1681 Assert.AreEqual (0, indexes.Length);
1682 } else if (prop.Name == "ReadOnlyProperty") {
1683 Assert.AreEqual ("Int32", prop.PropertyType.Name);
1684 Assert.AreEqual ("get_ReadOnlyProperty", prop.GetGetMethod ().Name);
1685 Assert.AreEqual (null, prop.GetSetMethod ());
1686 Assert.AreEqual (0, indexes.Length);
1687 } else if (prop.Name == "IndexedProperty") {
1688 Assert.AreEqual (1, indexes.Length);
1689 Assert.AreEqual ("Int32", indexes [0].ParameterType.Name);
1693 // custom attributes
1694 t = frame.Method.GetParameters ()[8].ParameterType;
1695 Assert.AreEqual ("Tests2", t.Name);
1696 var attrs = t.GetCustomAttributes (true);
1697 Assert.AreEqual (5, attrs.Length);
1698 foreach (var attr in attrs) {
1699 if (attr.Constructor.DeclaringType.Name == "DebuggerDisplayAttribute") {
1700 Assert.AreEqual (1, attr.ConstructorArguments.Count);
1701 Assert.AreEqual ("Tests", attr.ConstructorArguments [0].Value);
1702 Assert.AreEqual (2, attr.NamedArguments.Count);
1703 Assert.AreEqual ("Name", attr.NamedArguments [0].Property.Name);
1704 Assert.AreEqual ("FOO", attr.NamedArguments [0].TypedValue.Value);
1705 Assert.AreEqual ("Target", attr.NamedArguments [1].Property.Name);
1706 Assert.IsInstanceOfType (typeof (TypeMirror), attr.NamedArguments [1].TypedValue.Value);
1707 Assert.AreEqual ("Int32", (attr.NamedArguments [1].TypedValue.Value as TypeMirror).Name);
1708 } else if (attr.Constructor.DeclaringType.Name == "DebuggerTypeProxyAttribute") {
1709 Assert.AreEqual (1, attr.ConstructorArguments.Count);
1710 Assert.IsInstanceOfType (typeof (TypeMirror), attr.ConstructorArguments [0].Value);
1711 Assert.AreEqual ("Tests", (attr.ConstructorArguments [0].Value as TypeMirror).Name);
1712 } else if (attr.Constructor.DeclaringType.Name == "BAttribute") {
1713 Assert.AreEqual (2, attr.NamedArguments.Count);
1714 Assert.AreEqual ("afield", attr.NamedArguments [0].Field.Name);
1715 Assert.AreEqual ("bfield", attr.NamedArguments [1].Field.Name);
1716 } else if (attr.Constructor.DeclaringType.Name == "ClassInterfaceAttribute") {
1717 // inherited from System.Object
1718 //} else if (attr.Constructor.DeclaringType.Name == "Serializable") {
1719 // inherited from System.Object
1720 } else if (attr.Constructor.DeclaringType.Name == "ComVisibleAttribute") {
1721 // inherited from System.Object
1723 Assert.Fail (attr.Constructor.DeclaringType.Name);
1727 var assembly = entry_point.DeclaringType.Assembly;
1728 var type = assembly.GetType ("Tests4");
1729 Assert.IsFalse (type.IsInitialized);
1733 public void FieldInfo () {
1734 Event e = run_until ("ti2");
1735 StackFrame frame = e.Thread.GetFrames () [0];
1739 t = frame.Method.GetParameters ()[8].ParameterType;
1740 Assert.AreEqual ("Tests2", t.Name);
1742 var fi = t.GetField ("field_j");
1743 var attrs = fi.GetCustomAttributes (true);
1744 Assert.AreEqual (1, attrs.Length);
1745 var attr = attrs [0];
1746 Assert.AreEqual ("DebuggerBrowsableAttribute", attr.Constructor.DeclaringType.Name);
1747 Assert.AreEqual (1, attr.ConstructorArguments.Count);
1748 Assert.IsInstanceOfType (typeof (EnumMirror), attr.ConstructorArguments [0].Value);
1749 Assert.AreEqual ((int)System.Diagnostics.DebuggerBrowsableState.Collapsed, (attr.ConstructorArguments [0].Value as EnumMirror).Value);
1753 public void PropertyInfo () {
1754 Event e = run_until ("ti2");
1755 StackFrame frame = e.Thread.GetFrames () [0];
1759 t = frame.Method.GetParameters ()[8].ParameterType;
1760 Assert.AreEqual ("Tests2", t.Name);
1762 var pi = t.GetProperty ("AProperty");
1763 var attrs = pi.GetCustomAttributes (true);
1764 Assert.AreEqual (1, attrs.Length);
1765 var attr = attrs [0];
1766 Assert.AreEqual ("DebuggerBrowsableAttribute", attr.Constructor.DeclaringType.Name);
1767 Assert.AreEqual (1, attr.ConstructorArguments.Count);
1768 Assert.IsInstanceOfType (typeof (EnumMirror), attr.ConstructorArguments [0].Value);
1769 Assert.AreEqual ((int)System.Diagnostics.DebuggerBrowsableState.Collapsed, (attr.ConstructorArguments [0].Value as EnumMirror).Value);
1773 [Category ("only5")]
1774 public void Type_GetValue () {
1775 Event e = run_until ("o1");
1776 StackFrame frame = e.Thread.GetFrames () [0];
1778 ObjectMirror o = (frame.GetThis () as ObjectMirror);
1780 TypeMirror t = o.Type;
1782 ObjectMirror val2 = frame.GetValue (frame.Method.GetParameters ()[0]) as ObjectMirror;
1785 object f = t.GetValue (o.Type.GetField ("static_i"));
1786 AssertValue (55, f);
1788 f = t.GetValue (o.Type.GetField ("static_s"));
1789 AssertValue ("A", f);
1791 // literal static fields
1792 f = t.GetValue (o.Type.GetField ("literal_i"));
1793 AssertValue (56, f);
1795 f = t.GetValue (o.Type.GetField ("literal_s"));
1796 AssertValue ("B", f);
1798 // Inherited static fields
1799 TypeMirror parent = t.BaseType;
1800 f = t.GetValue (parent.GetField ("base_static_i"));
1801 AssertValue (57, f);
1803 f = t.GetValue (parent.GetField ("base_static_s"));
1804 AssertValue ("C", f);
1806 // thread static field
1807 f = t.GetValue (t.GetField ("tls_i"), e.Thread);
1808 AssertValue (42, f);
1810 // Argument checking
1811 AssertThrows<ArgumentNullException> (delegate () {
1816 AssertThrows<ArgumentException> (delegate () {
1817 t.GetValue (o.Type.GetField ("field_i"));
1820 // field on another type
1821 AssertThrows<ArgumentException> (delegate () {
1822 t.GetValue (val2.Type.GetField ("static_field_j"));
1825 // special static field
1826 AssertThrows<ArgumentException> (delegate () {
1827 t.GetValue (t.GetField ("tls_i"));
1832 public void Type_GetValues () {
1833 Event e = run_until ("o1");
1834 StackFrame frame = e.Thread.GetFrames () [0];
1836 ObjectMirror o = (frame.GetThis () as ObjectMirror);
1838 TypeMirror t = o.Type;
1841 object[] vals = t.GetValues (new FieldInfoMirror [] { t.GetField ("static_i"), t.GetField ("static_s") });
1842 object f = vals [0];
1843 AssertValue (55, f);
1846 AssertValue ("A", f);
1848 // Argument checking
1849 AssertThrows<ArgumentNullException> (delegate () {
1853 AssertThrows<ArgumentNullException> (delegate () {
1854 t.GetValues (new FieldInfoMirror [] { null });
1859 public void ObjRefs () {
1860 Event e = run_until ("objrefs1");
1861 StackFrame frame = e.Thread.GetFrames () [0];
1863 ObjectMirror o = frame.GetThis () as ObjectMirror;
1864 ObjectMirror child = o.GetValue (o.Type.GetField ("child")) as ObjectMirror;
1866 Assert.IsTrue (child.Address != 0);
1868 // Check that object references are internalized correctly
1869 Assert.AreEqual (o, frame.GetThis ());
1871 run_until ("objrefs2");
1873 // child should be gc'd now
1874 // This is not deterministic
1875 //Assert.IsTrue (child.IsCollected);
1878 * No longer works since Type is read eagerly
1881 AssertThrows<ObjectCollectedException> (delegate () {
1882 TypeMirror t = child.Type;
1886 AssertThrows<ObjectCollectedException> (delegate () {
1887 long addr = child.Address;
1893 public void Type_GetObject () {
1894 Event e = run_until ("o1");
1895 StackFrame frame = e.Thread.GetFrames () [0];
1897 ObjectMirror o = (frame.GetThis () as ObjectMirror);
1899 TypeMirror t = o.Type;
1901 Assert.AreEqual ("RuntimeType", t.GetTypeObject ().Type.Name);
1905 public void VTypes () {
1906 Event e = run_until ("vtypes1");
1907 StackFrame frame = e.Thread.GetFrames () [0];
1910 ObjectMirror o = frame.GetThis () as ObjectMirror;
1911 var obj = o.GetValue (o.Type.GetField ("field_struct"));
1912 Assert.IsTrue (obj is StructMirror);
1913 var s = obj as StructMirror;
1914 Assert.AreEqual ("AStruct", s.Type.Name);
1915 AssertValue (42, s ["i"]);
1917 AssertValue ("S", obj);
1918 AssertValue (43, s ["k"]);
1919 obj = o.GetValue (o.Type.GetField ("field_boxed_struct"));
1920 Assert.IsTrue (obj is StructMirror);
1921 s = obj as StructMirror;
1922 Assert.AreEqual ("AStruct", s.Type.Name);
1923 AssertValue (42, s ["i"]);
1925 // Check decoding of nested structs (#14942)
1926 obj = o.GetValue (o.Type.GetField ("nested_struct"));
1927 o.SetValue (o.Type.GetField ("nested_struct"), obj);
1929 // Check round tripping of boxed struct fields (#12354)
1930 obj = o.GetValue (o.Type.GetField ("boxed_struct_field"));
1931 o.SetValue (o.Type.GetField ("boxed_struct_field"), obj);
1932 obj = o.GetValue (o.Type.GetField ("boxed_struct_field"));
1933 s = obj as StructMirror;
1934 AssertValue (1, s ["key"]);
1936 Assert.IsTrue (obj is StructMirror);
1937 s = obj as StructMirror;
1938 AssertValue (42, s ["m_value"]);
1940 // vtypes as arguments
1941 s = frame.GetArgument (0) as StructMirror;
1942 AssertValue (44, s ["i"]);
1944 AssertValue ("T", obj);
1945 AssertValue (45, s ["k"]);
1947 // vtypes as array entries
1948 var arr = frame.GetArgument (1) as ArrayMirror;
1950 Assert.IsTrue (obj is StructMirror);
1951 s = obj as StructMirror;
1952 AssertValue (1, s ["i"]);
1953 AssertValue ("S1", s ["s"]);
1955 Assert.IsTrue (obj is StructMirror);
1956 s = obj as StructMirror;
1957 AssertValue (2, s ["i"]);
1958 AssertValue ("S2", s ["s"]);
1961 var typedref = frame.GetArgument (2) as StructMirror;
1962 Assert.IsTrue (typedref is StructMirror);
1964 // Argument checking
1965 s = frame.GetArgument (0) as StructMirror;
1966 AssertThrows<ArgumentException> (delegate () {
1970 // generic vtype instances
1971 o = frame.GetThis () as ObjectMirror;
1972 obj = o.GetValue (o.Type.GetField ("generic_field_struct"));
1973 Assert.IsTrue (obj is StructMirror);
1974 s = obj as StructMirror;
1975 Assert.AreEqual ("GStruct`1", s.Type.Name);
1976 AssertValue (42, s ["i"]);
1978 // this on vtype methods
1979 e = run_until ("vtypes2");
1980 e = step_until (e.Thread, "foo");
1982 frame = e.Thread.GetFrames () [0];
1984 Assert.AreEqual ("foo", (e as StepEvent).Method.Name);
1985 obj = frame.GetThis ();
1987 Assert.IsTrue (obj is StructMirror);
1988 s = obj as StructMirror;
1989 AssertValue (44, s ["i"]);
1990 AssertValue ("T", s ["s"]);
1991 AssertValue (45, s ["k"]);
1994 s ["i"] = vm.CreateValue (55);
1996 obj = frame.GetThis ();
1997 Assert.IsTrue (obj is StructMirror);
1998 s = obj as StructMirror;
1999 AssertValue (55, s ["i"]);
2000 AssertValue ("T", s ["s"]);
2001 AssertValue (45, s ["k"]);
2003 // this on static vtype methods
2004 e = run_until ("vtypes3");
2005 e = step_until (e.Thread, "static_foo");
2007 frame = e.Thread.GetFrames () [0];
2009 Assert.AreEqual ("static_foo", (e as StepEvent).Method.Name);
2010 obj = frame.GetThis ();
2011 AssertValue (null, obj);
2013 // vtypes which reference themselves recursively
2014 e = run_until ("vtypes4_2");
2015 frame = e.Thread.GetFrames () [0];
2017 Assert.IsTrue (frame.GetArgument (0) is StructMirror);
2021 public void AssemblyInfo () {
2022 Event e = run_until ("single_stepping");
2024 StackFrame frame = e.Thread.GetFrames () [0];
2026 var aname = frame.Method.DeclaringType.Assembly.GetName ();
2027 Assert.AreEqual ("dtest-app, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null", aname.ToString ());
2029 ModuleMirror m = frame.Method.DeclaringType.Module;
2031 Assert.AreEqual ("dtest-app.exe", m.Name);
2032 Assert.AreEqual ("dtest-app.exe", m.ScopeName);
2033 Assert.IsTrue (m.FullyQualifiedName.IndexOf ("dtest-app.exe") != -1);
2034 Guid guid = m.ModuleVersionId;
2035 Assert.AreEqual (frame.Method.DeclaringType.Assembly, m.Assembly);
2036 Assert.AreEqual (frame.Method.DeclaringType.Assembly.ManifestModule, m);
2038 // This is no longer true on 4.0
2039 //Assert.AreEqual ("Assembly", frame.Method.DeclaringType.Assembly.GetAssemblyObject ().Type.Name);
2041 TypeMirror t = vm.RootDomain.Corlib.GetType ("System.Diagnostics.DebuggerDisplayAttribute");
2042 Assert.AreEqual ("DebuggerDisplayAttribute", t.Name);
2046 public void LocalsInfo () {
2047 Event e = run_until ("locals2");
2049 StackFrame frame = e.Thread.GetFrames () [0];
2051 var locals = frame.Method.GetLocals ();
2052 Assert.AreEqual (9, locals.Length);
2053 for (int i = 0; i < 9; ++i) {
2054 if (locals [i].Name == "args") {
2055 Assert.IsTrue (locals [i].IsArg);
2056 Assert.AreEqual ("String[]", locals [i].Type.Name);
2057 } else if (locals [i].Name == "arg") {
2058 Assert.IsTrue (locals [i].IsArg);
2059 Assert.AreEqual ("Int32", locals [i].Type.Name);
2060 } else if (locals [i].Name == "i") {
2061 Assert.IsFalse (locals [i].IsArg);
2062 Assert.AreEqual ("Int64", locals [i].Type.Name);
2063 } else if (locals [i].Name == "j") {
2064 Assert.IsFalse (locals [i].IsArg);
2065 Assert.AreEqual ("Int32", locals [i].Type.Name);
2066 } else if (locals [i].Name == "s") {
2067 Assert.IsFalse (locals [i].IsArg);
2068 Assert.AreEqual ("String", locals [i].Type.Name);
2069 } else if (locals [i].Name == "t") {
2071 Assert.IsTrue (locals [i].IsArg);
2072 Assert.AreEqual ("String", locals [i].Type.Name);
2073 } else if (locals [i].Name == "rs") {
2074 Assert.IsTrue (locals [i].IsArg);
2075 Assert.AreEqual ("String", locals [i].Type.Name);
2076 } else if (locals [i].Name == "astruct") {
2077 } else if (locals [i].Name == "alist") {
2083 var scopes = frame.Method.GetScopes ();
2084 Assert.AreEqual (2, scopes.Length);
2087 Event step_once () {
2089 var e = GetNextEvent ();
2090 Assert.IsTrue (e is StepEvent);
2094 Event step_into () {
2095 step_req.Disable ();
2096 step_req.Depth = StepDepth.Into;
2098 return step_once ();
2101 Event step_over () {
2102 step_req.Disable ();
2103 step_req.Depth = StepDepth.Over;
2105 return step_once ();
2109 step_req.Disable ();
2110 step_req.Depth = StepDepth.Out;
2112 return step_once ();
2115 Event step_once_or_breakpoint () {
2117 var e = GetNextEvent ();
2118 Assert.IsTrue (e is StepEvent || e is BreakpointEvent);
2122 Event step_over_or_breakpoint () {
2123 step_req.Disable ();
2124 step_req.Depth = StepDepth.Over;
2126 return step_once_or_breakpoint ();
2129 Event step_out_or_breakpoint () {
2130 step_req.Disable ();
2131 step_req.Depth = StepDepth.Out;
2133 return step_once_or_breakpoint ();
2137 public void Locals () {
2138 var be = run_until ("locals1");
2140 StackFrame frame = be.Thread.GetFrames () [0];
2141 MethodMirror m1 = frame.Method;
2143 // Compiler generated byref local
2144 foreach (var l in m1.GetLocals ()) {
2145 // The byval flag is hidden from the type
2146 if (l.Name != "ri" && l.Type.Name == "Double")
2147 AssertValue (null, frame.GetValue (l));
2150 be = run_until ("locals2");
2152 frame = be.Thread.GetFrames () [0];
2154 object val = frame.GetValue (frame.Method.GetLocal ("i"));
2155 AssertValue (0, val);
2157 var req = create_step (be);
2164 var e = step_once ();
2165 Assert.AreEqual ("locals2", (e as StepEvent).Method.Name);
2167 // Execute s = "AB";
2169 Assert.AreEqual ("locals2", (e as StepEvent).Method.Name);
2171 frame = e.Thread.GetFrames () [0];
2173 val = frame.GetValue (frame.Method.GetLocal ("i"));
2174 AssertValue (42, val);
2176 LocalVariable[] locals = frame.Method.GetLocals ();
2177 var vals = frame.GetValues (locals);
2178 Assert.AreEqual (locals.Length, vals.Length);
2179 for (int i = 0; i < locals.Length; ++i) {
2180 if (locals [i].Name == "i")
2181 AssertValue (42, vals [i]);
2182 if (locals [i].Name == "s")
2183 AssertValue ("AB", vals [i]);
2184 if (locals [i].Name == "t")
2185 AssertValue ("ABC", vals [i]);
2186 if (locals [i].Name == "alist") {
2190 // Argument checking
2193 AssertThrows<ArgumentNullException> (delegate () {
2194 frame.GetValue ((LocalVariable)null);
2196 // GetValue () local from another method
2197 AssertThrows<ArgumentException> (delegate () {
2198 frame.GetValue (m1.GetLocal ("foo"));
2202 AssertThrows<ArgumentNullException> (delegate () {
2203 frame.GetValue ((ParameterInfoMirror)null);
2205 // GetValue () local from another method
2206 AssertThrows<ArgumentException> (delegate () {
2207 frame.GetValue (m1.GetParameters ()[0]);
2210 // GetValues () null
2211 AssertThrows<ArgumentNullException> (delegate () {
2212 frame.GetValues (null);
2214 // GetValues () embedded null
2215 AssertThrows<ArgumentNullException> (delegate () {
2216 frame.GetValues (new LocalVariable [] { null });
2218 // GetValues () local from another method
2219 AssertThrows<ArgumentException> (delegate () {
2220 frame.GetValues (new LocalVariable [] { m1.GetLocal ("foo") });
2223 AssertThrows<ArgumentException> (delegate () {
2224 val = frame.GetValue (frame.Method.ReturnParameter);
2227 // invalid stack frames
2229 e = GetNextEvent ();
2230 Assert.IsTrue (e is StepEvent);
2231 Assert.AreEqual ("locals2", (e as StepEvent).Method.Name);
2233 AssertThrows<InvalidStackFrameException> (delegate () {
2234 frame.GetValue (frame.Method.GetLocal ("i"));
2240 be = run_until ("locals7");
2242 req = create_step (be);
2248 // Test that locals are initialized
2249 frame = e.Thread.GetFrames () [0];
2250 val = frame.GetValue (frame.Method.GetLocal ("t"));
2251 AssertValue (0, val);
2255 Assert.AreEqual ("locals7", (e as StepEvent).Method.Name);
2259 Assert.AreEqual ("locals7", (e as StepEvent).Method.Name);
2261 frame = e.Thread.GetFrames () [0];
2262 val = frame.GetValue (frame.Method.GetParameters ()[0]);
2263 AssertValue (22, val);
2264 val = frame.GetValue (frame.Method.GetLocal ("t"));
2265 AssertValue (22, val);
2266 val = frame.GetValue (frame.Method.GetLocal ("t2"));
2267 AssertValue (22, val);
2271 public void GetVisibleVariables () {
2272 Event e = run_until ("locals4");
2275 var locals = e.Thread.GetFrames ()[1].GetVisibleVariables ();
2276 Assert.AreEqual (2, locals.Count);
2277 var loc = locals.First (l => l.Name == "i");
2278 Assert.AreEqual ("Int64", loc.Type.Name);
2279 loc = locals.First (l => l.Name == "s");
2280 Assert.AreEqual ("String", loc.Type.Name);
2282 loc = e.Thread.GetFrames ()[1].GetVisibleVariableByName ("i");
2283 Assert.AreEqual ("i", loc.Name);
2284 Assert.AreEqual ("Int64", loc.Type.Name);
2286 e = run_until ("locals5");
2289 locals = e.Thread.GetFrames ()[1].GetVisibleVariables ();
2290 Assert.AreEqual (2, locals.Count);
2291 loc = locals.First (l => l.Name == "i");
2292 Assert.AreEqual ("String", loc.Type.Name);
2293 loc = locals.First (l => l.Name == "s");
2294 Assert.AreEqual ("String", loc.Type.Name);
2296 loc = e.Thread.GetFrames ()[1].GetVisibleVariableByName ("i");
2297 Assert.AreEqual ("i", loc.Name);
2298 Assert.AreEqual ("String", loc.Type.Name);
2300 // Variable in another scope
2301 loc = e.Thread.GetFrames ()[1].GetVisibleVariableByName ("j");
2302 Assert.IsNull (loc);
2306 public void Exit () {
2311 var e = GetNextEvent ();
2312 Assert.IsInstanceOfType (typeof (VMDeathEvent), e);
2314 Assert.AreEqual (5, (e as VMDeathEvent).ExitCode);
2317 /* Could be a remote vm with no process */
2320 Assert.AreEqual (5, p.ExitCode);
2323 AssertThrows<VMDisconnectedException> (delegate () {
2332 public void Dispose () {
2337 var e = GetNextEvent ();
2338 Assert.IsInstanceOfType (typeof (VMDisconnectEvent), e);
2341 /* Could be a remote vm with no process */
2344 Assert.AreEqual (3, p.ExitCode);
2347 AssertThrows<VMDisconnectedException> (delegate () {
2356 public void ColumnNumbers () {
2357 Event e = run_until ("line_numbers");
2359 // FIXME: Merge this with LineNumbers () when its fixed
2361 step_req = create_step (e);
2362 step_req.Depth = StepDepth.Into;
2370 e = GetNextEvent ();
2371 Assert.IsTrue (e is StepEvent);
2372 if (e.Thread.GetFrames ()[0].Method.Name == "ln1")
2376 // Do an additional step over so we are not on the beginning line of the method
2377 step_req.Disable ();
2378 step_req.Depth = StepDepth.Over;
2381 e = GetNextEvent ();
2382 Assert.IsTrue (e is StepEvent);
2384 l = e.Thread.GetFrames ()[0].Location;
2386 Assert.AreEqual (3, l.ColumnNumber);
2388 step_req.Disable ();
2392 // Broken by mcs+runtime changes (#5438)
2393 [Category("NotWorking")]
2394 public void LineNumbers () {
2395 Event e = run_until ("line_numbers");
2397 step_req = create_step (e);
2398 step_req.Depth = StepDepth.Into;
2405 e = GetNextEvent ();
2406 Assert.IsTrue (e is StepEvent);
2408 l = e.Thread.GetFrames ()[0].Location;
2410 Assert.IsTrue (l.SourceFile.IndexOf ("dtest-app.cs") != -1);
2411 Assert.AreEqual ("ln1", l.Method.Name);
2414 using (FileStream fs = new FileStream (l.SourceFile, FileMode.Open, FileAccess.Read)) {
2415 MD5 md5 = MD5.Create ();
2416 var hash = md5.ComputeHash (fs);
2418 for (int i = 0; i < 16; ++i)
2419 Assert.AreEqual (hash [i], l.SourceFileHash [i]);
2422 int line_base = l.LineNumber;
2425 e = GetNextEvent ();
2426 Assert.IsTrue (e is StepEvent);
2427 l = e.Thread.GetFrames ()[0].Location;
2428 Assert.AreEqual ("ln2", l.Method.Name);
2429 Assert.AreEqual (line_base + 6, l.LineNumber);
2432 e = GetNextEvent ();
2433 Assert.IsTrue (e is StepEvent);
2434 l = e.Thread.GetFrames ()[0].Location;
2435 Assert.AreEqual ("ln1", l.Method.Name);
2436 Assert.AreEqual (line_base + 1, l.LineNumber);
2439 e = GetNextEvent ();
2440 Assert.IsTrue (e is StepEvent);
2441 l = e.Thread.GetFrames ()[0].Location;
2442 Assert.AreEqual ("ln3", l.Method.Name);
2443 Assert.AreEqual (line_base + 11, l.LineNumber);
2446 e = GetNextEvent ();
2447 Assert.IsTrue (e is StepEvent);
2448 l = e.Thread.GetFrames ()[0].Location;
2449 Assert.AreEqual ("ln3", l.Method.Name);
2450 Assert.IsTrue (l.SourceFile.EndsWith ("FOO"));
2451 Assert.AreEqual (55, l.LineNumber);
2454 e = GetNextEvent ();
2455 Assert.IsTrue (e is StepEvent);
2456 l = e.Thread.GetFrames ()[0].Location;
2457 Assert.AreEqual ("ln1", l.Method.Name);
2458 Assert.AreEqual (line_base + 2, l.LineNumber);
2460 // GetSourceFiles ()
2461 string[] sources = l.Method.DeclaringType.GetSourceFiles ();
2462 Assert.AreEqual (2, sources.Length);
2463 Assert.AreEqual ("dtest-app.cs", sources [0]);
2464 Assert.AreEqual ("FOO", sources [1]);
2466 sources = l.Method.DeclaringType.GetSourceFiles (true);
2467 Assert.AreEqual (2, sources.Length);
2468 Assert.IsTrue (sources [0].EndsWith ("dtest-app.cs"));
2469 Assert.IsTrue (sources [1].EndsWith ("FOO"));
2473 public void Suspend () {
2476 Start (new string [] { "dtest-app.exe", "suspend-test" });
2478 Event e = run_until ("suspend");
2480 ThreadMirror main = e.Thread;
2488 // The debuggee should be suspended while it is running the infinite loop
2490 StackFrame frame = main.GetFrames ()[0];
2491 Assert.AreEqual ("suspend", frame.Method.Name);
2495 // resuming when not suspended
2496 AssertThrows<InvalidOperationException> (delegate () {
2506 public void AssemblyLoad () {
2507 Event e = run_until ("assembly_load");
2509 var load_req = vm.CreateAssemblyLoadRequest ();
2514 e = GetNextEvent ();
2515 Assert.IsInstanceOfType (typeof (AssemblyLoadEvent), e);
2516 Assert.IsTrue ((e as AssemblyLoadEvent).Assembly.Location.EndsWith ("System.dll"));
2518 var frames = e.Thread.GetFrames ();
2519 Assert.IsTrue (frames.Length > 0);
2520 Assert.AreEqual ("assembly_load", frames [0].Method.Name);
2524 public void CreateValue () {
2527 v = vm.CreateValue (1);
2528 Assert.AreEqual (vm, v.VirtualMachine);
2529 Assert.AreEqual (1, v.Value);
2531 v = vm.CreateValue (null);
2532 Assert.AreEqual (vm, v.VirtualMachine);
2533 Assert.AreEqual (null, v.Value);
2535 // Argument checking
2536 AssertThrows <ArgumentException> (delegate () {
2537 v = vm.CreateValue ("FOO");
2542 public void CreateString () {
2543 StringMirror s = vm.RootDomain.CreateString ("ABC");
2545 Assert.AreEqual (vm, s.VirtualMachine);
2546 Assert.AreEqual ("ABC", s.Value);
2547 Assert.AreEqual (vm.RootDomain, s.Domain);
2550 StringBuilder sb = new StringBuilder ();
2551 for (int i = 0; i < 1024; ++i)
2553 s = vm.RootDomain.CreateString (sb.ToString ());
2555 // Argument checking
2556 AssertThrows <ArgumentNullException> (delegate () {
2557 s = vm.RootDomain.CreateString (null);
2562 public void CreateBoxedValue () {
2563 ObjectMirror o = vm.RootDomain.CreateBoxedValue (new PrimitiveValue (vm, 42));
2565 Assert.AreEqual ("Int32", o.Type.Name);
2566 //AssertValue (42, m.GetValue (o.Type.GetField ("m_value")));
2568 // Argument checking
2569 AssertThrows <ArgumentNullException> (delegate () {
2570 vm.RootDomain.CreateBoxedValue (null);
2573 AssertThrows <ArgumentException> (delegate () {
2574 vm.RootDomain.CreateBoxedValue (o);
2579 public void Invoke () {
2580 Event e = run_until ("invoke1");
2582 StackFrame frame = e.Thread.GetFrames () [0];
2584 TypeMirror t = frame.Method.DeclaringType;
2585 ObjectMirror this_obj = (ObjectMirror)frame.GetThis ();
2587 TypeMirror t2 = frame.Method.GetParameters ()[0].ParameterType;
2593 m = t.GetMethod ("invoke_return_void");
2594 v = this_obj.InvokeMethod (e.Thread, m, null);
2598 m = t.GetMethod ("invoke_return_ref");
2599 v = this_obj.InvokeMethod (e.Thread, m, null);
2600 AssertValue ("ABC", v);
2603 m = t.GetMethod ("invoke_return_null");
2604 v = this_obj.InvokeMethod (e.Thread, m, null);
2605 AssertValue (null, v);
2608 m = t.GetMethod ("invoke_return_primitive");
2609 v = this_obj.InvokeMethod (e.Thread, m, null);
2610 AssertValue (42, v);
2613 m = t.GetMethod ("invoke_return_nullable");
2614 v = this_obj.InvokeMethod (e.Thread, m, null);
2615 Assert.IsInstanceOfType (typeof (StructMirror), v);
2616 var s = v as StructMirror;
2617 AssertValue (42, s.Fields [0]);
2618 AssertValue (true, s.Fields [1]);
2620 // pass nullable as this
2621 //m = vm.RootDomain.Corlib.GetType ("System.Object").GetMethod ("ToString");
2622 m = s.Type.GetMethod ("ToString");
2623 v = s.InvokeMethod (e.Thread, m, null);
2625 // return nullable null
2626 m = t.GetMethod ("invoke_return_nullable_null");
2627 v = this_obj.InvokeMethod (e.Thread, m, null);
2628 Assert.IsInstanceOfType (typeof (StructMirror), v);
2629 s = v as StructMirror;
2630 AssertValue (0, s.Fields [0]);
2631 AssertValue (false, s.Fields [1]);
2633 // pass nullable as this
2634 //m = vm.RootDomain.Corlib.GetType ("System.Object").GetMethod ("ToString");
2635 m = s.Type.GetMethod ("ToString");
2636 v = s.InvokeMethod (e.Thread, m, null);
2639 m = t.GetMethod ("invoke_pass_primitive");
2640 Value[] args = new Value [] {
2641 vm.CreateValue ((byte)Byte.MaxValue),
2642 vm.CreateValue ((sbyte)SByte.MaxValue),
2643 vm.CreateValue ((short)1),
2644 vm.CreateValue ((ushort)1),
2645 vm.CreateValue ((int)1),
2646 vm.CreateValue ((uint)1),
2647 vm.CreateValue ((long)1),
2648 vm.CreateValue ((ulong)1),
2649 vm.CreateValue ('A'),
2650 vm.CreateValue (true),
2651 vm.CreateValue (3.14f),
2652 vm.CreateValue (3.14) };
2654 v = this_obj.InvokeMethod (e.Thread, m, args);
2655 AssertValue ((int)Byte.MaxValue + (int)SByte.MaxValue + 1 + 1 + 1 + 1 + 1 + 1 + 'A' + 1 + 3 + 3, v);
2658 m = t.GetMethod ("invoke_pass_ref");
2659 v = this_obj.InvokeMethod (e.Thread, m, new Value [] { vm.RootDomain.CreateString ("ABC") });
2660 AssertValue ("ABC", v);
2663 m = t.GetMethod ("invoke_pass_ref");
2664 v = this_obj.InvokeMethod (e.Thread, m, new Value [] { vm.CreateValue (null) });
2665 AssertValue (null, v);
2668 m = t.GetMethod ("invoke_static_pass_ref");
2669 v = t.InvokeMethod (e.Thread, m, new Value [] { vm.RootDomain.CreateString ("ABC") });
2670 AssertValue ("ABC", v);
2672 // static invoked using ObjectMirror.InvokeMethod
2673 m = t.GetMethod ("invoke_static_pass_ref");
2674 v = this_obj.InvokeMethod (e.Thread, m, new Value [] { vm.RootDomain.CreateString ("ABC") });
2675 AssertValue ("ABC", v);
2677 // method which throws an exception
2679 m = t.GetMethod ("invoke_throws");
2680 v = this_obj.InvokeMethod (e.Thread, m, null);
2682 } catch (InvocationException ex) {
2683 Assert.AreEqual ("Exception", ex.Exception.Type.Name);
2687 m = t.GetMethod ("invoke_out");
2688 var out_task = this_obj.InvokeMethodAsyncWithResult (e.Thread, m, new Value [] { vm.CreateValue (1), vm.CreateValue (null) }, InvokeOptions.ReturnOutArgs);
2689 var out_args = out_task.Result.OutArgs;
2690 AssertValue (5, out_args [0]);
2691 Assert.IsTrue (out_args [1] is ArrayMirror);
2692 Assert.AreEqual (10, (out_args [1] as ArrayMirror).Length);
2694 // without ReturnOutArgs flag
2695 out_task = this_obj.InvokeMethodAsyncWithResult (e.Thread, m, new Value [] { vm.CreateValue (1), vm.CreateValue (null) });
2696 out_args = out_task.Result.OutArgs;
2697 Assert.IsNull (out_args);
2700 m = t.GetMethod (".ctor");
2701 v = t.InvokeMethod (e.Thread, m, null);
2702 Assert.IsInstanceOfType (typeof (ObjectMirror), v);
2703 Assert.AreEqual ("Tests", (v as ObjectMirror).Type.Name);
2706 var cl1 = frame.Method.DeclaringType.Assembly.GetType ("ITest2");
2707 m = cl1.GetMethod ("invoke_iface");
2708 v = this_obj.InvokeMethod (e.Thread, m, null);
2709 AssertValue (42, v);
2712 m = t.BaseType.GetMethod ("virtual_method");
2713 v = this_obj.InvokeMethod (e.Thread, m, null, InvokeOptions.Virtual);
2714 AssertValue ("V2", v);
2716 // virtual call on static method
2717 m = t.GetMethod ("invoke_static_pass_ref");
2718 v = t.InvokeMethod (e.Thread, m, new Value [] { vm.RootDomain.CreateString ("ABC") }, InvokeOptions.Virtual);
2719 AssertValue ("ABC", v);
2722 m = t.GetMethod ("invoke_pass_ref");
2723 var task = this_obj.InvokeMethodAsync (e.Thread, m, new Value [] { vm.RootDomain.CreateString ("ABC") });
2724 AssertValue ("ABC", task.Result);
2727 m = t.GetMethod ("invoke_static_pass_ref");
2728 task = t.InvokeMethodAsync (e.Thread, m, new Value [] { vm.RootDomain.CreateString ("ABC") });
2729 AssertValue ("ABC", task.Result);
2731 // Argument checking
2734 AssertThrows<ArgumentNullException> (delegate {
2735 m = t.GetMethod ("invoke_pass_ref");
2736 v = this_obj.InvokeMethod (null, m, new Value [] { vm.CreateValue (null) });
2740 AssertThrows<ArgumentNullException> (delegate {
2741 v = this_obj.InvokeMethod (e.Thread, null, new Value [] { vm.CreateValue (null) });
2744 // invalid number of arguments
2745 m = t.GetMethod ("invoke_pass_ref");
2746 AssertThrows<ArgumentException> (delegate {
2747 v = this_obj.InvokeMethod (e.Thread, m, null);
2750 // invalid type of argument (ref != primitive)
2751 m = t.GetMethod ("invoke_pass_ref");
2752 AssertThrows<ArgumentException> (delegate {
2753 v = this_obj.InvokeMethod (e.Thread, m, new Value [] { vm.CreateValue (1) });
2756 // invalid type of argument (primitive != primitive)
2757 m = t.GetMethod ("invoke_pass_primitive_2");
2758 AssertThrows<ArgumentException> (delegate {
2759 v = this_obj.InvokeMethod (e.Thread, m, new Value [] { vm.CreateValue (1) });
2762 // invoking a non-static method as static
2763 m = t.GetMethod ("invoke_pass_ref");
2764 AssertThrows<ArgumentException> (delegate {
2765 v = t.InvokeMethod (e.Thread, m, new Value [] { vm.RootDomain.CreateString ("ABC") });
2768 // invoking a method defined in another class
2769 m = t2.GetMethod ("invoke");
2770 AssertThrows<ArgumentException> (delegate {
2771 v = this_obj.InvokeMethod (e.Thread, m, null);
2776 public void InvokeVType () {
2777 Event e = run_until ("invoke1");
2779 StackFrame frame = e.Thread.GetFrames () [0];
2781 var s = frame.GetArgument (1) as StructMirror;
2783 TypeMirror t = s.Type;
2788 // Pass struct as this, receive int
2789 m = t.GetMethod ("invoke_return_int");
2790 v = s.InvokeMethod (e.Thread, m, null);
2791 AssertValue (42, v);
2793 // Pass boxed struct as this
2794 var boxed_this = t.NewInstance () as ObjectMirror;
2795 m = t.GetMethod ("invoke_return_int");
2796 v = boxed_this.InvokeMethod (e.Thread, m, null);
2799 // Pass struct as this, receive intptr
2800 m = t.GetMethod ("invoke_return_intptr");
2801 v = s.InvokeMethod (e.Thread, m, null);
2802 AssertValue (43, v);
2805 m = t.GetMethod ("invoke_static");
2806 v = t.InvokeMethod (e.Thread, m, null);
2809 // Pass generic struct as this
2810 s = frame.GetArgument (2) as StructMirror;
2812 m = t.GetMethod ("invoke_return_int");
2813 v = s.InvokeMethod (e.Thread, m, null);
2814 AssertValue (42, v);
2817 s = frame.GetArgument (1) as StructMirror;
2819 m = t.GetMethods ().First (method => method.Name == ".ctor" && method.GetParameters ().Length == 1);
2820 v = t.InvokeMethod (e.Thread, m, new Value [] { vm.CreateValue (1) });
2821 AssertValue (1, (v as StructMirror)["i"]);
2823 // Invoke a method which changes state
2824 s = frame.GetArgument (1) as StructMirror;
2826 m = t.GetMethod ("invoke_mutate");
2827 var task = s.InvokeMethodAsyncWithResult (e.Thread, m, null, InvokeOptions.ReturnOutThis);
2828 var out_this = task.Result.OutThis as StructMirror;
2829 AssertValue (5, out_this ["l"]);
2831 // Without the ReturnOutThis flag
2832 s = frame.GetArgument (1) as StructMirror;
2834 m = t.GetMethod ("invoke_mutate");
2835 task = s.InvokeMethodAsyncWithResult (e.Thread, m, null);
2836 out_this = task.Result.OutThis as StructMirror;
2837 Assert.AreEqual (null, out_this);
2840 var cl1 = frame.Method.DeclaringType.Assembly.GetType ("ITest2");
2841 m = cl1.GetMethod ("invoke_iface");
2842 v = s.InvokeMethod (e.Thread, m, null);
2843 AssertValue (42, v);
2846 m = vm.RootDomain.Corlib.GetType ("System.Object").GetMethod ("ToString");
2847 v = s.InvokeMethod (e.Thread, m, null, InvokeOptions.Virtual);
2848 AssertValue ("42", v);
2852 public void BreakpointDuringInvoke () {
2853 Event e = run_until ("invoke1");
2855 MethodMirror m = entry_point.DeclaringType.GetMethod ("invoke2");
2856 Assert.IsNotNull (m);
2857 vm.SetBreakpoint (m, 0);
2859 StackFrame frame = e.Thread.GetFrames () [0];
2860 var o = frame.GetThis () as ObjectMirror;
2862 bool failed = false;
2864 bool finished = false;
2865 object wait = new object ();
2867 // Have to invoke in a separate thread as the invoke is suspended until we
2868 // resume after the breakpoint
2869 Thread t = new Thread (delegate () {
2871 o.InvokeMethod (e.Thread, m, null);
2877 Monitor.Pulse (wait);
2883 StackFrame invoke_frame = null;
2886 e = GetNextEvent ();
2887 Assert.IsInstanceOfType (typeof (BreakpointEvent), e);
2888 // Check stack trace support and invokes
2889 var frames = e.Thread.GetFrames ();
2890 invoke_frame = frames [0];
2891 Assert.AreEqual ("invoke2", frames [0].Method.Name);
2892 Assert.IsTrue (frames [0].IsDebuggerInvoke);
2893 Assert.AreEqual ("invoke1", frames [1].Method.Name);
2900 Monitor.Wait (wait);
2903 // Check that the invoke frames are no longer valid
2904 AssertThrows<InvalidStackFrameException> (delegate {
2905 invoke_frame.GetThis ();
2908 // Check InvokeOptions.DisableBreakpoints flag
2909 o.InvokeMethod (e.Thread, m, null, InvokeOptions.DisableBreakpoints);
2913 public void DisabledExceptionDuringInvoke () {
2914 Event e = run_until ("invoke_ex");
2916 MethodMirror m = entry_point.DeclaringType.GetMethod ("invoke_ex_inner");
2918 StackFrame frame = e.Thread.GetFrames () [0];
2919 var o = frame.GetThis () as ObjectMirror;
2921 var req = vm.CreateExceptionRequest (null);
2924 // Check InvokeOptions.DisableBreakpoints flag
2925 o.InvokeMethod (e.Thread, m, null, InvokeOptions.DisableBreakpoints);
2931 public void InvokeSingleThreaded () {
2934 Start (new string [] { "dtest-app.exe", "invoke-single-threaded" });
2936 Event e = run_until ("invoke_single_threaded_2");
2938 StackFrame f = e.Thread.GetFrames ()[0];
2940 var obj = f.GetThis () as ObjectMirror;
2942 // Check that the counter value incremented by the other thread does not increase
2943 // during the invoke.
2944 object counter1 = (obj.GetValue (obj.Type.GetField ("counter")) as PrimitiveValue).Value;
2946 var m = obj.Type.GetMethod ("invoke_return_void");
2947 obj.InvokeMethod (e.Thread, m, null, InvokeOptions.SingleThreaded);
2949 object counter2 = (obj.GetValue (obj.Type.GetField ("counter")) as PrimitiveValue).Value;
2951 Assert.AreEqual ((int)counter1, (int)counter2);
2953 // Test multiple invokes done in succession
2954 m = obj.Type.GetMethod ("invoke_return_void");
2955 obj.InvokeMethod (e.Thread, m, null, InvokeOptions.SingleThreaded);
2957 // Test events during single-threaded invokes
2958 vm.EnableEvents (EventType.TypeLoad);
2959 m = obj.Type.GetMethod ("invoke_type_load");
2960 obj.BeginInvokeMethod (e.Thread, m, null, InvokeOptions.SingleThreaded, delegate {
2964 e = GetNextEvent ();
2965 Assert.AreEqual (EventType.TypeLoad, e.EventType);
2968 List<Value> invoke_results;
2971 public void InvokeMultiple () {
2972 Event e = run_until ("invoke1");
2974 StackFrame frame = e.Thread.GetFrames () [0];
2976 TypeMirror t = frame.Method.DeclaringType;
2977 ObjectMirror this_obj = (ObjectMirror)frame.GetThis ();
2979 TypeMirror t2 = frame.Method.GetParameters ()[0].ParameterType;
2981 var methods = new MethodMirror [2];
2982 methods [0] = t.GetMethod ("invoke_return_ref");
2983 methods [1] = t.GetMethod ("invoke_return_primitive");
2985 invoke_results = new List<Value> ();
2987 var r = this_obj.BeginInvokeMultiple (e.Thread, methods, null, InvokeOptions.SingleThreaded, invoke_multiple_cb, this_obj);
2988 WaitHandle.WaitAll (new WaitHandle[] { r.AsyncWaitHandle });
2989 this_obj.EndInvokeMultiple (r);
2990 // The callback might still be running
2991 while (invoke_results.Count < 2) {
2994 if (invoke_results [0] is PrimitiveValue) {
2995 AssertValue ("ABC", invoke_results [1]);
2996 AssertValue (42, invoke_results [0]);
2998 AssertValue ("ABC", invoke_results [0]);
2999 AssertValue (42, invoke_results [1]);
3003 void invoke_multiple_cb (IAsyncResult ar) {
3004 ObjectMirror this_obj = (ObjectMirror)ar.AsyncState;
3006 var res = this_obj.EndInvokeMethod (ar);
3007 lock (invoke_results)
3008 invoke_results.Add (res);
3012 public void InvokeAbort () {
3015 Start (new string [] { "dtest-app.exe", "invoke-abort" });
3017 Event e = run_until ("invoke_abort");
3019 StackFrame f = e.Thread.GetFrames ()[0];
3021 var obj = f.GetThis () as ObjectMirror;
3023 var m = t.GetMethod ("invoke_abort_2");
3024 // Invoke multiple times to check that the subsequent invokes are aborted too
3025 var res = (IInvokeAsyncResult)obj.BeginInvokeMultiple (e.Thread, new MethodMirror[] { m, m, m, m }, null, InvokeOptions.None, delegate { }, null);
3028 AssertThrows<CommandException> (delegate {
3029 obj.EndInvokeMethod (res);
3034 public void GetThreads () {
3039 public void Threads () {
3040 Event e = run_until ("threads");
3042 Assert.AreEqual (ThreadState.Running, e.Thread.ThreadState);
3044 Assert.IsTrue (e.Thread.ThreadId > 0);
3046 Assert.AreEqual (e.Thread.TID, e.Thread.TID);
3048 vm.EnableEvents (EventType.ThreadStart, EventType.ThreadDeath);
3052 e = GetNextEvent ();
3053 Assert.IsInstanceOfType (typeof (ThreadStartEvent), e);
3054 var state = e.Thread.ThreadState;
3055 Assert.IsTrue (state == ThreadState.Running || state == ThreadState.Unstarted);
3059 e = GetNextEvent ();
3060 Assert.IsInstanceOfType (typeof (ThreadDeathEvent), e);
3061 Assert.AreEqual (ThreadState.Stopped, e.Thread.ThreadState);
3065 public void Frame_SetValue () {
3066 Event e = run_until ("locals2");
3068 StackFrame frame = e.Thread.GetFrames () [0];
3071 var l = frame.Method.GetLocal ("i");
3072 frame.SetValue (l, vm.CreateValue ((long)55));
3073 AssertValue (55, frame.GetValue (l));
3076 l = frame.Method.GetLocal ("s");
3077 frame.SetValue (l, vm.RootDomain.CreateString ("DEF"));
3078 AssertValue ("DEF", frame.GetValue (l));
3080 // argument as local
3081 l = frame.Method.GetLocal ("arg");
3082 frame.SetValue (l, vm.CreateValue (6));
3083 AssertValue (6, frame.GetValue (l));
3086 var p = frame.Method.GetParameters ()[1];
3087 frame.SetValue (p, vm.CreateValue (7));
3088 AssertValue (7, frame.GetValue (p));
3091 p = frame.Method.GetParameters ()[2];
3092 frame.SetValue (p, vm.RootDomain.CreateString ("DEF"));
3093 AssertValue ("DEF", frame.GetValue (p));
3096 p = frame.Method.GetParameters ()[3];
3097 frame.SetValue (p, vm.RootDomain.CreateString ("DEF2"));
3098 AssertValue ("DEF2", frame.GetValue (p));
3101 p = frame.Method.GetParameters ()[4];
3102 var v = frame.GetValue (p) as StructMirror;
3103 v ["i"] = vm.CreateValue (43);
3104 frame.SetValue (p, v);
3105 v = frame.GetValue (p) as StructMirror;
3106 AssertValue (43, v ["i"]);
3108 // argument checking
3111 AssertThrows<ArgumentNullException> (delegate () {
3112 frame.SetValue ((LocalVariable)null, vm.CreateValue (55));
3116 AssertThrows<ArgumentNullException> (delegate () {
3117 l = frame.Method.GetLocal ("i");
3118 frame.SetValue (l, null);
3121 // value of invalid type
3122 AssertThrows<ArgumentException> (delegate () {
3123 l = frame.Method.GetLocal ("i");
3124 frame.SetValue (l, vm.CreateValue (55));
3130 public void Frame_SetValue_Registers () {
3131 Event e = run_until ("locals6_1");
3133 StackFrame frame = e.Thread.GetFrames () [1];
3136 var l = frame.Method.GetLocal ("j");
3137 frame.SetValue (l, vm.CreateValue (99));
3138 AssertValue (99, frame.GetValue (l));
3140 // Check it during execution
3141 e = run_until ("locals6_2");
3142 frame = e.Thread.GetFrames () [0];
3143 AssertValue (99, frame.GetValue (frame.Method.GetParameters ()[0]));
3145 // Set it while in a frame which clobbers its register
3146 e = run_until ("locals6_3");
3147 frame = e.Thread.GetFrames () [1];
3148 frame.SetValue (l, vm.CreateValue (100));
3149 AssertValue (100, frame.GetValue (l));
3151 // Check it during execution
3152 e = run_until ("locals6_4");
3153 frame = e.Thread.GetFrames () [0];
3154 AssertValue (100, frame.GetValue (frame.Method.GetParameters ()[0]));
3156 // Signed byte value
3157 e = run_until ("locals6_5");
3158 frame = e.Thread.GetFrames () [1];
3159 var l2 = frame.Method.GetLocal ("sb");
3160 frame.SetValue (l2, vm.CreateValue ((sbyte)-99));
3161 AssertValue (-99, frame.GetValue (l2));
3163 // Check it during execution
3164 e = run_until ("locals6_6");
3165 frame = e.Thread.GetFrames () [0];
3166 AssertValue (-99, frame.GetValue (frame.Method.GetParameters ()[0]));
3170 public void InvokeRegress () {
3171 Event e = run_until ("invoke1");
3173 StackFrame frame = e.Thread.GetFrames () [0];
3175 TypeMirror t = frame.Method.DeclaringType;
3176 ObjectMirror this_obj = (ObjectMirror)frame.GetThis ();
3178 TypeMirror t2 = frame.Method.GetParameters ()[0].ParameterType;
3184 m = t.GetMethod ("invoke_return_void");
3185 v = this_obj.InvokeMethod (e.Thread, m, null);
3188 // Check that the stack frames remain valid during the invoke
3189 Assert.AreEqual ("Tests", (frame.GetThis () as ObjectMirror).Type.Name);
3191 // do another invoke
3192 m = t.GetMethod ("invoke_return_void");
3193 v = this_obj.InvokeMethod (e.Thread, m, null);
3196 // Try a single step after the invoke
3197 var req = create_step (e);
3198 req.Depth = StepDepth.Into;
3199 req.Size = StepSize.Line;
3205 // Step into invoke2
3207 e = GetNextEvent ();
3208 Assert.IsTrue (e is StepEvent);
3209 Assert.AreEqual ("invoke2", (e as StepEvent).Method.Name);
3213 frame = e.Thread.GetFrames () [0];
3217 public void Exceptions () {
3218 Event e = run_until ("exceptions");
3219 var req = vm.CreateExceptionRequest (null);
3224 e = GetNextEvent ();
3225 Assert.IsInstanceOfType (typeof (ExceptionEvent), e);
3226 Assert.AreEqual ("OverflowException", (e as ExceptionEvent).Exception.Type.Name);
3228 var frames = e.Thread.GetFrames ();
3229 Assert.AreEqual ("exceptions", frames [0].Method.Name);
3232 // exception type filter
3234 req = vm.CreateExceptionRequest (vm.RootDomain.Corlib.GetType ("System.ArgumentException"));
3237 // Skip the throwing of the second OverflowException
3240 e = GetNextEvent ();
3241 Assert.IsInstanceOfType (typeof (ExceptionEvent), e);
3242 Assert.AreEqual ("ArgumentException", (e as ExceptionEvent).Exception.Type.Name);
3245 // exception type filter for subclasses
3246 req = vm.CreateExceptionRequest (vm.RootDomain.Corlib.GetType ("System.Exception"));
3251 e = GetNextEvent ();
3252 Assert.IsInstanceOfType (typeof (ExceptionEvent), e);
3253 Assert.AreEqual ("OverflowException", (e as ExceptionEvent).Exception.Type.Name);
3257 req.IncludeSubclasses = false;
3262 e = GetNextEvent ();
3263 Assert.IsInstanceOfType (typeof (ExceptionEvent), e);
3264 Assert.AreEqual ("Exception", (e as ExceptionEvent).Exception.Type.Name);
3267 // Implicit exceptions
3268 req = vm.CreateExceptionRequest (null);
3273 e = GetNextEvent ();
3274 Assert.IsInstanceOfType (typeof (ExceptionEvent), e);
3275 Assert.AreEqual ("NullReferenceException", (e as ExceptionEvent).Exception.Type.Name);
3278 // Single stepping after an exception
3279 req = vm.CreateExceptionRequest (null);
3284 e = GetNextEvent ();
3285 Assert.IsInstanceOfType (typeof (ExceptionEvent), e);
3286 Assert.AreEqual ("Exception", (e as ExceptionEvent).Exception.Type.Name);
3287 frames = e.Thread.GetFrames ();
3288 Assert.AreEqual ("exceptions2", frames [0].Method.Name);
3291 var sreq = create_step (e);
3292 sreq.Depth = StepDepth.Over;
3293 sreq.Size = StepSize.Line;
3297 e = GetNextEvent ();
3298 Assert.IsInstanceOfType (typeof (StepEvent), e);
3299 frames = e.Thread.GetFrames ();
3300 Assert.AreEqual ("exceptions", frames [0].Method.Name);
3303 // Argument checking
3304 AssertThrows<ArgumentException> (delegate {
3305 vm.CreateExceptionRequest (e.Thread.Type);
3310 public void ExceptionFilter () {
3311 Event e = run_until ("exception_filter");
3313 MethodMirror m = entry_point.DeclaringType.GetMethod ("exception_filter_filter");
3314 Assert.IsNotNull (m);
3316 vm.SetBreakpoint (m, 0);
3320 e = GetNextEvent ();
3321 Assert.AreEqual (EventType.Breakpoint, e.EventType);
3322 Assert.IsTrue (e is BreakpointEvent);
3323 Assert.AreEqual (m.Name, (e as BreakpointEvent).Method.Name);
3325 var frames = e.Thread.GetFrames ();
3327 Assert.IsTrue (frames [0].Location.SourceFile.IndexOf ("dtest-app.cs") != -1);
3328 Assert.AreEqual ("exception_filter_filter", frames [0].Location.Method.Name);
3330 Assert.AreEqual (0, frames [1].Location.Method.MetadataToken);
3331 Assert.AreEqual (0x0f, frames [1].Location.ILOffset);
3333 Assert.AreEqual ("exception_filter_method", frames [2].Location.Method.Name);
3334 Assert.AreEqual (0x06, frames [2].Location.ILOffset);
3336 Assert.AreEqual (0, frames [3].Location.Method.MetadataToken, 0);
3337 Assert.AreEqual (0, frames [3].Location.ILOffset);
3339 Assert.AreEqual ("exception_filter", frames [4].Location.Method.Name);
3343 public void ExceptionFilter2 () {
3346 Start (new string [] { "dtest-excfilter.exe" });
3348 MethodMirror filter_method = entry_point.DeclaringType.GetMethod ("Filter");
3349 Assert.IsNotNull (filter_method);
3351 MethodMirror test_method = entry_point.DeclaringType.GetMethod ("Test");
3352 Assert.IsNotNull (test_method);
3354 vm.SetBreakpoint (filter_method, 0);
3358 var e = GetNextEvent ();
3359 Assert.AreEqual (EventType.Breakpoint, e.EventType);
3360 Assert.IsTrue (e is BreakpointEvent);
3361 Assert.AreEqual (filter_method.Name, (e as BreakpointEvent).Method.Name);
3363 var frames = e.Thread.GetFrames ();
3365 Assert.AreEqual (4, frames.Count ());
3367 Assert.AreEqual (filter_method.Name, frames [0].Location.Method.Name);
3368 Assert.AreEqual (20, frames [0].Location.LineNumber);
3369 Assert.AreEqual (0, frames [0].Location.ILOffset);
3371 Assert.AreEqual (test_method.Name, frames [1].Location.Method.Name);
3372 Assert.AreEqual (37, frames [1].Location.LineNumber);
3373 Assert.AreEqual (0x0b, frames [1].Location.ILOffset);
3375 Assert.AreEqual (test_method.Name, frames [2].Location.Method.Name);
3376 Assert.AreEqual (33, frames [2].Location.LineNumber);
3377 Assert.AreEqual (0x05, frames [2].Location.ILOffset);
3379 Assert.AreEqual (entry_point.Name, frames [3].Location.Method.Name);
3380 Assert.AreEqual (14, frames [3].Location.LineNumber);
3381 Assert.AreEqual (0x00, frames [3].Location.ILOffset);
3389 public void EventSets () {
3391 // Create two filter which both match the same exception
3393 Event e = run_until ("exceptions");
3395 var req = vm.CreateExceptionRequest (null);
3398 var req2 = vm.CreateExceptionRequest (vm.RootDomain.Corlib.GetType ("System.OverflowException"));
3403 var es = vm.GetNextEventSet ();
3404 Assert.AreEqual (2, es.Events.Length);
3407 Assert.IsInstanceOfType (typeof (ExceptionEvent), e);
3408 Assert.AreEqual ("OverflowException", (e as ExceptionEvent).Exception.Type.Name);
3411 Assert.IsInstanceOfType (typeof (ExceptionEvent), e);
3412 Assert.AreEqual ("OverflowException", (e as ExceptionEvent).Exception.Type.Name);
3419 // Test single threaded invokes during processing of nullref exceptions.
3420 // These won't work if the exception handling is done from the sigsegv signal
3421 // handler, since the sigsegv signal is disabled until control returns from the
3425 [Category ("only3")]
3426 public void NullRefExceptionAndSingleThreadedInvoke () {
3427 Event e = run_until ("exceptions");
3428 var req = vm.CreateExceptionRequest (vm.RootDomain.Corlib.GetType ("System.NullReferenceException"));
3433 e = GetNextEvent ();
3434 Assert.IsInstanceOfType (typeof (ExceptionEvent), e);
3435 Assert.AreEqual ("NullReferenceException", (e as ExceptionEvent).Exception.Type.Name);
3437 var ex = (e as ExceptionEvent).Exception;
3438 var tostring_method = vm.RootDomain.Corlib.GetType ("System.Object").GetMethod ("ToString");
3439 ex.InvokeMethod (e.Thread, tostring_method, null, InvokeOptions.SingleThreaded);
3443 public void MemberInOtherDomain () {
3446 Start (new string [] { "dtest-app.exe", "domain-test" });
3448 vm.EnableEvents (EventType.AppDomainCreate, EventType.AppDomainUnload, EventType.AssemblyUnload);
3450 Event e = run_until ("domains_print_across");
3452 var frame = e.Thread.GetFrames ()[0];
3453 var inOtherDomain = frame.GetArgument (0) as ObjectMirror;
3454 var crossDomainField = (ObjectMirror) inOtherDomain.GetValue (inOtherDomain.Type.GetField("printMe"));
3455 Assert.AreEqual ("SentinelClass", crossDomainField.Type.Name);
3459 public void Domains () {
3462 Start (new string [] { "dtest-app.exe", "domain-test" });
3464 vm.EnableEvents (EventType.AppDomainCreate, EventType.AppDomainUnload, EventType.AssemblyUnload);
3466 Event e = run_until ("domains");
3470 e = GetNextEvent ();
3471 Assert.IsInstanceOfType (typeof (AppDomainCreateEvent), e);
3473 var domain = (e as AppDomainCreateEvent).Domain;
3475 // Check the object type
3476 e = run_until ("domains_2");
3477 var frame = e.Thread.GetFrames ()[0];
3478 var o = frame.GetArgument (0) as ObjectMirror;
3479 Assert.AreEqual ("CrossDomain", o.Type.Name);
3481 // Do a remoting invoke
3482 var cross_domain_type = o.Type;
3483 var v = o.InvokeMethod (e.Thread, cross_domain_type.GetMethod ("invoke_3"), null);
3484 AssertValue (42, v);
3486 // Run until the callback in the domain
3487 MethodMirror m = entry_point.DeclaringType.GetMethod ("invoke_in_domain");
3488 Assert.IsNotNull (m);
3489 vm.SetBreakpoint (m, 0);
3493 e = GetNextEvent ();
3494 if (e is BreakpointEvent)
3498 Assert.AreEqual ("invoke_in_domain", (e as BreakpointEvent).Method.Name);
3500 // d_method is from another domain
3501 MethodMirror d_method = (e as BreakpointEvent).Method;
3502 Assert.IsTrue (m != d_method);
3503 Assert.AreEqual (domain, d_method.DeclaringType.Assembly.Domain);
3505 var frames = e.Thread.GetFrames ();
3506 Assert.AreEqual ("invoke_in_domain", frames [0].Method.Name);
3507 Assert.AreEqual (domain, frames [0].Domain);
3508 Assert.AreEqual ("invoke", frames [1].Method.Name);
3509 Assert.AreEqual ("domains", frames [2].Method.Name);
3510 Assert.AreEqual (vm.RootDomain, frames [2].Domain);
3512 // Test breakpoints on already JITted methods in other domains
3513 m = entry_point.DeclaringType.GetMethod ("invoke_in_domain_2");
3514 Assert.IsNotNull (m);
3515 vm.SetBreakpoint (m, 0);
3519 e = GetNextEvent ();
3520 if (e is BreakpointEvent)
3524 Assert.AreEqual ("invoke_in_domain_2", (e as BreakpointEvent).Method.Name);
3526 // This is empty when receiving the AppDomainCreateEvent
3527 Assert.AreEqual ("domain", domain.FriendlyName);
3529 // Run until the unload
3532 e = GetNextEvent ();
3533 if (e is AssemblyUnloadEvent) {
3534 AssertThrows<Exception> (delegate () {
3535 var assembly_obj = (e as AssemblyUnloadEvent).Assembly.GetAssemblyObject ();
3542 Assert.IsInstanceOfType (typeof (AppDomainUnloadEvent), e);
3543 Assert.AreEqual (domain, (e as AppDomainUnloadEvent).Domain);
3545 // Run past the unload
3546 e = run_until ("domains_3");
3548 // Test access to unloaded types
3549 // FIXME: Add an exception type for this
3550 AssertThrows<Exception> (delegate {
3551 d_method.DeclaringType.GetValue (d_method.DeclaringType.GetField ("static_i"));
3554 // Check that .Domain is accessible for stack frames with native transitions
3555 e = run_until ("called_from_invoke");
3556 ThreadMirror.NativeTransitions = true;
3557 foreach (var f in e.Thread.GetFrames ()) {
3563 public void DynamicMethods () {
3564 Event e = run_until ("dyn_call");
3566 var m = e.Thread.GetFrames ()[1].Method;
3567 Assert.AreEqual ("dyn_method", m.Name);
3569 // Test access to IL
3570 var body = m.GetMethodBody ();
3572 ILInstruction ins = body.Instructions [0];
3573 Assert.AreEqual (OpCodes.Ldstr, ins.OpCode);
3574 Assert.AreEqual ("FOO", ins.Operand);
3578 public void RefEmit () {
3581 Start (new string [] { "dtest-app.exe", "ref-emit-test" });
3583 Event e = run_until ("ref_emit_call");
3585 var m = e.Thread.GetFrames ()[1].Method;
3586 Assert.AreEqual ("ref_emit_method", m.Name);
3588 // Test access to IL
3589 var body = m.GetMethodBody ();
3593 ins = body.Instructions [0];
3594 Assert.AreEqual (OpCodes.Ldstr, ins.OpCode);
3595 Assert.AreEqual ("FOO", ins.Operand);
3597 ins = body.Instructions [1];
3598 Assert.AreEqual (OpCodes.Call, ins.OpCode);
3599 Assert.IsInstanceOfType (typeof (MethodMirror), ins.Operand);
3600 Assert.AreEqual ("ref_emit_call", (ins.Operand as MethodMirror).Name);
3604 public void IsAttached () {
3605 var f = entry_point.DeclaringType.GetField ("is_attached");
3607 Event e = run_until ("Main");
3609 AssertValue (true, entry_point.DeclaringType.GetValue (f));
3613 public void StackTraceInNative () {
3614 // Check that stack traces can be produced for threads in native code
3617 Start (new string [] { "dtest-app.exe", "frames-in-native" });
3619 var e = run_until ("frames_in_native");
3621 // FIXME: This is racy
3628 StackFrame[] frames = e.Thread.GetFrames ();
3630 int frame_index = -1;
3631 for (int i = 0; i < frames.Length; ++i) {
3632 if (frames [i].Method.Name == "Sleep") {
3638 Assert.IsTrue (frame_index != -1);
3639 Assert.AreEqual ("Sleep", frames [frame_index].Method.Name);
3640 Assert.AreEqual ("frames_in_native", frames [frame_index + 1].Method.Name);
3641 Assert.AreEqual ("Main", frames [frame_index + 2].Method.Name);
3643 // Check that invokes are disabled for such threads
3644 TypeMirror t = frames [frame_index + 1].Method.DeclaringType;
3646 var m = t.GetMethod ("invoke_static_return_void");
3647 AssertThrows<InvalidOperationException> (delegate {
3648 t.InvokeMethod (e.Thread, m, null);
3651 // Check that the frame info is invalidated
3652 run_until ("frames_in_native_2");
3654 AssertThrows<InvalidStackFrameException> (delegate {
3655 Console.WriteLine (frames [frame_index].GetThis ());
3660 public void VirtualMachine_CreateEnumMirror () {
3661 var e = run_until ("o1");
3662 var frame = e.Thread.GetFrames () [0];
3664 object val = frame.GetThis ();
3665 Assert.IsTrue (val is ObjectMirror);
3666 Assert.AreEqual ("Tests", (val as ObjectMirror).Type.Name);
3667 ObjectMirror o = (val as ObjectMirror);
3669 FieldInfoMirror field = o.Type.GetField ("field_enum");
3670 Value f = o.GetValue (field);
3671 TypeMirror enumType = (f as EnumMirror).Type;
3673 o.SetValue (field, vm.CreateEnumMirror (enumType, vm.CreateValue (1)));
3674 f = o.GetValue (field);
3675 Assert.AreEqual (1, (f as EnumMirror).Value);
3677 // Argument checking
3678 AssertThrows<ArgumentNullException> (delegate () {
3679 vm.CreateEnumMirror (enumType, null);
3682 AssertThrows<ArgumentNullException> (delegate () {
3683 vm.CreateEnumMirror (null, vm.CreateValue (1));
3687 AssertThrows<ArgumentException> (delegate () {
3688 vm.CreateEnumMirror (enumType, vm.CreateValue (null));
3691 // value of a wrong type
3692 AssertThrows<ArgumentException> (delegate () {
3693 vm.CreateEnumMirror (enumType, vm.CreateValue ((long)1));
3698 public void VirtualMachine_EnableEvents_Breakpoint () {
3699 AssertThrows<ArgumentException> (delegate () {
3700 vm.EnableEvents (EventType.Breakpoint);
3705 public void SingleStepRegress654694 () {
3708 MethodMirror m = entry_point.DeclaringType.GetMethod ("ss_regress_654694");
3709 foreach (Location l in m.Locations) {
3710 if (l.ILOffset > 0 && il_offset == -1)
3711 il_offset = l.ILOffset;
3714 Event e = run_until ("ss_regress_654694");
3716 Assert.IsNotNull (m);
3717 vm.SetBreakpoint (m, il_offset);
3721 e = GetNextEvent ();
3722 Assert.IsTrue (e is BreakpointEvent);
3724 var req = create_step (e);
3725 req.Depth = StepDepth.Over;
3726 req.Size = StepSize.Line;
3731 e = GetNextEvent ();
3732 Assert.IsTrue (e is StepEvent);
3738 public void DebugBreak () {
3739 vm.EnableEvents (EventType.UserBreak);
3744 var e = GetNextEvent ();
3745 Assert.IsTrue (e is UserBreakEvent);
3749 public void DebugLog () {
3750 vm.EnableEvents (EventType.UserLog);
3755 var e = GetNextEvent ();
3756 Assert.IsTrue (e is UserLogEvent);
3757 var le = e as UserLogEvent;
3759 Assert.AreEqual (5, le.Level);
3760 Assert.AreEqual ("A", le.Category);
3761 Assert.AreEqual ("B", le.Message);
3765 public void TypeGetMethodsByNameFlags () {
3767 var assembly = entry_point.DeclaringType.Assembly;
3768 var type = assembly.GetType ("Tests3");
3770 Assert.IsNotNull (type);
3772 mm = type.GetMethodsByNameFlags (null, BindingFlags.Static | BindingFlags.Public, false);
3773 Assert.AreEqual (1, mm.Length, "#1");
3774 Assert.AreEqual ("M1", mm[0].Name, "#2");
3776 mm = type.GetMethodsByNameFlags (null, BindingFlags.Static | BindingFlags.NonPublic, false);
3777 Assert.AreEqual (1, mm.Length, "#3");
3778 Assert.AreEqual ("M2", mm[0].Name, "#4");
3780 mm = type.GetMethodsByNameFlags (null, BindingFlags.Instance | BindingFlags.Public, false);
3781 Assert.AreEqual (7, mm.Length, "#5"); //M3 plus Equals, GetHashCode, GetType, ToString, .ctor
3783 mm = type.GetMethodsByNameFlags (null, BindingFlags.Instance | BindingFlags.Public | BindingFlags.DeclaredOnly, false);
3784 Assert.AreEqual (2, mm.Length, "#7");
3786 mm = type.GetMethodsByNameFlags (null, BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.DeclaredOnly, false);
3787 Assert.AreEqual (1, mm.Length, "#9");
3789 mm = type.GetMethodsByNameFlags (null, BindingFlags.Static | BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.DeclaredOnly, false);
3790 Assert.AreEqual (5, mm.Length, "#11");
3793 mm = type.GetMethodsByNameFlags ("M1", BindingFlags.Static | BindingFlags.Public, false);
3794 Assert.AreEqual (1, mm.Length, "#12");
3795 Assert.AreEqual ("M1", mm[0].Name, "#13");
3797 mm = type.GetMethodsByNameFlags ("m1", BindingFlags.Static | BindingFlags.Public, true);
3798 Assert.AreEqual (1, mm.Length, "#14");
3799 Assert.AreEqual ("M1", mm[0].Name, "#15");
3801 mm = type.GetMethodsByNameFlags ("M1", BindingFlags.Static | BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, false);
3802 Assert.AreEqual (1, mm.Length, "#16");
3803 Assert.AreEqual ("M1", mm[0].Name, "#17");
3807 [Category ("only88")]
3808 public void TypeLoadSourceFileFilter () {
3809 Event e = run_until ("type_load");
3811 if (!vm.Version.AtLeast (2, 7))
3814 string srcfile = (e as BreakpointEvent).Method.DeclaringType.GetSourceFiles (true)[0];
3815 srcfile = srcfile.Replace ("dtest-app.cs", "TypeLoadClass.cs");
3816 Assert.IsTrue (srcfile.Contains ("TypeLoadClass.cs"));
3818 var req = vm.CreateTypeLoadRequest ();
3819 req.SourceFileFilter = new string [] { srcfile.ToUpper () };
3823 e = GetNextEvent ();
3824 Assert.IsTrue (e is TypeLoadEvent);
3825 Assert.AreEqual ("TypeLoadClass", (e as TypeLoadEvent).Type.FullName);
3829 public void TypeLoadTypeNameFilter () {
3830 Event e = run_until ("type_load");
3832 var req = vm.CreateTypeLoadRequest ();
3833 req.TypeNameFilter = new string [] { "TypeLoadClass2" };
3837 e = GetNextEvent ();
3838 Assert.IsTrue (e is TypeLoadEvent);
3839 Assert.AreEqual ("TypeLoadClass2", (e as TypeLoadEvent).Type.FullName);
3843 public void GetTypesForSourceFile () {
3846 var types = vm.GetTypesForSourceFile ("dtest-app.cs", false);
3847 Assert.IsTrue (types.Any (t => t.FullName == "Tests"));
3848 Assert.IsFalse (types.Any (t => t.FullName == "System.Int32"));
3850 types = vm.GetTypesForSourceFile ("DTEST-app.cs", true);
3851 Assert.IsTrue (types.Any (t => t.FullName == "Tests"));
3852 Assert.IsFalse (types.Any (t => t.FullName == "System.Int32"));
3856 public void GetTypesNamed () {
3859 var types = vm.GetTypes ("Tests", false);
3860 Assert.AreEqual (1, types.Count);
3861 Assert.AreEqual ("Tests", types [0].FullName);
3863 types = vm.GetTypes ("System.Exception", false);
3864 Assert.AreEqual (1, types.Count);
3865 Assert.AreEqual ("System.Exception", types [0].FullName);
3869 public void String_GetValue () {
3874 var e = run_until ("arg2");
3876 var frame = e.Thread.GetFrames () [0];
3878 val = frame.GetArgument (6);
3879 Assert.AreEqual ('\0'.ToString () + "A", (val as StringMirror).Value);
3883 public void String_GetChars () {
3887 var e = run_until ("arg2");
3889 var frame = e.Thread.GetFrames () [0];
3891 val = frame.GetArgument (0);
3892 Assert.IsTrue (val is StringMirror);
3893 AssertValue ("FOO", val);
3894 var s = (val as StringMirror);
3895 Assert.AreEqual (3, s.Length);
3897 var c = s.GetChars (0, 2);
3898 Assert.AreEqual (2, c.Length);
3899 Assert.AreEqual ('F', c [0]);
3900 Assert.AreEqual ('O', c [1]);
3902 AssertThrows<ArgumentException> (delegate () {
3908 public void GetInterfaces () {
3909 var e = run_until ("arg2");
3911 var frame = e.Thread.GetFrames () [0];
3913 var cl1 = frame.Method.DeclaringType.Assembly.GetType ("TestIfaces");
3914 var ifaces = cl1.GetInterfaces ();
3915 Assert.AreEqual (1, ifaces.Length);
3916 Assert.AreEqual ("ITest", ifaces [0].Name);
3918 var cl2 = cl1.GetMethod ("Baz").ReturnType;
3919 var ifaces2 = cl2.GetInterfaces ();
3920 Assert.AreEqual (1, ifaces2.Length);
3921 Assert.AreEqual ("ITest`1", ifaces2 [0].Name);
3925 public void GetInterfaceMap () {
3926 var e = run_until ("arg2");
3928 var frame = e.Thread.GetFrames () [0];
3930 var cl1 = frame.Method.DeclaringType.Assembly.GetType ("TestIfaces");
3931 var iface = cl1.Assembly.GetType ("ITest");
3932 var map = cl1.GetInterfaceMap (iface);
3933 Assert.AreEqual (cl1, map.TargetType);
3934 Assert.AreEqual (iface, map.InterfaceType);
3935 Assert.AreEqual (2, map.InterfaceMethods.Length);
3936 Assert.AreEqual (2, map.TargetMethods.Length);
3940 public void StackAlloc_Breakpoints_Regress2775 () {
3941 // Check that breakpoints on arm don't overwrite stackalloc-ed memory
3942 var e = run_until ("regress_2755");
3944 var frame = e.Thread.GetFrames () [0];
3946 // This breaks at the call site
3947 vm.SetBreakpoint (m, m.Locations [2].ILOffset);
3950 var e2 = GetNextEvent ();
3951 Assert.IsTrue (e2 is BreakpointEvent);
3953 e = run_until ("regress_2755_3");
3954 frame = e.Thread.GetFrames () [1];
3955 var res = frame.GetValue (m.GetLocal ("sum"));
3956 AssertValue (0, res);
3960 public void MethodInfo () {
3961 Event e = run_until ("locals2");
3963 StackFrame frame = e.Thread.GetFrames () [0];
3964 var m = frame.Method;
3966 Assert.IsTrue (m.IsGenericMethod);
3967 Assert.IsFalse (m.IsGenericMethodDefinition);
3969 var args = m.GetGenericArguments ();
3970 Assert.AreEqual (1, args.Length);
3971 Assert.AreEqual ("String", args [0].Name);
3973 var gmd = m.GetGenericMethodDefinition ();
3974 Assert.IsTrue (gmd.IsGenericMethod);
3975 Assert.IsTrue (gmd.IsGenericMethodDefinition);
3976 Assert.AreEqual (gmd, gmd.GetGenericMethodDefinition ());
3978 args = gmd.GetGenericArguments ();
3979 Assert.AreEqual (1, args.Length);
3980 Assert.AreEqual ("T", args [0].Name);
3982 var attrs = m.GetCustomAttributes (true);
3983 Assert.AreEqual (1, attrs.Length);
3984 Assert.AreEqual ("StateMachineAttribute", attrs [0].Constructor.DeclaringType.Name);
3988 public void UnhandledException () {
3991 Start (new string [] { "dtest-app.exe", "unhandled-exception" });
3993 var req = vm.CreateExceptionRequest (null, false, true);
3996 var e = run_until ("unhandled_exception");
3999 var e2 = GetNextEvent ();
4000 Assert.IsTrue (e2 is ExceptionEvent);
4007 public void UnhandledException_2 () {
4010 Start (new string [] { "dtest-app.exe", "unhandled-exception-endinvoke" });
4012 var req = vm.CreateExceptionRequest (null, false, true);
4015 MethodMirror m = entry_point.DeclaringType.GetMethod ("unhandled_exception_endinvoke_2");
4016 Assert.IsNotNull (m);
4017 vm.SetBreakpoint (m, m.ILOffsets [0]);
4019 var e = run_until ("unhandled_exception_endinvoke");
4022 var e2 = GetNextEvent ();
4023 Assert.IsFalse (e2 is ExceptionEvent);
4030 public void UnhandledExceptionUserCode () {
4033 // Exceptions caught in non-user code are treated as unhandled
4034 Start (new string [] { "dtest-app.exe", "unhandled-exception-user" });
4036 var req = vm.CreateExceptionRequest (null, false, true);
4037 req.AssemblyFilter = new List<AssemblyMirror> () { entry_point.DeclaringType.Assembly };
4040 var e = run_until ("unhandled_exception_user");
4043 var e2 = GetNextEvent ();
4044 Assert.IsTrue (e2 is ExceptionEvent);
4051 public void GCWhileSuspended () {
4052 // Check that objects are kept alive during suspensions
4053 Event e = run_until ("gc_suspend_1");
4055 MethodMirror m = entry_point.DeclaringType.GetMethod ("gc_suspend_invoke");
4057 var o = entry_point.DeclaringType.GetValue (entry_point.DeclaringType.GetField ("gc_suspend_field")) as ObjectMirror;
4058 //Console.WriteLine (o);
4060 StackFrame frame = e.Thread.GetFrames () [0];
4061 TypeMirror t = frame.Method.DeclaringType;
4062 for (int i = 0; i < 10; ++i)
4063 t.InvokeMethod (e.Thread, m, new Value [] { });
4065 // This throws an exception if the object is collected
4066 long addr = o.Address;
4068 var o2 = entry_point.DeclaringType.GetValue (entry_point.DeclaringType.GetField ("gc_suspend_field")) as ObjectMirror;
4073 public void MakeGenericMethod () {
4074 Event e = run_until ("bp1");
4076 var intm = vm.RootDomain.GetCorrespondingType (typeof (int));
4077 var stringm = vm.RootDomain.GetCorrespondingType (typeof (string));
4078 var gm = entry_point.DeclaringType.GetMethod ("generic_method");
4079 var res = gm.MakeGenericMethod (new TypeMirror [] { stringm });
4080 var args = res.GetGenericArguments ();
4081 Assert.AreEqual (1, args.Length);
4082 Assert.AreEqual (stringm, args [0]);
4085 AssertThrows<ArgumentNullException> (delegate {
4086 gm.MakeGenericMethod (null);
4088 AssertThrows<ArgumentNullException> (delegate {
4089 gm.MakeGenericMethod (new TypeMirror [] { null });
4091 AssertThrows<ArgumentException> (delegate {
4092 gm.MakeGenericMethod (new TypeMirror [] { stringm, stringm });
4094 AssertThrows<InvalidOperationException> (delegate {
4095 gm.MakeGenericMethod (new TypeMirror [] { intm });
4097 AssertThrows<InvalidOperationException> (delegate {
4098 entry_point.DeclaringType.GetMethod ("Main").MakeGenericMethod (new TypeMirror [] { intm });
4103 public void InspectThreadSuspenedOnWaitOne () {
4105 Start (true, "dtest-app.exe", "wait-one" );
4107 ThreadMirror.NativeTransitions = true;
4109 var evt = run_until ("wait_one");
4110 Assert.IsNotNull (evt, "#1");
4112 var thread = evt.Thread;
4113 Assert.AreEqual (ThreadState.Running, thread.ThreadState, "#1.1");
4115 var frames = thread.GetFrames ();
4116 Assert.IsNotNull (frames, "#2");
4117 Assert.AreEqual (2, frames.Length, "#3");
4118 Assert.AreEqual ("wait_one", frames [0].Method.Name, "#4");
4119 Assert.AreEqual ("Main", frames [1].Method.Name, "#5");
4123 Thread.Sleep (500); //FIXME this is racy, maybe single step? or something?
4126 Assert.AreEqual (ThreadState.WaitSleepJoin, thread.ThreadState, "#6");
4128 frames = thread.GetFrames ();
4129 Assert.AreEqual (8, frames.Length, "#7");
4130 Assert.AreEqual ("WaitOne_internal", frames [0].Method.Name, "#8.0");
4131 Assert.AreEqual ("WaitOneNative", frames [1].Method.Name, "#8.1");
4132 Assert.AreEqual ("InternalWaitOne", frames [2].Method.Name, "#8.2");
4133 Assert.AreEqual ("WaitOne", frames [3].Method.Name, "#8.3");
4134 Assert.AreEqual ("WaitOne", frames [4].Method.Name, "#8.4");
4135 Assert.AreEqual ("WaitOne", frames [5].Method.Name, "#8.5");
4136 Assert.AreEqual ("wait_one", frames [6].Method.Name, "#8.6");
4137 Assert.AreEqual ("Main", frames [7].Method.Name, "#8.7");
4139 var frame = frames [0];
4140 Assert.IsTrue (frame.IsNativeTransition, "#11.1");
4143 Assert.Fail ("Known limitation - can't get info from m2n frames");
4144 } catch (AbsentInformationException) {}
4147 Assert.IsFalse (frame.IsNativeTransition, "#12.1");
4148 var wait_one_this = frame.GetThis ();
4149 Assert.IsNotNull (wait_one_this, "#12.2");
4152 var locals = frame.GetVisibleVariables ();
4153 Assert.AreEqual (1, locals.Count, "#13.1");
4155 var local_0 = frame.GetValue (locals [0]);
4156 Assert.IsNotNull (local_0, "#13.2");
4158 Assert.AreEqual (wait_one_this, local_0, "#14.2");
4162 public void GetMethodBody () {
4163 var bevent = run_until ("Main");
4165 var m = bevent.Method.DeclaringType.GetMethod ("get_IntProperty");
4166 var body = m.GetMethodBody ();
4167 foreach (var ins in body.Instructions) {
4168 if (ins.OpCode == OpCodes.Ldfld) {
4169 var field = (FieldInfoMirror)ins.Operand;
4170 Assert.AreEqual ("field_i", field.Name);
4176 public void EvaluateMethod () {
4177 var bevent = run_until ("evaluate_method_2");
4179 var m = bevent.Method.DeclaringType.GetMethod ("get_IntProperty");
4181 var this_obj = bevent.Thread.GetFrames ()[0].GetThis ();
4182 var v = m.Evaluate (this_obj, null);
4183 AssertValue (42, v);
4187 public void SetIP () {
4188 var bevent = run_until ("set_ip_1");
4190 var invalid_loc = bevent.Thread.GetFrames ()[0].Location;
4192 var req = create_step (bevent);
4193 var e = step_out ();
4195 var frames = e.Thread.GetFrames ();
4196 var locs = frames [0].Method.Locations;
4198 var next_loc = locs.First (l => (l.LineNumber == frames [0].Location.LineNumber + 3));
4200 e.Thread.SetIP (next_loc);
4202 /* Check that i ++; j = 5; was skipped */
4203 bevent = run_until ("set_ip_2");
4204 var f = bevent.Thread.GetFrames ()[1];
4205 AssertValue (2, f.GetValue (f.Method.GetLocal ("i")));
4206 AssertValue (0, f.GetValue (f.Method.GetLocal ("j")));
4209 AssertThrows<ArgumentNullException> (delegate {
4210 e.Thread.SetIP (null);
4213 AssertThrows<ArgumentException> (delegate {
4214 e.Thread.SetIP (invalid_loc);
4219 public void SetIPSingleStep () {
4220 // Check that single stepping after set-ip steps from the new ip
4221 var bevent = run_until ("set_ip_1");
4223 var invalid_loc = bevent.Thread.GetFrames ()[0].Location;
4225 var req = create_step (bevent);
4226 req.Size = StepSize.Line;
4227 var e = step_out ();
4229 var frames = e.Thread.GetFrames ();
4230 var locs = frames [0].Method.Locations;
4231 var prev_loc = locs.First (l => (l.LineNumber == frames [0].Location.LineNumber - 1));
4232 AssertValue (2, frames [0].GetValue (frames [0].Method.GetLocal ("i")));
4234 // Set back the ip to the first i ++; line
4235 e.Thread.SetIP (prev_loc);
4238 var f = e.Thread.GetFrames ()[0];
4239 AssertValue (3, f.GetValue (f.Method.GetLocal ("i")));
4243 public void NewInstanceNoCtor () {
4244 var bevent = run_until ("Main");
4246 var stype = bevent.Method.DeclaringType.Assembly.GetType ("AStruct");
4247 var obj = stype.NewInstance ();
4248 Assert.IsTrue (obj is ObjectMirror);
4249 Assert.AreEqual ("AStruct", (obj as ObjectMirror).Type.Name);
4253 public void StaticCtorFilterInCctor () {
4254 // Check that single stepping when in a cctor only ignores
4255 // other cctors, not the current one
4256 var bevent = run_until ("step_filters");
4258 var assembly = entry_point.DeclaringType.Assembly;
4259 var type = assembly.GetType ("Tests/ClassWithCctor");
4260 var cctor = type.GetMethod (".cctor");
4261 vm.SetBreakpoint (cctor, 0);
4264 var e = GetNextEvent ();
4265 Assert.IsTrue (e is BreakpointEvent);
4267 var req = create_step (e);
4268 req.Filter = StepFilter.StaticCtor;
4270 // Make sure we are still in the cctor
4271 Assert.AreEqual (".cctor", e.Thread.GetFrames ()[0].Location.Method.Name);
4275 public void ThreadpoolIOsinglestep () {
4277 Start ("dtest-app.exe", "threadpool-io");
4278 // This is a regression test for #42625. It tests the
4279 // interaction (particularly in coop GC) of the
4280 // threadpool I/O mechanism and the soft debugger.
4281 Event e = run_until ("threadpool_io");
4282 // run until we sent the task half the bytes it
4283 // expects, so that it blocks waiting for the rest.
4284 e = run_until ("threadpool_bp");
4285 var req = create_step (e);
4286 e = step_out (); // leave threadpool_bp
4287 e = step_out (); // leave threadpool_io
4291 // Uses a fixed port
4292 [Category("NotWorking")]
4293 public void Attach () {
4296 // Launch the app using server=y,suspend=n
4297 var pi = CreateStartInfo (new string[] { "--debugger-agent=transport=dt_socket,address=127.0.0.1:10000,server=y,suspend=n", "dtest-app.exe", "attach" });
4298 var process = Diag.Process.Start (pi);
4300 // Wait for the app to reach the Sleep () in attach ().
4301 Thread.Sleep (1000);
4302 var ep = new IPEndPoint (IPAddress.Loopback, 10000);
4303 vm = VirtualMachineManager.Connect (ep);
4305 var load_req = vm.CreateAssemblyLoadRequest ();
4307 vm.EnableEvents (EventType.TypeLoad);
4309 Event vmstart = GetNextEvent ();
4310 Assert.AreEqual (EventType.VMStart, vmstart.EventType);
4312 // Get collected events
4313 bool assembly_load_found = false;
4314 bool type_load_found = false;
4316 Event e = GetNextEvent ();
4319 if (e is AssemblyLoadEvent) {
4320 var assemblyload = e as AssemblyLoadEvent;
4322 var amirror = assemblyload.Assembly;
4324 if (amirror.GetName ().Name == "System.Transactions") {
4325 assembly_load_found = true;
4326 Assert.AreEqual ("domain", amirror.Domain.FriendlyName);
4329 if (amirror.GetName ().Name == "dtest-app")
4330 // Set a bp so we can break the event loop
4331 vm.SetBreakpoint (amirror.EntryPoint.DeclaringType.GetMethod ("attach_break"), 0);
4333 if (e is TypeLoadEvent) {
4334 var typeload = e as TypeLoadEvent;
4336 if (typeload.Type.Name == "GCSettings") {
4337 type_load_found = true;
4338 Assert.AreEqual ("domain", typeload.Type.Assembly.Domain.FriendlyName);
4342 if (e is BreakpointEvent)
4345 Assert.IsTrue (assembly_load_found);
4346 Assert.IsTrue (type_load_found);