+++ /dev/null
-/*
-using System.IO;
-Send("1-file-exec-and-symbols dotnet");
-Send("2-exec-arguments " + TestBin);
-
-string filename = Path.GetFileName(TestSource);
-
-Send(String.Format("3-break-insert -f {0}:{1}", filename, Lines["BREAK1"]));
-r = Expect("3^done");
-int id1 = r.Find("bkpt").FindInt("number");
-
-Send(String.Format("4-break-insert -f {0}:{1}", filename, Lines["BREAK2"]));
-r = Expect("4^done");
-int id2 = r.Find("bkpt").FindInt("number");
-
-Send(String.Format("5-break-insert -f -c \"x>20\" {0}:{1}", filename, Lines["BREAK3"]));
-r = Expect("5^done");
-int id3 = r.Find("bkpt").FindInt("number");
-
-Send(String.Format("6-break-insert -f -c \"x>50\" BreakpointAddRemoveTest.Program.TestFunc2"));
-r = Expect("6^done");
-int id4 = r.Find("bkpt").FindInt("number");
-
-Send(String.Format("7-break-insert -f Program.TestFunc3"));
-r = Expect("7^done");
-int id5 = r.Find("bkpt").FindInt("number");
-
-Send(String.Format("8-break-insert -f TestFunc4(int)"));
-r = Expect("8^done");
-int id6 = r.Find("bkpt").FindInt("number");
-
-Send("-exec-run");
-*/
-using System;
-
-namespace BreakpointAddRemoveTest
-{
-
-
- class Program
- {
- static void Main(string[] args)
- { // //@START@
-/*
-var r = Expect("*stopped");
-Assert.Equal("entry-point-hit", r.FindString("reason"));
-Assert.Equal(Lines["START"], r.Find("frame").FindInt("line"));
-
-Send("9-exec-continue");
-*/
- Console.WriteLine("Hello World!"); // //@BREAK1@
-/*
-r = Expect("*stopped");
-Assert.Equal("breakpoint-hit", r.FindString("reason"));
-Assert.Equal(Lines["BREAK1"], r.Find("frame").FindInt("line"));
-Assert.Equal(id1, r.FindInt("bkptno"));
-
-Send(String.Format("10-break-delete {0}", id2));
-Expect("10^done");
-Send("11-exec-continue");
-*/
- TestFunc(10);
- TestFunc(21);
- TestFunc(9);
- TestFunc2(11);
- TestFunc2(90);
-
- TestFunc3(true);
- TestFunc3();
-
- TestFunc4();
- TestFunc4(50);
-
- Console.WriteLine("Hello World!"); // //@BREAK2@
- }
-
- static void TestFunc(int x)
- {
- x++; // //@BREAK3@
-/*
-r = Expect("*stopped");
-Assert.Equal("breakpoint-hit", r.FindString("reason"));
-Assert.Equal(Lines["BREAK3"], r.Find("frame").FindInt("line"));
-Assert.Equal(id3, r.FindInt("bkptno"));
-Send("12-exec-continue");
-*/
- }
-
- static void TestFunc2(int x)
- { // //@FUNC_BREAK@
-/*
-r = Expect("*stopped");
-Assert.Equal("breakpoint-hit", r.FindString("reason"));
-Assert.Equal(Lines["FUNC_BREAK"], r.Find("frame").FindInt("line"));
-Assert.Equal(id4, r.FindInt("bkptno"));
-Send("13-exec-continue");
-*/
- x++;
- }
-
- static int TestFunc3(bool iii)
- { // //@FUNC_BREAK2@
-/*
-r = Expect("*stopped");
-Assert.Equal("breakpoint-hit", r.FindString("reason"));
-Assert.Equal(Lines["FUNC_BREAK2"], r.Find("frame").FindInt("line"));
-Assert.Equal(id5, r.FindInt("bkptno"));
-Send("14-exec-continue");
-*/
- return 10;
- }
-
- static int TestFunc3()
- { // //@FUNC_BREAK3@
-/*
-r = Expect("*stopped");
-Assert.Equal("breakpoint-hit", r.FindString("reason"));
-Assert.Equal(Lines["FUNC_BREAK3"], r.Find("frame").FindInt("line"));
-Assert.Equal(id5, r.FindInt("bkptno"));
-Send("15-exec-continue");
-*/
- return 100;
- }
-
- static int TestFunc4(int a)
- { // //@FUNC_BREAK4@
-/*
-r = Expect("*stopped");
-Assert.Equal("breakpoint-hit", r.FindString("reason"));
-Assert.Equal(Lines["FUNC_BREAK4"], r.Find("frame").FindInt("line"));
-Assert.Equal(id6, r.FindInt("bkptno"));
-Send("16-exec-continue");
-*/
- return 50;
- }
-
- static int TestFunc4()
- {
- return 10;
- }
- }
-/*
-r = Expect("*stopped");
-Assert.Equal("exited", r.FindString("reason"));
-*/
-}
+++ /dev/null
-<Project Sdk="Microsoft.NET.Sdk">
-
- <PropertyGroup>
- <OutputType>Exe</OutputType>
- <TargetFramework>netcoreapp2.0</TargetFramework>
- </PropertyGroup>
-
-</Project>
+++ /dev/null
-/*
-using System.IO;
-Send("1-file-exec-and-symbols dotnet");
-Send("2-exec-arguments " + TestBin);
-string filename = Path.GetFileName(TestSource);
-Send(String.Format("5-break-insert -f {0}:{1}", filename, Lines["PIT_STOP"]));
-var r = Expect("5^done");
-int b1 = r.Find("bkpt").FindInt("number");
-Send("7-exec-run");
-r = Expect("*stopped");
-Assert.Equal("entry-point-hit", r.FindString("reason"));
-Assert.Equal(Lines["MAIN"], r.Find("frame").FindInt("line"));
-Send("8-exec-continue");
-r = Expect("*stopped");
-Assert.Equal("breakpoint-hit", r.FindString("reason"));
-Assert.Equal(Lines["PIT_STOP"], r.Find("frame").FindInt("line"));
-Send("100-exec-continue");
-r = Expect("*stopped");
-Assert.Equal("exception-received", r.FindString("reason"));
-Send("101-exec-continue");
-r = Expect("*stopped");
-Assert.Equal("exception-received", r.FindString("reason"));
-Send("102-exec-continue");
-r = Expect("*stopped");
-Assert.Equal("exception-received", r.FindString("reason"));
-Send("103-exec-continue");
-r = Expect("*stopped");
-Assert.Equal("exception-received", r.FindString("reason"));
-Send("104-exec-continue");
-r = Expect("*stopped");
-Assert.Equal("exception-received", r.FindString("reason"));
-Send("105-exec-continue");
-r = Expect("*stopped");
-Assert.Equal("exception-received", r.FindString("reason"));
-Send("106-exec-continue");
-r = Expect("*stopped");
-Assert.Equal("exception-received", r.FindString("reason"));
-Send("107-exec-continue");
-r = Expect("*stopped");
-Assert.Equal("exception-received", r.FindString("reason"));
-Send("108-exec-continue");
-r = Expect("*stopped");
-Assert.Equal("exception-received", r.FindString("reason"));
-Send("109-exec-continue");
-r = Expect("*stopped");
-Assert.Equal("exception-received", r.FindString("reason"));
-Send("120-exec-continue");
-r = Expect("*stopped");
-Assert.Equal("exited", r.FindString("reason"));
-Send(String.Format("999-break-delete {0}", b1));
-Expect("999^done");
-Send("-gdb-exit");
-*/
-
-using System;
-using System.Threading;
-
-public class Test {
- public void TestSystemException()
- {
- throw new System.DivideByZeroException("Message text");
- }
-
- public void run()
- { // //@PIT_STOP@
- Test test = new Test();
-
- Thread thread0 = new Thread(new System.Threading.ThreadStart(test.TestSystemException));
- Thread thread1 = new Thread(new System.Threading.ThreadStart(test.TestSystemException));
- Thread thread2 = new Thread(new System.Threading.ThreadStart(test.TestSystemException));
- Thread thread3 = new Thread(new System.Threading.ThreadStart(test.TestSystemException));
- Thread thread4 = new Thread(new System.Threading.ThreadStart(test.TestSystemException));
- Thread thread5 = new Thread(new System.Threading.ThreadStart(test.TestSystemException));
- Thread thread6 = new Thread(new System.Threading.ThreadStart(test.TestSystemException));
- Thread thread7 = new Thread(new System.Threading.ThreadStart(test.TestSystemException));
- Thread thread8 = new Thread(new System.Threading.ThreadStart(test.TestSystemException));
- Thread thread9 = new Thread(new System.Threading.ThreadStart(test.TestSystemException));
-
- thread0.Name = "_thread_0_";
- thread1.Name = "_thread_1_";
- thread2.Name = "_thread_2_";
- thread3.Name = "_thread_3_";
- thread4.Name = "_thread_4_";
- thread5.Name = "_thread_5_";
- thread6.Name = "_thread_6_";
- thread7.Name = "_thread_7_";
- thread8.Name = "_thread_8_";
- thread9.Name = "_thread_9_";
-
- thread0.Start();
- thread1.Start();
- thread2.Start();
- thread3.Start();
- thread4.Start();
- thread5.Start();
- thread6.Start();
- thread7.Start();
- thread8.Start();
- thread9.Start();
-
- thread9.Join();
- thread8.Join();
- thread7.Join();
- thread6.Join();
- thread5.Join();
- thread4.Join();
- thread3.Join();
- thread2.Join();
- thread1.Join();
- thread0.Join();
- }
-}
-
-public class MainClass
-{
- public static void Main()
- { // //@MAIN@
- Test test = new Test();
- //////// Empty exception filter. And we expect unhandled exception from each thread.
- //////// Line in breakpoint and exception events not available inside thread methods.
- //////// And also, this test checks additional Continue().
- //////// FuncEval() not checked for MI, because ExceptionInfo not used for MI.
- test.run();
- }
-}
+++ /dev/null
-<Project Sdk="Microsoft.NET.Sdk">
-
- <PropertyGroup>
- <OutputType>Exe</OutputType>
- <TargetFramework>netcoreapp2.0</TargetFramework>
- </PropertyGroup>
-
-</Project>
+++ /dev/null
-/*
-using System.IO;
-Send("1-file-exec-and-symbols dotnet");
-Send("2-exec-arguments " + TestBin);
-
-string filename = Path.GetFileName(TestSource);
-
-Send("3-break-exception-insert throw+user-unhandled A B C");
-var r = Expect("3^done");
-Send("4-break-exception-delete 3 2 1");
-r = Expect("4^done");
-
-//////// Silent removing of previous global exception filter
-Send("200-break-exception-insert throw *");
-r = Expect("200^done");
-int be200 = r.Find("bkpt").FindInt("number");
-
-Send("201-break-exception-insert throw+user-unhandled *");
-r = Expect("201^done");
-int be201 = r.Find("bkpt").FindInt("number");
-
-Send(String.Format("202-break-exception-delete {0}", be200));
-r = Expect("202^error");
-
-Send(String.Format("203-break-exception-delete {0}", be201));
-r = Expect("203^done");
-////////
-
-Send(String.Format("5-break-insert -f {0}:{1}", filename, Lines["PIT_STOP_A"]));
-r = Expect("5^done");
-int b1 = r.Find("bkpt").FindInt("number");
-
-Send(String.Format("6-break-insert -f {0}:{1}", filename, Lines["PIT_STOP_B"]));
-r = Expect("6^done");
-int b2 = r.Find("bkpt").FindInt("number");
-
-Send("7-exec-run");
-
-r = Expect("*stopped");
-Assert.Equal("entry-point-hit", r.FindString("reason"));
-Assert.Equal(Lines["MAIN"], r.Find("frame").FindInt("line"));
-
-//////// Expected result => Not found any exception breakpoits.
-//////// "State: !Thow() && !UserUnhandled() name := '*'";
-Send("8-exec-continue");
-
-r = Expect("*stopped");
-Assert.Equal("breakpoint-hit", r.FindString("reason"));
-Assert.Equal(Lines["PIT_STOP_A"], r.Find("frame").FindInt("line"));
-
-//////// Expected result => Not found any exception breakpoits.
-//////// "State: !Thow() && UserUnhandled() name := '*'";
-Send("10-break-exception-insert user-unhandled *");
-r = Expect("10^done");
-int be1 = r.Find("bkpt").FindInt("number");
-
-Send("11-exec-continue");
-
-r = Expect("*stopped");
-Assert.Equal("breakpoint-hit", r.FindString("reason"));
-Assert.Equal(Lines["PIT_STOP_A"], r.Find("frame").FindInt("line"));
-
-Send(String.Format("12-break-exception-delete {0}", be1));
-r = Expect("12^done");
-
-//////// Expected result => Raised EXCEPTION_A and EXCEPTION_B.
-//////// "State: Thow() && !UserUnhandled() name := '*'";
-Send("13-break-exception-insert throw *");
-r = Expect("13^done");
-int be2 = r.Find("bkpt").FindInt("number");
-
-Send("14-exec-continue");
-
-r = Expect("*stopped");
-Assert.Equal("exception-received", r.FindString("reason"));
-Assert.Equal(Lines["EXCEPTION_A"], r.Find("frame").FindInt("line"));
-
-Send("15-exec-continue");
-
-r = Expect("*stopped");
-Assert.Equal("exception-received", r.FindString("reason"));
-Assert.Equal(Lines["EXCEPTION_B"], r.Find("frame").FindInt("line"));
-
-Send("17-exec-continue");
-
-r = Expect("*stopped");
-Assert.Equal("breakpoint-hit", r.FindString("reason"));
-Assert.Equal(Lines["PIT_STOP_A"], r.Find("frame").FindInt("line"));
-
-Send(String.Format("18-break-exception-delete {0}", be2));
-r = Expect("18^done");
-
-//////// Expected result => Raised EXCEPTION_A and EXCEPTION_B.
-//////// "State: Thow() && UserUnhandled() name := '*'";
-Send("19-break-exception-insert throw+user-unhandled *");
-r = Expect("19^done");
-int be3 = r.Find("bkpt").FindInt("number");
-
-Send("20-exec-continue");
-
-r = Expect("*stopped");
-Assert.Equal("exception-received", r.FindString("reason"));
-Assert.Equal(Lines["EXCEPTION_A"], r.Find("frame").FindInt("line"));
-
-Send("21-exec-continue");
-
-r = Expect("*stopped");
-Assert.Equal("exception-received", r.FindString("reason"));
-Assert.Equal(Lines["EXCEPTION_B"], r.Find("frame").FindInt("line"));
-
-Send("22-exec-continue");
-
-r = Expect("*stopped");
-Assert.Equal("breakpoint-hit", r.FindString("reason"));
-Assert.Equal(Lines["PIT_STOP_A"], r.Find("frame").FindInt("line"));
-
-Send(String.Format("23-break-exception-delete {0}", be3));
-r = Expect("23^done");
-
-//////// Expected result => Raised EXCEPTION_A and EXCEPTION_B.
-//////// "State: Thow() && UserUnhandled() name := '*'";
-Send("19-break-exception-insert throw+user-unhandled *");
-r = Expect("19^done");
-int be4 = r.Find("bkpt").FindInt("number");
-
-Send("20-exec-continue");
-
-r = Expect("*stopped");
-Assert.Equal("exception-received", r.FindString("reason"));
-Assert.Equal(Lines["EXCEPTION_A"], r.Find("frame").FindInt("line"));
-
-Send("21-exec-continue");
-
-r = Expect("*stopped");
-Assert.Equal("exception-received", r.FindString("reason"));
-Assert.Equal(Lines["EXCEPTION_B"], r.Find("frame").FindInt("line"));
-
-Send("22-exec-continue");
-
-r = Expect("*stopped");
-Assert.Equal("breakpoint-hit", r.FindString("reason"));
-Assert.Equal(Lines["PIT_STOP_A"], r.Find("frame").FindInt("line"));
-
-Send(String.Format("23-break-exception-delete {0}", be4));
-r = Expect("23^done");
-
-//////// Expected result => Raised EXCEPTION_A and EXCEPTION_B.
-//////// "State: Thow() && UserUnhandled()";
-//////// "name := System.DivideByZeroException";
-Send("24-break-exception-insert throw+user-unhandled System.DivideByZeroException");
-r = Expect("24^done");
-int be5 = r.Find("bkpt").FindInt("number");
-
-Send("25-exec-continue");
-
-r = Expect("*stopped");
-Assert.Equal("exception-received", r.FindString("reason"));
-Assert.Equal(Lines["EXCEPTION_A"], r.Find("frame").FindInt("line"));
-
-Send("26-exec-continue");
-
-r = Expect("*stopped");
-Assert.Equal("exception-received", r.FindString("reason"));
-Assert.Equal(Lines["EXCEPTION_B"], r.Find("frame").FindInt("line"));
-
-Send("27-exec-continue");
-
-r = Expect("*stopped");
-Assert.Equal("breakpoint-hit", r.FindString("reason"));
-Assert.Equal(Lines["PIT_STOP_A"], r.Find("frame").FindInt("line"));
-
-Send(String.Format("28-break-exception-delete {0}", be5));
-r = Expect("28^done");
-
-//////// Expected result => Raised EXCEPTION_A and EXCEPTION_B.
-//////// "State: Thow()";
-//////// "name := System.DivideByZeroException";
-//////// "State: UserUnhandled()";
-//////// "name := System.DivideByZeroException";
-Send("29-break-exception-insert throw System.DivideByZeroException");
-r = Expect("29^done");
-int be6 = r.Find("bkpt").FindInt("number");
-
-Send("30-break-exception-insert user-unhandled System.DivideByZeroException");
-r = Expect("30^done");
-int be7 = r.Find("bkpt").FindInt("number");
-
-Send("31-exec-continue");
-
-r = Expect("*stopped");
-Assert.Equal("exception-received", r.FindString("reason"));
-Assert.Equal(Lines["EXCEPTION_A"], r.Find("frame").FindInt("line"));
-
-Send("32-exec-continue");
-
-r = Expect("*stopped");
-Assert.Equal("exception-received", r.FindString("reason"));
-Assert.Equal(Lines["EXCEPTION_B"], r.Find("frame").FindInt("line"));
-
-Send("33-exec-continue");
-
-r = Expect("*stopped");
-Assert.Equal("breakpoint-hit", r.FindString("reason"));
-Assert.Equal(Lines["PIT_STOP_A"], r.Find("frame").FindInt("line"));
-
-Send(String.Format("34-break-exception-delete {0}", be7));
-r = Expect("34^done");
-
-Send(String.Format("35-break-exception-delete {0}", be6));
-r = Expect("35^done");
-
-//////// Expected result => Raised EXCEPTION_A and EXCEPTION_B.
-//////// "State: Thow() && UserUnhandled()";
-//////// "name := System.DivideByZeroExceptionWrong and *";
-Send("36-break-exception-insert throw+user-unhandled *");
-r = Expect("36^done");
-int be8 = r.Find("bkpt").FindInt("number");
-
-Send("37-break-exception-insert throw+user-unhandled DivideByZeroExceptionWrong");
-r = Expect("37^done");
-int be9 = r.Find("bkpt").FindInt("number");
-
-Send("38-exec-continue");
-
-r = Expect("*stopped");
-Assert.Equal("exception-received", r.FindString("reason"));
-Assert.Equal(Lines["EXCEPTION_A"], r.Find("frame").FindInt("line"));
-
-Send("39-exec-continue");
-
-r = Expect("*stopped");
-Assert.Equal("exception-received", r.FindString("reason"));
-Assert.Equal(Lines["EXCEPTION_B"], r.Find("frame").FindInt("line"));
-
-Send("40-exec-continue");
-
-r = Expect("*stopped");
-Assert.Equal("breakpoint-hit", r.FindString("reason"));
-Assert.Equal(Lines["PIT_STOP_A"], r.Find("frame").FindInt("line"));
-
-Send(String.Format("41-break-exception-delete {0}", be8));
-r = Expect("41^done");
-
-Send(String.Format("42-break-exception-delete {0}", be9));
-r = Expect("42^done");
-
-//////// Expected result => Not found any exception breakpoits.
-//////// "State: Thow() && UserUnhandled()";
-//////// "name := System.DivideByZeroExceptionWrong";
-
-Send("36-break-exception-insert throw+user-unhandled System.DivideByZeroExceptionWrong");
-r = Expect("36^done");
-int be10 = r.Find("bkpt").FindInt("number");
-
-Send("37-exec-continue");
-
-r = Expect("*stopped");
-Assert.Equal("breakpoint-hit", r.FindString("reason"));
-Assert.Equal(Lines["PIT_STOP_B"], r.Find("frame").FindInt("line"));
-
-Send(String.Format("38-break-exception-delete {0}", be10));
-r = Expect("38^done");
-
-//////// Expected result => Raised EXCEPTION_C, EXCEPTION_D, EXCEPTION_E and exit after third unhandled exception.
-//////// "State: !Thow() && UserUnhandled()";
-//////// "name := AppException";
-
-//////// Test of setting unhandled - read only mode.
-Send("39-break-exception-insert unhandled AppException");
-r = Expect("39^done");
-
-Send("40-break-exception-insert user-unhandled AppException");
-r = Expect("40^done");
-int be11 = r.Find("bkpt").FindInt("number");
-
-Send("41-exec-continue");
-
-r = Expect("*stopped");
-Assert.Equal("exception-received", r.FindString("reason"));
-Assert.Equal(Lines["EXCEPTION_C"], r.Find("frame").FindInt("line"));
-
-Send("42-exec-continue");
-
-r = Expect("*stopped");
-Assert.Equal("exception-received", r.FindString("reason"));
-Assert.Equal(Lines["EXCEPTION_D"], r.Find("frame").FindInt("line"));
-
-Send("43-exec-continue");
-
-r = Expect("*stopped");
-Assert.Equal("exception-received", r.FindString("reason"));
-Assert.Equal(Lines["EXCEPTION_E"], r.Find("frame").FindInt("line"));
-
-Send("45-exec-continue");
-r = Expect("*stopped");
-Assert.Equal("exited", r.FindString("reason"));
-
-Send(String.Format("46-break-exception-delete {0}", be11));
-r = Expect("46^done");
-
-Send(String.Format("99-break-delete {0}", b1));
-Expect("99^done");
-Send(String.Format("100-break-delete {0}", b2));
-Expect("100^done");
-
-Send("-gdb-exit");
-*/
-
-using System;
-using System.Threading;
-
-public class AppException : Exception
-{
- public AppException(String message) : base(message) { }
- public AppException(String message, Exception inner) : base(message, inner) { }
-}
-
-public class Test
-{
- public void TestSystemException()
- { // //@PIT_STOP_A@
- int zero = 1 - 1;
- try
- {
- int a = 1 / zero; // //@EXCEPTION_A@
- }
- catch (Exception e)
- {
- Console.WriteLine($"Implicit Exception: {e.Message}");
- }
- try
- {
- throw new System.DivideByZeroException(); // //@EXCEPTION_B@
- }
- catch (Exception e)
- {
- Console.WriteLine($"Explicit Exception: {e.Message}");
- }
- Console.WriteLine("Complete system exception test\n");
- }
- public void TestAppException()
- { // //@PIT_STOP_B@
- try
- {
- CatchInner();
- }
- catch (AppException e)
- {
- Console.WriteLine("Caught: {0}", e.Message);
- if (e.InnerException != null)
- {
- Console.WriteLine("Inner exception: {0}", e.InnerException);
- }
- throw new AppException("Error again in CatchInner caused by calling the ThrowInner method.", e); // //@EXCEPTION_E@
- }
- Console.WriteLine("Complete application exception test\n");
- }
- public void ThrowInner()
- {
- throw new AppException("Exception in ThrowInner method."); // //@EXCEPTION_C@
- }
- public void CatchInner()
- {
- try
- {
- this.ThrowInner();
- }
- catch (AppException e)
- {
- throw new AppException("Error in CatchInner caused by calling the ThrowInner method.", e); // //@EXCEPTION_D@
- }
- }
-}
-
-public class MainClass
-{
- public static void Main()
- { // //@MAIN@
- Test test = new Test();
-
- //////// "State: !Thow() && !UserUnhandled() name := '*'";
- test.TestSystemException();
-
- //////// "State: !Thow() && UserUnhandled() name := '*'";
- test.TestSystemException();
-
- //////// "State: Thow() && !UserUnhandled() name := '*'";
- test.TestSystemException();
-
- //////// "State: Thow() && UserUnhandled() name := '*'";
- test.TestSystemException();
-
- //////// "State: Thow() && UserUnhandled()";
- //////// "name := System.DivideByZeroException";
- test.TestSystemException();
-
- //////// "State: Thow()";
- //////// "name := System.DivideByZeroException";
- //////// "State: UserUnhandled()";
- //////// "name := System.DivideByZeroException";
- test.TestSystemException();
-
- //////// "State: Thow() && UserUnhandled()";
- //////// "name := System.DivideByZeroExceptionWrong and *";
- test.TestSystemException();
-
- //////// "State: Thow() && UserUnhandled()";
- //////// "name := System.DivideByZeroExceptionWrong";
- test.TestSystemException();
-
- //////// "TODO:\n"
- //////// "Test for check forever waiting:\n"
- //////// "threads in NetcoreDBG (unsupported now)\n"
- //////// "Thread threadA = new Thread(new ThreadStart(test.TestSystemException));\n"
- //////// "Thread threadB = new Thread(new ThreadStart(test.TestSystemException));\n"
- //////// "threadA.Start();\n"
- //////// "threadB.Start();\n"
- //////// "threadA.Join();\n"
- //////// "threadB.Join();\n"
-
- //////// "Test with process exit at the end, need re-run"
- //////// "INFO: State: !Thow() && UserUnhandled() name := AppException";
- test.TestAppException();
- }
-}
+++ /dev/null
-<Project Sdk="Microsoft.NET.Sdk">
-
- <PropertyGroup>
- <OutputType>Exe</OutputType>
- <TargetFramework>netcoreapp2.0</TargetFramework>
- </PropertyGroup>
-
-</Project>
+++ /dev/null
-/*
-Send("1-file-exec-and-symbols dotnet");
-Send("2-exec-arguments " + TestBin);
-Send("3-exec-run");
-
-var r = Expect("*stopped");
-Assert.Equal("entry-point-hit", r.FindString("reason"));
-Assert.Equal(Lines["START"], r.Find("frame").FindInt("line"));
-*/
-
-using System;
-
-namespace ExceptionTest
-{
- class P {
- public int x {
- get { return 111; }
- }
- }
-
- class Program
- {
- static void MyFunction(string s)
- {
- throw new Exception("test exception"); // //@THROW1@
- }
- static void MyFunction(int a)
- {
- }
- static void Main(string[] args)
- { // //@START@
- P p = new P(); // //@STEP1@
-/*
-var try1Lines = new string[] { "STEP1", "TRY1", "TRY2", "TRY3", "CATCH1", "CATCH2", "CATCH3", "CATCH4" };
-foreach (string tag in try1Lines)
-{
- Send("-exec-next");
- r = Expect("*stopped");
- Assert.Equal("end-stepping-range", r.FindString("reason"));
- Assert.Equal(Lines[tag], r.Find("frame").FindInt("line"));
-}
-*/
- try
- { // //@TRY1@
- try
- { // //@TRY2@
- MyFunction(""); // //@TRY3@
- }
- catch(Exception e) // //@CATCH1@
- { // //@CATCH2@
- int a = 1; // //@CATCH3@
- } // //@CATCH4@
-/*
-// Check stack frames location
-
-Send("-stack-list-frames");
-r = Expect("^done");
-
-NamedResultValue[] frames = r.Find<ResultListValue>("stack").Content;
-Assert.True(frames.Length >= 3);
-
-Assert.Equal("frame", frames[0].Name);
-Assert.Equal("frame", frames[1].Name);
-Assert.Equal("frame", frames[2].Name);
-
-Assert.Equal(0, frames[0].Value.FindInt("level"));
-Assert.Equal(1, frames[1].Value.FindInt("level"));
-Assert.Equal(2, frames[2].Value.FindInt("level"));
-
-Assert.Equal(TestSource, frames[0].Value.FindString("fullname"));
-Assert.Equal(TestSource, frames[1].Value.FindString("fullname"));
-Assert.Equal(TestSource, frames[2].Value.FindString("fullname"));
-
-Assert.Equal(Lines["CATCH4"], frames[0].Value.FindInt("line"));
-Assert.Equal(Lines["THROW1"], frames[1].Value.FindInt("line"));
-Assert.Equal(Lines["TRY3"], frames[2].Value.FindInt("line"));
-
-// Check local variables
-
-Send("-stack-list-variables");
-r = Expect("^done");
-ResultValue[] variables = r.Find<ValueListValue>("variables").AsArray<ResultValue>();
-Func<string, string> getVarValue = (string name) => Array.Find(variables, v => v.FindString("name") == name).FindString("value");
-
-Assert.Equal("{System.Exception}", getVarValue("$exception"));
-Assert.Equal("{System.Exception}", getVarValue("e"));
-Assert.Equal("1", getVarValue("a"));
-Assert.Equal("{ExceptionTest.P}", getVarValue("p"));
-Assert.Equal("{string[0]}", getVarValue("args"));
-
-// Execute property and check its value
-
-Send(String.Format("-var-create - * \"{0}\"", "p.x"));
-r = Expect("^done");
-Assert.Equal("111", r.FindString("value"));
-Assert.Equal("0", r.FindString("numchild"));
-Assert.Equal("int", r.FindString("type"));
-Assert.Equal("p.x", r.FindString("exp"));
-*/
- int b = 2; // //@TRY4@
- try
- {
- MyFunction("");
- }
- catch(Exception e)
- {
- int c = 1;
- throw new Exception("my exception");
- }
- }
- catch(Exception e)
- {
- MyFunction(1);
- }
- int d = 1; // //@BREAK@
- }
- }
-}
-/*
-Send("-exec-continue");
-r = Expect("*stopped");
-Assert.Equal("exited", r.FindString("reason"));
-*/
+++ /dev/null
-<Project Sdk="Microsoft.NET.Sdk">
-
- <PropertyGroup>
- <OutputType>Exe</OutputType>
- <TargetFramework>netcoreapp2.0</TargetFramework>
- </PropertyGroup>
-
-</Project>
+++ /dev/null
-<Project Sdk="Microsoft.NET.Sdk">\r
-\r
- <PropertyGroup>\r
- <OutputType>Exe</OutputType>\r
- <TargetFramework>netcoreapp2.0</TargetFramework>\r
- </PropertyGroup>\r
-\r
-</Project>\r
+++ /dev/null
-/*\r
-using System.IO;\r
-Send("1-file-exec-and-symbols dotnet");\r
-Send("2-exec-arguments " + TestBin);\r
-\r
-string filename = Path.GetFileName(TestSource);\r
-\r
-Send(String.Format("3-break-insert -f {0}:{1}", filename, Lines["BREAK1"]));\r
-r = Expect("3^done");\r
-int id1 = r.Find("bkpt").FindInt("number");\r
-\r
-Send(String.Format("4-break-insert -f {0}:{1}", filename, Lines["BREAK2"]));\r
-r = Expect("4^done");\r
-int id2 = r.Find("bkpt").FindInt("number");\r
-\r
-Send(String.Format("5-break-insert -f {0}:{1}", filename, Lines["BREAK3"]));\r
-r = Expect("5^done");\r
-int id3 = r.Find("bkpt").FindInt("number");\r
-\r
-Send("6-exec-run");\r
-*/\r
-\r
-using System;\r
-\r
-namespace ExpressionsTest\r
-{\r
- class Program\r
- {\r
- static void Main(string[] args)\r
- { // //@START@\r
-/*\r
-var r = Expect("*stopped");\r
-Assert.Equal("entry-point-hit", r.FindString("reason"));\r
-Assert.Equal(Lines["START"], r.Find("frame").FindInt("line"));\r
-\r
-Send("7-exec-continue");\r
-*/\r
- int a = 10;\r
- int b = 11;\r
- TestStruct tc = new TestStruct(a + 1, b);\r
- string str1 = "string1";\r
- string str2 = "string2";\r
- int c = tc.b + b; // //@BREAK1@\r
-/*\r
-r = Expect("*stopped");\r
-Assert.Equal("breakpoint-hit", r.FindString("reason"));\r
-Assert.Equal(Lines["BREAK1"], r.Find("frame").FindInt("line"));\r
-Assert.Equal(id1, r.FindInt("bkptno"));\r
-\r
-Send(String.Format("8-var-create - * \"{0}\"", "a + b"));\r
-r = Expect("8^done");\r
-Assert.Equal("21", r.FindString("value"));\r
-\r
-Send(String.Format("9-var-create - * \"{0}\"", "tc.a + b"));\r
-r = Expect("9^done");\r
-Assert.Equal("22", r.FindString("value"));\r
-\r
-Send(String.Format("10-var-create - * \"{0}\"", "str1 + str2"));\r
-r = Expect("10^done");\r
-Assert.Equal("\"string1string2\"", r.FindString("value"));\r
-\r
-Send("11-exec-continue");\r
-*/\r
- {\r
- int d = 99;\r
- int e = c + a; // //@BREAK2@\r
-/*\r
-r = Expect("*stopped");\r
-Assert.Equal("breakpoint-hit", r.FindString("reason"));\r
-Assert.Equal(Lines["BREAK2"], r.Find("frame").FindInt("line"));\r
-Assert.Equal(id2, r.FindInt("bkptno"));\r
-\r
-Send(String.Format("12-var-create - * \"{0}\"", "d + a"));\r
-r = Expect("12^done");\r
-Assert.Equal("109", r.FindString("value"));\r
-\r
-Send("13-exec-continue");\r
-*/\r
- }\r
-\r
- Console.WriteLine(str1 + str2);\r
-\r
- tc.IncA();\r
-\r
- Console.WriteLine("Hello World!");\r
- }\r
- }\r
-\r
- struct TestStruct\r
- {\r
- public int a;\r
- public int b;\r
-\r
- public TestStruct(int x, int y)\r
- {\r
- a = x;\r
- b = y;\r
- }\r
-\r
- public void IncA()\r
- {\r
- a++; // //@BREAK3@\r
-/*\r
-r = Expect("*stopped");\r
-Assert.Equal("breakpoint-hit", r.FindString("reason"));\r
-Assert.Equal(Lines["BREAK3"], r.Find("frame").FindInt("line"));\r
-Assert.Equal(id3, r.FindInt("bkptno"));\r
-\r
-Send(String.Format("14-var-create - * \"{0}\"", "a + 1"));\r
-r = Expect("14^done");\r
-Assert.Equal("12", r.FindString("value"));\r
-\r
-Send("15-exec-continue");\r
-*/\r
- }\r
- }\r
-/*\r
-r = Expect("*stopped");\r
-Assert.Equal("exited", r.FindString("reason"));\r
-*/\r
-}\r
+++ /dev/null
-<Project Sdk="Microsoft.NET.Sdk">
-
- <PropertyGroup>
- <OutputType>Exe</OutputType>
- <TargetFramework>netcoreapp2.0</TargetFramework>
- </PropertyGroup>
-
-</Project>
+++ /dev/null
-/*
-Send("1-file-exec-and-symbols dotnet");
-Send("2-exec-arguments " + TestBin);
-
-Send(String.Format("3-break-insert -f {0}:{1}", TestSource, Lines["LAMBDAENTRY1"]));
-r = Expect("3^done");
-
-Send(String.Format("4-break-insert -f {0}:{1}", TestSource, Lines["LAMBDAENTRY2"]));
-var r = Expect("4^done");
-
-Send("5-exec-run");
-r = Expect("*stopped");
-Assert.Equal("entry-point-hit", r.FindString("reason"));
-
-Send("6-exec-continue");
-r = Expect("6^running");
-
-r = Expect("*stopped");
-Assert.Equal("breakpoint-hit", r.FindString("reason"));
-Assert.Equal(Lines["LAMBDAENTRY1"], r.Find("frame").FindInt("line"));
-
-Send("7-stack-list-variables");
-r = Expect("7^done");
-ResultValue[] variables = r.Find<ValueListValue>("variables").AsArray<ResultValue>();
-Func<string, string> getVarValue = (string name) => Array.Find(variables, v => v.FindString("name") == name).FindString("value");
-
-Assert.Equal(variables.Length, 6);
-Assert.Equal("{LambdaTest.Class1.Class2}", getVarValue("this"));
-Assert.Equal("{LambdaTest.Lambda}", getVarValue("lambda2"));
-Assert.Equal("\"funcVar\"", getVarValue("funcVar"));
-Assert.Equal("\"funcArg\"", getVarValue("funcArg"));
-Assert.Equal("\"localVar1\"", getVarValue("localVar1"));
-Assert.Equal("\"argVar1\"", getVarValue("argVar1"));
-
-string [] accessibleVars1 = {
- "staticVar1",
- "staticVar2",
- "instanceVar",
- "funcVar",
- "funcArg",
- "localVar1",
- "argVar1"
-};
-
-foreach (string v in accessibleVars1)
-{
- Send(String.Format("-var-create - * \"{0}\"", v));
- r = Expect("^done");
- Assert.Equal($"\"{v}\"", r.FindString("value"));
-}
-
-Send("8-exec-continue");
-r = Expect("*stopped");
-Assert.Equal("breakpoint-hit", r.FindString("reason"));
-Assert.Equal(Lines["LAMBDAENTRY2"], r.Find("frame").FindInt("line"));
-
-Send("9-stack-list-variables");
-r = Expect("9^done");
-variables = r.Find<ValueListValue>("variables").AsArray<ResultValue>();
-
-Assert.Equal(variables.Length, 7);
-Assert.Equal("{LambdaTest.Class1.Class2}", getVarValue("this"));
-Assert.Equal("\"funcVar\"", getVarValue("funcVar"));
-Assert.Equal("\"funcArg\"", getVarValue("funcArg"));
-Assert.Equal("\"localVar1\"", getVarValue("localVar1"));
-Assert.Equal("\"argVar1\"", getVarValue("argVar1"));
-Assert.Equal("\"localVar2\"", getVarValue("localVar2"));
-Assert.Equal("\"argVar2\"", getVarValue("argVar2"));
-
-string [] accessibleVars2 = {
- "staticVar1",
- "staticVar2",
- "instanceVar",
- "funcVar",
- "funcArg",
- "localVar1",
- "argVar1",
- "localVar2",
- "argVar2"
-};
-
-foreach (string v in accessibleVars2)
-{
- Send(String.Format("-var-create - * \"{0}\"", v));
- r = Expect("^done");
- Assert.Equal($"\"{v}\"", r.FindString("value"));
-}
-
-*/
-
-using System;
-namespace LambdaTest
-{
- delegate void Lambda(string argVar);
-
- class Class1
- {
- static string staticVar1 = "staticVar1";
- class Class2
- {
-
- static string staticVar2 = "staticVar2";
-
- string instanceVar = "instanceVar";
-
- public void Func(string funcArg)
- {
- string funcVar = "funcVar";
-
- Lambda lambda1 = (argVar1) => {
- string localVar1 = "localVar1";
-
- Lambda lambda2 = (argVar2) => {
- string localVar2 = "localVar2";
-
- Console.WriteLine(staticVar1); // //@LAMBDAENTRY2@
- Console.WriteLine(staticVar2);
- Console.WriteLine(instanceVar);
- Console.WriteLine(funcVar);
- Console.WriteLine(funcArg);
- Console.WriteLine(localVar1);
- Console.WriteLine(argVar1);
- Console.WriteLine(localVar2);
- Console.WriteLine(argVar2);
- };
- Console.WriteLine(staticVar1); // //@LAMBDAENTRY1@
- Console.WriteLine(staticVar2);
- Console.WriteLine(instanceVar);
- Console.WriteLine(funcVar);
- Console.WriteLine(funcArg);
- Console.WriteLine(localVar1);
- Console.WriteLine(argVar1);
- lambda2("argVar2");
- };
- lambda1("argVar1");
- }
- }
-
- static void Main(string[] args)
- { // //@START@
- var c = new Class2();
- c.Func("funcArg");
- }
- }
-}
-
-/*
-Send("-exec-continue");
-r = Expect("*stopped");
-Assert.Equal("exited", r.FindString("reason"));
-*/
\ No newline at end of file
+++ /dev/null
-# Tests
-
-## Running tests
-
-By default test runner looks for debugger binary in `./bin` directory and expects `dotnet` CLI to be present in `PATH`.
-
-Test are run through dotnet CLI from the project root directory:
-```
-cd tests
-dotnet build && dotnet test runner
-```
-
-It is possible to override path to the debugger binary through `PIPE` environment variable:
-```
-cd tests
-PIPE=<path-to-debugger> dotnet test --logger "trx;LogFileName=$PWD/Results.trx"
-```
-
-`PIPE` can contain multiple shell commands, but in the end the debugger MI console should be lanched.
-
-Test results can be exported to a file with `--logger` command line option.
-
-By default test binaries are discovered recursively under project `tests` directory. When tests should be executed on another machine, environment variable `TESTDIR` can override the location of test binaries. In that case recursive search is not performed and all test binaries should be located directly under `TESTDIR`. So for `TESTDIR=/tmp` the test binary files layout shoud be:
-```
-/tmp/Example1Test.dll
-/tmp/Example1Test.pdb
-/tmp/Example2Test.dll
-/tmp/Example2Test.pdb
-...
-```
-
-Refer to `run_tests_sdb.sh` as an example of running tests on Tizen device.
-
-`TIMEOUT` environment variable overrides a default timeout (in seconds) for test's `Expect` command.
-
-## Writing new tests
-
-### Add new test
-
-Create new project under `tests` directory and add it to `tests` solution:
-```
-cd tests
-dotnet new console -o ExampleTest
-dotnet sln add ExampleTest/ExampleTest.csproj
-```
-
-Add project name as a method of `Runner.TestRunner` class in `runner/Runner.cs`:
-```
-[Fact]
-public void ExampleTest() => ExecuteTest();
-```
-
-Method name should match the project name and the name of the dll that is produced after project build.
-
-Now the ExampleTest should be displayed as available:
-```
-$ dotnet test -t
-...
-The following Tests are available:
- ...
- Runner.TestRunner.ExampleTest
-```
-
-### Write test scenario
-
-Test scenario should be present in comments inside TestExample/Program.cs
-
-The following example instructs the debugger to run test binary and verifies that the debugger stops at line with `@START@` tag with stop reason `entry-point-hit`:
-```
-/*
-Send("1-file-exec-and-symbols dotnet");
-Send("2-exec-arguments " + TestBin);
-Send("3-exec-run");
-
-var r = Expect("*stopped");
-Assert.Equal(r.FindString("reason"), "entry-point-hit");
-Assert.Equal(r.Find("frame").FindInt("line"), Lines["START"]);
-*/
-using System;
-
-namespace ExampleTest
-{
- class Program
- {
- static void Main(string[] args)
- { // //@START@
- Console.WriteLine("Hello World!");
- }
- }
-}
-```
-
-#### Variables
-
-* `Dictionary<string, int> Lines` provides the mapping between tags `@TAGNAME@` in test source and line numbers.
-
-* `string TestSource` is a full path to test source file.
-
-* `string TestBin` is a full path to test dll file.
-
-* `int DefaultExpectTimeout` is a timeout for `Expect` operation, default value is 20 (seconds).
-
-* `ITestOutputHelper Output` is a log interface from Xunit, it contains methods like `WriteLine` etc.
-
-#### Methods
-
-* `Assert.*` are asserts from Xunit.
-
-* `void Send(string s)` sends command to the debugger process through stdin. New line is automatically appended to `s`.
-
-* `MICore.Results Expect(string s, int timeoutSec = DefaultExpectTimeout)` reads debugger output line by line and checks if some line starts with `s`. If the expected line is found then it is parsed into MI responce object `MICore.Results`. In case of timeout or invalid MI responce an exception is thrown.
-For more info about MI responce object see https://github.com/Microsoft/MIEngine/blob/master/src/MICore/MIResults.cs
-
-* `int GetCurrentLine()` provides current line number.
+++ /dev/null
-/*\r
-Send("1-file-exec-and-symbols dotnet");\r
-Send("2-exec-arguments " + TestBin);\r
-Send("3-exec-run");\r
-\r
-var r = Expect("*stopped");\r
-Assert.Equal("entry-point-hit", r.FindString("reason"));\r
-\r
-Send(String.Format("4-break-insert -f {0}:{1}", TestSource, Lines["BREAK1"]));\r
-Expect("4^done");\r
-\r
-Send(String.Format("5-break-insert -f {0}:{1}", TestSource, Lines["BREAK2"]));\r
-Expect("5^done");\r
-\r
-Send("6-exec-continue");\r
-*/\r
-\r
-using System;\r
-\r
-namespace SetValuesTest\r
-{\r
- public struct TestStruct1\r
- {\r
- public int val1;\r
- public byte val2;\r
-\r
- public TestStruct1(int v1, byte v2)\r
- {\r
- val1 = v1;\r
- val2 = v2;\r
- }\r
- }\r
-\r
- public struct TestStruct2\r
- {\r
- public int val1;\r
- public TestStruct1 struct2;\r
-\r
- public TestStruct2(int v1, int v2, byte v3)\r
- {\r
- val1 = v1;\r
- struct2.val1 = v2;\r
- struct2.val2 = v3;\r
- }\r
- }\r
-\r
- class Program\r
- {\r
- static void Main(string[] args)\r
- { // //@START@\r
- TestStruct2 ts = new TestStruct2(1, 5, 10); \r
-\r
- bool testBool = false;\r
- char testChar = 'ㅎ';\r
- byte testByte = (byte)10;\r
- sbyte testSByte = (sbyte)-100;\r
- short testShort = (short)-500;\r
- ushort testUShort = (ushort)500;\r
- int testInt = -999999;\r
- uint testUInt = 999999;\r
- long testLong = -999999999;\r
- ulong testULong = 9999999999;\r
-\r
- decimal b = 0000001.000000000000000000000000006M;\r
- int[] arrs = decimal.GetBits(b);\r
- string testString = "someNewString that I'll test with";\r
-\r
- int dummy1 = 1; // //@BREAK1@\r
-/*\r
-r = Expect("*stopped");\r
-Assert.Equal("breakpoint-hit", r.FindString("reason"));\r
-Assert.Equal(Lines["BREAK1"], r.Find("frame").FindInt("line"));\r
-\r
-Send(String.Format("8-var-create - * \"{0}\"", "ts.struct2.val1"));\r
-r = Expect("8^done");\r
-string val1 = r.FindString("name");\r
-Send(String.Format("9-var-assign {0} \"666\"", val1));\r
-r = Expect("9^done");\r
-\r
-Send(String.Format("10-var-create - * \"{0}\"", "testBool"));\r
-r = Expect("10^done");\r
-string testBool = r.FindString("name");\r
-Send(String.Format("11-var-assign {0} \"true\"", testBool));\r
-r = Expect("11^done");\r
-\r
-Send(String.Format("12-var-create - * \"{0}\"", "testChar"));\r
-r = Expect("12^done");\r
-string testChar = r.FindString("name");\r
-Send(String.Format("13-var-assign {0} \"'a'\"", testChar));\r
-r = Expect("13^done");\r
-\r
-Send(String.Format("14-var-create - * \"{0}\"", "testByte"));\r
-r = Expect("14^done");\r
-string testByte = r.FindString("name");\r
-Send(String.Format("15-var-assign {0} \"200\"", testByte));\r
-r = Expect("15^done");\r
-\r
-Send(String.Format("16-var-create - * \"{0}\"", "testSByte"));\r
-r = Expect("16^done");\r
-string testSByte = r.FindString("name");\r
-Send(String.Format("17-var-assign {0} \"-1\"", testSByte));\r
-r = Expect("17^done");\r
-\r
-Send(String.Format("18-var-create - * \"{0}\"", "testShort"));\r
-r = Expect("18^done");\r
-string testShort = r.FindString("name");\r
-Send(String.Format("19-var-assign {0} \"-666\"", testShort));\r
-r = Expect("19^done");\r
-\r
-Send(String.Format("20-var-create - * \"{0}\"", "testUShort"));\r
-r = Expect("20^done");\r
-string testUShort = r.FindString("name");\r
-Send(String.Format("21-var-assign {0} \"666\"", testUShort));\r
-r = Expect("21^done");\r
-\r
-Send(String.Format("22-var-create - * \"{0}\"", "testInt"));\r
-r = Expect("22^done");\r
-string testInt = r.FindString("name");\r
-Send(String.Format("23-var-assign {0} \"666666\"", testInt));\r
-r = Expect("23^done");\r
-\r
-Send(String.Format("24-var-create - * \"{0}\"", "testUInt"));\r
-r = Expect("24^done");\r
-string testUInt = r.FindString("name");\r
-Send(String.Format("25-var-assign {0} \"666666\"", testUInt));\r
-r = Expect("25^done");\r
-\r
-Send(String.Format("26-var-create - * \"{0}\"", "testLong"));\r
-r = Expect("26^done");\r
-string testLong = r.FindString("name");\r
-Send(String.Format("27-var-assign {0} \"-666666666\"", testLong));\r
-r = Expect("27^done");\r
-\r
-Send(String.Format("28-var-create - * \"{0}\"", "testULong"));\r
-r = Expect("28^done");\r
-string testULong = r.FindString("name");\r
-Send(String.Format("29-var-assign {0} \"666666666\"", testULong));\r
-r = Expect("29^done");\r
-\r
-Send(String.Format("30-var-create - * \"{0}\"", "b"));\r
-r = Expect("30^done");\r
-string b = r.FindString("name");\r
-Send(String.Format("31-var-assign {0} \"-1.000000000000000000000017M\"", b));\r
-r = Expect("31^done");\r
-\r
-Send(String.Format("32-var-create - * \"{0}\"", "testString"));\r
-r = Expect("32^done");\r
-string testString = r.FindString("name");\r
-Send(String.Format("33-var-assign {0} \"\"edited string\"\"", testString));\r
-r = Expect("33^done");\r
-Send("34-exec-continue");\r
-*/\r
- int dummy2 = 2; // //@BREAK2@\r
-/*\r
-r = Expect("*stopped");\r
-Assert.Equal("breakpoint-hit", r.FindString("reason"));\r
-Assert.Equal(Lines["BREAK2"], r.Find("frame").FindInt("line"));\r
-\r
-Send(String.Format("35-var-create - * \"{0}\"", "ts.struct2"));\r
-r = Expect("35^done");\r
-string struct2 = r.FindString("name");\r
-Send(String.Format("36-var-list-children --simple-values \"{0}\"", struct2));\r
-r = Expect("36^done");\r
-string val = r.Find("children").Find("child").FindString("value");\r
-Assert.Equal("666", val);\r
-\r
-\r
-\r
-\r
-\r
-\r
-Send(String.Format("37-var-create - * \"{0}\"", "testBool"));\r
-r = Expect("37^done");\r
-Assert.Equal(r.FindString("value"), "true");\r
-\r
-Send(String.Format("38-var-create - * \"{0}\"", "testChar"));\r
-r = Expect("38^done");\r
-Assert.Equal(r.FindString("value"), "97 \'a\'");\r
-\r
-Send(String.Format("39-var-create - * \"{0}\"", "testByte"));\r
-r = Expect("39^done");\r
-Assert.Equal(r.FindString("value"), "200");\r
-\r
-Send(String.Format("40-var-create - * \"{0}\"", "testSByte"));\r
-r = Expect("40^done");\r
-Assert.Equal(r.FindString("value"), "-1");\r
-\r
-Send(String.Format("41-var-create - * \"{0}\"", "testShort"));\r
-r = Expect("41^done");\r
-Assert.Equal(r.FindString("value"), "-666");\r
-\r
-Send(String.Format("42-var-create - * \"{0}\"", "testUShort"));\r
-r = Expect("42^done");\r
-Assert.Equal(r.FindString("value"), "666");\r
-\r
-Send(String.Format("43-var-create - * \"{0}\"", "testInt"));\r
-r = Expect("43^done");\r
-Assert.Equal(r.FindString("value"), "666666");\r
-\r
-Send(String.Format("44-var-create - * \"{0}\"", "testUInt"));\r
-r = Expect("44^done");\r
-Assert.Equal(r.FindString("value"), "666666");\r
-\r
-Send(String.Format("45-var-create - * \"{0}\"", "testLong"));\r
-r = Expect("45^done");\r
-Assert.Equal(r.FindString("value"), "-666666666");\r
-\r
-Send(String.Format("46-var-create - * \"{0}\"", "testULong"));\r
-r = Expect("46^done");\r
-Assert.Equal(r.FindString("value"), "666666666");\r
-\r
-Send(String.Format("47-var-create - * \"{0}\"", "b"));\r
-r = Expect("47^done");\r
-Assert.Equal(r.FindString("value"), "-1.000000000000000000000017");\r
-\r
-Send(String.Format("48-var-create - * \"{0}\"", "testString"));\r
-r = Expect("48^done");\r
-Assert.Equal(r.FindString("value"), "\"edited string\"");\r
-\r
-*/\r
- }\r
- }\r
-}\r
-/*\r
-Send("49-exec-continue");\r
-r = Expect("*stopped");\r
-Assert.Equal("exited", r.FindString("reason"));\r
-*/\r
+++ /dev/null
-<Project Sdk="Microsoft.NET.Sdk">\r
-\r
- <PropertyGroup>\r
- <OutputType>Exe</OutputType>\r
- <TargetFramework>netcoreapp2.0</TargetFramework>\r
- </PropertyGroup>\r
-\r
-</Project>\r
+++ /dev/null
-/*
-Send("1-file-exec-and-symbols dotnet");
-Send("2-exec-arguments " + TestBin);
-Send("3-exec-run");
-
-var r = Expect("*stopped");
-Assert.Equal(r.FindString("reason"), "entry-point-hit");
-Assert.Equal(r.Find("frame").FindInt("line"), Lines["START"]);
-
-Send("4-exec-step");
-r = Expect("*stopped");
-Assert.Equal(r.FindString("reason"), "end-stepping-range");
-Assert.Equal(r.Find("frame").FindInt("line"), Lines["STEP1"]);
-
-Send("5-exec-step");
-r = Expect("*stopped");
-Assert.Equal(r.FindString("reason"), "end-stepping-range");
-Assert.Equal(r.Find("frame").FindInt("line"), Lines["STEP2"]);
-
-Send("6-gdb-exit");
-*/
-
-using System;
-
-namespace simple_stepping
-{
- class Program
- {
- static void Main(string[] args)
- { // //@START@
- Console.WriteLine("Hello World!"); // //@STEP1@
- } // //@STEP2@
- }
-}
+++ /dev/null
-<Project Sdk="Microsoft.NET.Sdk">
-
- <PropertyGroup>
- <OutputType>Exe</OutputType>
- <TargetFramework>netcoreapp2.0</TargetFramework>
- </PropertyGroup>
-
-</Project>
+++ /dev/null
-/*
-Send("1-file-exec-and-symbols dotnet");
-Send("2-exec-arguments " + TestBin);
-Send("3-exec-run");
-
-var r = Expect("*stopped");
-Assert.Equal("entry-point-hit", r.FindString("reason"));
-Assert.Equal(Lines["START"], r.Find("frame").FindInt("line"));
-
-Send(String.Format("4-break-insert -f {0}:{1}", TestSource, Lines["BREAK"]));
-Expect("4^done");
-
-Send("5-exec-continue");
-*/
-
-using System;
-
-namespace values
-{
- class Program
- {
- static void Main(string[] args)
- { // //@START@
- decimal d = 12345678901234567890123456m;
- decimal long_zero_dec = 0.00000000000000000017M;
- decimal short_zero_dec = 0.17M;
- string 测试 = "电视机"; // //Chinese named variable
- int x = 1; // //@BREAK@
- /*
-r = Expect("*stopped");
-Assert.Equal("breakpoint-hit", r.FindString("reason"));
-Assert.Equal(Lines["BREAK"], r.Find("frame").FindInt("line"));
-
-Send(String.Format("6-var-create - * \"{0}\"", "d"));
-r = Expect("6^done");
-Assert.Equal("12345678901234567890123456", r.FindString("value"));
-Assert.Equal("d", r.FindString("exp"));
-Assert.Equal("0", r.FindString("numchild"));
-Assert.Equal("decimal", r.FindString("type"));
-
-Send(String.Format("7-var-create 8 * \"{0}\"", "long_zero_dec"));
-r = Expect("7^done");
-Assert.Equal("0.00000000000000000017", r.FindString("value"));
-
-Send(String.Format("8-var-create 8 * \"{0}\"", "short_zero_dec"));
-r = Expect("8^done");
-Assert.Equal("0.17", r.FindString("value"));
-
-Send(String.Format("9-var-create - * \"{0}\"", "测试"));
-r = Expect("9^done");
-Assert.Equal("\"电视机\"", r.FindString("value"));
-
-Send(String.Format("99-var-create - * \"{0}\"", "测试 + 测试"));
-r = Expect("99^done");
-Assert.Equal("\"电视机电视机\"", r.FindString("value"));
- */
- }
- }
-}
-/*
-Send("10-exec-continue");
-r = Expect("*stopped");
-Assert.Equal("exited", r.FindString("reason"));
-*/
+++ /dev/null
-<Project Sdk="Microsoft.NET.Sdk">
-
- <PropertyGroup>
- <OutputType>Exe</OutputType>
- <TargetFramework>netcoreapp2.0</TargetFramework>
- </PropertyGroup>
-
-</Project>
+++ /dev/null
-bin
-obj
-*.sw*
+++ /dev/null
-
-.PHONY: all clean
-all:
- dotnet build -c Debug
-
-clean:
- rm -rf bin obj
+++ /dev/null
-This directory contains test program used to test "cli" interface of netcoredbg.
-
-```
-Usage: corerun test.dll <function> [args...]
-Function should be one of the following:
-assert -- call Debug.Assert
-fail -- call Debug.Fail
-null -- cause NullReferenceException
-range -- cause IndexOutOfRange exception
-key -- cause KeyNotFound exception
-overflow -- cause OverflowException
-sigsegv -- cause SIGSEGV signal
-exception -- throw and catch test exception
-task -- run test task
-delegate -- call function via delegate
-wait -- wait for input from stdin
-vars -- test variables in debugger (break test.cs:100)
-function -- test breakpoints in debugger (break test.cs:30
-output -- test stdout/stderr/debug output
-```
-
+++ /dev/null
-/* vim: set ts=4 sw=4 sts=4 et ai: */
-
-using System;
-using System.Threading;
-using System.Threading.Tasks;
-using System.Diagnostics;
-using System.Runtime.Serialization;
-using System.Runtime.Serialization.Formatters.Binary;
-using System.Collections.Generic;
-using System.Text;
-using System.IO;
-
-namespace Test
-{
- static class Program
- {
- static public string get_caller_info()
- {
- StackFrame callStack = new StackFrame(1, true);
- return callStack.GetFileName() + ":" + (callStack.GetFileLineNumber() + 1);
- }
-
- static public string function(int v)
- {
- if (v != 0) Console.WriteLine("function entry");
-
- if (v == 0) return get_caller_info();
-
- v += 1;
- Console.WriteLine("function leave");
- return "";
- }
-
- static public int consume(string s)
- {
- return s.Length;
- }
-
- static public int vars(string a1, ref int a2, int a3)
- {
- ushort us = 0xcafe;
- short s1 = 0x1ace, s2 = (short)us;
- uint u = 0xfeedca75;
- int i1 = 0x1ead1e55, i2 = (int)u;
- ulong ul = 0xfee1900dc0cac01a;
- long l1 = 0x10aded1e55f001ed, l2 = (long)ul;
- string s = "test string";
- char c = 'a';
- byte ub = 0xa5;
- sbyte b1 = 0x5a, b2 = (sbyte)ub;
- bool t = true, f = false;
- float F = 3.141592654F;
- double D = 2.71828D;
- decimal L = 123456789.123456789M;
-
- Console.WriteLine("us={0}, s1={1}, s2={2}, u={3}, i1={4}, i2={5}",
- us, s1, s2, u, i1, i2);
-
- Console.WriteLine("ul={0}, l1={1}, l2={2}", ul, l1, l2);
-
- Console.WriteLine("s={0}, c={1}, ub={2}, b1={3}, b2={4}, t={5}, f={6}",
- s, c, ub, b1, b2, t, f);
-
- Console.WriteLine("f={0}, d={1}, L={2}", F, D, L);
-
- Console.WriteLine("a1={0}, a2={1}, a3={2}", a1, a2, a3);
-
- Console.WriteLine("sv={0}", sv);
-
- Debug.Fail("examine variables");
-
- return consume(s + c + us + s1 + u + i1 + i2 + ul + l1 + l1 + ub + b1 + b2 + t + f + F + D + L);
- }
-
-
- static long sv = 0x1eadf1ee7;
- volatile static int zero = 0, one = 1;
-
- class Except : Exception
- {
- public Except(string msg): base(msg) {}
- }
-
- static void task()
- {
- System.Threading.Thread.Sleep(3000);
- }
-
- delegate void Delegate(string msg);
-
- static void delegate_impl(string msg)
- {
- Console.WriteLine("delegate: {0}", msg);
- }
-
- static void call_delegate(Delegate func)
- {
- func("test");
- }
-
- static public void consume(Object obj)
- {
- using (var devnull = new FileStream("/dev/null", FileMode.Append)) {
- new BinaryFormatter().Serialize(devnull,(obj));
- }
- }
-
- static void stdout_test(int len)
- {
- // using fixed seed (need reproducible result for testing)
- int send = 0;
- Random rnd = new Random(0);
- StringBuilder str = new StringBuilder();
- while (send < len)
- {
- int left = len - send;
- int size = rnd.Next(1, len / 10);
- if (size > left) size = left;
-
- str.Clear();
- string dlm = "";
- while (str.Length < size)
- {
- str.AppendFormat("{0}{1}", dlm, size);
- dlm = " ";
- }
-
- str.Length = size;
- Console.WriteLine(str);
- send += str.Length;
- }
- }
-
- static int fib(int x)
- {
- int y = x - 1;
- int z = x - 2;
- if (x == 0) {
- System.Diagnostics.Debugger.Break();
- return 0;
- }
- else if (x == 1)
- return 1;
- else
- return fib(y) + fib(z);
- }
-
- static void Main(string[] args)
- {
- Thread.CurrentThread.Name = "main (test)";
-
- if (args.Length == 0)
- {
- Console.WriteLine("Usage: {0} <function> [args...]", Environment.CommandLine);
- Console.WriteLine(String.Join(Environment.NewLine,
- "Function should be one of the following:",
- "assert -- call Diagnostics.Debug.Assert",
- "fail -- call Diagnostics.Debug.Fail",
- "break -- call Diagnostics.Debugger.Break (deep stack)",
- "log -- call Diagnostics.Debugger.Log",
- "null -- cause ArgumentNullException",
- "range -- cause IndexOutOfRangeException",
- "key -- cause KeyNotFoundException",
- "overflow -- cause OverflowException",
- "sigsegv -- cause SIGSEGV signal (NullReferenceException)",
- "exception -- throw and catch test exception",
- "task -- run test task",
- "delegate -- call function via delegate",
- "wait -- wait for input from stdin",
- "vars -- test variables in debugger",
- "function -- test breakpoints in debugger",
- "output -- test stdout/stderr/debug output",
- "print [len] -- print len bytes to stdout (1MByte default)",
- "echo [text] -- print 'text' (or read lines from stdin and print)"
- "sleep [sec] -- sleep (default is infinite)"
- ));
- Console.WriteLine("");
- Console.WriteLine("breakpoint location: Test::Program::function at {0}", function(0));
- Environment.Exit(0);
- }
-
- switch (args[0])
- {
- case "assert":
- System.Diagnostics.Debug.Assert(false, "calling Debug.Assert");
- break;
-
- case "fail":
- System.Diagnostics.Debug.Fail("calling Debug.Fail");
- break;
-
- case "break":
- fib(20);
- break;
-
- case "log":
- System.Diagnostics.Debugger.Log(0, null, "Test log message 1");
- System.Diagnostics.Debugger.Log(1, "category", "Test log message 2");
- break;
-
- case "null":
- consume(null);
- break;
-
- case "range":
- {
- var v = new int[1];
- consume(v[one]);
- }
- break;
-
- case "key":
- {
- var v = new SortedList<int, int>();
- consume(v[zero]);
- }
- break;
-
- case "overflow":
- {
- int v = Int32.MaxValue;
- checked {
- v += one;
- }
- }
- break;
-
- case "sigsegv":
- {
- int x = 1;
- unsafe {
- int *i = (int*)zero;
- x = *i;
- consume(*i);
- }
- }
- break;
-
- case "exception":
- try {
- throw (new Except("test exception"));
- }
- catch (Except e) {
- Console.WriteLine("caught: {0}", e.Message);
- }
- break;
-
- case "task":
- {
- Task task = Task.Run(() => Test.Program.task());
- task.Wait();
- }
- break;
-
- case "delegate":
- {
- Delegate func = delegate_impl;
- call_delegate(func);
- }
- break;
-
- case "wait":
- Console.ReadLine();
- break;
-
- case "vars":
- {
- int ref_i = 42;
- vars("func-test", ref ref_i, 43);
- }
- break;
-
- case "function":
- function(42);
- break;
-
- case "output":
- Console.WriteLine("stdout output line 1");
- Console.Error.WriteLine("stderr output line 1");
- Debug.WriteLine("Debug.WriteLine message line 1");
- System.Diagnostics.Debugger.Log(0, null, "log message 1\n");
- Console.WriteLine("stdout output line 2");
- Console.Error.WriteLine("stderr output line 2");
- Debug.WriteLine("Debug.WriteLine message line 2");
- System.Diagnostics.Debugger.Log(0, null, "log message 2\n");
- break;
-
- case "print":
- {
- int len = 1024*1024;
- if (args.Length > 1)
- len = Int32.Parse(args[1]);
- stdout_test(len);
- }
- break;
-
- case "echo":
- {
- if (args.Length > 1) {
- Console.WriteLine(args[1]);
- break;
- }
-
- try {
- string s;
- while (true)
- {
- s = Console.ReadLine();
- if (s == null) break;
- Console.WriteLine(s);
- }
- }
- catch (IOException e)
- {
- Console.Error.WriteLine(e.GetType().Name);
- }
- }
- break;
-
- case "sleep":
- {
- int sec = 86400;
- if (args.Length > 1)
- sec = Int32.Parse(args[1]);
- System.Threading.Thread.Sleep(sec * 1000);
- }
- break;
-
- default:
- Console.Error.WriteLine("Wrong argument ({0})", args[0]);
- Environment.Exit(1);
- break;
- }
- }
- }
-}
-
+++ /dev/null
-<Project Sdk="Microsoft.NET.Sdk">
-
- <PropertyGroup>
- <OutputType>Exe</OutputType>
- <TargetFramework>netcoreapp3.1</TargetFramework>
- <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
- </PropertyGroup>
-
-</Project>
+++ /dev/null
-#!/bin/sh
-
-SDB=${SDB:-sdb}
-
-GBSROOT=$HOME/GBS-ROOT
-TOOLS_ABS_PATH=/home/owner/share/tmp/sdk_tools
-
-SCRIPTDIR=$(dirname $(readlink -f $0))
-
-# Detect target arch
-
-if $SDB shell lscpu | grep -q armv7l; then ARCH=armv7l;
-elif $SDB shell lscpu | grep -q i686; then ARCH=i686;
-else echo "Unknown target architecture"; exit 1; fi
-
-# The following command assumes that GBS build was performed on a clean system (or in Docker),
-# which means only one such file exists.
-RPMFILE=$(find $GBSROOT/local/repos/ -type f -name netcoredbg-[0-9]\*$ARCH.rpm -print -quit)
-
-# Repackage RPM file as TGZ
-
-if [ ! -f "$RPMFILE" ]; then echo "Debugger RPM not found"; exit 1; fi
-PKGNAME=`rpm -q --qf "%{n}" -p $RPMFILE`
-PKGVERSION=`rpm -q --qf "%{v}" -p $RPMFILE`
-PKGARCH=`rpm -q --qf "%{arch}" -p $RPMFILE`
-TARGZNAME=$PKGNAME-$PKGVERSION-$PKGARCH.tar.gz
-if [ -d "$SCRIPTDIR/unpacked" ]; then rm -rf "$SCRIPTDIR/unpacked"; fi
-mkdir "$SCRIPTDIR/unpacked" && cd "$SCRIPTDIR/unpacked"
-rpm2cpio "$RPMFILE" | cpio -idmv
-touch .$TOOLS_ABS_PATH/$PKGNAME/version-$PKGVERSION
-tar cfz ../$TARGZNAME --owner=root --group=root -C .$TOOLS_ABS_PATH .
-cd ..
-
-# Upload TGZ to target and unpack
-
-REMOTETESTDIR=$TOOLS_ABS_PATH/netcoredbg-tests
-
-$SDB root on
-$SDB shell rm -rf "$TOOLS_ABS_PATH/netcoredbg"
-$SDB shell mkdir -p $TOOLS_ABS_PATH/on-demand
-$SDB push $TARGZNAME $TOOLS_ABS_PATH/on-demand
-$SDB shell "cd $TOOLS_ABS_PATH && tar xf $TOOLS_ABS_PATH/on-demand/$(basename $TARGZNAME)"
-$SDB shell rm -rf "$REMOTETESTDIR"
-$SDB shell mkdir $REMOTETESTDIR
-
-# Upload all test dlls and pdbs
-
-find "$SCRIPTDIR" -name '*Test.runtimeconfig.json' | while read fname; do
- base=$(echo $fname | rev | cut -f 3- -d '.' | rev)
- $SDB push ${base}.dll ${base}.pdb $REMOTETESTDIR
-done
-
-$SDB shell "echo -e '#!/bin/sh\nexec /lib/ld-linux.so.* /usr/share/dotnet/corerun --clr-path /usr/share/dotnet.tizen/netcoreapp \$@' > $REMOTETESTDIR/dotnet"
-$SDB shell chmod +x $REMOTETESTDIR/dotnet
-
-# Run tests
-
-DEBUGGER=$TOOLS_ABS_PATH/netcoredbg/netcoredbg
-
-# sdb always allocates a terminal for a shell command, but we do not want MI commands to be echoed.
-# So we need to delay stdin by 1 second and hope that `stty raw -echo` turns the echo off during the delay.
-TESTDIR=$REMOTETESTDIR PIPE="(sleep 1; cat) | $SDB shell stty raw -echo\\; export PATH=\$PATH:$TOOLS_ABS_PATH/netcoredbg-tests\\; $DEBUGGER --log=file --interpreter=mi" dotnet test "$SCRIPTDIR" --logger "trx;LogFileName=$SCRIPTDIR/Results.trx"
+++ /dev/null
-// Copyright (c) Microsoft. All rights reserved.
-// Licensed under the MIT license. See LICENSE file in the project root for full license information.
-
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-using System.Threading.Tasks;
-using System.Globalization;
-
-namespace MICore
-{
- public class MIException : Exception
- {
- public MIException(int hr)
- {
- this.HResult = hr;
- }
-
- public MIException(int hr, Exception innerException)
- : base(string.Empty, innerException)
- {
- }
- }
-
- public class MIResultFormatException : MIException
- {
- private const int COMQC_E_BAD_MESSAGE = unchecked((int)0x80110604);
- public readonly string Field;
- public ResultValue Result;
-
- public MIResultFormatException(string field, ResultValue value)
- : base(COMQC_E_BAD_MESSAGE)
- {
- Field = field;
- Result = value;
- }
-
- public MIResultFormatException(string field, ResultValue value, Exception innerException)
- : base(COMQC_E_BAD_MESSAGE, innerException)
- {
- Field = field;
- Result = value;
- }
-
- public override string Message
- {
- get
- {
- string message = string.Format(CultureInfo.CurrentCulture, "Unrecognized format of field \"{0}\" in result: {1}", Field, Result.ToString());
- return message;
- }
- }
- }
-
- public class UnexpectedMIResultException : MIException
- {
- // We want to have a message which is vaguely reasonable if it winds up getting converted to an HRESULT. So
- // we will use take this one.
- // MessageId: COMQC_E_BAD_MESSAGE
- //
- // MessageText:
- // The message is improperly formatted or was damaged in transit
- private const int COMQC_E_BAD_MESSAGE = unchecked((int)0x80110604);
- private readonly string _debuggerName;
- private readonly string _command;
- private readonly string _miError;
-
- /// <summary>
- /// Creates a new UnexpectedMIResultException
- /// </summary>
- /// <param name="debuggerName">[Required] Name of the underlying MI debugger (ex: 'GDB')</param>
- /// <param name="command">[Required] MI command that was issued</param>
- /// <param name="mi">[Optional] Error message from MI</param>
- public UnexpectedMIResultException(string debuggerName, string command, string mi) : base(COMQC_E_BAD_MESSAGE)
- {
- _debuggerName = debuggerName;
- _command = command;
- _miError = mi;
- }
-
- public override string Message
- {
- get
- {
- string message = string.Format(CultureInfo.CurrentCulture, "Unexpected {0} output from command \"{1}\".", _debuggerName, _command);
- if (!string.IsNullOrWhiteSpace(_miError))
- {
- message = string.Concat(message, " ", _miError);
- }
-
- return message;
- }
- }
-
- public string MIError
- {
- get { return _miError; }
- }
- }
-
- public class MIDebuggerInitializeFailedException : Exception
- {
- [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Security", "CA2104:DoNotDeclareReadOnlyMutableReferenceTypes")]
- public readonly IReadOnlyList<string> OutputLines;
- private readonly string _debuggerName;
- private readonly IReadOnlyList<string> _errorLines;
- private string _message;
-
- public MIDebuggerInitializeFailedException(string debuggerName, IReadOnlyList<string> errorLines, IReadOnlyList<string> outputLines)
- {
- this.OutputLines = outputLines;
- _debuggerName = debuggerName;
- _errorLines = errorLines;
- }
-
- public override string Message
- {
- get
- {
- if (_message == null)
- {
- if (_errorLines.Any(x => !string.IsNullOrWhiteSpace(x)))
- {
- _message = string.Format(CultureInfo.InvariantCulture, "Unable to establish a connection to {0}. The following message was written to stderr:\n\n{1}\n\nSee Output Window for details.", _debuggerName, string.Join("\r\n", _errorLines));
- }
- else
- {
- _message = string.Format(CultureInfo.InvariantCulture, "Unable to establish a connection to {0}. Debug output may contain more information.", _debuggerName);
- }
- }
-
- return _message;
- }
- }
- }
-}
+++ /dev/null
-// Copyright (c) Microsoft. All rights reserved.
-// Licensed under the MIT license. See LICENSE file in the project root for full license information.
-
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-using System.Threading.Tasks;
-using System.Diagnostics;
-using System.Collections;
-using System.Globalization;
-
-namespace MICore
-{
- /// <summary>
- /// Prefix from the output indicating the class of result. According to the documentation, these are:
- ///
- /// result-class ==> "done" | "running" | "connected" | "error" | "exit" | "stopped"
- /// </summary>
- public enum ResultClass
- {
- /// <summary>
- /// ResultClass is not set
- /// </summary>
- None,
-
- done,
- running,
- connected,
- error,
- exit,
- stopped
- }
-
- public class ResultValue
- {
- public virtual ResultValue Find(string name)
- {
- throw new MIResultFormatException(name, this);
- }
-
- public virtual bool TryFind(string name, out ResultValue result)
- {
- if (Contains(name))
- {
- result = Find(name);
- }
- else
- {
- result = null;
- }
- return result != null;
- }
-
- public virtual bool Contains(string name)
- {
- return false;
- }
-
- public ConstValue FindConst(string name)
- {
- return Find<ConstValue>(name);
- }
-
- public int FindInt(string name)
- {
- try
- {
- return FindConst(name).ToInt;
- }
- catch (MIResultFormatException)
- {
- throw;
- }
- catch (Exception e)
- {
- throw new MIResultFormatException(name, this, e);
- }
- }
- public uint FindUint(string name)
- {
- try
- {
- return FindConst(name).ToUint;
- }
- catch (MIResultFormatException)
- {
- throw;
- }
- catch (Exception e)
- {
- throw new MIResultFormatException(name, this, e);
- }
- }
-
- /// <summary>
- /// Try to find a uint property. Throws if the property can be found but is not a uint.
- /// </summary>
- /// <param name="name">[Required] name of the property to search for</param>
- /// <returns>The value of the property or null if it cannot be found</returns>
- public uint? TryFindUint(string name)
- {
- ConstValue c;
- if (!TryFind(name, out c))
- {
- return null;
- }
-
- try
- {
- return c.ToUint;
- }
- catch (OverflowException)
- {
- return null;
- }
- catch (MIResultFormatException)
- {
- throw;
- }
- catch (Exception e)
- {
- throw new MIResultFormatException(name, this, e);
- }
- }
-
- public ulong FindAddr(string name)
- {
- try
- {
- return FindConst(name).ToAddr;
- }
- catch (MIResultFormatException)
- {
- throw;
- }
- catch (Exception e)
- {
- throw new MIResultFormatException(name, this, e);
- }
- }
-
- /// <summary>
- /// Try and find an address property. Returns null if there is no property. Will throw if that property exists but it is not an address.
- /// </summary>
- /// <param name="name">[Required] Name of the property to look for</param>
- /// <returns>The value of the address or null if it can't be found</returns>
- public ulong? TryFindAddr(string name)
- {
- ConstValue c;
- if (!TryFind(name, out c))
- {
- return null;
- }
-
- try
- {
- return c.ToAddr;
- }
- catch (MIResultFormatException)
- {
- throw;
- }
- catch (Exception e)
- {
- throw new MIResultFormatException(name, this, e);
- }
- }
-
-
- public string FindString(string name)
- {
- return FindConst(name).AsString;
- }
-
- public string TryFindString(string name)
- {
- ConstValue c;
- if (!TryFind(name, out c))
- {
- return string.Empty;
- }
- return c.AsString;
- }
-
- public T Find<T>(string name) where T : ResultValue
- {
- var c = Find(name);
- if (c is T)
- {
- return c as T;
- }
- throw new MIResultFormatException(name, this);
- }
-
- public ResultListValue FindResultListValue(string name)
- {
- var c = Find(name);
- if (c is ResultListValue)
- {
- return c as ResultListValue;
- }
- throw new MIResultFormatException(name, this);
- }
-
- public bool TryFind<T>(string name, out T result) where T : ResultValue
- {
- if (Contains(name))
- {
- result = Find(name) as T;
- }
- else
- {
- result = null;
- }
- return result != null;
- }
-
- public T TryFind<T>(string name) where T : ResultValue
- {
- T result;
- if (!TryFind(name, out result))
- {
- return null;
- }
- return result;
- }
- }
-
- public class ConstValue : ResultValue
- {
- public readonly string Content;
-
- public ConstValue(string str)
- {
- Content = str ?? string.Empty;
- }
-
- public static ulong ParseAddr(string addr, bool throwOnError = false)
- {
- ulong res = 0;
- if (string.IsNullOrEmpty(addr))
- {
- if (throwOnError)
- {
- throw new ArgumentNullException();
- }
- return 0;
- }
- else if (addr.StartsWith("0x", StringComparison.OrdinalIgnoreCase))
- {
- if (throwOnError)
- {
- res = ulong.Parse(addr.Substring(2), System.Globalization.NumberStyles.HexNumber, CultureInfo.InvariantCulture);
- }
- else
- {
- ulong.TryParse(addr.Substring(2), System.Globalization.NumberStyles.HexNumber, CultureInfo.InvariantCulture, out res);
- }
- }
- else
- {
- if (throwOnError)
- {
- res = ulong.Parse(addr, System.Globalization.NumberStyles.Integer, CultureInfo.InvariantCulture);
- }
- else
- {
- ulong.TryParse(addr, System.Globalization.NumberStyles.Integer, CultureInfo.InvariantCulture, out res);
- }
- }
- return res;
- }
-
- public static uint ParseUint(string str, bool throwOnError = false)
- {
- uint value = 0;
- if (string.IsNullOrEmpty(str))
- {
- if (throwOnError)
- {
- throw new ArgumentException();
- }
- return value;
- }
- else if (str.StartsWith("0x", StringComparison.OrdinalIgnoreCase))
- {
- if (throwOnError)
- {
- value = uint.Parse(str.Substring(2), System.Globalization.NumberStyles.HexNumber, CultureInfo.InvariantCulture);
- }
- else
- {
- uint.TryParse(str.Substring(2), System.Globalization.NumberStyles.HexNumber, CultureInfo.InvariantCulture, out value);
- }
- }
- else
- {
- if (throwOnError)
- {
- value = uint.Parse(str, System.Globalization.NumberStyles.Integer, CultureInfo.InvariantCulture);
- }
- else
- {
- uint.TryParse(str, System.Globalization.NumberStyles.Integer, CultureInfo.InvariantCulture, out value);
- }
- }
- return value;
- }
-
- public ulong ToAddr
- {
- get
- {
- return ParseAddr(Content, throwOnError: true);
- }
- }
- public int ToInt
- {
- get
- {
- return int.Parse(Content, CultureInfo.InvariantCulture);
- }
- }
- public uint ToUint
- {
- get
- {
- return ParseUint(Content, throwOnError: true);
- }
- }
-
- public string AsString
- {
- get
- {
- return Content;
- }
- }
-
- public override string ToString()
- {
- return Content;
- }
- }
-
- [DebuggerDisplay("{DisplayValue,nq}", Name = "{Name,nq}")]
- [DebuggerTypeProxy(typeof(NamedResultValueTypeProxy))]
- public class NamedResultValue
- {
- internal class NamedResultValueTypeProxy
- {
- private ResultValue _value;
- public NamedResultValueTypeProxy(NamedResultValue namedResultValue)
- {
- _value = namedResultValue.Value;
- }
-
- [DebuggerBrowsable(DebuggerBrowsableState.RootHidden)]
- public NamedResultValue[] Content
- {
- get
- {
- List<NamedResultValue> values = null;
-
- if (_value is ValueListValue)
- {
- var valueListValue = (ValueListValue)_value;
- values = new List<NamedResultValue>(valueListValue.Length);
- for (int i = 0; i < valueListValue.Length; i++)
- {
- string name = string.Format(CultureInfo.InvariantCulture, "[{0}]", i); // fake the [0], [1], [2], etc...
- values.Add(new NamedResultValue(name, valueListValue.Content[i]));
- }
- }
- else if (_value is ResultListValue)
- {
- var resultListValue = (ResultListValue)_value;
- var namedResultValues = resultListValue.Content.Select(value => new NamedResultValue(value));
- values = new List<NamedResultValue>(namedResultValues);
- }
- else if (_value is TupleValue)
- {
- var tupleValue = (TupleValue)_value;
- values = new List<NamedResultValue>(tupleValue.Content.Count);
- tupleValue.Content.ForEach((namedResultValue) =>
- {
- values.Add(new NamedResultValue(namedResultValue.Name, namedResultValue.Value));
- });
- }
-
- return values?.ToArray();
- }
- }
- }
-
- public string Name { get; private set; }
- public ResultValue Value { get; private set; }
-
- public NamedResultValue(string name, ResultValue value)
- {
- this.Name = name;
- this.Value = value;
- }
-
- public NamedResultValue(NamedResultValue namedResultValue) : this(namedResultValue.Name, namedResultValue.Value)
- {
- }
-
- internal string DisplayValue
- {
- get
- {
- if (this.Value is ConstValue)
- {
- return string.Format(CultureInfo.InvariantCulture, "\"{0}\"", ((ConstValue)this.Value).AsString);
- }
- else if (this.Value is TupleValue)
- {
- return string.Format(CultureInfo.InvariantCulture, "{{...}}");
- }
- else if (this.Value is ListValue)
- {
- return string.Format(CultureInfo.InvariantCulture, "[...] count = {0}", ((ListValue)this.Value).Length);
- }
-
- return "<Unknown ResultValue Type>";
- }
- }
-
- public override string ToString()
- {
- StringBuilder builder = new StringBuilder();
- builder.Append(Name);
- builder.Append("=");
- builder.Append(Value.ToString());
- return builder.ToString();
- }
- }
-
- public class TupleValue : ResultValue
- {
- public List<NamedResultValue> Content { get; private set; }
-
- public TupleValue(List<NamedResultValue> list)
- {
- Content = list;
- }
- public override ResultValue Find(string name)
- {
- var item = Content.Find((c) => c.Name == name);
- if (item == null)
- {
- throw new MIResultFormatException(name, this);
- }
- return item.Value;
- }
-
- public override bool Contains(string name)
- {
- var item = Content.Find((c) => c.Name == name);
- return item != null;
- }
-
- public override string ToString()
- {
- StringBuilder outTuple = new StringBuilder();
- outTuple.Append("{");
- for (int i = 0; i < Content.Count; ++i)
- {
- if (i != 0)
- {
- outTuple.Append(",");
- }
- outTuple.Append(Content[i].ToString());
- }
- outTuple.Append("}");
- return outTuple.ToString();
- }
- public ResultValue[] FindAll(string name)
- {
- return Content.FindAll((c) => c.Name == name).Select((c) => c.Value).ToArray();
- }
-
- public T[] FindAll<T>(string name) where T : class
- {
- return FindAll(name).OfType<T>().ToArray();
- }
-
- /// <summary>
- /// Creates a new TupleValue with a subset of values from this TupleValue.
- /// </summary>
- /// <param name="requiredNames">The list of names that must be added to the TupleValue.</param>
- /// <param name="optionalNames">The list of names that will be added to the TupleValue if they exist in this TupleValue.</param>
- public TupleValue Subset(IEnumerable<string> requiredNames, IEnumerable<string> optionalNames = null)
- {
- List<NamedResultValue> values = new List<NamedResultValue>();
-
- // Iterate the required list and add the values.
- // Will throw if a name cannot be found.
- foreach (string name in requiredNames)
- {
- values.Add(new NamedResultValue(name, this.Find(name)));
- }
-
- // Iterate the optional list and add the values of the name exists.
- if (null != optionalNames)
- {
- foreach (string name in optionalNames)
- {
- ResultValue value;
- if (this.TryFind(name, out value))
- {
- values.Add(new NamedResultValue(name, value));
- }
- }
- }
-
- return new TupleValue(values);
- }
- }
-
- public abstract class ListValue : ResultValue
- {
- public abstract int Length { get; }
- public bool IsEmpty()
- {
- return this.Length == 0;
- }
- }
-
- public class ValueListValue : ListValue
- {
- public ResultValue[] Content { get; private set; }
-
- public override int Length { get { return Content.Length; } }
-
- public ValueListValue(List<ResultValue> list)
- {
- Content = list.ToArray();
- }
- public T[] AsArray<T>() where T : ResultValue
- {
- return Content.Cast<T>().ToArray();
- }
-
- public string[] AsStrings
- {
- get { return Content.Cast<ConstValue>().Select(c => c.AsString).ToArray(); }
- }
-
- public override string ToString()
- {
- StringBuilder outList = new StringBuilder();
- outList.Append("[");
- for (int i = 0; i < Content.Length; ++i)
- {
- if (i != 0)
- {
- outList.Append(",");
- }
- outList.Append(Content[i].ToString());
- }
- outList.Append("]");
- return outList.ToString();
- }
- }
-
- public class ResultListValue : ListValue
- {
- public NamedResultValue[] Content { get; private set; }
-
- public override int Length { get { return Content.Length; } }
-
- public ResultListValue(List<NamedResultValue> list)
- {
- Content = list.ToArray();
- }
- public override ResultValue Find(string name)
- {
- var item = Array.Find(Content, (c) => c.Name == name);
- if (item == null)
- {
- throw new MIResultFormatException(name, this);
- }
- return item.Value;
- }
-
- public override bool Contains(string name)
- {
- var item = Array.Find(Content, (c) => c.Name == name);
- return item != null;
- }
-
- public ResultValue[] FindAll(string name)
- {
- return Array.FindAll(Content, (c) => c.Name == name).Select((c) => c.Value).ToArray();
- }
-
- public T[] FindAll<T>(string name) where T : class
- {
- return FindAll(name).OfType<T>().ToArray();
- }
-
- public string[] FindAllStrings(string name)
- {
- return FindAll<ConstValue>(name).Select((c) => c.AsString).ToArray();
- }
-
- public int CountOf(string name)
- {
- return Content.Count(c => c.Name == name);
- }
-
- public ResultValue FindWith(string name, string value)
- {
- for (int i = 0; i < Length; i++)
- if (Content[i].Value.Find(name).ToString() == value)
- return Content[i].Value;
- throw new MIResultFormatException(name, this);
- }
-
- public override string ToString()
- {
- StringBuilder outList = new StringBuilder();
- outList.Append("[");
- for (int i = 0; i < Content.Length; ++i)
- {
- if (i != 0)
- {
- outList.Append(",");
- }
- outList.Append(Content[i].Name);
- outList.Append("=");
- outList.Append(Content[i].Value.ToString());
- }
- outList.Append("]");
- return outList.ToString();
- }
- }
-
- [DebuggerTypeProxy(typeof(ResultsTypeProxy))]
- [DebuggerDisplay("{ResultClass}, Length={Length}")]
- public class Results : ResultListValue
- {
- internal class ResultsTypeProxy
- {
- public ResultsTypeProxy(Results results)
- {
- this.Content = results.Content;
- }
-
- [DebuggerBrowsable(DebuggerBrowsableState.RootHidden)]
- public NamedResultValue[] Content { get; private set; }
- }
-
- public readonly ResultClass ResultClass;
-
- public Results(ResultClass resultsClass, List<NamedResultValue> list = null)
- : base(list ?? new List<NamedResultValue>())
- {
- ResultClass = resultsClass;
- }
-
- public Results Add(string name, ResultValue value)
- {
- var l = Content.ToList();
- l.Add(new NamedResultValue(name, value));
- return new Results(ResultClass, l);
- }
-
- public override string ToString()
- {
- StringBuilder outList = new StringBuilder();
- outList.Append("result-class: " + ResultClass.ToString());
- for (int i = 0; i < Content.Length; ++i)
- {
- outList.Append("\r\n");
- outList.Append(Content[i].Name);
- outList.Append(": ");
- outList.Append(Content[i].Value.ToString());
- }
- outList.Append("\r\n");
- return outList.ToString();
- }
- };
-
- public class MIResults
- {
- struct Span
- {
- static Span _emptySpan;
- public int Start { get; private set; } // index first character in the substring
- public int Length { get; private set; } // length of the substring
- public int Extent { get { return Start + Length; } }
- public bool IsEmpty { get { return Length == 0; } }
- public static Span Empty { get { return _emptySpan; } }
-
- static Span()
- {
- _emptySpan = new Span(0, 0);
- }
-
- public Span(string s)
- {
- Start = 0;
- Length = s.Length;
- }
- public Span(int start, int len)
- {
- if (start < 0)
- {
- throw new ArgumentException("start");
- }
- Start = start;
- Length = len;
- }
- public Span Advance(int len)
- {
- if (len > Length)
- {
- throw new ArgumentException("len");
- }
- return new Span(Start + len, Length - len);
- }
- public Span AdvanceTo(int pos)
- {
- if (Start > pos || pos > Start + Length)
- {
- throw new ArgumentException("pos");
- }
- return new Span(pos, Length - (pos - Start));
- }
- public Span Prefix(int len)
- {
- if (len > Length)
- {
- throw new ArgumentException("len");
- }
- return new Span(Start, len);
- }
- public string Extract(string theString)
- {
- if (Extent > theString.Length)
- {
- throw new ArgumentException("theSpan");
- }
- return theString.Substring(Start, Length);
- }
- public int IndexOf(string theString, char c)
- {
- int i = theString.IndexOf(c, Start);
- if (i < 0 || i >= Extent)
- {
- return -1;
- }
- return i - Start; // Span relative offset
- }
- public bool StartsWith(string theString, string pattern)
- {
- if (Length < pattern.Length)
- {
- return false;
- }
- for (int i = 0; i < pattern.Length; ++i)
- {
- if (theString[Start + i] != pattern[i])
- {
- return false;
- }
- }
- return true;
- }
- }
-
- private string _resultString;
-
- /// <summary>
- /// result-record ==> result-class ( "," result )*
- /// </summary>
- /// <param name="output"></param>
- public Results ParseCommandOutput(string output)
- {
- string token = ParseToken(ref output);
- output = output.Remove(0, 1); // Remove first char (^, *, e.t.c)
- _resultString = output.Trim();
- int comma = _resultString.IndexOf(',');
- Results results;
- ResultClass resultClass = ResultClass.None;
- if (comma < 0)
- {
- // no comma, so entire string should be the result class
- results = new Results(ParseResultClass(output), new List<NamedResultValue>());
- }
- else
- {
- resultClass = ParseResultClass(output.Substring(0, comma));
- Span wholeString = new Span(_resultString);
- results = ParseResultList(wholeString.AdvanceTo(comma + 1), resultClass);
- }
- return results;
- }
-
- private string ParseToken(ref string output)
- {
- if (char.IsDigit(output, 0))
- {
- int i;
- for (i = 1; i < output.Length; i++)
- {
- if (!char.IsDigit(output, i))
- break;
- }
- if (i < output.Length)
- {
- string token = output.Substring(0, i);
- output = output.Substring(i);
- return token;
- }
- }
- return null;
- }
-
- public Results ParseResultList(string listStr, ResultClass resultClass = ResultClass.None)
- {
- _resultString = listStr.Trim();
- return ParseResultList(new Span(_resultString), resultClass);
- }
-
- private Results ParseResultList(Span listStr, ResultClass resultClass = ResultClass.None)
- {
- Span rest;
- var list = ParseResultList((Span s, ref int i) =>
- {
- return true;
- }, (Span s, ref int i) =>
- {
- return i == s.Extent;
- }, listStr, out rest);
- if (!rest.IsEmpty)
- {
- ParseError("trailing chars", rest);
- return null;
- }
- return new Results(resultClass, list);
- }
-
- public string ParseCString(string input)
- {
- if (input == null)
- {
- throw new ArgumentNullException("input");
- }
- else if (input == String.Empty)
- {
- return string.Empty;
- }
-
- string cstr = input.Trim();
- if (cstr[0] != '\"') // not a Cstring, just return the string
- {
- return input;
- }
- _resultString = cstr;
- Span rest;
- var s = ParseCString(new Span(cstr), out rest);
- return s == null ? string.Empty : s.AsString;
- }
-
- private string ParseCString(Span input)
- {
- if (input.IsEmpty)
- {
- return string.Empty;
- }
-
- if (_resultString[input.Start] != '\"') // not a Cstring, just return the string
- {
- return input.Extract(_resultString);
- }
- Span rest;
- var s = ParseCString(input, out rest);
- return s == null ? string.Empty : s.AsString;
- }
-
- /// <summary>
- /// value ==>const | tuple | list
- /// </summary>
- /// <returns></returns>
- private ResultValue ParseValue(Span resultStr, out Span rest)
- {
- ResultValue value = null;
- rest = Span.Empty;
- if (resultStr.IsEmpty)
- {
- return null;
- }
- switch (_resultString[resultStr.Start])
- {
- case '\"':
- value = ParseCString(resultStr, out rest);
- break;
- case '{':
- value = ParseTuple(resultStr, out rest);
- break;
- case '[':
- value = ParseList(resultStr, out rest);
- break;
- default:
- ParseError("unexpected char", resultStr);
- break;
- }
- return value;
- }
-
- /// <summary>
- /// GDB (on x86) sometimes returns a tuple list in a context requiring a tuple (<MULTIPLE> breakpoints).
- /// The grammar does not allow this, but we recognize it and accept it only in the special case when it is contained
- /// in a result value.
- /// tuplelist -- tuple ("," tuple)*
- /// value -- const | tuple | tuplelist | list
- /// </summary>
- /// <returns></returns>
- private ResultValue ParseResultValue(Span resultStr, out Span rest)
- {
- ResultValue value = null;
- rest = Span.Empty;
- if (resultStr.IsEmpty)
- {
- return null;
- }
- switch (_resultString[resultStr.Start])
- {
- case '\"':
- value = ParseCString(resultStr, out rest);
- break;
- case '{':
- value = ParseResultTuple(resultStr, out rest);
- break;
- case '[':
- value = ParseList(resultStr, out rest);
- break;
- default:
- ParseError("unexpected char", resultStr);
- break;
- }
- return value;
- }
-
- /// <summary>
- /// IsValueChar - true is the char is a start-char for a value
- /// </summary>
- private static bool IsValueChar(char c)
- {
- return c == '\"' || c == '{' || c == '[';
- }
-
- /// <summary>
- /// result ==> variable "=" value
- /// </summary>
- /// <param name="resultStr">trimmed input string</param>
- /// <param name="rest">trimmed remainder after result</param>
- private NamedResultValue ParseResult(Span resultStr, out Span rest)
- {
- rest = Span.Empty;
- int equals = resultStr.IndexOf(_resultString, '=');
- if (equals < 1)
- {
- ParseError("variable not found", resultStr);
- return null;
- }
- string name = resultStr.Prefix(equals).Extract(_resultString);
- ResultValue value = ParseResultValue(resultStr.Advance(equals + 1), out rest);
- if (value == null)
- {
- return null;
- }
- return new NamedResultValue(name, value);
- }
-
- private static ResultClass ParseResultClass(string resultClass)
- {
- switch (resultClass)
- {
- case "done": return ResultClass.done;
- case "running": return ResultClass.running;
- case "connected": return ResultClass.connected;
- case "error": return ResultClass.error;
- case "exit": return ResultClass.exit;
- case "stopped": return ResultClass.stopped;
- default:
- {
- Debug.Fail("unexpected result class");
- return ResultClass.None;
- }
- }
- }
-
- private ConstValue ParseCString(Span input, out Span rest)
- {
- rest = input;
- StringBuilder output = new StringBuilder();
- if (input.IsEmpty || _resultString[input.Start] != '\"')
- {
- ParseError("Cstring expected", input);
- return null;
- }
- int i = input.Start + 1;
- bool endFound = false;
- for (; i < input.Extent; i++)
- {
- char c = _resultString[i];
- if (c == '\"')
- {
- // closing quote, so we are (probably) done
- i++;
- if ((i < input.Extent) && (_resultString[i] == c))
- {
- // double quotes mean we emit a single quote, and carry on
- ;
- }
- else
- {
- endFound = true;
- break;
- }
- }
- else if (c == '\\')
- {
- // escaped character
- c = _resultString[++i];
- switch (c)
- {
- case 'n': c = '\n'; break;
- case 'r': c = '\r'; break;
- case 't': c = '\t'; break;
- default: break;
- }
- }
- output.Append(c);
- }
- if (!endFound)
- {
- ParseError("CString not terminated", input);
- return null;
- }
- rest = input.AdvanceTo(i);
- return new ConstValue(output.ToString());
- }
-
- private delegate bool EdgeCondition(Span s, ref int i);
-
- private List<NamedResultValue> ParseResultList(EdgeCondition begin, EdgeCondition end, Span input, out Span rest)
- {
- rest = Span.Empty;
- List<NamedResultValue> list = new List<NamedResultValue>();
- int i = input.Start;
- if (!begin(input, ref i))
- {
- ParseError("Unexpected opening character", input);
- return null;
- }
- if (end(input, ref i)) // tuple is empty
- {
- rest = input.AdvanceTo(i); // eat through the closing brace
- return list;
- }
- input = input.AdvanceTo(i);
- var item = ParseResult(input, out rest);
- if (item == null)
- {
- ParseError("Result expected", input);
- return null;
- }
- list.Add(item);
- input = rest;
- while (!input.IsEmpty && _resultString[input.Start] == ',')
- {
- item = ParseResult(input.Advance(1), out rest);
- if (item == null)
- {
- ParseError("Result expected", input);
- return null;
- }
- list.Add(item);
- input = rest;
- }
-
- i = input.Start;
- if (!end(input, ref i)) // tuple is not closed
- {
- ParseError("Unexpected list termination", input);
- rest = Span.Empty;
- return null;
- }
- rest = input.AdvanceTo(i);
- return list;
- }
-
- private List<NamedResultValue> ParseResultList(char begin, char end, Span input, out Span rest)
- {
- return ParseResultList((Span s, ref int i) =>
- {
- if (_resultString[i] == begin)
- {
- i++;
- return true;
- }
- return false;
- }, (Span s, ref int i) =>
- {
- if (i < s.Extent && _resultString[i] == end)
- {
- i++;
- return true;
- }
- return false;
- }, input, out rest);
- }
-
- /// <summary>
- /// tuple ==> "{}" | "{" result ( "," result )* "}"
- /// </summary>
- /// <returns>if one tuple found a TupleValue, otherwise a ValueListValue of TupleValues</returns>
- private ResultValue ParseResultTuple(Span input, out Span rest)
- {
- var list = ParseResultList('{', '}', input, out rest);
- if (list == null)
- {
- return null;
- }
- var tlist = new List<ResultValue>();
- TupleValue v;
- while (rest.StartsWith(_resultString, ",{"))
- {
- // a tuple list
- v = new TupleValue(list);
- tlist.Add(v);
- list = ParseResultList('{', '}', rest.Advance(1), out rest);
- }
- v = new TupleValue(list);
- if (tlist.Count != 0)
- {
- tlist.Add(v);
- return new ValueListValue(tlist);
- }
- return v;
- }
-
- /// <summary>
- /// tuple ==> "{}" | "{" result ( "," result )* "}"
- /// </summary>
- private TupleValue ParseTuple(Span input, out Span rest)
- {
- var list = ParseResultList('{', '}', input, out rest);
- if (list == null)
- {
- return null;
- }
- return new TupleValue(list);
- }
-
- /// <summary>
- /// list ==> "[]" | "[" value ( "," value )* "]" | "[" result ( "," result )* "]"
- /// </summary>
- private ResultValue ParseList(Span input, out Span rest)
- {
- rest = Span.Empty;
- if (_resultString[input.Start] != '[')
- {
- ParseError("List expected", input);
- return null;
- }
- if (_resultString[input.Start + 1] == ']') // list is empty
- {
- rest = input.Advance(2); // eat through the closing brace
- return new ValueListValue(new List<ResultValue>());
- }
- if (IsValueChar(_resultString[input.Start + 1]))
- {
- return ParseValueList(input, out rest);
- }
- else
- {
- return ParseResultList(input, out rest);
- }
- }
-
- /// <summary>
- /// list ==> "[" value ( "," value )* "]"
- /// </summary>
- private ValueListValue ParseValueList(Span input, out Span rest)
- {
- rest = Span.Empty;
- List<ResultValue> list = new List<ResultValue>();
- if (_resultString[input.Start] != '[')
- {
- ParseError("List expected", input);
- return null;
- }
- input = input.Advance(1);
- var item = ParseValue(input, out rest);
- if (item == null)
- {
- ParseError("Value expected", input);
- return null;
- }
- list.Add(item);
- input = rest;
- while (!input.IsEmpty && _resultString[input.Start] == ',')
- {
- item = ParseValue(input.Advance(1), out rest);
- if (item == null)
- {
- ParseError("Value expected", input);
- return null;
- }
- list.Add(item);
- input = rest;
- }
-
- if (input.IsEmpty || _resultString[input.Start] != ']') // list is not closed
- {
- ParseError("List not terminated", input);
- rest = Span.Empty;
- return null;
- }
- rest = input.Advance(1);
- return new ValueListValue(list);
- }
-
- /// <summary>
- /// list ==> "[" result ( "," result )* "]"
- /// </summary>
- private ResultListValue ParseResultList(Span input, out Span rest)
- {
- var list = ParseResultList('[', ']', input, out rest);
- if (list == null)
- {
- return null;
- }
- return new ResultListValue(list);
- }
-
- private void ParseError(string message, Span input)
- {
- if (input.Length > 1000)
- {
- input = new Span(input.Start, 1000); // don't show more than 1000 chars
- }
- string result = input.Extract(_resultString);
- Debug.Fail(message + ": " + result);
- }
- }
-}
+++ /dev/null
-using System;
-using System.Diagnostics;
-using System.Text;
-using System.IO;
-using System.Collections.Generic;
-using System.Threading.Tasks;
-using System.Threading.Tasks.Dataflow;
-using System.Runtime.InteropServices;
-using Xunit;
-using Xunit.Abstractions;
-
-using System.Text.RegularExpressions;
-using System.Reflection;
-
-using Microsoft.CodeAnalysis;
-using Microsoft.CodeAnalysis.CSharp.Scripting;
-using Microsoft.CodeAnalysis.CSharp;
-using System.Runtime.CompilerServices;
-using Microsoft.CodeAnalysis.Scripting;
-
-using System.Threading;
-
-namespace Runner
-{
- public class TestRunner
- {
- [Fact]
- public void SimpleSteppingTest() => ExecuteTest();
-
- [Fact]
- public void ValuesTest() => ExecuteTest();
-
- [Fact]
- public void ExceptionTest() => ExecuteTest();
-
- [Fact]
- public void BreakpointAddRemoveTest() => ExecuteTest();
-
- [Fact]
- public void ExceptionBreakpointTest() => ExecuteTest();
-
- [Fact]
- public void ExceptionBreakpointMultiThreadsTest() => ExecuteTest();
-
- [Fact]
- public void SetValuesTest() => ExecuteTest();
-
- [Fact]
- public void ExpressionsTest() => ExecuteTest();
-
- [Fact]
- public void LambdaTest() => ExecuteTest();
-
- private const int DefaultTimeoutSec = 20;
- private int expectTimeoutSec;
-
- public class ProcessInfo
- {
- public ProcessInfo(string command, int defaultTimeoutSec, ITestOutputHelper output)
- {
- this.output = output;
- this.defaultTimeoutSec = defaultTimeoutSec;
- process = new Process();
- queue = new BufferBlock<string>();
-
- process.StartInfo.CreateNoWindow = true;
- process.StartInfo.RedirectStandardOutput = true;
- process.StartInfo.RedirectStandardInput = true;
- process.StartInfo.UseShellExecute = false;
- process.StartInfo.StandardOutputEncoding = Encoding.UTF8;
- if (TestRunner.IsWindows)
- {
- // For older Windows versions:
- // process.StartInfo.Arguments = String.Format("/C \"{0}\"", command);
- // process.StartInfo.FileName = "cmd";
- process.StartInfo.Arguments = String.Format("-NoLogo -Command \"{0}\"", command);
- process.StartInfo.FileName = "powershell";
- }
- else
- {
- process.StartInfo.Arguments = String.Format("-c \"{0}\"", command);
- process.StartInfo.FileName = "/bin/sh";
- }
- // enable raising events because Process does not raise events by default
- process.EnableRaisingEvents = true;
- // attach the event handler for OutputDataReceived before starting the process
- process.OutputDataReceived += new DataReceivedEventHandler
- (
- delegate(object sender, DataReceivedEventArgs e)
- {
- if (e.Data is null)
- return;
- // append the new data to the data already read-in
- output.WriteLine("> " + e.Data);
- queue.Post(e.Data);
- }
- );
- process.Exited += new EventHandler
- (
- delegate(object sender, EventArgs args)
- {
- // This is where you can add some code to be
- // executed before this program exits.
- queue.Complete();
- }
- );
-
- try
- {
- process.Start();
- }
- catch (System.ComponentModel.Win32Exception)
- {
- throw new Exception("Unable to run: " + command);
- }
-
- process.BeginOutputReadLine();
- }
-
- public void Close()
- {
- process.StandardInput.WriteLine("-gdb-exit");
- process.StandardInput.Close();
- if (!process.WaitForExit(5))
- {
- process.CancelOutputRead();
- process.Close();
- }
- else
- process.CancelOutputRead();
- }
-
- public string Receive()
- {
- return queue.ReceiveAsync().Result;
- }
-
- public MICore.Results Expect(string text, int timeoutSec, int line)
- {
- if (timeoutSec < 0)
- timeoutSec = defaultTimeoutSec;
-
- TimeSpan timeSpan = TimeSpan.FromSeconds(timeoutSec);
-
- CancellationTokenSource ts = new CancellationTokenSource();
-
- ts.CancelAfter(timeSpan);
- CancellationToken token = ts.Token;
- token.ThrowIfCancellationRequested();
-
- try
- {
- while (true)
- {
- Task<string> inputTask = queue.ReceiveAsync();
- inputTask.Wait(token);
- string result = inputTask.Result;
- if (result.StartsWith(text))
- {
- var parser = new MICore.MIResults();
- return parser.ParseCommandOutput(result);
- }
- }
- }
- catch (AggregateException e)
- {
- foreach (var v in e.InnerExceptions)
- output.WriteLine(e.Message + " " + v.Message);
- }
- catch (OperationCanceledException)
- {
- }
- finally
- {
- ts.Dispose();
- }
- throw new Exception($"Expected '{text}' (at line {line}) in {timeSpan}");
- }
-
- public void Send(string s)
- {
- var bytes = Encoding.UTF8.GetBytes(s);
- process.StandardInput.BaseStream.Write(bytes, 0, bytes.Length);
- process.StandardInput.WriteLine();
- output.WriteLine("< " + s);
- }
-
- public Process process;
- private readonly ITestOutputHelper output;
- private int defaultTimeoutSec { get; }
- public BufferBlock<string> queue;
- }
-
- public class TestCaseGlobals
- {
- public readonly Dictionary<string, int> Lines;
- private ProcessInfo processInfo;
- public TestCaseGlobals(
- ProcessInfo processInfo,
- Dictionary<string, int> lines,
- string testSource,
- string testBin,
- int defaultExpectTimeout,
- ITestOutputHelper output)
- {
- this.processInfo = processInfo;
- this.Lines = lines;
- this.TestSource = testSource;
- this.TestBin = testBin;
- this.DefaultExpectTimeout = defaultExpectTimeout;
- this.Output = output;
- }
- public int GetCurrentLine([CallerLineNumber] int line = 0) { return line; }
-
- public void Send(string s) => processInfo.Send(s);
- public MICore.Results Expect(string s, int timeoutSec = -1, [CallerLineNumber] int line = 0) => processInfo.Expect(s, timeoutSec, line);
- public readonly string TestSource;
- public readonly string TestBin;
- public readonly int DefaultExpectTimeout;
- public readonly ITestOutputHelper Output;
- }
-
- // Fill 'Tags' dictionary with tags lines
- Dictionary<string, int> CollectTags(string srcName)
- {
- Dictionary<string, int> Tags = new Dictionary<string, int>();
- int lineCounter = 0;
- string[] separators = new string[] {"//"};
- string pattern = @".*@([^@]+)@.*";
- Regex reg = new Regex (pattern);
-
- foreach (string line in File.ReadLines(srcName))
- {
- lineCounter++;
-
- Match match = reg.Match(line);
-
- if (!match.Success)
- continue;
-
- string key = match.Groups[1].ToString().Trim();
- if (Tags.ContainsKey(key))
- throw new Exception(String.Format("Tag '{0}' is present more than once in file '{1}'", key, srcName));
- Tags[key] = lineCounter;
- }
-
- return Tags;
- }
-
- private class CommentCollector : CSharpSyntaxRewriter
- {
- private StringBuilder allComments = new StringBuilder();
- private int lineCount = 0;
- public override SyntaxTrivia VisitTrivia(SyntaxTrivia trivia)
- {
- if (!trivia.IsKind(SyntaxKind.SingleLineCommentTrivia) && !trivia.IsKind(SyntaxKind.MultiLineCommentTrivia))
- return trivia;
-
- var lineSpan = trivia.GetLocation().GetLineSpan();
-
- while (lineCount < lineSpan.StartLinePosition.Line)
- {
- allComments.AppendLine();
- lineCount++;
- }
- string comment = trivia.ToString();
- if (trivia.IsKind(SyntaxKind.SingleLineCommentTrivia))
- comment = comment.Substring(2);
- else if (trivia.IsKind(SyntaxKind.MultiLineCommentTrivia))
- comment = comment.Substring(2, comment.Length - 4);
-
- allComments.Append(comment);
- lineCount = lineSpan.EndLinePosition.Line;
-
- return trivia;
- }
- public string Text { get => allComments.ToString(); }
- }
-
- class TestData
- {
- public TestData(string dllPath, string srcFilePath)
- {
- this.dllPath = dllPath;
- this.srcFilePath = srcFilePath;
- }
- public string srcFilePath { get; }
- public string dllPath { get; }
-
- }
-
- private readonly ITestOutputHelper output;
- private string debuggerCommand;
- private Dictionary<string, TestData> allTests;
-
- public static bool IsWindows {
- get
- {
- return RuntimeInformation.IsOSPlatform(OSPlatform.Windows);
- }
- }
-
- public TestRunner(ITestOutputHelper output)
- {
- this.output = output;
-
- // Sneaky way to get assembly path, which works even if call
- // current constructor with reflection
- string codeBase = Assembly.GetExecutingAssembly().CodeBase;
- UriBuilder uri = new UriBuilder(codeBase);
- string path = Uri.UnescapeDataString(uri.Path);
- var d = new DirectoryInfo(Path.GetDirectoryName(path));
-
- var pipe = Environment.GetEnvironmentVariable("PIPE");
- if (pipe != null)
- {
- this.debuggerCommand = pipe;
- }
- else
- {
- this.debuggerCommand = Path.Combine(d.Parent.Parent.Parent.Parent.Parent.FullName, "bin", "netcoredbg" + (IsWindows ? ".exe" : ""));
- }
-
- var timeout = Environment.GetEnvironmentVariable("TIMEOUT");
- if (timeout == null || !Int32.TryParse(timeout, out expectTimeoutSec) || expectTimeoutSec < 0)
- expectTimeoutSec = DefaultTimeoutSec;
-
- var testDir = Environment.GetEnvironmentVariable("TESTDIR");
-
- // Find all dlls
- var baseDir = d.Parent.Parent.Parent.Parent;
- var files = Directory.GetFiles(baseDir.FullName, "*.dll", SearchOption.AllDirectories);
-
- allTests = new Dictionary<string, TestData>();
-
- foreach (var dll in files)
- {
- string testName = dll.Substring(0, dll.Length - 4);
- var configName = new FileInfo(testName + ".runtimeconfig.json");
- if (configName.Exists)
- {
- var csFiles = Directory.GetFiles(configName.Directory.Parent.Parent.Parent.FullName, "*.cs");
-
- string testDll = testDir != null ? Path.Combine(testDir, Path.GetFileName(dll)) : dll;
-
- allTests[Path.GetFileName(testName)] = new TestData(testDll, csFiles[0]);
- }
- }
- }
-
- private void ExecuteTest([CallerMemberName] string name = null)
- {
- var data = allTests[name];
-
- var lines = CollectTags(data.srcFilePath);
-
- var tree = CSharpSyntaxTree.ParseText(File.ReadAllText(data.srcFilePath))
- .WithFilePath(data.srcFilePath);
-
- var cc = new CommentCollector();
- cc.Visit(tree.GetRoot());
-
- output.WriteLine("------ Test script ------");
- output.WriteLine(cc.Text);
- output.WriteLine("-------------------------");
-
- var script = CSharpScript.Create(
- cc.Text,
- ScriptOptions.Default.WithReferences(typeof(object).Assembly)
- .WithReferences(typeof(Xunit.Assert).Assembly)
- .WithReferences(typeof(MICore.MIResults).Assembly)
- .WithImports(new string[]{"System", "Xunit", "MICore"}),
- globalsType: typeof(TestCaseGlobals)
- );
- script.Compile();
-
- ProcessInfo processInfo = new ProcessInfo(debuggerCommand, expectTimeoutSec, output);
-
- try
- {
- // Globals, to use inside test case
- TestCaseGlobals globals = new TestCaseGlobals(
- processInfo,
- lines,
- data.srcFilePath,
- data.dllPath,
- expectTimeoutSec,
- output
- );
-
- script.RunAsync(globals).Wait();
- }
- catch (Exception e)
- {
- throw e;
- }
- finally
- {
- // Finish process
- processInfo.Close();
- }
- }
- }
-}
+++ /dev/null
-<Project Sdk="Microsoft.NET.Sdk">
-
- <PropertyGroup>
- <TargetFramework>netcoreapp2.0</TargetFramework>
- <OutputType>Library</OutputType>
- </PropertyGroup>
-
- <ItemGroup>
- <PackageReference Include="Microsoft.NET.Test.Sdk" Version="15.3.0" />
- <PackageReference Include="System.Threading.Tasks.Dataflow" Version="4.8.0" />
- <PackageReference Include="xunit" Version="2.2.0" />
- <PackageReference Include="xunit.runner.visualstudio" Version="2.2.0" />
- <PackageReference Include="Microsoft.CodeAnalysis.CSharp.Scripting" Version="2.4.0" />
- <PackageReference Include="Microsoft.CodeAnalysis.Scripting" Version="2.4.0" />
- </ItemGroup>
-
-</Project>
+++ /dev/null
-
-Microsoft Visual Studio Solution File, Format Version 12.00
-# Visual Studio 15
-VisualStudioVersion = 15.0.26124.0
-MinimumVisualStudioVersion = 15.0.26124.0
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "runner", "runner\runner.csproj", "{E042BA1C-E2FB-41DF-AA94-9FACCF22D358}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ValuesTest", "ValuesTest\ValuesTest.csproj", "{7A4F31DE-22C7-4662-A6D4-63D1DCDD6D6E}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SimpleSteppingTest", "SimpleSteppingTest\SimpleSteppingTest.csproj", "{E0060C4B-2D50-4912-A2E6-29E897ED1767}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ExceptionTest", "ExceptionTest\ExceptionTest.csproj", "{AA120201-343F-4A1D-BDA5-930F9B28DD9A}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BreakpointAddRemoveTest", "BreakpointAddRemoveTest\BreakpointAddRemoveTest.csproj", "{48403D8A-08D8-48FC-BF1B-F0239154AD85}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SetValuesTest", "SetValuesTest\SetValuesTest.csproj", "{9E6CD7E6-0B84-4088-9097-1839A14B49DB}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ExpressionsTest", "ExpressionsTest\ExpressionsTest.csproj", "{3477E658-CB14-4D86-8909-F7448C17AC9A}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "LambdaTest", "LambdaTest\LambdaTest.csproj", "{70F91400-AB4E-4A19-A137-9B5BF36C8543}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ExceptionBreakpointTest", "ExceptionBreakpointTest\ExceptionBreakpointTest.csproj", "{361771B0-7948-412E-86ED-D41157F6DE6B}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ExceptionBreakpointMultiThreadsTest", "ExceptionBreakpointMultiThreadsTest\ExceptionBreakpointMultiThreadsTest.csproj", "{31C7F5AD-ED22-4F02-82F5-084C48598AA9}"
-EndProject
-Global
- GlobalSection(SolutionConfigurationPlatforms) = preSolution
- Debug|Any CPU = Debug|Any CPU
- Debug|x64 = Debug|x64
- Debug|x86 = Debug|x86
- Release|Any CPU = Release|Any CPU
- Release|x64 = Release|x64
- Release|x86 = Release|x86
- EndGlobalSection
- GlobalSection(SolutionProperties) = preSolution
- HideSolutionNode = FALSE
- EndGlobalSection
- GlobalSection(ProjectConfigurationPlatforms) = postSolution
- {E042BA1C-E2FB-41DF-AA94-9FACCF22D358}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {E042BA1C-E2FB-41DF-AA94-9FACCF22D358}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {E042BA1C-E2FB-41DF-AA94-9FACCF22D358}.Debug|x64.ActiveCfg = Debug|x64
- {E042BA1C-E2FB-41DF-AA94-9FACCF22D358}.Debug|x64.Build.0 = Debug|x64
- {E042BA1C-E2FB-41DF-AA94-9FACCF22D358}.Debug|x86.ActiveCfg = Debug|x86
- {E042BA1C-E2FB-41DF-AA94-9FACCF22D358}.Debug|x86.Build.0 = Debug|x86
- {E042BA1C-E2FB-41DF-AA94-9FACCF22D358}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {E042BA1C-E2FB-41DF-AA94-9FACCF22D358}.Release|Any CPU.Build.0 = Release|Any CPU
- {E042BA1C-E2FB-41DF-AA94-9FACCF22D358}.Release|x64.ActiveCfg = Release|x64
- {E042BA1C-E2FB-41DF-AA94-9FACCF22D358}.Release|x64.Build.0 = Release|x64
- {E042BA1C-E2FB-41DF-AA94-9FACCF22D358}.Release|x86.ActiveCfg = Release|x86
- {E042BA1C-E2FB-41DF-AA94-9FACCF22D358}.Release|x86.Build.0 = Release|x86
- {7A4F31DE-22C7-4662-A6D4-63D1DCDD6D6E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {7A4F31DE-22C7-4662-A6D4-63D1DCDD6D6E}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {7A4F31DE-22C7-4662-A6D4-63D1DCDD6D6E}.Debug|x64.ActiveCfg = Debug|x64
- {7A4F31DE-22C7-4662-A6D4-63D1DCDD6D6E}.Debug|x64.Build.0 = Debug|x64
- {7A4F31DE-22C7-4662-A6D4-63D1DCDD6D6E}.Debug|x86.ActiveCfg = Debug|x86
- {7A4F31DE-22C7-4662-A6D4-63D1DCDD6D6E}.Debug|x86.Build.0 = Debug|x86
- {7A4F31DE-22C7-4662-A6D4-63D1DCDD6D6E}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {7A4F31DE-22C7-4662-A6D4-63D1DCDD6D6E}.Release|Any CPU.Build.0 = Release|Any CPU
- {7A4F31DE-22C7-4662-A6D4-63D1DCDD6D6E}.Release|x64.ActiveCfg = Release|x64
- {7A4F31DE-22C7-4662-A6D4-63D1DCDD6D6E}.Release|x64.Build.0 = Release|x64
- {7A4F31DE-22C7-4662-A6D4-63D1DCDD6D6E}.Release|x86.ActiveCfg = Release|x86
- {7A4F31DE-22C7-4662-A6D4-63D1DCDD6D6E}.Release|x86.Build.0 = Release|x86
- {E0060C4B-2D50-4912-A2E6-29E897ED1767}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {E0060C4B-2D50-4912-A2E6-29E897ED1767}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {E0060C4B-2D50-4912-A2E6-29E897ED1767}.Debug|x64.ActiveCfg = Debug|x64
- {E0060C4B-2D50-4912-A2E6-29E897ED1767}.Debug|x64.Build.0 = Debug|x64
- {E0060C4B-2D50-4912-A2E6-29E897ED1767}.Debug|x86.ActiveCfg = Debug|x86
- {E0060C4B-2D50-4912-A2E6-29E897ED1767}.Debug|x86.Build.0 = Debug|x86
- {E0060C4B-2D50-4912-A2E6-29E897ED1767}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {E0060C4B-2D50-4912-A2E6-29E897ED1767}.Release|Any CPU.Build.0 = Release|Any CPU
- {E0060C4B-2D50-4912-A2E6-29E897ED1767}.Release|x64.ActiveCfg = Release|x64
- {E0060C4B-2D50-4912-A2E6-29E897ED1767}.Release|x64.Build.0 = Release|x64
- {E0060C4B-2D50-4912-A2E6-29E897ED1767}.Release|x86.ActiveCfg = Release|x86
- {E0060C4B-2D50-4912-A2E6-29E897ED1767}.Release|x86.Build.0 = Release|x86
- {AA120201-343F-4A1D-BDA5-930F9B28DD9A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {AA120201-343F-4A1D-BDA5-930F9B28DD9A}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {AA120201-343F-4A1D-BDA5-930F9B28DD9A}.Debug|x64.ActiveCfg = Debug|x64
- {AA120201-343F-4A1D-BDA5-930F9B28DD9A}.Debug|x64.Build.0 = Debug|x64
- {AA120201-343F-4A1D-BDA5-930F9B28DD9A}.Debug|x86.ActiveCfg = Debug|x86
- {AA120201-343F-4A1D-BDA5-930F9B28DD9A}.Debug|x86.Build.0 = Debug|x86
- {AA120201-343F-4A1D-BDA5-930F9B28DD9A}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {AA120201-343F-4A1D-BDA5-930F9B28DD9A}.Release|Any CPU.Build.0 = Release|Any CPU
- {AA120201-343F-4A1D-BDA5-930F9B28DD9A}.Release|x64.ActiveCfg = Release|x64
- {AA120201-343F-4A1D-BDA5-930F9B28DD9A}.Release|x64.Build.0 = Release|x64
- {AA120201-343F-4A1D-BDA5-930F9B28DD9A}.Release|x86.ActiveCfg = Release|x86
- {AA120201-343F-4A1D-BDA5-930F9B28DD9A}.Release|x86.Build.0 = Release|x86
- {48403D8A-08D8-48FC-BF1B-F0239154AD85}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {48403D8A-08D8-48FC-BF1B-F0239154AD85}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {48403D8A-08D8-48FC-BF1B-F0239154AD85}.Debug|x64.ActiveCfg = Debug|x64
- {48403D8A-08D8-48FC-BF1B-F0239154AD85}.Debug|x64.Build.0 = Debug|x64
- {48403D8A-08D8-48FC-BF1B-F0239154AD85}.Debug|x86.ActiveCfg = Debug|x86
- {48403D8A-08D8-48FC-BF1B-F0239154AD85}.Debug|x86.Build.0 = Debug|x86
- {48403D8A-08D8-48FC-BF1B-F0239154AD85}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {48403D8A-08D8-48FC-BF1B-F0239154AD85}.Release|Any CPU.Build.0 = Release|Any CPU
- {48403D8A-08D8-48FC-BF1B-F0239154AD85}.Release|x64.ActiveCfg = Release|x64
- {48403D8A-08D8-48FC-BF1B-F0239154AD85}.Release|x64.Build.0 = Release|x64
- {48403D8A-08D8-48FC-BF1B-F0239154AD85}.Release|x86.ActiveCfg = Release|x86
- {48403D8A-08D8-48FC-BF1B-F0239154AD85}.Release|x86.Build.0 = Release|x86
- {9E6CD7E6-0B84-4088-9097-1839A14B49DB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {9E6CD7E6-0B84-4088-9097-1839A14B49DB}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {9E6CD7E6-0B84-4088-9097-1839A14B49DB}.Debug|x64.ActiveCfg = Debug|x64
- {9E6CD7E6-0B84-4088-9097-1839A14B49DB}.Debug|x64.Build.0 = Debug|x64
- {9E6CD7E6-0B84-4088-9097-1839A14B49DB}.Debug|x86.ActiveCfg = Debug|x86
- {9E6CD7E6-0B84-4088-9097-1839A14B49DB}.Debug|x86.Build.0 = Debug|x86
- {9E6CD7E6-0B84-4088-9097-1839A14B49DB}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {9E6CD7E6-0B84-4088-9097-1839A14B49DB}.Release|Any CPU.Build.0 = Release|Any CPU
- {9E6CD7E6-0B84-4088-9097-1839A14B49DB}.Release|x64.ActiveCfg = Release|x64
- {9E6CD7E6-0B84-4088-9097-1839A14B49DB}.Release|x64.Build.0 = Release|x64
- {9E6CD7E6-0B84-4088-9097-1839A14B49DB}.Release|x86.ActiveCfg = Release|x86
- {9E6CD7E6-0B84-4088-9097-1839A14B49DB}.Release|x86.Build.0 = Release|x86
- {3477E658-CB14-4D86-8909-F7448C17AC9A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {3477E658-CB14-4D86-8909-F7448C17AC9A}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {3477E658-CB14-4D86-8909-F7448C17AC9A}.Debug|x64.ActiveCfg = Debug|x64
- {3477E658-CB14-4D86-8909-F7448C17AC9A}.Debug|x64.Build.0 = Debug|x64
- {3477E658-CB14-4D86-8909-F7448C17AC9A}.Debug|x86.ActiveCfg = Debug|x86
- {3477E658-CB14-4D86-8909-F7448C17AC9A}.Debug|x86.Build.0 = Debug|x86
- {3477E658-CB14-4D86-8909-F7448C17AC9A}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {3477E658-CB14-4D86-8909-F7448C17AC9A}.Release|Any CPU.Build.0 = Release|Any CPU
- {3477E658-CB14-4D86-8909-F7448C17AC9A}.Release|x64.ActiveCfg = Release|x64
- {3477E658-CB14-4D86-8909-F7448C17AC9A}.Release|x64.Build.0 = Release|x64
- {3477E658-CB14-4D86-8909-F7448C17AC9A}.Release|x86.ActiveCfg = Release|x86
- {3477E658-CB14-4D86-8909-F7448C17AC9A}.Release|x86.Build.0 = Release|x86
- {70F91400-AB4E-4A19-A137-9B5BF36C8543}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {70F91400-AB4E-4A19-A137-9B5BF36C8543}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {70F91400-AB4E-4A19-A137-9B5BF36C8543}.Debug|x64.ActiveCfg = Debug|x64
- {70F91400-AB4E-4A19-A137-9B5BF36C8543}.Debug|x64.Build.0 = Debug|x64
- {70F91400-AB4E-4A19-A137-9B5BF36C8543}.Debug|x86.ActiveCfg = Debug|x86
- {70F91400-AB4E-4A19-A137-9B5BF36C8543}.Debug|x86.Build.0 = Debug|x86
- {70F91400-AB4E-4A19-A137-9B5BF36C8543}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {70F91400-AB4E-4A19-A137-9B5BF36C8543}.Release|Any CPU.Build.0 = Release|Any CPU
- {70F91400-AB4E-4A19-A137-9B5BF36C8543}.Release|x64.ActiveCfg = Release|x64
- {70F91400-AB4E-4A19-A137-9B5BF36C8543}.Release|x64.Build.0 = Release|x64
- {70F91400-AB4E-4A19-A137-9B5BF36C8543}.Release|x86.ActiveCfg = Release|x86
- {70F91400-AB4E-4A19-A137-9B5BF36C8543}.Release|x86.Build.0 = Release|x86
- {361771B0-7948-412E-86ED-D41157F6DE6B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {361771B0-7948-412E-86ED-D41157F6DE6B}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {361771B0-7948-412E-86ED-D41157F6DE6B}.Debug|x64.ActiveCfg = Debug|x64
- {361771B0-7948-412E-86ED-D41157F6DE6B}.Debug|x64.Build.0 = Debug|x64
- {361771B0-7948-412E-86ED-D41157F6DE6B}.Debug|x86.ActiveCfg = Debug|x86
- {361771B0-7948-412E-86ED-D41157F6DE6B}.Debug|x86.Build.0 = Debug|x86
- {361771B0-7948-412E-86ED-D41157F6DE6B}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {361771B0-7948-412E-86ED-D41157F6DE6B}.Release|Any CPU.Build.0 = Release|Any CPU
- {361771B0-7948-412E-86ED-D41157F6DE6B}.Release|x64.ActiveCfg = Release|x64
- {361771B0-7948-412E-86ED-D41157F6DE6B}.Release|x64.Build.0 = Release|x64
- {361771B0-7948-412E-86ED-D41157F6DE6B}.Release|x86.ActiveCfg = Release|x86
- {361771B0-7948-412E-86ED-D41157F6DE6B}.Release|x86.Build.0 = Release|x86
- {31C7F5AD-ED22-4F02-82F5-084C48598AA9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {31C7F5AD-ED22-4F02-82F5-084C48598AA9}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {31C7F5AD-ED22-4F02-82F5-084C48598AA9}.Debug|x64.ActiveCfg = Debug|x64
- {31C7F5AD-ED22-4F02-82F5-084C48598AA9}.Debug|x64.Build.0 = Debug|x64
- {31C7F5AD-ED22-4F02-82F5-084C48598AA9}.Debug|x86.ActiveCfg = Debug|x86
- {31C7F5AD-ED22-4F02-82F5-084C48598AA9}.Debug|x86.Build.0 = Debug|x86
- {31C7F5AD-ED22-4F02-82F5-084C48598AA9}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {31C7F5AD-ED22-4F02-82F5-084C48598AA9}.Release|Any CPU.Build.0 = Release|Any CPU
- {31C7F5AD-ED22-4F02-82F5-084C48598AA9}.Release|x64.ActiveCfg = Release|x64
- {31C7F5AD-ED22-4F02-82F5-084C48598AA9}.Release|x64.Build.0 = Release|x64
- {31C7F5AD-ED22-4F02-82F5-084C48598AA9}.Release|x86.ActiveCfg = Release|x86
- {31C7F5AD-ED22-4F02-82F5-084C48598AA9}.Release|x86.Build.0 = Release|x86
- EndGlobalSection
-EndGlobal