Add webapp debuggees and more SOS commmand tests (#507)
authorMike McLaughlin <mikem@microsoft.com>
Tue, 1 Oct 2019 04:04:32 +0000 (21:04 -0700)
committerGitHub <noreply@github.com>
Tue, 1 Oct 2019 04:04:32 +0000 (21:04 -0700)
Add webapp debuggees and more SOS commmand tests

Add runtime version to TestConfiguration.ToString()

Added WebApp and WebApp3 as prebuilts. Use pipe to sync webapps. "dotnet-dump collect" to collect a dump from these apps.

Enable "dbgout" command logging

Speed up SOS tests by reworking ScriptLogger removing the .EndsWith on the last command output string.

Upgrade to 3.0.100 SDK

Switch to prebuilt debuggees except desktop (net462). Add debuggees.sln. Don't optimize debuggees.

Add the lldb plugin test python script as an xunit test

Publish the dump and bin artifacts on failure

Enable triage dump testing.

Switch to BYOC pools

65 files changed:
.vsts-dotnet-ci.yml
.vsts-dotnet.yml
debuggees.sln [new file with mode: 0644]
diagnostics.sln
eng/Build-Native.cmd
eng/build-native.sh
eng/build.yml
eng/install-test-runtimes.ps1
eng/install-test-runtimes.sh
global.json
src/Directory.Build.props
src/Microsoft.Diagnostics.Repl/Console/ConsoleProvider.cs
src/Microsoft.Diagnostics.TestHelpers/BaseDebuggeeCompiler.cs
src/Microsoft.Diagnostics.TestHelpers/DebuggeeCompiler.cs
src/Microsoft.Diagnostics.TestHelpers/SdkPrebuiltDebuggeeCompiler.cs [new file with mode: 0644]
src/Microsoft.Diagnostics.TestHelpers/TestConfiguration.cs
src/SOS/SOS.Hosting/SOSHost.cs
src/SOS/SOS.UnitTests/ConfigFiles/Unix/Debugger.Tests.Config.txt
src/SOS/SOS.UnitTests/ConfigFiles/Windows/Debugger.Tests.Config.txt
src/SOS/SOS.UnitTests/Debuggees/Directory.Build.props [new file with mode: 0644]
src/SOS/SOS.UnitTests/Debuggees/DivZero/DivZero.csproj
src/SOS/SOS.UnitTests/Debuggees/GCWhere/GCWhere.csproj
src/SOS/SOS.UnitTests/Debuggees/NestedExceptionTest/NestedExceptionTest.csproj
src/SOS/SOS.UnitTests/Debuggees/Overflow/Overflow.csproj
src/SOS/SOS.UnitTests/Debuggees/ReflectionTest/ReflectionTest.csproj
src/SOS/SOS.UnitTests/Debuggees/SimpleThrow/SimpleThrow.csproj
src/SOS/SOS.UnitTests/Debuggees/SymbolTestApp/SymbolTestApp/SymbolTestApp.csproj
src/SOS/SOS.UnitTests/Debuggees/SymbolTestApp/SymbolTestDll/SymbolTestDll.csproj
src/SOS/SOS.UnitTests/Debuggees/TaskNestedException/RandomUserLibrary/RandomUserLibrary.csproj
src/SOS/SOS.UnitTests/Debuggees/TaskNestedException/TaskNestedException/TaskNestedException.csproj
src/SOS/SOS.UnitTests/Debuggees/WebApp/Program.cs [new file with mode: 0644]
src/SOS/SOS.UnitTests/Debuggees/WebApp/Properties/launchSettings.json [new file with mode: 0644]
src/SOS/SOS.UnitTests/Debuggees/WebApp/Startup.cs [new file with mode: 0644]
src/SOS/SOS.UnitTests/Debuggees/WebApp/WebApp.csproj [new file with mode: 0644]
src/SOS/SOS.UnitTests/Debuggees/WebApp3/Program.cs [new file with mode: 0644]
src/SOS/SOS.UnitTests/Debuggees/WebApp3/Properties/launchSettings.json [new file with mode: 0644]
src/SOS/SOS.UnitTests/Debuggees/WebApp3/Startup.cs [new file with mode: 0644]
src/SOS/SOS.UnitTests/Debuggees/WebApp3/WebApp3.csproj [new file with mode: 0644]
src/SOS/SOS.UnitTests/Debuggees/WebApp3/appsettings.Development.json [new file with mode: 0644]
src/SOS/SOS.UnitTests/Debuggees/WebApp3/appsettings.json [new file with mode: 0644]
src/SOS/SOS.UnitTests/SOS.cs
src/SOS/SOS.UnitTests/SOSRunner.cs
src/SOS/SOS.UnitTests/Scripts/DivZero.script
src/SOS/SOS.UnitTests/Scripts/NestedExceptionTest.script
src/SOS/SOS.UnitTests/Scripts/OtherCommands.script [new file with mode: 0644]
src/SOS/SOS.UnitTests/Scripts/Overflow.script
src/SOS/SOS.UnitTests/Scripts/Reflection.script
src/SOS/SOS.UnitTests/Scripts/SimpleThrow.script
src/SOS/SOS.UnitTests/Scripts/StackAndOtherTests.script
src/SOS/SOS.UnitTests/Scripts/StackTests.script
src/SOS/SOS.UnitTests/Scripts/TaskNestedException.script
src/SOS/SOS.UnitTests/Scripts/WebApp.script [new file with mode: 0644]
src/SOS/Strike/datatarget.cpp
src/SOS/Strike/exts.cpp
src/SOS/Strike/exts.h
src/SOS/Strike/hostcoreclr.cpp
src/SOS/Strike/sos.def
src/SOS/Strike/sos_unixexports.src
src/SOS/Strike/strike.cpp
src/SOS/Strike/util.cpp
src/SOS/gcdump/gcdump.vcxproj
src/SOS/gcdump/gcdump.vcxproj.filters
src/SOS/lldbplugin.tests/TestDebuggee/TestDebuggee.csproj
src/SOS/lldbplugin/soscommand.cpp
src/Tools/dotnet-dump/Commands/SOSCommand.cs

index 005a83ec1d69f229baa7ca8f8abcc74ea876e1ff..948485f9e2b4df91c3f3430466b4cf4fcab5b414 100644 (file)
@@ -1,11 +1,17 @@
-phases:
+trigger:
+- master
+- release/*
+
+pr:
+- master
+- release/*
+
+jobs:
 - template: /eng/build.yml
   parameters:
     name: Windows
-    agentOs: Windows_NT
-    queue: 
-      name: Hosted VS2017
-      parallel: 2
+    osGroup: Windows_NT
+    strategy:
       matrix:
         Build_Debug:
           _BuildConfig: Debug
@@ -17,11 +23,9 @@ phases:
 - template: /eng/build.yml
   parameters:
     name: CentOS_7
-    agentOs: Linux
+    osGroup: Linux
     dockerImage: mcr.microsoft.com/dotnet-buildtools/prereqs:centos-7-3e800f1-20190501005343
-    queue:
-      name: Hosted Ubuntu 1604
-      parallel: 2
+    strategy:
       matrix:
         Build_Debug:
           _BuildConfig: Debug
@@ -33,10 +37,8 @@ phases:
 - template: /eng/build.yml
   parameters:
     name: MacOS
-    agentOs: Darwin
-    queue: 
-      name: Hosted macOS
-      parallel: 2
+    osGroup: MacOS
+    strategy:
       matrix:
         Build_Debug:
           _BuildConfig: Debug
index a7cf34d9289d60746152e7be0cd35f69dacb2949..d5653c145144e77c514dfeeee6aa46b372dadfb1 100644 (file)
@@ -1,12 +1,21 @@
-phases:
+trigger:
+- master
+- release/*
+
+pr:
+- master
+- release/*
+
+jobs:
 - template: /eng/build.yml
   parameters:
     name: Windows
-    agentOs: Windows_NT
-    queue: 
-      name: Hosted VS2017
-      parallel: 4
+    osGroup: Windows_NT
+    strategy:
       matrix:
+        Build_Debug:
+          _BuildConfig: Debug
+          _BuildArch: x64
         Build_Release:
           _BuildConfig: Release
           _BuildArch: x64
@@ -23,11 +32,9 @@ phases:
 - template: /eng/build.yml
   parameters:
     name: CentOS_7
-    agentOs: Linux
+    osGroup: Linux
     dockerImage: mcr.microsoft.com/dotnet-buildtools/prereqs:centos-7-3e800f1-20190501005343
-    queue:
-      name: Hosted Ubuntu 1604
-      parallel: 2
+    strategy:
       matrix:
         Build_Debug:
           _BuildConfig: Debug
@@ -41,11 +48,10 @@ phases:
 - template: /eng/build.yml
   parameters:
     name: Linux_cross
-    agentOs: Linux
+    osGroup: Linux
     dockerImage: mcr.microsoft.com/dotnet-buildtools/prereqs:ubuntu-14.04-cross-1735d26-20190521133857
     crossrootfsDir: '/crossrootfs/arm'
-    queue:
-      name: Hosted Ubuntu 1604
+    strategy:
       matrix:
         Build_Release:
           _BuildConfig: Release
@@ -55,11 +61,10 @@ phases:
 - template: /eng/build.yml
   parameters:
     name: Linux_cross64
-    agentOs: Linux
+    osGroup: Linux
     dockerImage: mcr.microsoft.com/dotnet-buildtools/prereqs:ubuntu-16.04-cross-arm64-a3ae44b-20180315221921
     crossrootfsDir: '/crossrootfs/arm64'
-    queue:
-      name: Hosted Ubuntu 1604
+    strategy:
       matrix:
         Build_Release:
           _BuildConfig: Release
@@ -69,10 +74,9 @@ phases:
 - template: /eng/build.yml
   parameters:
     name: Alpine3_6
-    agentOs: Linux
+    osGroup: Linux
     dockerImage: mcr.microsoft.com/dotnet-buildtools/prereqs:alpine-3.6-WithNode-f4d3fe3-20181220200247
-    queue:
-      name: Hosted Ubuntu 1604
+    strategy:
       matrix:
         Build_Release:
           _BuildConfig: Release
@@ -82,10 +86,8 @@ phases:
 - template: /eng/build.yml
   parameters:
     name: MacOS
-    agentOs: Darwin
-    queue: 
-      name: Hosted macOS
-      parallel: 2
+    osGroup: MacOS
+    strategy:
       matrix:
         Build_Release:
           _BuildConfig: Release
@@ -97,12 +99,11 @@ phases:
 - template: /eng/build.yml
   parameters:
     name: Debian_Stretch
-    agentOs: Linux
+    osGroup: Linux
     dockerImage: mcr.microsoft.com/dotnet-buildtools/prereqs:debian-stretch-3e800f1-20190521154431
     dependsOn: CentOS_7
     testOnly: true
-    queue:
-      name: Hosted Ubuntu 1604
+    strategy:
       matrix:
         Build_Debug:
           _BuildConfig: Debug
@@ -111,12 +112,11 @@ phases:
 - template: /eng/build.yml
   parameters:
     name: Fedora_28
-    agentOs: Linux
+    osGroup: Linux
     dockerImage: mcr.microsoft.com/dotnet-buildtools/prereqs:fedora-28-09ca40b-20190508143249
     dependsOn: CentOS_7
     testOnly: true
-    queue:
-      name: Hosted Ubuntu 1604
+    strategy:
       matrix:
         Build_Debug:
           _BuildConfig: Debug
@@ -125,12 +125,11 @@ phases:
 - template: /eng/build.yml
   parameters:
     name: Fedora_29
-    agentOs: Linux
+    osGroup: Linux
     dockerImage: mcr.microsoft.com/dotnet-buildtools/prereqs:fedora-29-09ca40b-20190508143249
     dependsOn: CentOS_7
     testOnly: true
-    queue:
-      name: Hosted Ubuntu 1604
+    strategy:
       matrix:
         Build_Debug:
           _BuildConfig: Debug
@@ -139,12 +138,11 @@ phases:
 - template: /eng/build.yml
   parameters:
     name: OpenSuse_42_1
-    agentOs: Linux
+    osGroup: Linux
     dockerImage: mcr.microsoft.com/dotnet-buildtools/prereqs:opensuse-42.1-c103199-20180628122439
     dependsOn: CentOS_7
     testOnly: true
-    queue:
-      name: Hosted Ubuntu 1604
+    strategy:
       matrix:
         Build_Debug:
           _BuildConfig: Debug
@@ -153,12 +151,11 @@ phases:
 - template: /eng/build.yml
   parameters:
     name: OpenSuse_42_3
-    agentOs: Linux
+    osGroup: Linux
     dockerImage: mcr.microsoft.com/dotnet-buildtools/prereqs:opensuse-42.3-3e800f1-20190501005344
     dependsOn: CentOS_7
     testOnly: true
-    queue:
-      name: Hosted Ubuntu 1604
+    strategy:
       matrix:
         Build_Debug:
           _BuildConfig: Debug
@@ -167,12 +164,11 @@ phases:
 - template: /eng/build.yml
   parameters:
     name: Ubuntu_14_04
-    agentOs: Linux
+    osGroup: Linux
     dockerImage: mcr.microsoft.com/dotnet-buildtools/prereqs:ubuntu-14.04-1735d26-20190521133852
     dependsOn: CentOS_7
     testOnly: true
-    queue:
-      name: Hosted Ubuntu 1604
+    strategy:
       matrix:
         Build_Debug:
           _BuildConfig: Debug
@@ -181,12 +177,11 @@ phases:
 - template: /eng/build.yml
   parameters:
     name: Ubuntu_16_04
-    agentOs: Linux
+    osGroup: Linux
     dockerImage: mcr.microsoft.com/dotnet-buildtools/prereqs:ubuntu-16.04-09ca40b-20190520220842
     dependsOn: CentOS_7
     testOnly: true
-    queue:
-      name: Hosted Ubuntu 1604
+    strategy:
       matrix:
         Build_Debug:
           _BuildConfig: Debug
@@ -195,12 +190,11 @@ phases:
 - template: /eng/build.yml
   parameters:
     name: Ubuntu_18_04
-    agentOs: Linux
+    osGroup: Linux
     dockerImage: mcr.microsoft.com/dotnet-buildtools/prereqs:ubuntu-18.04-3e800f1-20190508143252
     dependsOn: CentOS_7
     testOnly: true
-    queue:
-      name: Hosted Ubuntu 1604
+    strategy:
       matrix:
         Build_Debug:
           _BuildConfig: Debug
diff --git a/debuggees.sln b/debuggees.sln
new file mode 100644 (file)
index 0000000..74b2705
--- /dev/null
@@ -0,0 +1,606 @@
+
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio Version 16
+VisualStudioVersion = 16.0.29019.234
+MinimumVisualStudioVersion = 10.0.40219.1
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "TestDebuggee", "src\SOS\lldbplugin.tests\TestDebuggee\TestDebuggee.csproj", "{6C43BE85-F8C3-4D76-8050-F25CE953A7FD}"
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "SOS", "SOS", "{41638A4C-0DAF-47ED-A774-ECBBAC0315D7}"
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{19FAB78C-3351-4911-8F0C-8C6056401740}"
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Debuggees", "Debuggees", "{C3072949-6D24-451B-A308-2F3621F858B0}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WebApp3", "src\SOS\SOS.UnitTests\Debuggees\WebApp3\WebApp3.csproj", "{252E5845-8D4C-4306-9D8F-ED2E2F7005F6}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WebApp", "src\SOS\SOS.UnitTests\Debuggees\WebApp\WebApp.csproj", "{E7FEA82E-0E16-4868-B122-4B0BC0014E7F}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SimpleThrow", "src\SOS\SOS.UnitTests\Debuggees\SimpleThrow\SimpleThrow.csproj", "{179EF543-E30A-4428-ABA0-2E2621860173}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DivZero", "src\SOS\SOS.UnitTests\Debuggees\DivZero\DivZero.csproj", "{447AC053-2E0A-4119-BD11-30A4A8E3F765}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "GCWhere", "src\SOS\SOS.UnitTests\Debuggees\GCWhere\GCWhere.csproj", "{664F46A9-3C99-489B-AAB9-4CD3A430C425}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "NestedExceptionTest", "src\SOS\SOS.UnitTests\Debuggees\NestedExceptionTest\NestedExceptionTest.csproj", "{0CB805C8-0B76-4B1D-8AAF-48535B180448}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Overflow", "src\SOS\SOS.UnitTests\Debuggees\Overflow\Overflow.csproj", "{20251748-AA7B-45BE-ADAA-C9375F5CC80F}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ReflectionTest", "src\SOS\SOS.UnitTests\Debuggees\ReflectionTest\ReflectionTest.csproj", "{DDDA69DF-2C4C-477A-B6C9-B4FE73C6E288}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "TaskNestedException", "src\SOS\SOS.UnitTests\Debuggees\TaskNestedException\TaskNestedException\TaskNestedException.csproj", "{73EA5188-1E4F-42D8-B63E-F1B878A4EB63}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "RandomUserLibrary", "src\SOS\SOS.UnitTests\Debuggees\TaskNestedException\RandomUserLibrary\RandomUserLibrary.csproj", "{B50D14DB-8EE5-47BD-B412-62FA5C693CC7}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SymbolTestApp", "src\SOS\SOS.UnitTests\Debuggees\SymbolTestApp\SymbolTestApp\SymbolTestApp.csproj", "{112FE2A7-3FD2-4496-8A14-171898AD5CF5}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SymbolTestDll", "src\SOS\SOS.UnitTests\Debuggees\SymbolTestApp\SymbolTestDll\SymbolTestDll.csproj", "{8C27904A-47C0-44C7-B191-88FF34580CBE}"
+EndProject
+Global
+       GlobalSection(SolutionConfigurationPlatforms) = preSolution
+               Checked|Any CPU = Checked|Any CPU
+               Checked|ARM = Checked|ARM
+               Checked|ARM64 = Checked|ARM64
+               Checked|x64 = Checked|x64
+               Checked|x86 = Checked|x86
+               Debug|Any CPU = Debug|Any CPU
+               Debug|ARM = Debug|ARM
+               Debug|ARM64 = Debug|ARM64
+               Debug|x64 = Debug|x64
+               Debug|x86 = Debug|x86
+               Release|Any CPU = Release|Any CPU
+               Release|ARM = Release|ARM
+               Release|ARM64 = Release|ARM64
+               Release|x64 = Release|x64
+               Release|x86 = Release|x86
+               RelWithDebInfo|Any CPU = RelWithDebInfo|Any CPU
+               RelWithDebInfo|ARM = RelWithDebInfo|ARM
+               RelWithDebInfo|ARM64 = RelWithDebInfo|ARM64
+               RelWithDebInfo|x64 = RelWithDebInfo|x64
+               RelWithDebInfo|x86 = RelWithDebInfo|x86
+       EndGlobalSection
+       GlobalSection(ProjectConfigurationPlatforms) = postSolution
+               {6C43BE85-F8C3-4D76-8050-F25CE953A7FD}.Checked|Any CPU.ActiveCfg = Release|Any CPU
+               {6C43BE85-F8C3-4D76-8050-F25CE953A7FD}.Checked|Any CPU.Build.0 = Release|Any CPU
+               {6C43BE85-F8C3-4D76-8050-F25CE953A7FD}.Checked|ARM.ActiveCfg = Release|Any CPU
+               {6C43BE85-F8C3-4D76-8050-F25CE953A7FD}.Checked|ARM.Build.0 = Release|Any CPU
+               {6C43BE85-F8C3-4D76-8050-F25CE953A7FD}.Checked|ARM64.ActiveCfg = Release|Any CPU
+               {6C43BE85-F8C3-4D76-8050-F25CE953A7FD}.Checked|ARM64.Build.0 = Release|Any CPU
+               {6C43BE85-F8C3-4D76-8050-F25CE953A7FD}.Checked|x64.ActiveCfg = Release|Any CPU
+               {6C43BE85-F8C3-4D76-8050-F25CE953A7FD}.Checked|x64.Build.0 = Release|Any CPU
+               {6C43BE85-F8C3-4D76-8050-F25CE953A7FD}.Checked|x86.ActiveCfg = Release|Any CPU
+               {6C43BE85-F8C3-4D76-8050-F25CE953A7FD}.Checked|x86.Build.0 = Release|Any CPU
+               {6C43BE85-F8C3-4D76-8050-F25CE953A7FD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+               {6C43BE85-F8C3-4D76-8050-F25CE953A7FD}.Debug|Any CPU.Build.0 = Debug|Any CPU
+               {6C43BE85-F8C3-4D76-8050-F25CE953A7FD}.Debug|ARM.ActiveCfg = Debug|Any CPU
+               {6C43BE85-F8C3-4D76-8050-F25CE953A7FD}.Debug|ARM.Build.0 = Debug|Any CPU
+               {6C43BE85-F8C3-4D76-8050-F25CE953A7FD}.Debug|ARM64.ActiveCfg = Debug|Any CPU
+               {6C43BE85-F8C3-4D76-8050-F25CE953A7FD}.Debug|ARM64.Build.0 = Debug|Any CPU
+               {6C43BE85-F8C3-4D76-8050-F25CE953A7FD}.Debug|x64.ActiveCfg = Debug|Any CPU
+               {6C43BE85-F8C3-4D76-8050-F25CE953A7FD}.Debug|x64.Build.0 = Debug|Any CPU
+               {6C43BE85-F8C3-4D76-8050-F25CE953A7FD}.Debug|x86.ActiveCfg = Debug|Any CPU
+               {6C43BE85-F8C3-4D76-8050-F25CE953A7FD}.Debug|x86.Build.0 = Debug|Any CPU
+               {6C43BE85-F8C3-4D76-8050-F25CE953A7FD}.Release|Any CPU.ActiveCfg = Release|Any CPU
+               {6C43BE85-F8C3-4D76-8050-F25CE953A7FD}.Release|Any CPU.Build.0 = Release|Any CPU
+               {6C43BE85-F8C3-4D76-8050-F25CE953A7FD}.Release|ARM.ActiveCfg = Release|Any CPU
+               {6C43BE85-F8C3-4D76-8050-F25CE953A7FD}.Release|ARM.Build.0 = Release|Any CPU
+               {6C43BE85-F8C3-4D76-8050-F25CE953A7FD}.Release|ARM64.ActiveCfg = Release|Any CPU
+               {6C43BE85-F8C3-4D76-8050-F25CE953A7FD}.Release|ARM64.Build.0 = Release|Any CPU
+               {6C43BE85-F8C3-4D76-8050-F25CE953A7FD}.Release|x64.ActiveCfg = Release|Any CPU
+               {6C43BE85-F8C3-4D76-8050-F25CE953A7FD}.Release|x64.Build.0 = Release|Any CPU
+               {6C43BE85-F8C3-4D76-8050-F25CE953A7FD}.Release|x86.ActiveCfg = Release|Any CPU
+               {6C43BE85-F8C3-4D76-8050-F25CE953A7FD}.Release|x86.Build.0 = Release|Any CPU
+               {6C43BE85-F8C3-4D76-8050-F25CE953A7FD}.RelWithDebInfo|Any CPU.ActiveCfg = Release|Any CPU
+               {6C43BE85-F8C3-4D76-8050-F25CE953A7FD}.RelWithDebInfo|Any CPU.Build.0 = Release|Any CPU
+               {6C43BE85-F8C3-4D76-8050-F25CE953A7FD}.RelWithDebInfo|ARM.ActiveCfg = Release|Any CPU
+               {6C43BE85-F8C3-4D76-8050-F25CE953A7FD}.RelWithDebInfo|ARM.Build.0 = Release|Any CPU
+               {6C43BE85-F8C3-4D76-8050-F25CE953A7FD}.RelWithDebInfo|ARM64.ActiveCfg = Release|Any CPU
+               {6C43BE85-F8C3-4D76-8050-F25CE953A7FD}.RelWithDebInfo|ARM64.Build.0 = Release|Any CPU
+               {6C43BE85-F8C3-4D76-8050-F25CE953A7FD}.RelWithDebInfo|x64.ActiveCfg = Release|Any CPU
+               {6C43BE85-F8C3-4D76-8050-F25CE953A7FD}.RelWithDebInfo|x64.Build.0 = Release|Any CPU
+               {6C43BE85-F8C3-4D76-8050-F25CE953A7FD}.RelWithDebInfo|x86.ActiveCfg = Release|Any CPU
+               {6C43BE85-F8C3-4D76-8050-F25CE953A7FD}.RelWithDebInfo|x86.Build.0 = Release|Any CPU
+               {252E5845-8D4C-4306-9D8F-ED2E2F7005F6}.Checked|Any CPU.ActiveCfg = Debug|Any CPU
+               {252E5845-8D4C-4306-9D8F-ED2E2F7005F6}.Checked|Any CPU.Build.0 = Debug|Any CPU
+               {252E5845-8D4C-4306-9D8F-ED2E2F7005F6}.Checked|ARM.ActiveCfg = Debug|Any CPU
+               {252E5845-8D4C-4306-9D8F-ED2E2F7005F6}.Checked|ARM.Build.0 = Debug|Any CPU
+               {252E5845-8D4C-4306-9D8F-ED2E2F7005F6}.Checked|ARM64.ActiveCfg = Debug|Any CPU
+               {252E5845-8D4C-4306-9D8F-ED2E2F7005F6}.Checked|ARM64.Build.0 = Debug|Any CPU
+               {252E5845-8D4C-4306-9D8F-ED2E2F7005F6}.Checked|x64.ActiveCfg = Debug|Any CPU
+               {252E5845-8D4C-4306-9D8F-ED2E2F7005F6}.Checked|x64.Build.0 = Debug|Any CPU
+               {252E5845-8D4C-4306-9D8F-ED2E2F7005F6}.Checked|x86.ActiveCfg = Debug|Any CPU
+               {252E5845-8D4C-4306-9D8F-ED2E2F7005F6}.Checked|x86.Build.0 = Debug|Any CPU
+               {252E5845-8D4C-4306-9D8F-ED2E2F7005F6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+               {252E5845-8D4C-4306-9D8F-ED2E2F7005F6}.Debug|Any CPU.Build.0 = Debug|Any CPU
+               {252E5845-8D4C-4306-9D8F-ED2E2F7005F6}.Debug|ARM.ActiveCfg = Debug|Any CPU
+               {252E5845-8D4C-4306-9D8F-ED2E2F7005F6}.Debug|ARM.Build.0 = Debug|Any CPU
+               {252E5845-8D4C-4306-9D8F-ED2E2F7005F6}.Debug|ARM64.ActiveCfg = Debug|Any CPU
+               {252E5845-8D4C-4306-9D8F-ED2E2F7005F6}.Debug|ARM64.Build.0 = Debug|Any CPU
+               {252E5845-8D4C-4306-9D8F-ED2E2F7005F6}.Debug|x64.ActiveCfg = Debug|Any CPU
+               {252E5845-8D4C-4306-9D8F-ED2E2F7005F6}.Debug|x64.Build.0 = Debug|Any CPU
+               {252E5845-8D4C-4306-9D8F-ED2E2F7005F6}.Debug|x86.ActiveCfg = Debug|Any CPU
+               {252E5845-8D4C-4306-9D8F-ED2E2F7005F6}.Debug|x86.Build.0 = Debug|Any CPU
+               {252E5845-8D4C-4306-9D8F-ED2E2F7005F6}.Release|Any CPU.ActiveCfg = Release|Any CPU
+               {252E5845-8D4C-4306-9D8F-ED2E2F7005F6}.Release|Any CPU.Build.0 = Release|Any CPU
+               {252E5845-8D4C-4306-9D8F-ED2E2F7005F6}.Release|ARM.ActiveCfg = Release|Any CPU
+               {252E5845-8D4C-4306-9D8F-ED2E2F7005F6}.Release|ARM.Build.0 = Release|Any CPU
+               {252E5845-8D4C-4306-9D8F-ED2E2F7005F6}.Release|ARM64.ActiveCfg = Release|Any CPU
+               {252E5845-8D4C-4306-9D8F-ED2E2F7005F6}.Release|ARM64.Build.0 = Release|Any CPU
+               {252E5845-8D4C-4306-9D8F-ED2E2F7005F6}.Release|x64.ActiveCfg = Release|Any CPU
+               {252E5845-8D4C-4306-9D8F-ED2E2F7005F6}.Release|x64.Build.0 = Release|Any CPU
+               {252E5845-8D4C-4306-9D8F-ED2E2F7005F6}.Release|x86.ActiveCfg = Release|Any CPU
+               {252E5845-8D4C-4306-9D8F-ED2E2F7005F6}.Release|x86.Build.0 = Release|Any CPU
+               {252E5845-8D4C-4306-9D8F-ED2E2F7005F6}.RelWithDebInfo|Any CPU.ActiveCfg = Release|Any CPU
+               {252E5845-8D4C-4306-9D8F-ED2E2F7005F6}.RelWithDebInfo|Any CPU.Build.0 = Release|Any CPU
+               {252E5845-8D4C-4306-9D8F-ED2E2F7005F6}.RelWithDebInfo|ARM.ActiveCfg = Release|Any CPU
+               {252E5845-8D4C-4306-9D8F-ED2E2F7005F6}.RelWithDebInfo|ARM.Build.0 = Release|Any CPU
+               {252E5845-8D4C-4306-9D8F-ED2E2F7005F6}.RelWithDebInfo|ARM64.ActiveCfg = Release|Any CPU
+               {252E5845-8D4C-4306-9D8F-ED2E2F7005F6}.RelWithDebInfo|ARM64.Build.0 = Release|Any CPU
+               {252E5845-8D4C-4306-9D8F-ED2E2F7005F6}.RelWithDebInfo|x64.ActiveCfg = Release|Any CPU
+               {252E5845-8D4C-4306-9D8F-ED2E2F7005F6}.RelWithDebInfo|x64.Build.0 = Release|Any CPU
+               {252E5845-8D4C-4306-9D8F-ED2E2F7005F6}.RelWithDebInfo|x86.ActiveCfg = Release|Any CPU
+               {252E5845-8D4C-4306-9D8F-ED2E2F7005F6}.RelWithDebInfo|x86.Build.0 = Release|Any CPU
+               {E7FEA82E-0E16-4868-B122-4B0BC0014E7F}.Checked|Any CPU.ActiveCfg = Debug|Any CPU
+               {E7FEA82E-0E16-4868-B122-4B0BC0014E7F}.Checked|Any CPU.Build.0 = Debug|Any CPU
+               {E7FEA82E-0E16-4868-B122-4B0BC0014E7F}.Checked|ARM.ActiveCfg = Debug|Any CPU
+               {E7FEA82E-0E16-4868-B122-4B0BC0014E7F}.Checked|ARM.Build.0 = Debug|Any CPU
+               {E7FEA82E-0E16-4868-B122-4B0BC0014E7F}.Checked|ARM64.ActiveCfg = Debug|Any CPU
+               {E7FEA82E-0E16-4868-B122-4B0BC0014E7F}.Checked|ARM64.Build.0 = Debug|Any CPU
+               {E7FEA82E-0E16-4868-B122-4B0BC0014E7F}.Checked|x64.ActiveCfg = Debug|Any CPU
+               {E7FEA82E-0E16-4868-B122-4B0BC0014E7F}.Checked|x64.Build.0 = Debug|Any CPU
+               {E7FEA82E-0E16-4868-B122-4B0BC0014E7F}.Checked|x86.ActiveCfg = Debug|Any CPU
+               {E7FEA82E-0E16-4868-B122-4B0BC0014E7F}.Checked|x86.Build.0 = Debug|Any CPU
+               {E7FEA82E-0E16-4868-B122-4B0BC0014E7F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+               {E7FEA82E-0E16-4868-B122-4B0BC0014E7F}.Debug|Any CPU.Build.0 = Debug|Any CPU
+               {E7FEA82E-0E16-4868-B122-4B0BC0014E7F}.Debug|ARM.ActiveCfg = Debug|Any CPU
+               {E7FEA82E-0E16-4868-B122-4B0BC0014E7F}.Debug|ARM.Build.0 = Debug|Any CPU
+               {E7FEA82E-0E16-4868-B122-4B0BC0014E7F}.Debug|ARM64.ActiveCfg = Debug|Any CPU
+               {E7FEA82E-0E16-4868-B122-4B0BC0014E7F}.Debug|ARM64.Build.0 = Debug|Any CPU
+               {E7FEA82E-0E16-4868-B122-4B0BC0014E7F}.Debug|x64.ActiveCfg = Debug|Any CPU
+               {E7FEA82E-0E16-4868-B122-4B0BC0014E7F}.Debug|x64.Build.0 = Debug|Any CPU
+               {E7FEA82E-0E16-4868-B122-4B0BC0014E7F}.Debug|x86.ActiveCfg = Debug|Any CPU
+               {E7FEA82E-0E16-4868-B122-4B0BC0014E7F}.Debug|x86.Build.0 = Debug|Any CPU
+               {E7FEA82E-0E16-4868-B122-4B0BC0014E7F}.Release|Any CPU.ActiveCfg = Release|Any CPU
+               {E7FEA82E-0E16-4868-B122-4B0BC0014E7F}.Release|Any CPU.Build.0 = Release|Any CPU
+               {E7FEA82E-0E16-4868-B122-4B0BC0014E7F}.Release|ARM.ActiveCfg = Release|Any CPU
+               {E7FEA82E-0E16-4868-B122-4B0BC0014E7F}.Release|ARM.Build.0 = Release|Any CPU
+               {E7FEA82E-0E16-4868-B122-4B0BC0014E7F}.Release|ARM64.ActiveCfg = Release|Any CPU
+               {E7FEA82E-0E16-4868-B122-4B0BC0014E7F}.Release|ARM64.Build.0 = Release|Any CPU
+               {E7FEA82E-0E16-4868-B122-4B0BC0014E7F}.Release|x64.ActiveCfg = Release|Any CPU
+               {E7FEA82E-0E16-4868-B122-4B0BC0014E7F}.Release|x64.Build.0 = Release|Any CPU
+               {E7FEA82E-0E16-4868-B122-4B0BC0014E7F}.Release|x86.ActiveCfg = Release|Any CPU
+               {E7FEA82E-0E16-4868-B122-4B0BC0014E7F}.Release|x86.Build.0 = Release|Any CPU
+               {E7FEA82E-0E16-4868-B122-4B0BC0014E7F}.RelWithDebInfo|Any CPU.ActiveCfg = Release|Any CPU
+               {E7FEA82E-0E16-4868-B122-4B0BC0014E7F}.RelWithDebInfo|Any CPU.Build.0 = Release|Any CPU
+               {E7FEA82E-0E16-4868-B122-4B0BC0014E7F}.RelWithDebInfo|ARM.ActiveCfg = Release|Any CPU
+               {E7FEA82E-0E16-4868-B122-4B0BC0014E7F}.RelWithDebInfo|ARM.Build.0 = Release|Any CPU
+               {E7FEA82E-0E16-4868-B122-4B0BC0014E7F}.RelWithDebInfo|ARM64.ActiveCfg = Release|Any CPU
+               {E7FEA82E-0E16-4868-B122-4B0BC0014E7F}.RelWithDebInfo|ARM64.Build.0 = Release|Any CPU
+               {E7FEA82E-0E16-4868-B122-4B0BC0014E7F}.RelWithDebInfo|x64.ActiveCfg = Release|Any CPU
+               {E7FEA82E-0E16-4868-B122-4B0BC0014E7F}.RelWithDebInfo|x64.Build.0 = Release|Any CPU
+               {E7FEA82E-0E16-4868-B122-4B0BC0014E7F}.RelWithDebInfo|x86.ActiveCfg = Release|Any CPU
+               {E7FEA82E-0E16-4868-B122-4B0BC0014E7F}.RelWithDebInfo|x86.Build.0 = Release|Any CPU
+               {179EF543-E30A-4428-ABA0-2E2621860173}.Checked|Any CPU.ActiveCfg = Debug|Any CPU
+               {179EF543-E30A-4428-ABA0-2E2621860173}.Checked|Any CPU.Build.0 = Debug|Any CPU
+               {179EF543-E30A-4428-ABA0-2E2621860173}.Checked|ARM.ActiveCfg = Debug|Any CPU
+               {179EF543-E30A-4428-ABA0-2E2621860173}.Checked|ARM.Build.0 = Debug|Any CPU
+               {179EF543-E30A-4428-ABA0-2E2621860173}.Checked|ARM64.ActiveCfg = Debug|Any CPU
+               {179EF543-E30A-4428-ABA0-2E2621860173}.Checked|ARM64.Build.0 = Debug|Any CPU
+               {179EF543-E30A-4428-ABA0-2E2621860173}.Checked|x64.ActiveCfg = Debug|Any CPU
+               {179EF543-E30A-4428-ABA0-2E2621860173}.Checked|x64.Build.0 = Debug|Any CPU
+               {179EF543-E30A-4428-ABA0-2E2621860173}.Checked|x86.ActiveCfg = Debug|Any CPU
+               {179EF543-E30A-4428-ABA0-2E2621860173}.Checked|x86.Build.0 = Debug|Any CPU
+               {179EF543-E30A-4428-ABA0-2E2621860173}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+               {179EF543-E30A-4428-ABA0-2E2621860173}.Debug|Any CPU.Build.0 = Debug|Any CPU
+               {179EF543-E30A-4428-ABA0-2E2621860173}.Debug|ARM.ActiveCfg = Debug|Any CPU
+               {179EF543-E30A-4428-ABA0-2E2621860173}.Debug|ARM.Build.0 = Debug|Any CPU
+               {179EF543-E30A-4428-ABA0-2E2621860173}.Debug|ARM64.ActiveCfg = Debug|Any CPU
+               {179EF543-E30A-4428-ABA0-2E2621860173}.Debug|ARM64.Build.0 = Debug|Any CPU
+               {179EF543-E30A-4428-ABA0-2E2621860173}.Debug|x64.ActiveCfg = Debug|Any CPU
+               {179EF543-E30A-4428-ABA0-2E2621860173}.Debug|x64.Build.0 = Debug|Any CPU
+               {179EF543-E30A-4428-ABA0-2E2621860173}.Debug|x86.ActiveCfg = Debug|Any CPU
+               {179EF543-E30A-4428-ABA0-2E2621860173}.Debug|x86.Build.0 = Debug|Any CPU
+               {179EF543-E30A-4428-ABA0-2E2621860173}.Release|Any CPU.ActiveCfg = Release|Any CPU
+               {179EF543-E30A-4428-ABA0-2E2621860173}.Release|Any CPU.Build.0 = Release|Any CPU
+               {179EF543-E30A-4428-ABA0-2E2621860173}.Release|ARM.ActiveCfg = Release|Any CPU
+               {179EF543-E30A-4428-ABA0-2E2621860173}.Release|ARM.Build.0 = Release|Any CPU
+               {179EF543-E30A-4428-ABA0-2E2621860173}.Release|ARM64.ActiveCfg = Release|Any CPU
+               {179EF543-E30A-4428-ABA0-2E2621860173}.Release|ARM64.Build.0 = Release|Any CPU
+               {179EF543-E30A-4428-ABA0-2E2621860173}.Release|x64.ActiveCfg = Release|Any CPU
+               {179EF543-E30A-4428-ABA0-2E2621860173}.Release|x64.Build.0 = Release|Any CPU
+               {179EF543-E30A-4428-ABA0-2E2621860173}.Release|x86.ActiveCfg = Release|Any CPU
+               {179EF543-E30A-4428-ABA0-2E2621860173}.Release|x86.Build.0 = Release|Any CPU
+               {179EF543-E30A-4428-ABA0-2E2621860173}.RelWithDebInfo|Any CPU.ActiveCfg = Release|Any CPU
+               {179EF543-E30A-4428-ABA0-2E2621860173}.RelWithDebInfo|Any CPU.Build.0 = Release|Any CPU
+               {179EF543-E30A-4428-ABA0-2E2621860173}.RelWithDebInfo|ARM.ActiveCfg = Release|Any CPU
+               {179EF543-E30A-4428-ABA0-2E2621860173}.RelWithDebInfo|ARM.Build.0 = Release|Any CPU
+               {179EF543-E30A-4428-ABA0-2E2621860173}.RelWithDebInfo|ARM64.ActiveCfg = Release|Any CPU
+               {179EF543-E30A-4428-ABA0-2E2621860173}.RelWithDebInfo|ARM64.Build.0 = Release|Any CPU
+               {179EF543-E30A-4428-ABA0-2E2621860173}.RelWithDebInfo|x64.ActiveCfg = Release|Any CPU
+               {179EF543-E30A-4428-ABA0-2E2621860173}.RelWithDebInfo|x64.Build.0 = Release|Any CPU
+               {179EF543-E30A-4428-ABA0-2E2621860173}.RelWithDebInfo|x86.ActiveCfg = Release|Any CPU
+               {179EF543-E30A-4428-ABA0-2E2621860173}.RelWithDebInfo|x86.Build.0 = Release|Any CPU
+               {447AC053-2E0A-4119-BD11-30A4A8E3F765}.Checked|Any CPU.ActiveCfg = Debug|Any CPU
+               {447AC053-2E0A-4119-BD11-30A4A8E3F765}.Checked|Any CPU.Build.0 = Debug|Any CPU
+               {447AC053-2E0A-4119-BD11-30A4A8E3F765}.Checked|ARM.ActiveCfg = Debug|Any CPU
+               {447AC053-2E0A-4119-BD11-30A4A8E3F765}.Checked|ARM.Build.0 = Debug|Any CPU
+               {447AC053-2E0A-4119-BD11-30A4A8E3F765}.Checked|ARM64.ActiveCfg = Debug|Any CPU
+               {447AC053-2E0A-4119-BD11-30A4A8E3F765}.Checked|ARM64.Build.0 = Debug|Any CPU
+               {447AC053-2E0A-4119-BD11-30A4A8E3F765}.Checked|x64.ActiveCfg = Debug|Any CPU
+               {447AC053-2E0A-4119-BD11-30A4A8E3F765}.Checked|x64.Build.0 = Debug|Any CPU
+               {447AC053-2E0A-4119-BD11-30A4A8E3F765}.Checked|x86.ActiveCfg = Debug|Any CPU
+               {447AC053-2E0A-4119-BD11-30A4A8E3F765}.Checked|x86.Build.0 = Debug|Any CPU
+               {447AC053-2E0A-4119-BD11-30A4A8E3F765}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+               {447AC053-2E0A-4119-BD11-30A4A8E3F765}.Debug|Any CPU.Build.0 = Debug|Any CPU
+               {447AC053-2E0A-4119-BD11-30A4A8E3F765}.Debug|ARM.ActiveCfg = Debug|Any CPU
+               {447AC053-2E0A-4119-BD11-30A4A8E3F765}.Debug|ARM.Build.0 = Debug|Any CPU
+               {447AC053-2E0A-4119-BD11-30A4A8E3F765}.Debug|ARM64.ActiveCfg = Debug|Any CPU
+               {447AC053-2E0A-4119-BD11-30A4A8E3F765}.Debug|ARM64.Build.0 = Debug|Any CPU
+               {447AC053-2E0A-4119-BD11-30A4A8E3F765}.Debug|x64.ActiveCfg = Debug|Any CPU
+               {447AC053-2E0A-4119-BD11-30A4A8E3F765}.Debug|x64.Build.0 = Debug|Any CPU
+               {447AC053-2E0A-4119-BD11-30A4A8E3F765}.Debug|x86.ActiveCfg = Debug|Any CPU
+               {447AC053-2E0A-4119-BD11-30A4A8E3F765}.Debug|x86.Build.0 = Debug|Any CPU
+               {447AC053-2E0A-4119-BD11-30A4A8E3F765}.Release|Any CPU.ActiveCfg = Release|Any CPU
+               {447AC053-2E0A-4119-BD11-30A4A8E3F765}.Release|Any CPU.Build.0 = Release|Any CPU
+               {447AC053-2E0A-4119-BD11-30A4A8E3F765}.Release|ARM.ActiveCfg = Release|Any CPU
+               {447AC053-2E0A-4119-BD11-30A4A8E3F765}.Release|ARM.Build.0 = Release|Any CPU
+               {447AC053-2E0A-4119-BD11-30A4A8E3F765}.Release|ARM64.ActiveCfg = Release|Any CPU
+               {447AC053-2E0A-4119-BD11-30A4A8E3F765}.Release|ARM64.Build.0 = Release|Any CPU
+               {447AC053-2E0A-4119-BD11-30A4A8E3F765}.Release|x64.ActiveCfg = Release|Any CPU
+               {447AC053-2E0A-4119-BD11-30A4A8E3F765}.Release|x64.Build.0 = Release|Any CPU
+               {447AC053-2E0A-4119-BD11-30A4A8E3F765}.Release|x86.ActiveCfg = Release|Any CPU
+               {447AC053-2E0A-4119-BD11-30A4A8E3F765}.Release|x86.Build.0 = Release|Any CPU
+               {447AC053-2E0A-4119-BD11-30A4A8E3F765}.RelWithDebInfo|Any CPU.ActiveCfg = Release|Any CPU
+               {447AC053-2E0A-4119-BD11-30A4A8E3F765}.RelWithDebInfo|Any CPU.Build.0 = Release|Any CPU
+               {447AC053-2E0A-4119-BD11-30A4A8E3F765}.RelWithDebInfo|ARM.ActiveCfg = Release|Any CPU
+               {447AC053-2E0A-4119-BD11-30A4A8E3F765}.RelWithDebInfo|ARM.Build.0 = Release|Any CPU
+               {447AC053-2E0A-4119-BD11-30A4A8E3F765}.RelWithDebInfo|ARM64.ActiveCfg = Release|Any CPU
+               {447AC053-2E0A-4119-BD11-30A4A8E3F765}.RelWithDebInfo|ARM64.Build.0 = Release|Any CPU
+               {447AC053-2E0A-4119-BD11-30A4A8E3F765}.RelWithDebInfo|x64.ActiveCfg = Release|Any CPU
+               {447AC053-2E0A-4119-BD11-30A4A8E3F765}.RelWithDebInfo|x64.Build.0 = Release|Any CPU
+               {447AC053-2E0A-4119-BD11-30A4A8E3F765}.RelWithDebInfo|x86.ActiveCfg = Release|Any CPU
+               {447AC053-2E0A-4119-BD11-30A4A8E3F765}.RelWithDebInfo|x86.Build.0 = Release|Any CPU
+               {664F46A9-3C99-489B-AAB9-4CD3A430C425}.Checked|Any CPU.ActiveCfg = Debug|Any CPU
+               {664F46A9-3C99-489B-AAB9-4CD3A430C425}.Checked|Any CPU.Build.0 = Debug|Any CPU
+               {664F46A9-3C99-489B-AAB9-4CD3A430C425}.Checked|ARM.ActiveCfg = Debug|Any CPU
+               {664F46A9-3C99-489B-AAB9-4CD3A430C425}.Checked|ARM.Build.0 = Debug|Any CPU
+               {664F46A9-3C99-489B-AAB9-4CD3A430C425}.Checked|ARM64.ActiveCfg = Debug|Any CPU
+               {664F46A9-3C99-489B-AAB9-4CD3A430C425}.Checked|ARM64.Build.0 = Debug|Any CPU
+               {664F46A9-3C99-489B-AAB9-4CD3A430C425}.Checked|x64.ActiveCfg = Debug|Any CPU
+               {664F46A9-3C99-489B-AAB9-4CD3A430C425}.Checked|x64.Build.0 = Debug|Any CPU
+               {664F46A9-3C99-489B-AAB9-4CD3A430C425}.Checked|x86.ActiveCfg = Debug|Any CPU
+               {664F46A9-3C99-489B-AAB9-4CD3A430C425}.Checked|x86.Build.0 = Debug|Any CPU
+               {664F46A9-3C99-489B-AAB9-4CD3A430C425}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+               {664F46A9-3C99-489B-AAB9-4CD3A430C425}.Debug|Any CPU.Build.0 = Debug|Any CPU
+               {664F46A9-3C99-489B-AAB9-4CD3A430C425}.Debug|ARM.ActiveCfg = Debug|Any CPU
+               {664F46A9-3C99-489B-AAB9-4CD3A430C425}.Debug|ARM.Build.0 = Debug|Any CPU
+               {664F46A9-3C99-489B-AAB9-4CD3A430C425}.Debug|ARM64.ActiveCfg = Debug|Any CPU
+               {664F46A9-3C99-489B-AAB9-4CD3A430C425}.Debug|ARM64.Build.0 = Debug|Any CPU
+               {664F46A9-3C99-489B-AAB9-4CD3A430C425}.Debug|x64.ActiveCfg = Debug|Any CPU
+               {664F46A9-3C99-489B-AAB9-4CD3A430C425}.Debug|x64.Build.0 = Debug|Any CPU
+               {664F46A9-3C99-489B-AAB9-4CD3A430C425}.Debug|x86.ActiveCfg = Debug|Any CPU
+               {664F46A9-3C99-489B-AAB9-4CD3A430C425}.Debug|x86.Build.0 = Debug|Any CPU
+               {664F46A9-3C99-489B-AAB9-4CD3A430C425}.Release|Any CPU.ActiveCfg = Release|Any CPU
+               {664F46A9-3C99-489B-AAB9-4CD3A430C425}.Release|Any CPU.Build.0 = Release|Any CPU
+               {664F46A9-3C99-489B-AAB9-4CD3A430C425}.Release|ARM.ActiveCfg = Release|Any CPU
+               {664F46A9-3C99-489B-AAB9-4CD3A430C425}.Release|ARM.Build.0 = Release|Any CPU
+               {664F46A9-3C99-489B-AAB9-4CD3A430C425}.Release|ARM64.ActiveCfg = Release|Any CPU
+               {664F46A9-3C99-489B-AAB9-4CD3A430C425}.Release|ARM64.Build.0 = Release|Any CPU
+               {664F46A9-3C99-489B-AAB9-4CD3A430C425}.Release|x64.ActiveCfg = Release|Any CPU
+               {664F46A9-3C99-489B-AAB9-4CD3A430C425}.Release|x64.Build.0 = Release|Any CPU
+               {664F46A9-3C99-489B-AAB9-4CD3A430C425}.Release|x86.ActiveCfg = Release|Any CPU
+               {664F46A9-3C99-489B-AAB9-4CD3A430C425}.Release|x86.Build.0 = Release|Any CPU
+               {664F46A9-3C99-489B-AAB9-4CD3A430C425}.RelWithDebInfo|Any CPU.ActiveCfg = Release|Any CPU
+               {664F46A9-3C99-489B-AAB9-4CD3A430C425}.RelWithDebInfo|Any CPU.Build.0 = Release|Any CPU
+               {664F46A9-3C99-489B-AAB9-4CD3A430C425}.RelWithDebInfo|ARM.ActiveCfg = Release|Any CPU
+               {664F46A9-3C99-489B-AAB9-4CD3A430C425}.RelWithDebInfo|ARM.Build.0 = Release|Any CPU
+               {664F46A9-3C99-489B-AAB9-4CD3A430C425}.RelWithDebInfo|ARM64.ActiveCfg = Release|Any CPU
+               {664F46A9-3C99-489B-AAB9-4CD3A430C425}.RelWithDebInfo|ARM64.Build.0 = Release|Any CPU
+               {664F46A9-3C99-489B-AAB9-4CD3A430C425}.RelWithDebInfo|x64.ActiveCfg = Release|Any CPU
+               {664F46A9-3C99-489B-AAB9-4CD3A430C425}.RelWithDebInfo|x64.Build.0 = Release|Any CPU
+               {664F46A9-3C99-489B-AAB9-4CD3A430C425}.RelWithDebInfo|x86.ActiveCfg = Release|Any CPU
+               {664F46A9-3C99-489B-AAB9-4CD3A430C425}.RelWithDebInfo|x86.Build.0 = Release|Any CPU
+               {0CB805C8-0B76-4B1D-8AAF-48535B180448}.Checked|Any CPU.ActiveCfg = Debug|Any CPU
+               {0CB805C8-0B76-4B1D-8AAF-48535B180448}.Checked|Any CPU.Build.0 = Debug|Any CPU
+               {0CB805C8-0B76-4B1D-8AAF-48535B180448}.Checked|ARM.ActiveCfg = Debug|Any CPU
+               {0CB805C8-0B76-4B1D-8AAF-48535B180448}.Checked|ARM.Build.0 = Debug|Any CPU
+               {0CB805C8-0B76-4B1D-8AAF-48535B180448}.Checked|ARM64.ActiveCfg = Debug|Any CPU
+               {0CB805C8-0B76-4B1D-8AAF-48535B180448}.Checked|ARM64.Build.0 = Debug|Any CPU
+               {0CB805C8-0B76-4B1D-8AAF-48535B180448}.Checked|x64.ActiveCfg = Debug|Any CPU
+               {0CB805C8-0B76-4B1D-8AAF-48535B180448}.Checked|x64.Build.0 = Debug|Any CPU
+               {0CB805C8-0B76-4B1D-8AAF-48535B180448}.Checked|x86.ActiveCfg = Debug|Any CPU
+               {0CB805C8-0B76-4B1D-8AAF-48535B180448}.Checked|x86.Build.0 = Debug|Any CPU
+               {0CB805C8-0B76-4B1D-8AAF-48535B180448}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+               {0CB805C8-0B76-4B1D-8AAF-48535B180448}.Debug|Any CPU.Build.0 = Debug|Any CPU
+               {0CB805C8-0B76-4B1D-8AAF-48535B180448}.Debug|ARM.ActiveCfg = Debug|Any CPU
+               {0CB805C8-0B76-4B1D-8AAF-48535B180448}.Debug|ARM.Build.0 = Debug|Any CPU
+               {0CB805C8-0B76-4B1D-8AAF-48535B180448}.Debug|ARM64.ActiveCfg = Debug|Any CPU
+               {0CB805C8-0B76-4B1D-8AAF-48535B180448}.Debug|ARM64.Build.0 = Debug|Any CPU
+               {0CB805C8-0B76-4B1D-8AAF-48535B180448}.Debug|x64.ActiveCfg = Debug|Any CPU
+               {0CB805C8-0B76-4B1D-8AAF-48535B180448}.Debug|x64.Build.0 = Debug|Any CPU
+               {0CB805C8-0B76-4B1D-8AAF-48535B180448}.Debug|x86.ActiveCfg = Debug|Any CPU
+               {0CB805C8-0B76-4B1D-8AAF-48535B180448}.Debug|x86.Build.0 = Debug|Any CPU
+               {0CB805C8-0B76-4B1D-8AAF-48535B180448}.Release|Any CPU.ActiveCfg = Release|Any CPU
+               {0CB805C8-0B76-4B1D-8AAF-48535B180448}.Release|Any CPU.Build.0 = Release|Any CPU
+               {0CB805C8-0B76-4B1D-8AAF-48535B180448}.Release|ARM.ActiveCfg = Release|Any CPU
+               {0CB805C8-0B76-4B1D-8AAF-48535B180448}.Release|ARM.Build.0 = Release|Any CPU
+               {0CB805C8-0B76-4B1D-8AAF-48535B180448}.Release|ARM64.ActiveCfg = Release|Any CPU
+               {0CB805C8-0B76-4B1D-8AAF-48535B180448}.Release|ARM64.Build.0 = Release|Any CPU
+               {0CB805C8-0B76-4B1D-8AAF-48535B180448}.Release|x64.ActiveCfg = Release|Any CPU
+               {0CB805C8-0B76-4B1D-8AAF-48535B180448}.Release|x64.Build.0 = Release|Any CPU
+               {0CB805C8-0B76-4B1D-8AAF-48535B180448}.Release|x86.ActiveCfg = Release|Any CPU
+               {0CB805C8-0B76-4B1D-8AAF-48535B180448}.Release|x86.Build.0 = Release|Any CPU
+               {0CB805C8-0B76-4B1D-8AAF-48535B180448}.RelWithDebInfo|Any CPU.ActiveCfg = Release|Any CPU
+               {0CB805C8-0B76-4B1D-8AAF-48535B180448}.RelWithDebInfo|Any CPU.Build.0 = Release|Any CPU
+               {0CB805C8-0B76-4B1D-8AAF-48535B180448}.RelWithDebInfo|ARM.ActiveCfg = Release|Any CPU
+               {0CB805C8-0B76-4B1D-8AAF-48535B180448}.RelWithDebInfo|ARM.Build.0 = Release|Any CPU
+               {0CB805C8-0B76-4B1D-8AAF-48535B180448}.RelWithDebInfo|ARM64.ActiveCfg = Release|Any CPU
+               {0CB805C8-0B76-4B1D-8AAF-48535B180448}.RelWithDebInfo|ARM64.Build.0 = Release|Any CPU
+               {0CB805C8-0B76-4B1D-8AAF-48535B180448}.RelWithDebInfo|x64.ActiveCfg = Release|Any CPU
+               {0CB805C8-0B76-4B1D-8AAF-48535B180448}.RelWithDebInfo|x64.Build.0 = Release|Any CPU
+               {0CB805C8-0B76-4B1D-8AAF-48535B180448}.RelWithDebInfo|x86.ActiveCfg = Release|Any CPU
+               {0CB805C8-0B76-4B1D-8AAF-48535B180448}.RelWithDebInfo|x86.Build.0 = Release|Any CPU
+               {20251748-AA7B-45BE-ADAA-C9375F5CC80F}.Checked|Any CPU.ActiveCfg = Debug|Any CPU
+               {20251748-AA7B-45BE-ADAA-C9375F5CC80F}.Checked|Any CPU.Build.0 = Debug|Any CPU
+               {20251748-AA7B-45BE-ADAA-C9375F5CC80F}.Checked|ARM.ActiveCfg = Debug|Any CPU
+               {20251748-AA7B-45BE-ADAA-C9375F5CC80F}.Checked|ARM.Build.0 = Debug|Any CPU
+               {20251748-AA7B-45BE-ADAA-C9375F5CC80F}.Checked|ARM64.ActiveCfg = Debug|Any CPU
+               {20251748-AA7B-45BE-ADAA-C9375F5CC80F}.Checked|ARM64.Build.0 = Debug|Any CPU
+               {20251748-AA7B-45BE-ADAA-C9375F5CC80F}.Checked|x64.ActiveCfg = Debug|Any CPU
+               {20251748-AA7B-45BE-ADAA-C9375F5CC80F}.Checked|x64.Build.0 = Debug|Any CPU
+               {20251748-AA7B-45BE-ADAA-C9375F5CC80F}.Checked|x86.ActiveCfg = Debug|Any CPU
+               {20251748-AA7B-45BE-ADAA-C9375F5CC80F}.Checked|x86.Build.0 = Debug|Any CPU
+               {20251748-AA7B-45BE-ADAA-C9375F5CC80F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+               {20251748-AA7B-45BE-ADAA-C9375F5CC80F}.Debug|Any CPU.Build.0 = Debug|Any CPU
+               {20251748-AA7B-45BE-ADAA-C9375F5CC80F}.Debug|ARM.ActiveCfg = Debug|Any CPU
+               {20251748-AA7B-45BE-ADAA-C9375F5CC80F}.Debug|ARM.Build.0 = Debug|Any CPU
+               {20251748-AA7B-45BE-ADAA-C9375F5CC80F}.Debug|ARM64.ActiveCfg = Debug|Any CPU
+               {20251748-AA7B-45BE-ADAA-C9375F5CC80F}.Debug|ARM64.Build.0 = Debug|Any CPU
+               {20251748-AA7B-45BE-ADAA-C9375F5CC80F}.Debug|x64.ActiveCfg = Debug|Any CPU
+               {20251748-AA7B-45BE-ADAA-C9375F5CC80F}.Debug|x64.Build.0 = Debug|Any CPU
+               {20251748-AA7B-45BE-ADAA-C9375F5CC80F}.Debug|x86.ActiveCfg = Debug|Any CPU
+               {20251748-AA7B-45BE-ADAA-C9375F5CC80F}.Debug|x86.Build.0 = Debug|Any CPU
+               {20251748-AA7B-45BE-ADAA-C9375F5CC80F}.Release|Any CPU.ActiveCfg = Release|Any CPU
+               {20251748-AA7B-45BE-ADAA-C9375F5CC80F}.Release|Any CPU.Build.0 = Release|Any CPU
+               {20251748-AA7B-45BE-ADAA-C9375F5CC80F}.Release|ARM.ActiveCfg = Release|Any CPU
+               {20251748-AA7B-45BE-ADAA-C9375F5CC80F}.Release|ARM.Build.0 = Release|Any CPU
+               {20251748-AA7B-45BE-ADAA-C9375F5CC80F}.Release|ARM64.ActiveCfg = Release|Any CPU
+               {20251748-AA7B-45BE-ADAA-C9375F5CC80F}.Release|ARM64.Build.0 = Release|Any CPU
+               {20251748-AA7B-45BE-ADAA-C9375F5CC80F}.Release|x64.ActiveCfg = Release|Any CPU
+               {20251748-AA7B-45BE-ADAA-C9375F5CC80F}.Release|x64.Build.0 = Release|Any CPU
+               {20251748-AA7B-45BE-ADAA-C9375F5CC80F}.Release|x86.ActiveCfg = Release|Any CPU
+               {20251748-AA7B-45BE-ADAA-C9375F5CC80F}.Release|x86.Build.0 = Release|Any CPU
+               {20251748-AA7B-45BE-ADAA-C9375F5CC80F}.RelWithDebInfo|Any CPU.ActiveCfg = Release|Any CPU
+               {20251748-AA7B-45BE-ADAA-C9375F5CC80F}.RelWithDebInfo|Any CPU.Build.0 = Release|Any CPU
+               {20251748-AA7B-45BE-ADAA-C9375F5CC80F}.RelWithDebInfo|ARM.ActiveCfg = Release|Any CPU
+               {20251748-AA7B-45BE-ADAA-C9375F5CC80F}.RelWithDebInfo|ARM.Build.0 = Release|Any CPU
+               {20251748-AA7B-45BE-ADAA-C9375F5CC80F}.RelWithDebInfo|ARM64.ActiveCfg = Release|Any CPU
+               {20251748-AA7B-45BE-ADAA-C9375F5CC80F}.RelWithDebInfo|ARM64.Build.0 = Release|Any CPU
+               {20251748-AA7B-45BE-ADAA-C9375F5CC80F}.RelWithDebInfo|x64.ActiveCfg = Release|Any CPU
+               {20251748-AA7B-45BE-ADAA-C9375F5CC80F}.RelWithDebInfo|x64.Build.0 = Release|Any CPU
+               {20251748-AA7B-45BE-ADAA-C9375F5CC80F}.RelWithDebInfo|x86.ActiveCfg = Release|Any CPU
+               {20251748-AA7B-45BE-ADAA-C9375F5CC80F}.RelWithDebInfo|x86.Build.0 = Release|Any CPU
+               {DDDA69DF-2C4C-477A-B6C9-B4FE73C6E288}.Checked|Any CPU.ActiveCfg = Debug|Any CPU
+               {DDDA69DF-2C4C-477A-B6C9-B4FE73C6E288}.Checked|Any CPU.Build.0 = Debug|Any CPU
+               {DDDA69DF-2C4C-477A-B6C9-B4FE73C6E288}.Checked|ARM.ActiveCfg = Debug|Any CPU
+               {DDDA69DF-2C4C-477A-B6C9-B4FE73C6E288}.Checked|ARM.Build.0 = Debug|Any CPU
+               {DDDA69DF-2C4C-477A-B6C9-B4FE73C6E288}.Checked|ARM64.ActiveCfg = Debug|Any CPU
+               {DDDA69DF-2C4C-477A-B6C9-B4FE73C6E288}.Checked|ARM64.Build.0 = Debug|Any CPU
+               {DDDA69DF-2C4C-477A-B6C9-B4FE73C6E288}.Checked|x64.ActiveCfg = Debug|Any CPU
+               {DDDA69DF-2C4C-477A-B6C9-B4FE73C6E288}.Checked|x64.Build.0 = Debug|Any CPU
+               {DDDA69DF-2C4C-477A-B6C9-B4FE73C6E288}.Checked|x86.ActiveCfg = Debug|Any CPU
+               {DDDA69DF-2C4C-477A-B6C9-B4FE73C6E288}.Checked|x86.Build.0 = Debug|Any CPU
+               {DDDA69DF-2C4C-477A-B6C9-B4FE73C6E288}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+               {DDDA69DF-2C4C-477A-B6C9-B4FE73C6E288}.Debug|Any CPU.Build.0 = Debug|Any CPU
+               {DDDA69DF-2C4C-477A-B6C9-B4FE73C6E288}.Debug|ARM.ActiveCfg = Debug|Any CPU
+               {DDDA69DF-2C4C-477A-B6C9-B4FE73C6E288}.Debug|ARM.Build.0 = Debug|Any CPU
+               {DDDA69DF-2C4C-477A-B6C9-B4FE73C6E288}.Debug|ARM64.ActiveCfg = Debug|Any CPU
+               {DDDA69DF-2C4C-477A-B6C9-B4FE73C6E288}.Debug|ARM64.Build.0 = Debug|Any CPU
+               {DDDA69DF-2C4C-477A-B6C9-B4FE73C6E288}.Debug|x64.ActiveCfg = Debug|Any CPU
+               {DDDA69DF-2C4C-477A-B6C9-B4FE73C6E288}.Debug|x64.Build.0 = Debug|Any CPU
+               {DDDA69DF-2C4C-477A-B6C9-B4FE73C6E288}.Debug|x86.ActiveCfg = Debug|Any CPU
+               {DDDA69DF-2C4C-477A-B6C9-B4FE73C6E288}.Debug|x86.Build.0 = Debug|Any CPU
+               {DDDA69DF-2C4C-477A-B6C9-B4FE73C6E288}.Release|Any CPU.ActiveCfg = Release|Any CPU
+               {DDDA69DF-2C4C-477A-B6C9-B4FE73C6E288}.Release|Any CPU.Build.0 = Release|Any CPU
+               {DDDA69DF-2C4C-477A-B6C9-B4FE73C6E288}.Release|ARM.ActiveCfg = Release|Any CPU
+               {DDDA69DF-2C4C-477A-B6C9-B4FE73C6E288}.Release|ARM.Build.0 = Release|Any CPU
+               {DDDA69DF-2C4C-477A-B6C9-B4FE73C6E288}.Release|ARM64.ActiveCfg = Release|Any CPU
+               {DDDA69DF-2C4C-477A-B6C9-B4FE73C6E288}.Release|ARM64.Build.0 = Release|Any CPU
+               {DDDA69DF-2C4C-477A-B6C9-B4FE73C6E288}.Release|x64.ActiveCfg = Release|Any CPU
+               {DDDA69DF-2C4C-477A-B6C9-B4FE73C6E288}.Release|x64.Build.0 = Release|Any CPU
+               {DDDA69DF-2C4C-477A-B6C9-B4FE73C6E288}.Release|x86.ActiveCfg = Release|Any CPU
+               {DDDA69DF-2C4C-477A-B6C9-B4FE73C6E288}.Release|x86.Build.0 = Release|Any CPU
+               {DDDA69DF-2C4C-477A-B6C9-B4FE73C6E288}.RelWithDebInfo|Any CPU.ActiveCfg = Release|Any CPU
+               {DDDA69DF-2C4C-477A-B6C9-B4FE73C6E288}.RelWithDebInfo|Any CPU.Build.0 = Release|Any CPU
+               {DDDA69DF-2C4C-477A-B6C9-B4FE73C6E288}.RelWithDebInfo|ARM.ActiveCfg = Release|Any CPU
+               {DDDA69DF-2C4C-477A-B6C9-B4FE73C6E288}.RelWithDebInfo|ARM.Build.0 = Release|Any CPU
+               {DDDA69DF-2C4C-477A-B6C9-B4FE73C6E288}.RelWithDebInfo|ARM64.ActiveCfg = Release|Any CPU
+               {DDDA69DF-2C4C-477A-B6C9-B4FE73C6E288}.RelWithDebInfo|ARM64.Build.0 = Release|Any CPU
+               {DDDA69DF-2C4C-477A-B6C9-B4FE73C6E288}.RelWithDebInfo|x64.ActiveCfg = Release|Any CPU
+               {DDDA69DF-2C4C-477A-B6C9-B4FE73C6E288}.RelWithDebInfo|x64.Build.0 = Release|Any CPU
+               {DDDA69DF-2C4C-477A-B6C9-B4FE73C6E288}.RelWithDebInfo|x86.ActiveCfg = Release|Any CPU
+               {DDDA69DF-2C4C-477A-B6C9-B4FE73C6E288}.RelWithDebInfo|x86.Build.0 = Release|Any CPU
+               {73EA5188-1E4F-42D8-B63E-F1B878A4EB63}.Checked|Any CPU.ActiveCfg = Debug|Any CPU
+               {73EA5188-1E4F-42D8-B63E-F1B878A4EB63}.Checked|Any CPU.Build.0 = Debug|Any CPU
+               {73EA5188-1E4F-42D8-B63E-F1B878A4EB63}.Checked|ARM.ActiveCfg = Debug|Any CPU
+               {73EA5188-1E4F-42D8-B63E-F1B878A4EB63}.Checked|ARM.Build.0 = Debug|Any CPU
+               {73EA5188-1E4F-42D8-B63E-F1B878A4EB63}.Checked|ARM64.ActiveCfg = Debug|Any CPU
+               {73EA5188-1E4F-42D8-B63E-F1B878A4EB63}.Checked|ARM64.Build.0 = Debug|Any CPU
+               {73EA5188-1E4F-42D8-B63E-F1B878A4EB63}.Checked|x64.ActiveCfg = Debug|Any CPU
+               {73EA5188-1E4F-42D8-B63E-F1B878A4EB63}.Checked|x64.Build.0 = Debug|Any CPU
+               {73EA5188-1E4F-42D8-B63E-F1B878A4EB63}.Checked|x86.ActiveCfg = Debug|Any CPU
+               {73EA5188-1E4F-42D8-B63E-F1B878A4EB63}.Checked|x86.Build.0 = Debug|Any CPU
+               {73EA5188-1E4F-42D8-B63E-F1B878A4EB63}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+               {73EA5188-1E4F-42D8-B63E-F1B878A4EB63}.Debug|Any CPU.Build.0 = Debug|Any CPU
+               {73EA5188-1E4F-42D8-B63E-F1B878A4EB63}.Debug|ARM.ActiveCfg = Debug|Any CPU
+               {73EA5188-1E4F-42D8-B63E-F1B878A4EB63}.Debug|ARM.Build.0 = Debug|Any CPU
+               {73EA5188-1E4F-42D8-B63E-F1B878A4EB63}.Debug|ARM64.ActiveCfg = Debug|Any CPU
+               {73EA5188-1E4F-42D8-B63E-F1B878A4EB63}.Debug|ARM64.Build.0 = Debug|Any CPU
+               {73EA5188-1E4F-42D8-B63E-F1B878A4EB63}.Debug|x64.ActiveCfg = Debug|Any CPU
+               {73EA5188-1E4F-42D8-B63E-F1B878A4EB63}.Debug|x64.Build.0 = Debug|Any CPU
+               {73EA5188-1E4F-42D8-B63E-F1B878A4EB63}.Debug|x86.ActiveCfg = Debug|Any CPU
+               {73EA5188-1E4F-42D8-B63E-F1B878A4EB63}.Debug|x86.Build.0 = Debug|Any CPU
+               {73EA5188-1E4F-42D8-B63E-F1B878A4EB63}.Release|Any CPU.ActiveCfg = Release|Any CPU
+               {73EA5188-1E4F-42D8-B63E-F1B878A4EB63}.Release|Any CPU.Build.0 = Release|Any CPU
+               {73EA5188-1E4F-42D8-B63E-F1B878A4EB63}.Release|ARM.ActiveCfg = Release|Any CPU
+               {73EA5188-1E4F-42D8-B63E-F1B878A4EB63}.Release|ARM.Build.0 = Release|Any CPU
+               {73EA5188-1E4F-42D8-B63E-F1B878A4EB63}.Release|ARM64.ActiveCfg = Release|Any CPU
+               {73EA5188-1E4F-42D8-B63E-F1B878A4EB63}.Release|ARM64.Build.0 = Release|Any CPU
+               {73EA5188-1E4F-42D8-B63E-F1B878A4EB63}.Release|x64.ActiveCfg = Release|Any CPU
+               {73EA5188-1E4F-42D8-B63E-F1B878A4EB63}.Release|x64.Build.0 = Release|Any CPU
+               {73EA5188-1E4F-42D8-B63E-F1B878A4EB63}.Release|x86.ActiveCfg = Release|Any CPU
+               {73EA5188-1E4F-42D8-B63E-F1B878A4EB63}.Release|x86.Build.0 = Release|Any CPU
+               {73EA5188-1E4F-42D8-B63E-F1B878A4EB63}.RelWithDebInfo|Any CPU.ActiveCfg = Release|Any CPU
+               {73EA5188-1E4F-42D8-B63E-F1B878A4EB63}.RelWithDebInfo|Any CPU.Build.0 = Release|Any CPU
+               {73EA5188-1E4F-42D8-B63E-F1B878A4EB63}.RelWithDebInfo|ARM.ActiveCfg = Release|Any CPU
+               {73EA5188-1E4F-42D8-B63E-F1B878A4EB63}.RelWithDebInfo|ARM.Build.0 = Release|Any CPU
+               {73EA5188-1E4F-42D8-B63E-F1B878A4EB63}.RelWithDebInfo|ARM64.ActiveCfg = Release|Any CPU
+               {73EA5188-1E4F-42D8-B63E-F1B878A4EB63}.RelWithDebInfo|ARM64.Build.0 = Release|Any CPU
+               {73EA5188-1E4F-42D8-B63E-F1B878A4EB63}.RelWithDebInfo|x64.ActiveCfg = Release|Any CPU
+               {73EA5188-1E4F-42D8-B63E-F1B878A4EB63}.RelWithDebInfo|x64.Build.0 = Release|Any CPU
+               {73EA5188-1E4F-42D8-B63E-F1B878A4EB63}.RelWithDebInfo|x86.ActiveCfg = Release|Any CPU
+               {73EA5188-1E4F-42D8-B63E-F1B878A4EB63}.RelWithDebInfo|x86.Build.0 = Release|Any CPU
+               {B50D14DB-8EE5-47BD-B412-62FA5C693CC7}.Checked|Any CPU.ActiveCfg = Debug|Any CPU
+               {B50D14DB-8EE5-47BD-B412-62FA5C693CC7}.Checked|Any CPU.Build.0 = Debug|Any CPU
+               {B50D14DB-8EE5-47BD-B412-62FA5C693CC7}.Checked|ARM.ActiveCfg = Debug|Any CPU
+               {B50D14DB-8EE5-47BD-B412-62FA5C693CC7}.Checked|ARM.Build.0 = Debug|Any CPU
+               {B50D14DB-8EE5-47BD-B412-62FA5C693CC7}.Checked|ARM64.ActiveCfg = Debug|Any CPU
+               {B50D14DB-8EE5-47BD-B412-62FA5C693CC7}.Checked|ARM64.Build.0 = Debug|Any CPU
+               {B50D14DB-8EE5-47BD-B412-62FA5C693CC7}.Checked|x64.ActiveCfg = Debug|Any CPU
+               {B50D14DB-8EE5-47BD-B412-62FA5C693CC7}.Checked|x64.Build.0 = Debug|Any CPU
+               {B50D14DB-8EE5-47BD-B412-62FA5C693CC7}.Checked|x86.ActiveCfg = Debug|Any CPU
+               {B50D14DB-8EE5-47BD-B412-62FA5C693CC7}.Checked|x86.Build.0 = Debug|Any CPU
+               {B50D14DB-8EE5-47BD-B412-62FA5C693CC7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+               {B50D14DB-8EE5-47BD-B412-62FA5C693CC7}.Debug|Any CPU.Build.0 = Debug|Any CPU
+               {B50D14DB-8EE5-47BD-B412-62FA5C693CC7}.Debug|ARM.ActiveCfg = Debug|Any CPU
+               {B50D14DB-8EE5-47BD-B412-62FA5C693CC7}.Debug|ARM.Build.0 = Debug|Any CPU
+               {B50D14DB-8EE5-47BD-B412-62FA5C693CC7}.Debug|ARM64.ActiveCfg = Debug|Any CPU
+               {B50D14DB-8EE5-47BD-B412-62FA5C693CC7}.Debug|ARM64.Build.0 = Debug|Any CPU
+               {B50D14DB-8EE5-47BD-B412-62FA5C693CC7}.Debug|x64.ActiveCfg = Debug|Any CPU
+               {B50D14DB-8EE5-47BD-B412-62FA5C693CC7}.Debug|x64.Build.0 = Debug|Any CPU
+               {B50D14DB-8EE5-47BD-B412-62FA5C693CC7}.Debug|x86.ActiveCfg = Debug|Any CPU
+               {B50D14DB-8EE5-47BD-B412-62FA5C693CC7}.Debug|x86.Build.0 = Debug|Any CPU
+               {B50D14DB-8EE5-47BD-B412-62FA5C693CC7}.Release|Any CPU.ActiveCfg = Release|Any CPU
+               {B50D14DB-8EE5-47BD-B412-62FA5C693CC7}.Release|Any CPU.Build.0 = Release|Any CPU
+               {B50D14DB-8EE5-47BD-B412-62FA5C693CC7}.Release|ARM.ActiveCfg = Release|Any CPU
+               {B50D14DB-8EE5-47BD-B412-62FA5C693CC7}.Release|ARM.Build.0 = Release|Any CPU
+               {B50D14DB-8EE5-47BD-B412-62FA5C693CC7}.Release|ARM64.ActiveCfg = Release|Any CPU
+               {B50D14DB-8EE5-47BD-B412-62FA5C693CC7}.Release|ARM64.Build.0 = Release|Any CPU
+               {B50D14DB-8EE5-47BD-B412-62FA5C693CC7}.Release|x64.ActiveCfg = Release|Any CPU
+               {B50D14DB-8EE5-47BD-B412-62FA5C693CC7}.Release|x64.Build.0 = Release|Any CPU
+               {B50D14DB-8EE5-47BD-B412-62FA5C693CC7}.Release|x86.ActiveCfg = Release|Any CPU
+               {B50D14DB-8EE5-47BD-B412-62FA5C693CC7}.Release|x86.Build.0 = Release|Any CPU
+               {B50D14DB-8EE5-47BD-B412-62FA5C693CC7}.RelWithDebInfo|Any CPU.ActiveCfg = Release|Any CPU
+               {B50D14DB-8EE5-47BD-B412-62FA5C693CC7}.RelWithDebInfo|Any CPU.Build.0 = Release|Any CPU
+               {B50D14DB-8EE5-47BD-B412-62FA5C693CC7}.RelWithDebInfo|ARM.ActiveCfg = Release|Any CPU
+               {B50D14DB-8EE5-47BD-B412-62FA5C693CC7}.RelWithDebInfo|ARM.Build.0 = Release|Any CPU
+               {B50D14DB-8EE5-47BD-B412-62FA5C693CC7}.RelWithDebInfo|ARM64.ActiveCfg = Release|Any CPU
+               {B50D14DB-8EE5-47BD-B412-62FA5C693CC7}.RelWithDebInfo|ARM64.Build.0 = Release|Any CPU
+               {B50D14DB-8EE5-47BD-B412-62FA5C693CC7}.RelWithDebInfo|x64.ActiveCfg = Release|Any CPU
+               {B50D14DB-8EE5-47BD-B412-62FA5C693CC7}.RelWithDebInfo|x64.Build.0 = Release|Any CPU
+               {B50D14DB-8EE5-47BD-B412-62FA5C693CC7}.RelWithDebInfo|x86.ActiveCfg = Release|Any CPU
+               {B50D14DB-8EE5-47BD-B412-62FA5C693CC7}.RelWithDebInfo|x86.Build.0 = Release|Any CPU
+               {112FE2A7-3FD2-4496-8A14-171898AD5CF5}.Checked|Any CPU.ActiveCfg = Debug|Any CPU
+               {112FE2A7-3FD2-4496-8A14-171898AD5CF5}.Checked|Any CPU.Build.0 = Debug|Any CPU
+               {112FE2A7-3FD2-4496-8A14-171898AD5CF5}.Checked|ARM.ActiveCfg = Debug|Any CPU
+               {112FE2A7-3FD2-4496-8A14-171898AD5CF5}.Checked|ARM.Build.0 = Debug|Any CPU
+               {112FE2A7-3FD2-4496-8A14-171898AD5CF5}.Checked|ARM64.ActiveCfg = Debug|Any CPU
+               {112FE2A7-3FD2-4496-8A14-171898AD5CF5}.Checked|ARM64.Build.0 = Debug|Any CPU
+               {112FE2A7-3FD2-4496-8A14-171898AD5CF5}.Checked|x64.ActiveCfg = Debug|Any CPU
+               {112FE2A7-3FD2-4496-8A14-171898AD5CF5}.Checked|x64.Build.0 = Debug|Any CPU
+               {112FE2A7-3FD2-4496-8A14-171898AD5CF5}.Checked|x86.ActiveCfg = Debug|Any CPU
+               {112FE2A7-3FD2-4496-8A14-171898AD5CF5}.Checked|x86.Build.0 = Debug|Any CPU
+               {112FE2A7-3FD2-4496-8A14-171898AD5CF5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+               {112FE2A7-3FD2-4496-8A14-171898AD5CF5}.Debug|Any CPU.Build.0 = Debug|Any CPU
+               {112FE2A7-3FD2-4496-8A14-171898AD5CF5}.Debug|ARM.ActiveCfg = Debug|Any CPU
+               {112FE2A7-3FD2-4496-8A14-171898AD5CF5}.Debug|ARM.Build.0 = Debug|Any CPU
+               {112FE2A7-3FD2-4496-8A14-171898AD5CF5}.Debug|ARM64.ActiveCfg = Debug|Any CPU
+               {112FE2A7-3FD2-4496-8A14-171898AD5CF5}.Debug|ARM64.Build.0 = Debug|Any CPU
+               {112FE2A7-3FD2-4496-8A14-171898AD5CF5}.Debug|x64.ActiveCfg = Debug|Any CPU
+               {112FE2A7-3FD2-4496-8A14-171898AD5CF5}.Debug|x64.Build.0 = Debug|Any CPU
+               {112FE2A7-3FD2-4496-8A14-171898AD5CF5}.Debug|x86.ActiveCfg = Debug|Any CPU
+               {112FE2A7-3FD2-4496-8A14-171898AD5CF5}.Debug|x86.Build.0 = Debug|Any CPU
+               {112FE2A7-3FD2-4496-8A14-171898AD5CF5}.Release|Any CPU.ActiveCfg = Release|Any CPU
+               {112FE2A7-3FD2-4496-8A14-171898AD5CF5}.Release|Any CPU.Build.0 = Release|Any CPU
+               {112FE2A7-3FD2-4496-8A14-171898AD5CF5}.Release|ARM.ActiveCfg = Release|Any CPU
+               {112FE2A7-3FD2-4496-8A14-171898AD5CF5}.Release|ARM.Build.0 = Release|Any CPU
+               {112FE2A7-3FD2-4496-8A14-171898AD5CF5}.Release|ARM64.ActiveCfg = Release|Any CPU
+               {112FE2A7-3FD2-4496-8A14-171898AD5CF5}.Release|ARM64.Build.0 = Release|Any CPU
+               {112FE2A7-3FD2-4496-8A14-171898AD5CF5}.Release|x64.ActiveCfg = Release|Any CPU
+               {112FE2A7-3FD2-4496-8A14-171898AD5CF5}.Release|x64.Build.0 = Release|Any CPU
+               {112FE2A7-3FD2-4496-8A14-171898AD5CF5}.Release|x86.ActiveCfg = Release|Any CPU
+               {112FE2A7-3FD2-4496-8A14-171898AD5CF5}.Release|x86.Build.0 = Release|Any CPU
+               {112FE2A7-3FD2-4496-8A14-171898AD5CF5}.RelWithDebInfo|Any CPU.ActiveCfg = Release|Any CPU
+               {112FE2A7-3FD2-4496-8A14-171898AD5CF5}.RelWithDebInfo|Any CPU.Build.0 = Release|Any CPU
+               {112FE2A7-3FD2-4496-8A14-171898AD5CF5}.RelWithDebInfo|ARM.ActiveCfg = Release|Any CPU
+               {112FE2A7-3FD2-4496-8A14-171898AD5CF5}.RelWithDebInfo|ARM.Build.0 = Release|Any CPU
+               {112FE2A7-3FD2-4496-8A14-171898AD5CF5}.RelWithDebInfo|ARM64.ActiveCfg = Release|Any CPU
+               {112FE2A7-3FD2-4496-8A14-171898AD5CF5}.RelWithDebInfo|ARM64.Build.0 = Release|Any CPU
+               {112FE2A7-3FD2-4496-8A14-171898AD5CF5}.RelWithDebInfo|x64.ActiveCfg = Release|Any CPU
+               {112FE2A7-3FD2-4496-8A14-171898AD5CF5}.RelWithDebInfo|x64.Build.0 = Release|Any CPU
+               {112FE2A7-3FD2-4496-8A14-171898AD5CF5}.RelWithDebInfo|x86.ActiveCfg = Release|Any CPU
+               {112FE2A7-3FD2-4496-8A14-171898AD5CF5}.RelWithDebInfo|x86.Build.0 = Release|Any CPU
+               {8C27904A-47C0-44C7-B191-88FF34580CBE}.Checked|Any CPU.ActiveCfg = Debug|Any CPU
+               {8C27904A-47C0-44C7-B191-88FF34580CBE}.Checked|Any CPU.Build.0 = Debug|Any CPU
+               {8C27904A-47C0-44C7-B191-88FF34580CBE}.Checked|ARM.ActiveCfg = Debug|Any CPU
+               {8C27904A-47C0-44C7-B191-88FF34580CBE}.Checked|ARM.Build.0 = Debug|Any CPU
+               {8C27904A-47C0-44C7-B191-88FF34580CBE}.Checked|ARM64.ActiveCfg = Debug|Any CPU
+               {8C27904A-47C0-44C7-B191-88FF34580CBE}.Checked|ARM64.Build.0 = Debug|Any CPU
+               {8C27904A-47C0-44C7-B191-88FF34580CBE}.Checked|x64.ActiveCfg = Debug|Any CPU
+               {8C27904A-47C0-44C7-B191-88FF34580CBE}.Checked|x64.Build.0 = Debug|Any CPU
+               {8C27904A-47C0-44C7-B191-88FF34580CBE}.Checked|x86.ActiveCfg = Debug|Any CPU
+               {8C27904A-47C0-44C7-B191-88FF34580CBE}.Checked|x86.Build.0 = Debug|Any CPU
+               {8C27904A-47C0-44C7-B191-88FF34580CBE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+               {8C27904A-47C0-44C7-B191-88FF34580CBE}.Debug|Any CPU.Build.0 = Debug|Any CPU
+               {8C27904A-47C0-44C7-B191-88FF34580CBE}.Debug|ARM.ActiveCfg = Debug|Any CPU
+               {8C27904A-47C0-44C7-B191-88FF34580CBE}.Debug|ARM.Build.0 = Debug|Any CPU
+               {8C27904A-47C0-44C7-B191-88FF34580CBE}.Debug|ARM64.ActiveCfg = Debug|Any CPU
+               {8C27904A-47C0-44C7-B191-88FF34580CBE}.Debug|ARM64.Build.0 = Debug|Any CPU
+               {8C27904A-47C0-44C7-B191-88FF34580CBE}.Debug|x64.ActiveCfg = Debug|Any CPU
+               {8C27904A-47C0-44C7-B191-88FF34580CBE}.Debug|x64.Build.0 = Debug|Any CPU
+               {8C27904A-47C0-44C7-B191-88FF34580CBE}.Debug|x86.ActiveCfg = Debug|Any CPU
+               {8C27904A-47C0-44C7-B191-88FF34580CBE}.Debug|x86.Build.0 = Debug|Any CPU
+               {8C27904A-47C0-44C7-B191-88FF34580CBE}.Release|Any CPU.ActiveCfg = Release|Any CPU
+               {8C27904A-47C0-44C7-B191-88FF34580CBE}.Release|Any CPU.Build.0 = Release|Any CPU
+               {8C27904A-47C0-44C7-B191-88FF34580CBE}.Release|ARM.ActiveCfg = Release|Any CPU
+               {8C27904A-47C0-44C7-B191-88FF34580CBE}.Release|ARM.Build.0 = Release|Any CPU
+               {8C27904A-47C0-44C7-B191-88FF34580CBE}.Release|ARM64.ActiveCfg = Release|Any CPU
+               {8C27904A-47C0-44C7-B191-88FF34580CBE}.Release|ARM64.Build.0 = Release|Any CPU
+               {8C27904A-47C0-44C7-B191-88FF34580CBE}.Release|x64.ActiveCfg = Release|Any CPU
+               {8C27904A-47C0-44C7-B191-88FF34580CBE}.Release|x64.Build.0 = Release|Any CPU
+               {8C27904A-47C0-44C7-B191-88FF34580CBE}.Release|x86.ActiveCfg = Release|Any CPU
+               {8C27904A-47C0-44C7-B191-88FF34580CBE}.Release|x86.Build.0 = Release|Any CPU
+               {8C27904A-47C0-44C7-B191-88FF34580CBE}.RelWithDebInfo|Any CPU.ActiveCfg = Release|Any CPU
+               {8C27904A-47C0-44C7-B191-88FF34580CBE}.RelWithDebInfo|Any CPU.Build.0 = Release|Any CPU
+               {8C27904A-47C0-44C7-B191-88FF34580CBE}.RelWithDebInfo|ARM.ActiveCfg = Release|Any CPU
+               {8C27904A-47C0-44C7-B191-88FF34580CBE}.RelWithDebInfo|ARM.Build.0 = Release|Any CPU
+               {8C27904A-47C0-44C7-B191-88FF34580CBE}.RelWithDebInfo|ARM64.ActiveCfg = Release|Any CPU
+               {8C27904A-47C0-44C7-B191-88FF34580CBE}.RelWithDebInfo|ARM64.Build.0 = Release|Any CPU
+               {8C27904A-47C0-44C7-B191-88FF34580CBE}.RelWithDebInfo|x64.ActiveCfg = Release|Any CPU
+               {8C27904A-47C0-44C7-B191-88FF34580CBE}.RelWithDebInfo|x64.Build.0 = Release|Any CPU
+               {8C27904A-47C0-44C7-B191-88FF34580CBE}.RelWithDebInfo|x86.ActiveCfg = Release|Any CPU
+               {8C27904A-47C0-44C7-B191-88FF34580CBE}.RelWithDebInfo|x86.Build.0 = Release|Any CPU
+       EndGlobalSection
+       GlobalSection(SolutionProperties) = preSolution
+               HideSolutionNode = FALSE
+       EndGlobalSection
+       GlobalSection(NestedProjects) = preSolution
+               {6C43BE85-F8C3-4D76-8050-F25CE953A7FD} = {C3072949-6D24-451B-A308-2F3621F858B0}
+               {41638A4C-0DAF-47ED-A774-ECBBAC0315D7} = {19FAB78C-3351-4911-8F0C-8C6056401740}
+               {C3072949-6D24-451B-A308-2F3621F858B0} = {41638A4C-0DAF-47ED-A774-ECBBAC0315D7}
+               {252E5845-8D4C-4306-9D8F-ED2E2F7005F6} = {C3072949-6D24-451B-A308-2F3621F858B0}
+               {E7FEA82E-0E16-4868-B122-4B0BC0014E7F} = {C3072949-6D24-451B-A308-2F3621F858B0}
+               {179EF543-E30A-4428-ABA0-2E2621860173} = {C3072949-6D24-451B-A308-2F3621F858B0}
+               {447AC053-2E0A-4119-BD11-30A4A8E3F765} = {C3072949-6D24-451B-A308-2F3621F858B0}
+               {664F46A9-3C99-489B-AAB9-4CD3A430C425} = {C3072949-6D24-451B-A308-2F3621F858B0}
+               {0CB805C8-0B76-4B1D-8AAF-48535B180448} = {C3072949-6D24-451B-A308-2F3621F858B0}
+               {20251748-AA7B-45BE-ADAA-C9375F5CC80F} = {C3072949-6D24-451B-A308-2F3621F858B0}
+               {DDDA69DF-2C4C-477A-B6C9-B4FE73C6E288} = {C3072949-6D24-451B-A308-2F3621F858B0}
+               {73EA5188-1E4F-42D8-B63E-F1B878A4EB63} = {C3072949-6D24-451B-A308-2F3621F858B0}
+               {B50D14DB-8EE5-47BD-B412-62FA5C693CC7} = {C3072949-6D24-451B-A308-2F3621F858B0}
+               {112FE2A7-3FD2-4496-8A14-171898AD5CF5} = {C3072949-6D24-451B-A308-2F3621F858B0}
+               {8C27904A-47C0-44C7-B191-88FF34580CBE} = {C3072949-6D24-451B-A308-2F3621F858B0}
+       EndGlobalSection
+       GlobalSection(ExtensibilityGlobals) = postSolution
+               SolutionGuid = {46465737-C938-44FC-BE1A-4CE139EBB5E0}
+       EndGlobalSection
+EndGlobal
index 71e216bd78c2d8fe3fa346e1a2768323f766ac78..de60049a94db401e578df11ac761c43c61503b98 100644 (file)
@@ -5,8 +5,6 @@ VisualStudioVersion = 16.0.29019.234
 MinimumVisualStudioVersion = 10.0.40219.1
 Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SOS.NETCore", "src\SOS\SOS.NETCore\SOS.NETCore.csproj", "{20513BA2-A156-4A17-4C70-5AC2DBD4F833}"
 EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "TestDebuggee", "src\SOS\lldbplugin.tests\TestDebuggee\TestDebuggee.csproj", "{6C43BE85-F8C3-4D76-8050-F25CE953A7FD}"
-EndProject
 Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Diagnostics.TestHelpers", "src\Microsoft.Diagnostics.TestHelpers\Microsoft.Diagnostics.TestHelpers.csproj", "{730C1201-1848-4F1E-8C1F-6316FB886C35}"
 EndProject
 Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "SOS", "SOS", "{41638A4C-0DAF-47ED-A774-ECBBAC0315D7}"
@@ -113,46 +111,6 @@ Global
                {20513BA2-A156-4A17-4C70-5AC2DBD4F833}.RelWithDebInfo|x64.Build.0 = Release|Any CPU
                {20513BA2-A156-4A17-4C70-5AC2DBD4F833}.RelWithDebInfo|x86.ActiveCfg = Release|Any CPU
                {20513BA2-A156-4A17-4C70-5AC2DBD4F833}.RelWithDebInfo|x86.Build.0 = Release|Any CPU
-               {6C43BE85-F8C3-4D76-8050-F25CE953A7FD}.Checked|Any CPU.ActiveCfg = Release|Any CPU
-               {6C43BE85-F8C3-4D76-8050-F25CE953A7FD}.Checked|Any CPU.Build.0 = Release|Any CPU
-               {6C43BE85-F8C3-4D76-8050-F25CE953A7FD}.Checked|ARM.ActiveCfg = Release|Any CPU
-               {6C43BE85-F8C3-4D76-8050-F25CE953A7FD}.Checked|ARM.Build.0 = Release|Any CPU
-               {6C43BE85-F8C3-4D76-8050-F25CE953A7FD}.Checked|ARM64.ActiveCfg = Release|Any CPU
-               {6C43BE85-F8C3-4D76-8050-F25CE953A7FD}.Checked|ARM64.Build.0 = Release|Any CPU
-               {6C43BE85-F8C3-4D76-8050-F25CE953A7FD}.Checked|x64.ActiveCfg = Release|Any CPU
-               {6C43BE85-F8C3-4D76-8050-F25CE953A7FD}.Checked|x64.Build.0 = Release|Any CPU
-               {6C43BE85-F8C3-4D76-8050-F25CE953A7FD}.Checked|x86.ActiveCfg = Release|Any CPU
-               {6C43BE85-F8C3-4D76-8050-F25CE953A7FD}.Checked|x86.Build.0 = Release|Any CPU
-               {6C43BE85-F8C3-4D76-8050-F25CE953A7FD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
-               {6C43BE85-F8C3-4D76-8050-F25CE953A7FD}.Debug|Any CPU.Build.0 = Debug|Any CPU
-               {6C43BE85-F8C3-4D76-8050-F25CE953A7FD}.Debug|ARM.ActiveCfg = Debug|Any CPU
-               {6C43BE85-F8C3-4D76-8050-F25CE953A7FD}.Debug|ARM.Build.0 = Debug|Any CPU
-               {6C43BE85-F8C3-4D76-8050-F25CE953A7FD}.Debug|ARM64.ActiveCfg = Debug|Any CPU
-               {6C43BE85-F8C3-4D76-8050-F25CE953A7FD}.Debug|ARM64.Build.0 = Debug|Any CPU
-               {6C43BE85-F8C3-4D76-8050-F25CE953A7FD}.Debug|x64.ActiveCfg = Debug|Any CPU
-               {6C43BE85-F8C3-4D76-8050-F25CE953A7FD}.Debug|x64.Build.0 = Debug|Any CPU
-               {6C43BE85-F8C3-4D76-8050-F25CE953A7FD}.Debug|x86.ActiveCfg = Debug|Any CPU
-               {6C43BE85-F8C3-4D76-8050-F25CE953A7FD}.Debug|x86.Build.0 = Debug|Any CPU
-               {6C43BE85-F8C3-4D76-8050-F25CE953A7FD}.Release|Any CPU.ActiveCfg = Release|Any CPU
-               {6C43BE85-F8C3-4D76-8050-F25CE953A7FD}.Release|Any CPU.Build.0 = Release|Any CPU
-               {6C43BE85-F8C3-4D76-8050-F25CE953A7FD}.Release|ARM.ActiveCfg = Release|Any CPU
-               {6C43BE85-F8C3-4D76-8050-F25CE953A7FD}.Release|ARM.Build.0 = Release|Any CPU
-               {6C43BE85-F8C3-4D76-8050-F25CE953A7FD}.Release|ARM64.ActiveCfg = Release|Any CPU
-               {6C43BE85-F8C3-4D76-8050-F25CE953A7FD}.Release|ARM64.Build.0 = Release|Any CPU
-               {6C43BE85-F8C3-4D76-8050-F25CE953A7FD}.Release|x64.ActiveCfg = Release|Any CPU
-               {6C43BE85-F8C3-4D76-8050-F25CE953A7FD}.Release|x64.Build.0 = Release|Any CPU
-               {6C43BE85-F8C3-4D76-8050-F25CE953A7FD}.Release|x86.ActiveCfg = Release|Any CPU
-               {6C43BE85-F8C3-4D76-8050-F25CE953A7FD}.Release|x86.Build.0 = Release|Any CPU
-               {6C43BE85-F8C3-4D76-8050-F25CE953A7FD}.RelWithDebInfo|Any CPU.ActiveCfg = Release|Any CPU
-               {6C43BE85-F8C3-4D76-8050-F25CE953A7FD}.RelWithDebInfo|Any CPU.Build.0 = Release|Any CPU
-               {6C43BE85-F8C3-4D76-8050-F25CE953A7FD}.RelWithDebInfo|ARM.ActiveCfg = Release|Any CPU
-               {6C43BE85-F8C3-4D76-8050-F25CE953A7FD}.RelWithDebInfo|ARM.Build.0 = Release|Any CPU
-               {6C43BE85-F8C3-4D76-8050-F25CE953A7FD}.RelWithDebInfo|ARM64.ActiveCfg = Release|Any CPU
-               {6C43BE85-F8C3-4D76-8050-F25CE953A7FD}.RelWithDebInfo|ARM64.Build.0 = Release|Any CPU
-               {6C43BE85-F8C3-4D76-8050-F25CE953A7FD}.RelWithDebInfo|x64.ActiveCfg = Release|Any CPU
-               {6C43BE85-F8C3-4D76-8050-F25CE953A7FD}.RelWithDebInfo|x64.Build.0 = Release|Any CPU
-               {6C43BE85-F8C3-4D76-8050-F25CE953A7FD}.RelWithDebInfo|x86.ActiveCfg = Release|Any CPU
-               {6C43BE85-F8C3-4D76-8050-F25CE953A7FD}.RelWithDebInfo|x86.Build.0 = Release|Any CPU
                {730C1201-1848-4F1E-8C1F-6316FB886C35}.Checked|Any CPU.ActiveCfg = Release|Any CPU
                {730C1201-1848-4F1E-8C1F-6316FB886C35}.Checked|Any CPU.Build.0 = Release|Any CPU
                {730C1201-1848-4F1E-8C1F-6316FB886C35}.Checked|ARM.ActiveCfg = Release|Any CPU
@@ -256,7 +214,6 @@ Global
                {D52C65C4-2C7D-45E6-9F5C-6F3A96796018}.Release|x64.ActiveCfg = Release|x64
                {D52C65C4-2C7D-45E6-9F5C-6F3A96796018}.Release|x64.Build.0 = Release|x64
                {D52C65C4-2C7D-45E6-9F5C-6F3A96796018}.Release|x86.ActiveCfg = Release|x86
-               {D52C65C4-2C7D-45E6-9F5C-6F3A96796018}.Release|x86.Build.0 = Release|x86
                {D52C65C4-2C7D-45E6-9F5C-6F3A96796018}.RelWithDebInfo|Any CPU.ActiveCfg = Release|x64
                {D52C65C4-2C7D-45E6-9F5C-6F3A96796018}.RelWithDebInfo|Any CPU.Build.0 = Release|x64
                {D52C65C4-2C7D-45E6-9F5C-6F3A96796018}.RelWithDebInfo|ARM.ActiveCfg = Release|x64
@@ -809,7 +766,6 @@ Global
        EndGlobalSection
        GlobalSection(NestedProjects) = preSolution
                {20513BA2-A156-4A17-4C70-5AC2DBD4F833} = {41638A4C-0DAF-47ED-A774-ECBBAC0315D7}
-               {6C43BE85-F8C3-4D76-8050-F25CE953A7FD} = {41638A4C-0DAF-47ED-A774-ECBBAC0315D7}
                {730C1201-1848-4F1E-8C1F-6316FB886C35} = {19FAB78C-3351-4911-8F0C-8C6056401740}
                {41638A4C-0DAF-47ED-A774-ECBBAC0315D7} = {19FAB78C-3351-4911-8F0C-8C6056401740}
                {1532DB3C-7DCD-45C6-B697-62B8378A16A2} = {41638A4C-0DAF-47ED-A774-ECBBAC0315D7}
index 957cb566936435be6f0787926d1cb36bc3f74628..52f620f1d400d57df9f653e284783d7d223a8214 100644 (file)
@@ -93,7 +93,7 @@ if /i "%1" == "-restore"             (set processedArgs=!processedArgs! %1&shift
 if /i "%1" == "-pack"                (set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
 if /i "%1" == "-publish"             (set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
 if /i "%1" == "-preparemachine"      (set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
-if /i "%1" == "-projects"            (set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
+if /i "%1" == "-projects"            (set processedArgs=!processedArgs! %1 %2&shift&shift&goto Arg_Loop)
 
 if [!processedArgs!] == [] (
   set __UnprocessedBuildArgs=%__args%
index ea9b450717a4c2e7368b2da0c172ef445c19f3ed..5035a8ef7d54fb06d5ef39d74d39c495b7da2463 100755 (executable)
@@ -175,7 +175,7 @@ while :; do
             __TestArgs="$__TestArgs $1"
             ;;
 
-        --solution)
+        --projects)
             __TestArgs="$__TestArgs $1 $2"
             shift
             ;;
@@ -245,7 +245,7 @@ while :; do
             ;;
 
         # Ignored for a native build
-        --build|--rebuild|--sign|--restore|--pack|--publish|--preparemachine|--projects|--solution)
+        --build|--rebuild|--sign|--restore|--pack|--publish|--preparemachine)
             ;;
 
         *)
@@ -282,7 +282,6 @@ __ResultsDir=$__RootBinDir/TestResults/$__BuildType
 __PackagesBinDir=$__RootBinDir/packages/$__BuildType/Shipping
 __ExtraCmakeArgs="$__ExtraCmakeArgs -DCLR_MANAGED_BINARY_DIR=$__RootBinDir/bin -DCLR_BUILD_TYPE=$__BuildType"
 __DotNetCli=$__ProjectRoot/.dotnet/dotnet
-__DotNetRuntimeVersion=2.1.11
 
 if [ ! -e $__DotNetCli ]; then
    echo "dotnet cli not installed $__DotNetCli"
@@ -379,6 +378,7 @@ initTargetDistroRid()
 # Init the target distro name
 initTargetDistroRid
 
+
 echo "RID: $__DistroRid"
 
 if [ "$__HostOS" == "OSX" ]; then
@@ -449,7 +449,7 @@ if [ $__Test == true ]; then
    if [ $__CrossBuild != true ]; then
 
       # Install the other versions of .NET Core runtime we are going to test on
-      "$__ProjectRoot/eng/install-test-runtimes.sh" --dotnet-directory "$__ProjectRoot/.dotnet" --runtime-version-21 "$__DotNetRuntimeVersion" --temp-directory "$__IntermediatesDir" --architecture "$__BuildArch" $__DailyTest
+      "$__ProjectRoot/eng/install-test-runtimes.sh" --dotnet-directory "$__ProjectRoot/.dotnet" --temp-directory "$__IntermediatesDir" --architecture "$__BuildArch" $__DailyTest
 
       if [ "$LLDB_PATH" == "" ]; then
           export LLDB_PATH="$(which lldb-3.9.1 2> /dev/null)"
@@ -478,21 +478,6 @@ if [ $__Test == true ]; then
       if [ $? != 0 ]; then
           exit 1
       fi
-
-      # Skip Alpine because lldb doesn't work
-      if [ $__Alpine == false ]; then
-          if [ "$__BuildOS" == "OSX" ]; then
-              __Plugin=$__CMakeBinDir/libsosplugin.dylib
-          else
-              __Plugin=$__CMakeBinDir/libsosplugin.so
-          fi
-
-          # Run lldb python tests
-          "$__ProjectRoot/src/SOS/lldbplugin.tests/testsos.sh" "$__ProjectRoot" "$__Plugin" "$__DotNetRuntimeVersion" "$__RootBinDir/bin/TestDebuggee/$__BuildType/netcoreapp2.0/TestDebuggee.dll" "$__ResultsDir"
-          if [ $? != 0 ]; then
-              exit 1
-          fi
-      fi
    fi
 fi
 
index 42c03e97ff16df80eda8632d3c65f5f2061e2219..0428f6084d6736b7385ffa278a7bf7459d2b9884 100644 (file)
-# build.yml
-# Description: Defines the build phase
-# Parameters:
-#   agentOs: [Windows_NT (default), Linux, OSX] Used in templates to define variables which are OS specific
-#   dockerImage: If defined, specifies docker image to run build steps in
-#   matrix: build matrix
-#   enableTelemetry: send telemetry if build is not a PR or CI build
-#   queue YAML object - https://github.com/Microsoft/vsts-agent/blob/master/docs/preview/yamlgettingstarted-schema.md#queue
-#   variables YAML object - https://github.com/Microsoft/vsts-agent/blob/master/docs/preview/yamlgettingstarted-schema.md#phase
-
 parameters:
+  # Job name
   name: ''
-  agentOs: Windows_NT
+
+  # Agent OS (Windows_NT, Linux, MacOS, FreeBSD)
+  osGroup: Windows_NT
+
+  # Additional variables
+  variables: {}
+
+  # Build strategy - matrix
+  strategy: ''
+
+  # Optional: Job timeout
+  timeoutInMinutes: 180
+
+  # Optional: Docker image to use
   dockerImage: ''
+
+  # Optional: ROOTFS_DIR to use
   crossrootfsDir: ''
+
+  # Optional: test only job if true
   testOnly: false
-  dependsOn: ''
-  # send telemetry
-  enableTelemetry: true
-  # install Microbuild plugin if not a public build
-  enableMicrobuild: true
-  # queue YAML object - https://github.com/Microsoft/vsts-agent/blob/master/docs/preview/yamlgettingstarted-schema.md#queue
-  queue: {}
-  # variables YAML object - https://github.com/Microsoft/vsts-agent/blob/master/docs/preview/yamlgettingstarted-schema.md#phase
-  variables: {}
 
-# Common conditionals:  There are a number of common conditionals that are useful.  Generally these are used to decide what resources can be accessed,
-#                       or what logic should be applied based on the context the build is being run in.
-#   - eq/ne(variables['Agent.Os'], 'Windows_NT') - Running/not running on a windows machine
-#   - eq/ne(variables['System.TeamProject'], 'public') - Running/not running on the dotnet public VSTS project 
-#   - and(ne(variables['System.TeamProject'], 'public'), notin(variables['Build.Reason'], 'PullRequest') - Not running in public and not a pull request.
-#   - or(eq(variables['System.TeamProject'], 'public'), in(variables['Build.Reason'], 'PullRequest') - Running in public or a pull request.
+  # Depends on 
+  dependsOn: ''
 
-phases:
-- template: /eng/common/templates/phases/base.yml
+jobs:
+- template: /eng/common/templates/job/job.yml
   parameters:
-    enableTelemetry: ${{ parameters.enableTelemetry }}
-    enableMicrobuild: ${{ parameters.enableMicrobuild }}
     name: ${{ parameters.name }}
-    agentOs: ${{ parameters.agentOs }}
-    dependsOn: ${{ parameters.dependsOn }}
-    queue: ${{ parameters.queue }}
+    timeoutInMinutes: ${{ parameters.timeoutInMinutes }}
+    enableMicrobuild: true
+    enableTelemetry: true
+    helixRepo: dotnet/sdk
+
+    pool:
+      # Public Linux Build Pool
+      ${{ if and(eq(parameters.osGroup, 'Linux'), eq(variables['System.TeamProject'], 'public')) }}:
+        name:  NetCorePublic-Pool
+        queue: BuildPool.Ubuntu.1604.Amd64.Open
+
+      # Official Build Linux Pool
+      ${{ if and(eq(parameters.osGroup, 'Linux'), ne(variables['System.TeamProject'], 'public')) }}:
+        name: NetCoreInternal-Pool
+        queue: BuildPool.Ubuntu.1604.Amd64
+
+      # FreeBSD builds only in the internal project
+      ${{ if and(eq(parameters.osGroup, 'FreeBSD'), ne(variables['System.TeamProject'], 'public')) }}:
+        name: dnceng-freebsd-internal
+
+      # Public OSX Build Pool
+      ${{ if and(eq(parameters.osGroup, 'MacOS'), ne(variables['System.TeamProject'], 'public')) }}:
+        name: Hosted Mac Internal
+
+      # Official Build OSX Pool
+      ${{ if and(eq(parameters.osGroup, 'MacOS'), eq(variables['System.TeamProject'], 'public')) }}:
+        name: Hosted MacOS
+
+      # Official Build Windows Pool
+      ${{ if and(eq(parameters.osGroup, 'Windows_NT'), ne(variables['System.TeamProject'], 'public')) }}:
+        name: NetCoreInternal-Pool
+        queue: BuildPool.Windows.10.Amd64.VS2017
+
+      # Public Windows Build Pool
+      ${{ if and(eq(parameters.osGroup, 'Windows_NT'), eq(variables['System.TeamProject'], 'public')) }}:
+        name: NetCorePublic-Pool
+        queue: BuildPool.Windows.10.Amd64.VS2017.Open
+
+    ${{ if ne(parameters.strategy, '') }}:
+      strategy: ${{ parameters.strategy }}
+
+    ${{ if ne(parameters.dependsOn, '') }}:
+      dependsOn: ${{ parameters.dependsOn }}
+
+    workspace:
+      clean: all
 
     variables: 
-      ${{ insert }}: ${{ parameters.variables }}
-      _PortableLinuxBuild: CentOS_7_$(_BuildArch)_$(_BuildConfig)
-      _DockerImageName: ${{ parameters.dockerImage }}
-      _PhaseName : ${{ parameters.name }}
-      _HelixType: build/product
-      _HelixBuildConfig: $(_BuildConfig)
-
-      # Only enable publishing in non-public, non PR scenarios.
-      ${{ if and(ne(variables['System.TeamProject'], 'public'), notin(variables['Build.Reason'], 'PullRequest')) }}:
-        _HelixSource: official/dotnet/arcade/$(Build.SourceBranch)
-      ${{ if or(eq(variables['System.TeamProject'], 'public'), in(variables['Build.Reason'], 'PullRequest')) }}:
-        _HelixSource: pr/dotnet/arcade/$(Build.SourceBranch)
-
-      ${{ if eq(parameters.testOnly, 'true') }}:
-        _LinuxScript: $(Build.SourcesDirectory)/eng/citest.sh
-      ${{ if ne(parameters.testOnly, 'true') }}:
-        _LinuxScript: $(Build.SourcesDirectory)/eng/cibuild.sh
-
-      ${{ if eq(variables['Build.Reason'], 'Schedule') }}:
-        ${{ if eq(parameters.agentOs, 'Windows_NT') }}:
-          _DailyTest: -daily-test
-        ${{ if ne(parameters.agentOs, 'Windows_NT') }}:
-          _DailyTest: --daily-test
-      ${{ if ne(variables['Build.Reason'], 'Schedule') }}:
-        _DailyTest: ''
-
-      ${{ if eq(parameters.crossrootfsDir, '') }}:
-        _RootFs: ''
-      # This is only required for cross builds.
-      ${{ if ne(parameters.crossrootfsDir, '') }}:
-        _RootFs: --rootfs ${{ parameters.crossrootfsDir }}
+    - ${{ insert }}: ${{ parameters.variables }}
+    - _PortableLinuxBuild: CentOS_7_$(_BuildArch)_$(_BuildConfig)
+    - _DockerImageName: ${{ parameters.dockerImage }}
+    - _PhaseName : ${{ parameters.name }}
+    - _HelixType: build/product
+    - _HelixBuildConfig: $(_BuildConfig)
+
+    # Only enable publishing in non-public, non PR scenarios.
+    - ${{ if and(ne(variables['System.TeamProject'], 'public'), notin(variables['Build.Reason'], 'PullRequest')) }}:
+      - _HelixSource: official/dotnet/arcade/$(Build.SourceBranch)
+    - ${{ if or(eq(variables['System.TeamProject'], 'public'), in(variables['Build.Reason'], 'PullRequest')) }}:
+      - _HelixSource: pr/dotnet/arcade/$(Build.SourceBranch)
+
+    - ${{ if eq(parameters.testOnly, 'true') }}:
+      - _LinuxScript: $(Build.SourcesDirectory)/eng/citest.sh
+    - ${{ if ne(parameters.testOnly, 'true') }}:
+      - _LinuxScript: $(Build.SourcesDirectory)/eng/cibuild.sh
+
+    - ${{ if eq(variables['Build.Reason'], 'Schedule') }}:
+      - ${{ if eq(parameters.osGroup, 'Windows_NT') }}:
+        - _DailyTest: -daily-test
+      - ${{ if ne(parameters.osGroup, 'Windows_NT') }}:
+        - _DailyTest: --daily-test
+    - ${{ if ne(variables['Build.Reason'], 'Schedule') }}:
+      - _DailyTest: ''
+
+    # This is only required for cross builds.
+    - ${{ if eq(parameters.crossrootfsDir, '') }}:
+      - _RootFs: ''
+    - ${{ if ne(parameters.crossrootfsDir, '') }}:
+      - _RootFs: --rootfs ${{ parameters.crossrootfsDir }}
 
     steps:
-    - template: /eng/common/templates/steps/run-on-windows.yml
-      parameters:
-        agentOs: ${{ parameters.agentOs }} 
-        steps:
-        - script: $(Build.SourcesDirectory)\eng\cibuild.cmd $(_DailyTest)
-            -configuration $(_BuildConfig) 
-            -architecture $(_BuildArch)
-            -prepareMachine 
-            /p:OfficialBuildId=$(BUILD.BUILDNUMBER)
-          displayName: Build / Test
-          condition: succeeded()
+    - ${{ if eq(parameters.osGroup, 'Windows_NT') }}:
+      - script: $(Build.SourcesDirectory)\eng\cibuild.cmd $(_DailyTest)
+          -configuration $(_BuildConfig) 
+          -architecture $(_BuildArch)
+          -prepareMachine 
+          /p:OfficialBuildId=$(BUILD.BUILDNUMBER)
+        displayName: Build / Test
+        condition: succeeded()
 
-    - ${{ if eq(parameters.agentOs, 'Linux') }}:
+    - ${{ if eq(parameters.osGroup, 'Linux') }}:
       - ${{ if eq(parameters.testOnly, 'true') }}:
         - task: DownloadBuildArtifacts@0
           displayName: Download Linux-x64 Artifacts
@@ -116,7 +149,7 @@ phases:
         displayName: Docker Build / Test
         condition: succeeded()
 
-    - ${{ if eq(parameters.agentOs, 'Darwin') }}:
+    - ${{ if eq(parameters.osGroup, 'MacOS') }}:
       - script: $(Build.SourcesDirectory)/eng/cibuild.sh $(_DailyTest)
           --configuration $(_BuildConfig) 
           --architecture $(_BuildArch)
@@ -126,14 +159,32 @@ phases:
         condition: succeeded()
  
     - task: PublishBuildArtifacts@1
-      displayName: Upload Artifacts
+      displayName: Publish Build Artifacts
       inputs:
         pathtoPublish: '$(Build.SourcesDirectory)/artifacts/$(_PublishArtifacts)'
         artifactName: $(_PhaseName)_$(_BuildArch)_$(_BuildConfig)
       condition: ne(variables['_PublishArtifacts'], '')
 
+    - task: PublishBuildArtifacts@1
+      displayName: Publish Artifacts on failure
+      inputs:
+        PathtoPublish: '$(Build.SourcesDirectory)/artifacts/bin'
+        PublishLocation: Container
+        ArtifactName: Artifacts_$(_PhaseName)_$(_BuildArch)_$(_BuildConfig)
+      continueOnError: true
+      condition: failed()
+
+    - task: PublishBuildArtifacts@1
+      displayName: Publish Dump Artifacts on failure
+      inputs:
+        PathtoPublish: '$(Build.SourcesDirectory)/artifacts/tmp/$(_BuildConfig)/dumps'
+        PublishLocation: Container
+        ArtifactName: Dumps_$(_PhaseName)_$(_BuildArch)_$(_BuildConfig)
+      continueOnError: true
+      condition: failed()
+
     - task: CopyFiles@2
-      displayName: Gather Build Logs
+      displayName: Gather Logs
       inputs:
         sourceFolder: '$(Build.SourcesDirectory)/artifacts'
         contents: '?(log|TestResults)/**'
@@ -142,7 +193,7 @@ phases:
       condition: always()
 
     - task: PublishBuildArtifacts@1
-      displayName: Publish Logs to VSTS
+      displayName: Publish Logs
       inputs:
         PathtoPublish: '$(Build.StagingDirectory)/BuildLogs'
         PublishLocation: Container
index ed0181564074f8d9876acd73185e59e3d2ce7192..0b0a617b6187ecc08f7c702be404416301ad8846 100644 (file)
@@ -12,23 +12,28 @@ Set-StrictMode -Version Latest
 $ErrorActionPreference="Stop"
 
 $RuntimeVersion11="1.1.13"
-$RuntimeVersion21="2.1.11"
-$RuntimeVersion22="2.2.5"
+$RuntimeVersion21="2.1.12"
+$RuntimeVersion22="2.2.6"
+$RuntimeVersion30="3.0.0"
+$AspNetCoreVersion30="3.0.0"
 $DailyTestText="true"
 
 # Always install 2.1 for the daily test (scheduled builds) scenario because xunit needs it
 . $DotNetDir\dotnet-install.ps1 -Version $RuntimeVersion21 -Architecture $BuildArch -SkipNonVersionedFiles -Runtime dotnet -InstallDir $DotNetDir
+. $DotNetDir\dotnet-install.ps1 -Version $RuntimeVersion21 -Architecture $BuildArch -SkipNonVersionedFiles -Runtime aspnetcore -InstallDir $DotNetDir
 
-# Install the other versions of .NET Core runtime we are going to test. 1.1.x, 2.1.x, 2.2.x
+# Install the other versions of .NET Core runtime we are going to test. 1.1.x, 2.1.x, 2.2.x, 3.0.x
 # and latest. Only install the latest master for daily jobs and leave the RuntimeVersion* 
 # config properties blank.
 if (!$DailyTest) {
     $DailyTestText="false"
     . $DotNetDir\dotnet-install.ps1 -Version $RuntimeVersion11 -Architecture $BuildArch -SkipNonVersionedFiles -Runtime dotnet -InstallDir $DotNetDir
     . $DotNetDir\dotnet-install.ps1 -Version $RuntimeVersion22 -Architecture $BuildArch -SkipNonVersionedFiles -Runtime dotnet -InstallDir $DotNetDir
+    . $DotNetDir\dotnet-install.ps1 -Version $RuntimeVersion22 -Architecture $BuildArch -SkipNonVersionedFiles -Runtime aspnetcore -InstallDir $DotNetDir
 }
 
 . $DotNetDir\dotnet-install.ps1 -Channel $Branch -Version latest -Architecture $BuildArch -SkipNonVersionedFiles -Runtime dotnet -InstallDir $DotNetDir
+. $DotNetDir\dotnet-install.ps1 -Channel $Branch -Version latest -Architecture $BuildArch -SkipNonVersionedFiles -Runtime aspnetcore -InstallDir $DotNetDir
 
 # Now download the latest runtime version and create a config file containing it
 $VersionFileUrl = "$UncachedFeed/Runtime/$Branch/latest.version"
@@ -42,13 +47,15 @@ if (Test-Path $VersionFile) {
     $Data = @($VersionText.Split([char[]]@(), [StringSplitOptions]::RemoveEmptyEntries));
     $RuntimeVersionLatest = $Data[1].Trim()
 
-    Write-Host "Latest version: $RuntimeVersionLatest"
+    Write-Host "Latest $Branch version: $RuntimeVersionLatest"
 
     '<Configuration>
 <DailyTest>' + $DailyTestText  +'</DailyTest>
 <RuntimeVersion11>' + $RuntimeVersion11 + '</RuntimeVersion11>
 <RuntimeVersion21>' + $RuntimeVersion21 + '</RuntimeVersion21>
 <RuntimeVersion22>' + $RuntimeVersion22 + '</RuntimeVersion22>
+<RuntimeVersion30>' + $RuntimeVersion30 + '</RuntimeVersion30>
+<AspNetCoreVersion30>' + $AspNetCoreVersion30 + '</AspNetCoreVersion30>
 <RuntimeVersionLatest>' + $RuntimeVersionLatest + '</RuntimeVersionLatest>
 </Configuration>' | Set-Content $ConfigFile
 
index 9096c01887331f36225ff29384582edbc3fc07f0..20fb19a170ea2be0b210196e0946f715380743c7 100755 (executable)
@@ -10,8 +10,10 @@ branch="master"
 uncached_feed="https://dotnetcli.blob.core.windows.net/dotnet"
 
 runtime_version_11="1.1.13"
-runtime_version_21=
-runtime_version_22="2.2.5"
+runtime_version_21="2.1.12"
+runtime_version_22="2.2.6"
+runtime_version_30="3.0.0"
+aspnetcore_version_30="3.0.0"
 
 while [ $# -ne 0 ]; do
     name=$1
@@ -20,10 +22,6 @@ while [ $# -ne 0 ]; do
             shift
             dotnet_dir=$1
             ;;
-        --runtime-version-21)
-            shift
-            runtime_version_21=$1
-            ;;
         --temp-directory)
             shift
             temp_dir=$1
@@ -51,7 +49,7 @@ daily_test_text="true"
 # Always install 2.1 for the daily test (scheduled builds) scenario because xunit needs it
 bash "$dotnet_dir/dotnet-install.sh" --version "$runtime_version_21" --architecture "$build_arch" --skip-non-versioned-files --runtime dotnet --install-dir "$dotnet_dir"
 
-# Install the other versions of .NET Core runtime we are going to test. 1.1.x, 2.1.x, 2.2.x
+# Install the other versions of .NET Core runtime we are going to test. 1.1.x, 2.1.x, 2.2.x, 3.0.x
 # and latest. Only install the latest master for daily jobs and leave the RuntimeVersion* 
 # config properties blank.
 if [ $daily_test == 0 ]; then
@@ -61,6 +59,7 @@ if [ $daily_test == 0 ]; then
 fi
 
 bash "$dotnet_dir/dotnet-install.sh" --channel $branch --version latest --architecture "$build_arch" --skip-non-versioned-files --runtime dotnet --install-dir "$dotnet_dir"
+bash "$dotnet_dir/dotnet-install.sh" --channel $branch --version latest --architecture "$build_arch" --skip-non-versioned-files --runtime aspnetcore --install-dir "$dotnet_dir"
 
 # Now download the latest runtime version and create a config file containing it
 version_file_url="$uncached_feed/Runtime/$branch/latest.version"
@@ -75,15 +74,17 @@ else
 fi
 
 if [ -f "$version_file" ]; then
-    runtime_version_latest=$(cat $version_file | tail -n 1 | sed 's/\r$//')
+    runtime_version_latest=$(cat $version_file | tail -n 1 | tr -d "\r")
 
-    echo "Latest version: $runtime_version_latest"
+    echo "Latest $branch version: '$runtime_version_latest'"
 
     echo "<Configuration>
 <DailyTest>$daily_test_text</DailyTest>
 <RuntimeVersion11>$runtime_version_11</RuntimeVersion11>
 <RuntimeVersion21>$runtime_version_21</RuntimeVersion21>
 <RuntimeVersion22>$runtime_version_22</RuntimeVersion22>
+<RuntimeVersion30>$runtime_version_30</RuntimeVersion30>
+<AspNetCoreVersion30>$aspnetcore_version_30</AspNetCoreVersion30>
 <RuntimeVersionLatest>$runtime_version_latest</RuntimeVersionLatest>
 </Configuration>" > $config_file
 
index 5e472401504afd53532153e8a4d41b2054fd33d3..add2e1c50960a405287988641169a6a043bf7351 100644 (file)
@@ -1,9 +1,9 @@
 {
   "sdk": {
-    "version": "3.0.100-preview6-012264"
+    "version": "3.0.100"
   },
   "tools": {
-    "dotnet": "3.0.100-preview6-012264"
+    "dotnet": "3.0.100"
   },
   "msbuild-sdks": {
     "Microsoft.DotNet.Arcade.Sdk": "1.0.0-beta.19309.1"
index 843f8b0084f6ca3987b2a0406819ea8cdfaffcaf..63e5b1ff8db3e85daddfd185086c98c90e7c9cd7 100644 (file)
     <CheckForOverflowUnderflow>false</CheckForOverflowUnderflow>
   </PropertyGroup>
 
-  <PropertyGroup Condition="'$(TargetFramework)' == 'net461'">
+  <PropertyGroup Condition="'$(TargetFramework)' == 'net462'">
     <DebugType>full</DebugType>
   </PropertyGroup>
 
-  <PropertyGroup Condition="'$(TargetFramework)' != 'net461'">
+  <PropertyGroup Condition="'$(TargetFramework)' != 'net462'">
     <DebugType>portable</DebugType>
   </PropertyGroup>
 </Project>
index c5399a1fa0e2f612a9f142b6df6133d782f4b75a..2083ec063c12035164414ffbf7027cd76e1413fb 100644 (file)
@@ -81,6 +81,12 @@ namespace Microsoft.Diagnostics.Repl
             m_interactiveConsole = !Console.IsInputRedirected;
             RefreshLine();
 
+            // The special prompts for the test runner are built into this
+            // console provider when the output has been redirected.
+            if (!m_interactiveConsole) {
+                WriteLine(OutputType.Normal, "<END_COMMAND_OUTPUT>");
+            }
+
             // Start keyboard processing
             while (!m_shutdown) {
                 if (m_interactiveConsole)
@@ -91,12 +97,20 @@ namespace Microsoft.Diagnostics.Repl
                 else
                 {
                     // The input has been redirected (i.e. testing or in script)
-                    WriteLine(OutputType.Normal, "<END_COMMAND_OUTPUT>");
                     string line = Console.ReadLine();
                     if (string.IsNullOrEmpty(line)) {
                         continue;
                     }
-                    await Dispatch(line, dispatchCommand);
+                    bool result = await Dispatch(line, dispatchCommand);
+                    if (!m_shutdown)
+                    {
+                        if (result) {
+                            WriteLine(OutputType.Normal, "<END_COMMAND_OUTPUT>");
+                        }
+                        else {
+                            WriteLine(OutputType.Normal, "<END_COMMAND_ERROR>");
+                        }
+                    }
                 }
             }
         }
@@ -410,8 +424,9 @@ namespace Microsoft.Diagnostics.Repl
             }
         }
 
-        private async Task Dispatch(string newCommand, Func<string, CancellationToken, Task> dispatchCommand)
+        private async Task<bool> Dispatch(string newCommand, Func<string, CancellationToken, Task> dispatchCommand)
         {
+            bool result = true;
             CommandStarting();
             m_interruptExecutingCommand = new CancellationTokenSource();
             try
@@ -435,6 +450,7 @@ namespace Microsoft.Diagnostics.Repl
                 {
                     WriteLine(OutputType.Error, "ERROR: {0}", ex.Message);
                     m_lastCommandLine = null;
+                    result = false;
                 }
             }
             finally
@@ -442,6 +458,7 @@ namespace Microsoft.Diagnostics.Repl
                 m_interruptExecutingCommand = null;
                 CommandFinished();
             }
+            return result;
         }
 
         private void AppendNewText(string text)
index 79d4ce3d9df413820efdc3141a72f61c7d717b1c..0ab6285dd1108241385959f0babe83a1b5b112d5 100644 (file)
@@ -122,6 +122,10 @@ namespace Microsoft.Diagnostics.TestHelpers
 
         protected static string GetDebuggeeNativeLibDirPath(TestConfiguration config, string debuggeeName)
         {
+            if (config.DebuggeeNativeLibRoot == null)
+            {
+                return null;
+            }
             return Path.Combine(config.DebuggeeNativeLibRoot, debuggeeName);
         }
 
index 9dd2fced58e346db06dc93663cda3f252ecb2a7b..7609fe1f9aa116458cee0758df259bad1dd7b9e1 100644 (file)
@@ -16,20 +16,24 @@ namespace Microsoft.Diagnostics.TestHelpers
     {
         async public static Task<DebuggeeConfiguration> Execute(TestConfiguration config, string debuggeeName, ITestOutputHelper output)
         {
-            IDebuggeeCompiler compiler = null;
-            if (config.DebuggeeBuildProcess == "prebuilt")
+            IDebuggeeCompiler compiler;
+            switch (config.DebuggeeBuildProcess)
             {
-                compiler = new PrebuiltDebuggeeCompiler(config, debuggeeName);
+                case "prebuilt":
+                    // Backwards compatibility for the diagnostics test repo
+                    compiler = new PrebuiltDebuggeeCompiler(config, debuggeeName);
+                    break;
+                case "sdk.prebuilt":
+                    // The .NET Core SDK layout
+                    compiler = new SdkPrebuiltDebuggeeCompiler(config, debuggeeName);
+                    break;
+                case "cli":
+                    // Builds the debuggee with the .NET Core CLI
+                    compiler = new CliDebuggeeCompiler(config, debuggeeName);
+                    break;
+                default:
+                    throw new Exception("Invalid DebuggeeBuildProcess configuration value. Expected 'prebuilt', actual \'" + config.DebuggeeBuildProcess + "\'");
             }
-            else if (config.DebuggeeBuildProcess == "cli")
-            {
-                compiler = new CliDebuggeeCompiler(config, debuggeeName);
-            }
-            else
-            {
-                throw new Exception("Invalid DebuggeeBuildProcess configuration value. Expected 'prebuilt', actual \'" + config.DebuggeeBuildProcess + "\'");
-            }
-
             return await compiler.Execute(output);
         }
     }
diff --git a/src/Microsoft.Diagnostics.TestHelpers/SdkPrebuiltDebuggeeCompiler.cs b/src/Microsoft.Diagnostics.TestHelpers/SdkPrebuiltDebuggeeCompiler.cs
new file mode 100644 (file)
index 0000000..53fd418
--- /dev/null
@@ -0,0 +1,37 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+using System.IO;
+using System.Threading.Tasks;
+using Xunit.Abstractions;
+
+namespace Microsoft.Diagnostics.TestHelpers
+{
+    public class SdkPrebuiltDebuggeeCompiler : IDebuggeeCompiler
+    {
+        readonly string _sourcePath;
+        readonly string _binaryPath;
+        readonly string _binaryExePath;
+
+        public SdkPrebuiltDebuggeeCompiler(TestConfiguration config, string debuggeeName)
+        {
+            // The layout is how the current .NET Core SDK layouts the binaries out:
+            // Source Path:     <DebuggeeSourceRoot>/<DebuggeeName>/[<DebuggeeName>]
+            // Binary Path:     <DebuggeeBuildRoot>/bin/<DebuggeeName>/<TargetConfiguration>/<BuildProjectFramework>
+            // Binary Exe Path: <DebuggeeBuildRoot>/bin/<DebuggeeName>/<TargetConfiguration>/<BuildProjectFramework>/<DebuggeeName>.dll
+            _sourcePath = Path.Combine(config.DebuggeeSourceRoot, debuggeeName);
+            if (Directory.Exists(Path.Combine(_sourcePath, debuggeeName)))
+            {
+                _sourcePath = Path.Combine(_sourcePath, debuggeeName);
+            }
+            _binaryPath = Path.Combine(config.DebuggeeBuildRoot, "bin", debuggeeName, config.TargetConfiguration, config.BuildProjectFramework);
+            _binaryExePath = Path.Combine(_binaryPath, debuggeeName) + (config.IsDesktop ? ".exe" : ".dll");
+        }
+
+        public Task<DebuggeeConfiguration> Execute(ITestOutputHelper output)
+        {
+            return Task.Factory.StartNew<DebuggeeConfiguration>(() => new DebuggeeConfiguration(_sourcePath, _binaryPath, _binaryExePath));
+        }
+    }
+}
\ No newline at end of file
index 001028d368386caeb6e4310313ecfb6b993d4388..d1dfbba4fee4d47da75777ee58701834c58f22f2 100644 (file)
@@ -284,18 +284,23 @@ namespace Microsoft.Diagnostics.TestHelpers
             get { return _settings; }
         }
 
+        /// <summary>
+        /// Creates a new test config with the new PDB type (full, portable or embedded)
+        /// </summary>
+        /// <param name="pdbType">new pdb type</param>
+        /// <returns>new test config</returns>
         public TestConfiguration CloneWithNewDebugType(string pdbType)
         {
             Debug.Assert(!string.IsNullOrWhiteSpace(pdbType));
 
-            var currentSettings = new Dictionary<string, string>(_settings);
-
-            // Set or replace if the pdb debug type
-            currentSettings[DebugTypeKey] = pdbType;
+            var currentSettings = new Dictionary<string, string>(_settings) {
 
-            // The debuggee build root must exist. Append the pdb type to make it unique.
-            currentSettings[DebuggeeBuildRootKey] = Path.Combine(currentSettings[DebuggeeBuildRootKey], pdbType);
+                // Set or replace if the pdb debug type
+                [DebugTypeKey] = pdbType,
 
+                // The debuggee build root must exist. Append the pdb type to make it unique.
+                [DebuggeeBuildRootKey] = Path.Combine(_settings[DebuggeeBuildRootKey], pdbType)
+            };
             return new TestConfiguration(currentSettings);
         }
 
@@ -649,7 +654,17 @@ namespace Microsoft.Diagnostics.TestHelpers
 
         public override string ToString()
         {
-            return TestProduct + "." + DebuggeeBuildProcess;
+            var sb = new StringBuilder();
+            sb.Append(TestProduct);
+            sb.Append(".");
+            sb.Append(DebuggeeBuildProcess);
+            string version = RuntimeFrameworkVersion;
+            if (!string.IsNullOrEmpty(version))
+            {
+                sb.Append(".");
+                sb.Append(version);
+            }
+            return sb.ToString();
         }
     }
 
index 8fa2e4f87c01aa94a3bbab59b77dcec17c1bb71d..d3a7d827753d0667b6a1572d161299af24e69103 100644 (file)
@@ -669,9 +669,27 @@ namespace SOS
             uint* index,
             ulong* baseAddress)
         {
-            Write(index);
-            Write(baseAddress);
-            return E_NOTIMPL;
+            Debug.Assert(startIndex == 0);
+
+            // This causes way too many problems on Linux because of various
+            // bugs in the CLRMD ELF dump reader module enumeration and isn't
+            // necessary on linux anyway.
+            if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
+            {
+                // Find the module that contains the offset.
+                uint i = 0;
+                foreach (ModuleInfo module in DataReader.EnumerateModules())
+                {
+                    if (offset >= module.ImageBase && offset < (module.ImageBase + module.FileSize))
+                    {
+                        Write(index, i);
+                        Write(baseAddress, module.ImageBase);
+                        return S_OK;
+                    }
+                    i++;
+                }
+            }
+            return E_FAIL;
         }
 
         internal unsafe int GetModuleNames(
index d845fabbe417b276b75237d35e126a4f6a3bee1d..b94f6435f2db80842a35435946cd9b680a5219d7 100644 (file)
@@ -20,9 +20,8 @@
   <DumpDir>$(RootBinDir)/tmp/$(TargetConfiguration)\dumps</DumpDir>
   
   <DebuggeeSourceRoot>$(RepoRootDir)/src/SOS/SOS.UnitTests/Debuggees</DebuggeeSourceRoot>
-  <DebuggeeBuildRoot>$(RootBinDir)/Debuggees</DebuggeeBuildRoot>
-  <DebuggeeNativeLibRoot>$(DebuggeeBuildRoot)/native</DebuggeeNativeLibRoot>
-  <DebuggeeBuildProcess>cli</DebuggeeBuildProcess>
+  <DebuggeeBuildProcess>sdk.prebuilt</DebuggeeBuildProcess>
+  <DebuggeeBuildRoot>$(RootBinDir)</DebuggeeBuildRoot>
   <CliPath>$(RepoRootDir)/.dotnet/dotnet</CliPath>
 
   <NuGetPackageFeeds>
   </NuGetPackageFeeds>
 
   <Options>
+    <!--
+        Default (prebuilt)
+      -->
     <Option>
-      <!-- Build the debuggee for 2.1 but run it on latest -->
-      <BuildProjectMicrosoftNetCoreAppVersion>$(RuntimeVersion21)</BuildProjectMicrosoftNetCoreAppVersion>
-      <BuildProjectFramework>netcoreapp2.1</BuildProjectFramework>
+      <!-- The debuggee built for 3.0 but run it on latest -->
+      <BuildProjectFramework>netcoreapp3.0</BuildProjectFramework>
       <RuntimeFrameworkVersion>$(RuntimeVersionLatest)</RuntimeFrameworkVersion>
     </Option>
+    <Option>
+      <BuildProjectFramework>netcoreapp3.0</BuildProjectFramework>
+      <RuntimeFrameworkVersion>$(RuntimeVersion30)</RuntimeFrameworkVersion>
+    </Option>
     <Option Condition="'$(DailyTest)' != 'true'">
-      <!-- Build the debuggee for 2.1 but run it on 2.2 -->
+      <!-- The debuggee built for 2.1 but run it on 2.2 -->
       <BuildProjectFramework>netcoreapp2.1</BuildProjectFramework>
-      <BuildProjectMicrosoftNetCoreAppVersion>$(RuntimeVersion22)</BuildProjectMicrosoftNetCoreAppVersion>
       <RuntimeFrameworkVersion>$(RuntimeVersion22)</RuntimeFrameworkVersion>
     </Option>
     <Option Condition="'$(DailyTest)' != 'true'">
       <BuildProjectFramework>netcoreapp2.1</BuildProjectFramework>
-      <BuildProjectMicrosoftNetCoreAppVersion>$(RuntimeVersion21)</BuildProjectMicrosoftNetCoreAppVersion>
       <RuntimeFrameworkVersion>$(RuntimeVersion21)</RuntimeFrameworkVersion>
     </Option>
     <Option Condition="Exists('$(RepoRootDir)/.dotnet/shared/Microsoft.NETCore.App/$(RuntimeVersion11)')">
       <BuildProjectFramework>netcoreapp1.1</BuildProjectFramework>
-      <BuildProjectMicrosoftNetCoreAppVersion>$(RuntimeVersion11)</BuildProjectMicrosoftNetCoreAppVersion>
       <RuntimeFrameworkVersion>$(RuntimeVersion11)</RuntimeFrameworkVersion>
       <!-- createdump doesn't exists in 1.1 -->
       <GenerateDumpWithGDB>true</GenerateDumpWithGDB>
       <!-- SOS needs at least 2.0 to run. The default without this is to use the runtime being debuggged to host SOS.NETCore -->
       <SOSHostRuntime>$(RepoRootDir)/.dotnet/shared/Microsoft.NETCore.App/$(RuntimeVersion21)</SOSHostRuntime>
     </Option>
+    <!--
+        SOS.StackAndOtherTests (cli because tested with embedded and portable PDBs)
+      -->
+    <Option>
+      <DebuggeeBuildProcess>cli</DebuggeeBuildProcess>
+      <DebuggeeBuildRoot>$(RootBinDir)/Debuggees</DebuggeeBuildRoot>
+      <TestName>SOS.StackAndOtherTests</TestName>
+      <Options>
+        <Option>
+          <BuildProjectFramework>netcoreapp3.0</BuildProjectFramework>
+          <BuildProjectMicrosoftNetCoreAppVersion>$(RuntimeVersion30)</BuildProjectMicrosoftNetCoreAppVersion>
+          <RuntimeFrameworkVersion>$(RuntimeVersion30)</RuntimeFrameworkVersion>
+        </Option>
+        <Option>
+          <!-- Build the debuggee for 3.0 but run it on latest -->
+          <BuildProjectFramework>netcoreapp3.0</BuildProjectFramework>
+          <BuildProjectMicrosoftNetCoreAppVersion>$(RuntimeVersion30)</BuildProjectMicrosoftNetCoreAppVersion>
+          <RuntimeFrameworkVersion>$(RuntimeVersionLatest)</RuntimeFrameworkVersion>
+        </Option>
+        <Option Condition="'$(DailyTest)' != 'true'">
+          <BuildProjectFramework>netcoreapp2.1</BuildProjectFramework>
+          <BuildProjectMicrosoftNetCoreAppVersion>$(RuntimeVersion21)</BuildProjectMicrosoftNetCoreAppVersion>
+          <RuntimeFrameworkVersion>$(RuntimeVersion21)</RuntimeFrameworkVersion>
+        </Option>
+        <Option Condition="'$(DailyTest)' != 'true'">
+          <!-- The debuggee built for 2.1 but run it on 2.2 -->
+          <BuildProjectFramework>netcoreapp2.1</BuildProjectFramework>
+          <BuildProjectMicrosoftNetCoreAppVersion>$(RuntimeVersion21)</BuildProjectMicrosoftNetCoreAppVersion>
+          <RuntimeFrameworkVersion>$(RuntimeVersion22)</RuntimeFrameworkVersion>
+        </Option>
+        <Option Condition="Exists('$(RepoRootDir)/.dotnet/shared/Microsoft.NETCore.App/$(RuntimeVersion11)')">
+          <BuildProjectFramework>netcoreapp1.1</BuildProjectFramework>
+          <BuildProjectMicrosoftNetCoreAppVersion>$(RuntimeVersion11)</BuildProjectMicrosoftNetCoreAppVersion>
+          <RuntimeFrameworkVersion>$(RuntimeVersion11)</RuntimeFrameworkVersion>
+          <!-- createdump doesn't exists in 1.1 -->
+          <GenerateDumpWithGDB>true</GenerateDumpWithGDB>
+          <!-- SOS needs at least 2.0 to run. The default without this is to use the runtime being debuggged to host SOS.NETCore -->
+          <SOSHostRuntime>$(RepoRootDir)/.dotnet/shared/Microsoft.NETCore.App/$(RuntimeVersion21)</SOSHostRuntime>
+        </Option>
+      </Options>
+    </Option>
+    <!--
+        SOS.WebApp3 (runs only on 3.0 aspnetcore)
+      -->
+    <Option>
+      <TestName>SOS.WebApp3</TestName>
+      <BuildProjectFramework>netcoreapp3.0</BuildProjectFramework>
+      <RuntimeFrameworkVersion>$(AspNetCoreVersion30)</RuntimeFrameworkVersion>
+    </Option>
   </Options>
 
   <HostExe>$(RepoRootDir)/.dotnet/dotnet</HostExe>
index a837c13d6672c26c3d4ab24da5d63221f62ec93b..818999d00944969d94387ce235c5924a02c86175 100644 (file)
   <InstallDir>$(RootBinDir)\bin\Windows_NT.$(TargetArchitecture).$(TargetConfiguration)</InstallDir>
   <LogDir>$(RootBinDir)\TestResults\$(TargetConfiguration)\sos.unittests_$(Timestamp)</LogDir>
   <DumpDir>$(RootBinDir)\tmp\$(TargetConfiguration)\dumps</DumpDir>
-  <CDBPath>$(NuGetPackageCacheDir)\cdb-sos\10.0.18362\runtimes\win-$(TargetArchitecture)\native\cdb.exe</CDBPath>
+  <CDBPath>$(RootBinDir)\bin\SOS.UnitTests\$(TargetConfiguration)\netcoreapp2.0\publish\runtimes\win-$(TargetArchitecture)\native\cdb.exe</CDBPath>
   <CDBHelperExtension>$(InstallDir)\runcommand.dll</CDBHelperExtension>
+  <HostRuntimeDir>$(RepoRootDir)\.dotnet\shared\Microsoft.NETCore.App\$(RuntimeVersion21)</HostRuntimeDir>
 
   <DebuggeeSourceRoot>$(RepoRootDir)\src\SOS\SOS.UnitTests\Debuggees</DebuggeeSourceRoot>
-  <DebuggeeBuildRoot>$(RootBinDir)\Debuggees</DebuggeeBuildRoot>
-  <DebuggeeNativeLibRoot>$(DebuggeeBuildRoot)\native</DebuggeeNativeLibRoot>
-  <DebuggeeBuildProcess>cli</DebuggeeBuildProcess>
+  <DebuggeeBuildProcess>sdk.prebuilt</DebuggeeBuildProcess>
+  <DebuggeeBuildRoot>$(RootBinDir)</DebuggeeBuildRoot>
   <CliPath>$(RepoRootDir)\.dotnet\dotnet.exe</CliPath>
 
   <NuGetPackageFeeds>
   </NuGetPackageFeeds>
 
   <Options>
+    <!--
+        .NET Core Runtime
+     -->
     <Option>
       <TestProduct>ProjectK</TestProduct>
       <Options>
+        <!--
+            Default (prebuilt)
+          -->
         <Option>
-          <!-- Build the debuggee for 2.1 but run it on latest -->
-          <BuildProjectFramework>netcoreapp2.1</BuildProjectFramework>
-          <BuildProjectMicrosoftNetCoreAppVersion>$(RuntimeVersion21)</BuildProjectMicrosoftNetCoreAppVersion>
+          <!-- The debuggee built for 3.0 but run it on latest -->
+          <BuildProjectFramework>netcoreapp3.0</BuildProjectFramework>
           <RuntimeFrameworkVersion>$(RuntimeVersionLatest)</RuntimeFrameworkVersion>
         </Option>
+        <Option>
+          <BuildProjectFramework>netcoreapp3.0</BuildProjectFramework>
+          <RuntimeFrameworkVersion>$(RuntimeVersion30)</RuntimeFrameworkVersion>
+        </Option>
         <Option Condition="'$(DailyTest)' != 'true'">
-          <!-- Build the debuggee for 2.1 but run it on 2.2 -->
+          <!-- The debuggee built for 2.1 but run it on 2.2 -->
           <BuildProjectFramework>netcoreapp2.1</BuildProjectFramework>
-          <BuildProjectMicrosoftNetCoreAppVersion>$(RuntimeVersion22)</BuildProjectMicrosoftNetCoreAppVersion>
           <RuntimeFrameworkVersion>$(RuntimeVersion22)</RuntimeFrameworkVersion>
         </Option>
         <Option Condition="'$(DailyTest)' != 'true'">
           <BuildProjectFramework>netcoreapp2.1</BuildProjectFramework>
-          <BuildProjectMicrosoftNetCoreAppVersion>$(RuntimeVersion21)</BuildProjectMicrosoftNetCoreAppVersion>
           <RuntimeFrameworkVersion>$(RuntimeVersion21)</RuntimeFrameworkVersion>
         </Option>
         <Option Condition="'$(DailyTest)' != 'true'">
           <BuildProjectFramework>netcoreapp1.1</BuildProjectFramework>
-          <BuildProjectMicrosoftNetCoreAppVersion>$(RuntimeVersion11)</BuildProjectMicrosoftNetCoreAppVersion>
           <RuntimeFrameworkVersion>$(RuntimeVersion11)</RuntimeFrameworkVersion>
           <!-- SOS needs at least 2.0 to run. The default without this is to use the runtime being debuggged to host SOS.NETCore -->
-          <SOSHostRuntime>$(RepoRootDir)\.dotnet\shared\Microsoft.NETCore.App\$(RuntimeVersion21)</SOSHostRuntime>
+          <SOSHostRuntime>$(HostRuntimeDir)</SOSHostRuntime>
         </Option>
-      </Options>
-      <Options>
-        <Option Condition="$(TargetArchitecture) == x64">
-          <DotNetDumpPath>$(RootBinDir)/bin/dotnet-dump/$(TargetConfiguration)/netcoreapp2.1/publish/dotnet-dump.dll</DotNetDumpPath>
+        <!--
+            SOS.StackAndOtherTests (cli because tested with full, embedded and portable PDBs)
+          -->
+        <Option>
+          <DebuggeeBuildProcess>cli</DebuggeeBuildProcess>
+          <DebuggeeBuildRoot>$(RootBinDir)\Debuggees</DebuggeeBuildRoot>
+          <TestName>SOS.StackAndOtherTests</TestName>
+          <Options>
+            <Option>
+              <BuildProjectFramework>netcoreapp3.0</BuildProjectFramework>
+              <BuildProjectMicrosoftNetCoreAppVersion>$(RuntimeVersion30)</BuildProjectMicrosoftNetCoreAppVersion>
+              <RuntimeFrameworkVersion>$(RuntimeVersion30)</RuntimeFrameworkVersion>
+            </Option>
+            <Option>
+              <!-- Build the debuggee for 3.0 but run it on latest -->
+              <BuildProjectFramework>netcoreapp3.0</BuildProjectFramework>
+              <BuildProjectMicrosoftNetCoreAppVersion>$(RuntimeVersion30)</BuildProjectMicrosoftNetCoreAppVersion>
+              <RuntimeFrameworkVersion>$(RuntimeVersionLatest)</RuntimeFrameworkVersion>
+            </Option>
+            <Option Condition="'$(DailyTest)' != 'true'">
+              <BuildProjectFramework>netcoreapp2.1</BuildProjectFramework>
+              <BuildProjectMicrosoftNetCoreAppVersion>$(RuntimeVersion21)</BuildProjectMicrosoftNetCoreAppVersion>
+              <RuntimeFrameworkVersion>$(RuntimeVersion21)</RuntimeFrameworkVersion>
+            </Option>
+            <Option Condition="'$(DailyTest)' != 'true'">
+              <!-- The debuggee built for 2.1 but run it on 2.2 -->
+              <BuildProjectFramework>netcoreapp2.1</BuildProjectFramework>
+              <BuildProjectMicrosoftNetCoreAppVersion>$(RuntimeVersion21)</BuildProjectMicrosoftNetCoreAppVersion>
+              <RuntimeFrameworkVersion>$(RuntimeVersion22)</RuntimeFrameworkVersion>
+            </Option>
+            <Option Condition="'$(DailyTest)' != 'true'">
+              <BuildProjectFramework>netcoreapp1.1</BuildProjectFramework>
+              <BuildProjectMicrosoftNetCoreAppVersion>$(RuntimeVersion11)</BuildProjectMicrosoftNetCoreAppVersion>
+              <RuntimeFrameworkVersion>$(RuntimeVersion11)</RuntimeFrameworkVersion>
+              <!-- SOS needs at least 2.0 to run. The default without this is to use the runtime being debuggged to host SOS.NETCore -->
+              <SOSHostRuntime>$(HostRuntimeDir)</SOSHostRuntime>
+            </Option>
+          </Options>
+        </Option>
+        <!--
+            SOS.WebApp (runs only on Windows 2.x aspnetcore)
+          -->
+        <Option>
+          <TestName>SOS.WebApp</TestName>
+          <Options>
+            <Option Condition="'$(DailyTest)' != 'true'">
+              <BuildProjectFramework>netcoreapp2.1</BuildProjectFramework>
+              <RuntimeFrameworkVersion>$(RuntimeVersion22)</RuntimeFrameworkVersion>
+            </Option>
+            <Option Condition="'$(DailyTest)' != 'true'">
+              <BuildProjectFramework>netcoreapp2.1</BuildProjectFramework>
+              <RuntimeFrameworkVersion>$(RuntimeVersion21)</RuntimeFrameworkVersion>
+            </Option>
+          </Options>
+        </Option>
+        <!--
+            SOS.WebApp3 (runs only on 3.0 aspnetcore)
+          -->
+        <Option>
+          <TestName>SOS.WebApp3</TestName>
+          <BuildProjectFramework>netcoreapp3.0</BuildProjectFramework>
+          <RuntimeFrameworkVersion>$(AspNetCoreVersion30)</RuntimeFrameworkVersion>
         </Option>
       </Options>
+
       <HostExe>$(RepoRootDir)\.dotnet\dotnet.exe</HostExe>
       <HostArgs>--fx-version $(RuntimeFrameworkVersion)</HostArgs>
       <RuntimeSymbolsPath>$(RepoRootDir)\.dotnet\shared\Microsoft.NETCore.App\$(RuntimeFrameworkVersion)</RuntimeSymbolsPath>
       <SOSPath>$(InstallDir)\sos.dll</SOSPath>
+      <DotNetDumpPath>$(RootBinDir)/bin/dotnet-dump/$(TargetConfiguration)/netcoreapp2.1/publish/dotnet-dump.dll</DotNetDumpPath>
     </Option>
+    <!--
+        Desktop Runtime (debuggees cli built)
+     -->
     <Option Condition="$(TargetArchitecture) != arm64">
+      <Options>
+        <Option>
+        </Option>
+        <Option>
+          <TestName>SOS.StackAndOtherTests</TestName>
+        </Option>
+      </Options>
       <TestProduct>Desktop</TestProduct>
+      <DebuggeeBuildProcess>cli</DebuggeeBuildProcess>
+      <DebuggeeBuildRoot>$(RootBinDir)\Debuggees</DebuggeeBuildRoot>
+      <BuildProjectFramework>net462</BuildProjectFramework>
       <BuildProjectRuntime>win-$(TargetArchitecture)</BuildProjectRuntime>
       <DebugType>full</DebugType>
       <FrameworkDirPath Condition="$(TargetArchitecture) == x64">$(WinDir)\Microsoft.Net\Framework64\v4.0.30319\</FrameworkDirPath>
       <FrameworkDirPath Condition="$(TargetArchitecture) != x64">$(WinDir)\Microsoft.Net\Framework\v4.0.30319\</FrameworkDirPath>
       <RuntimeSymbolsPath>$(FrameworkDirPath)</RuntimeSymbolsPath>
-      <BuildProjectFramework>net462</BuildProjectFramework>
       <SOSPath>$(FrameworkDirPath)\sos.dll</SOSPath>
     </Option>
   </Options>
diff --git a/src/SOS/SOS.UnitTests/Debuggees/Directory.Build.props b/src/SOS/SOS.UnitTests/Debuggees/Directory.Build.props
new file mode 100644 (file)
index 0000000..92a52fa
--- /dev/null
@@ -0,0 +1,10 @@
+<!-- Copyright (c)  Microsoft.  All Rights Reserved.  Licensed under the Apache License, Version 2.0.  See License.txt in the project root for license information. -->
+<Project>
+  <Import Project="$(MSBuildThisFileDirectory)..\..\..\Directory.Build.props"/>
+  
+  <PropertyGroup>
+    <DebugType Condition="'$(TargetFramework)' == 'net462'">full</DebugType>
+    <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
+    <Optimize>false</Optimize>
+  </PropertyGroup>
+</Project>
index 37c7f376aa996cd8f3ee3241cab98901bb6bda77..754e64894897c8f47e9a2d033943184485bb8b4b 100644 (file)
@@ -1,7 +1,7 @@
 <Project Sdk="Microsoft.NET.Sdk">
   <PropertyGroup>
     <OutputType>Exe</OutputType>
-    <TargetFramework>$(BuildProjectFramework)</TargetFramework>
-    <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
+    <TargetFramework Condition="'$(BuildProjectFramework)' != ''">$(BuildProjectFramework)</TargetFramework>
+    <TargetFrameworks Condition="'$(BuildProjectFramework)' == ''">netcoreapp1.1;netcoreapp2.1;netcoreapp3.0</TargetFrameworks>
   </PropertyGroup>
 </Project>
index 37c7f376aa996cd8f3ee3241cab98901bb6bda77..754e64894897c8f47e9a2d033943184485bb8b4b 100644 (file)
@@ -1,7 +1,7 @@
 <Project Sdk="Microsoft.NET.Sdk">
   <PropertyGroup>
     <OutputType>Exe</OutputType>
-    <TargetFramework>$(BuildProjectFramework)</TargetFramework>
-    <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
+    <TargetFramework Condition="'$(BuildProjectFramework)' != ''">$(BuildProjectFramework)</TargetFramework>
+    <TargetFrameworks Condition="'$(BuildProjectFramework)' == ''">netcoreapp1.1;netcoreapp2.1;netcoreapp3.0</TargetFrameworks>
   </PropertyGroup>
 </Project>
index 37c7f376aa996cd8f3ee3241cab98901bb6bda77..754e64894897c8f47e9a2d033943184485bb8b4b 100644 (file)
@@ -1,7 +1,7 @@
 <Project Sdk="Microsoft.NET.Sdk">
   <PropertyGroup>
     <OutputType>Exe</OutputType>
-    <TargetFramework>$(BuildProjectFramework)</TargetFramework>
-    <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
+    <TargetFramework Condition="'$(BuildProjectFramework)' != ''">$(BuildProjectFramework)</TargetFramework>
+    <TargetFrameworks Condition="'$(BuildProjectFramework)' == ''">netcoreapp1.1;netcoreapp2.1;netcoreapp3.0</TargetFrameworks>
   </PropertyGroup>
 </Project>
index 37c7f376aa996cd8f3ee3241cab98901bb6bda77..754e64894897c8f47e9a2d033943184485bb8b4b 100644 (file)
@@ -1,7 +1,7 @@
 <Project Sdk="Microsoft.NET.Sdk">
   <PropertyGroup>
     <OutputType>Exe</OutputType>
-    <TargetFramework>$(BuildProjectFramework)</TargetFramework>
-    <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
+    <TargetFramework Condition="'$(BuildProjectFramework)' != ''">$(BuildProjectFramework)</TargetFramework>
+    <TargetFrameworks Condition="'$(BuildProjectFramework)' == ''">netcoreapp1.1;netcoreapp2.1;netcoreapp3.0</TargetFrameworks>
   </PropertyGroup>
 </Project>
index 37c7f376aa996cd8f3ee3241cab98901bb6bda77..754e64894897c8f47e9a2d033943184485bb8b4b 100644 (file)
@@ -1,7 +1,7 @@
 <Project Sdk="Microsoft.NET.Sdk">
   <PropertyGroup>
     <OutputType>Exe</OutputType>
-    <TargetFramework>$(BuildProjectFramework)</TargetFramework>
-    <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
+    <TargetFramework Condition="'$(BuildProjectFramework)' != ''">$(BuildProjectFramework)</TargetFramework>
+    <TargetFrameworks Condition="'$(BuildProjectFramework)' == ''">netcoreapp1.1;netcoreapp2.1;netcoreapp3.0</TargetFrameworks>
   </PropertyGroup>
 </Project>
index 37c7f376aa996cd8f3ee3241cab98901bb6bda77..754e64894897c8f47e9a2d033943184485bb8b4b 100644 (file)
@@ -1,7 +1,7 @@
 <Project Sdk="Microsoft.NET.Sdk">
   <PropertyGroup>
     <OutputType>Exe</OutputType>
-    <TargetFramework>$(BuildProjectFramework)</TargetFramework>
-    <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
+    <TargetFramework Condition="'$(BuildProjectFramework)' != ''">$(BuildProjectFramework)</TargetFramework>
+    <TargetFrameworks Condition="'$(BuildProjectFramework)' == ''">netcoreapp1.1;netcoreapp2.1;netcoreapp3.0</TargetFrameworks>
   </PropertyGroup>
 </Project>
index f7cac32f276b7fb4bc649cc7c75b39e0f9874f8b..e2d7614035ad40dd58ca7ae06eb112ca061ce3a9 100644 (file)
@@ -1,9 +1,9 @@
 <Project Sdk="Microsoft.NET.Sdk">
   <PropertyGroup>
     <OutputType>Exe</OutputType>
-    <TargetFramework>$(BuildProjectFramework)</TargetFramework>
-    <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
-    <DefineConstants Condition="'$(BuildProjectFramework)' != 'net461'">$(DefineConstants);FULL_CLR</DefineConstants>
+    <TargetFramework Condition="'$(BuildProjectFramework)' != ''">$(BuildProjectFramework)</TargetFramework>
+    <TargetFrameworks Condition="'$(BuildProjectFramework)' == ''">netcoreapp1.1;netcoreapp2.1;netcoreapp3.0</TargetFrameworks>
+    <DefineConstants Condition="'$(TargetFramework)' == 'net462'">$(DefineConstants);FULL_CLR</DefineConstants>
   </PropertyGroup>
 
   <ItemGroup>
@@ -15,6 +15,6 @@
   </ItemGroup>
 
   <ItemGroup>
-    <PackageReference Condition="'$(BuildProjectFramework)' != 'net461'" Include="System.Runtime.Loader" Version="4.3.0" />
+    <PackageReference Condition="'$(TargetFramework)' != 'net462'" Include="System.Runtime.Loader" Version="4.3.0" />
   </ItemGroup>
 </Project>
index 5863a4282de5b77ad28be4d779d7c15c155b6a54..62f23c4bb12a2708c66ad600e7528fa37bc3b9e7 100644 (file)
@@ -1,7 +1,7 @@
 <Project Sdk="Microsoft.NET.Sdk">
   <PropertyGroup>
     <OutputType>Library</OutputType>
-    <TargetFramework>$(BuildProjectFramework)</TargetFramework>
-    <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
+    <TargetFramework Condition="'$(BuildProjectFramework)' != ''">$(BuildProjectFramework)</TargetFramework>
+    <TargetFrameworks Condition="'$(BuildProjectFramework)' == ''">netcoreapp1.1;netcoreapp2.1;netcoreapp3.0</TargetFrameworks>
   </PropertyGroup>
 </Project>
index 5863a4282de5b77ad28be4d779d7c15c155b6a54..62f23c4bb12a2708c66ad600e7528fa37bc3b9e7 100644 (file)
@@ -1,7 +1,7 @@
 <Project Sdk="Microsoft.NET.Sdk">
   <PropertyGroup>
     <OutputType>Library</OutputType>
-    <TargetFramework>$(BuildProjectFramework)</TargetFramework>
-    <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
+    <TargetFramework Condition="'$(BuildProjectFramework)' != ''">$(BuildProjectFramework)</TargetFramework>
+    <TargetFrameworks Condition="'$(BuildProjectFramework)' == ''">netcoreapp1.1;netcoreapp2.1;netcoreapp3.0</TargetFrameworks>
   </PropertyGroup>
 </Project>
index e886c02b3caa94322a82280841047dbd856586eb..f94fa66b45c29989364485bbe1ea2f6a098938f5 100644 (file)
@@ -1,14 +1,10 @@
-<Project Sdk="Microsoft.NET.Sdk">
+<Project Sdk="Microsoft.NET.Sdk">
   <PropertyGroup>
     <OutputType>Exe</OutputType>
-    <TargetFramework>$(BuildProjectFramework)</TargetFramework>
-    <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
+    <TargetFramework Condition="'$(BuildProjectFramework)' != ''">$(BuildProjectFramework)</TargetFramework>
+    <TargetFrameworks Condition="'$(BuildProjectFramework)' == ''">netcoreapp1.1;netcoreapp2.1;netcoreapp3.0</TargetFrameworks>
   </PropertyGroup>
 
-  <ItemGroup>
-    <AdditionalSourceCopy Include="..\TaskNestedException.sln" />
-  </ItemGroup>
-
   <ItemGroup>
     <ProjectReference Include="..\RandomUserLibrary\RandomUserLibrary.csproj" />
   </ItemGroup>
diff --git a/src/SOS/SOS.UnitTests/Debuggees/WebApp/Program.cs b/src/SOS/SOS.UnitTests/Debuggees/WebApp/Program.cs
new file mode 100644 (file)
index 0000000..022b4d6
--- /dev/null
@@ -0,0 +1,46 @@
+using Microsoft.AspNetCore;
+using Microsoft.AspNetCore.Hosting;
+using System;
+using System.Net.Http;
+
+namespace webapp
+{
+    public class Program
+    {
+        public static string PipeServerName;
+
+        public static void Main(string[] args)
+        {
+            if (args.Length > 0)
+            {
+                PipeServerName = args[0];
+                Console.WriteLine("Pipe server: {0}", PipeServerName);
+            }
+
+            using (IWebHost host = CreateWebHostBuilder(args).Build())
+            {
+                host.Start();
+
+                using (var client = new HttpClient())
+                {
+                    string url = $"http://localhost:5000";
+                    Console.WriteLine($"Starting request to {url}");
+                    try
+                    {
+                        HttpResponseMessage response = client.GetAsync(url).GetAwaiter().GetResult();
+                    }
+                    catch (HttpRequestException ex)
+                    {
+                        Console.WriteLine(ex.ToString());
+                    }
+                }
+
+                host.WaitForShutdown();
+            }
+        }
+
+        public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
+            WebHost.CreateDefaultBuilder(args)
+                .UseStartup<Startup>();
+    }
+}
diff --git a/src/SOS/SOS.UnitTests/Debuggees/WebApp/Properties/launchSettings.json b/src/SOS/SOS.UnitTests/Debuggees/WebApp/Properties/launchSettings.json
new file mode 100644 (file)
index 0000000..1bdad9e
--- /dev/null
@@ -0,0 +1,27 @@
+{
+  "iisSettings": {
+    "windowsAuthentication": false, 
+    "anonymousAuthentication": true, 
+    "iisExpress": {
+      "applicationUrl": "http://localhost:6270",
+      "sslPort": 44313
+    }
+  },
+  "profiles": {
+    "IIS Express": {
+      "commandName": "IISExpress",
+      "launchBrowser": true,
+      "environmentVariables": {
+        "ASPNETCORE_ENVIRONMENT": "Development"
+      }
+    },
+    "WebApp": {
+      "commandName": "Project",
+      "launchBrowser": true,
+      "applicationUrl": "https://localhost:5001;http://localhost:5000",
+      "environmentVariables": {
+        "ASPNETCORE_ENVIRONMENT": "Development"
+      }
+    }
+  }
+}
\ No newline at end of file
diff --git a/src/SOS/SOS.UnitTests/Debuggees/WebApp/Startup.cs b/src/SOS/SOS.UnitTests/Debuggees/WebApp/Startup.cs
new file mode 100644 (file)
index 0000000..a6ab860
--- /dev/null
@@ -0,0 +1,42 @@
+using Microsoft.AspNetCore.Builder;
+using Microsoft.AspNetCore.Hosting;
+using Microsoft.AspNetCore.Http;
+using Microsoft.Extensions.DependencyInjection;
+using System;
+using System.IO.Pipes;
+
+namespace webapp
+{
+    public class Startup
+    {
+        // This method gets called by the runtime. Use this method to add services to the container.
+        // For more information on how to configure your application, visit https://go.microsoft.com/fwlink/?LinkID=398940
+        public void ConfigureServices(IServiceCollection services)
+        {
+        }
+
+        // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
+        public void Configure(IApplicationBuilder app, IHostingEnvironment env)
+        {
+            if (env.IsDevelopment())
+            {
+                app.UseDeveloperExceptionPage();
+            }
+
+            app.Run(async (context) =>
+            {
+                await context.Response.WriteAsync("Hello World!");
+
+                if (Program.PipeServerName != null)
+                {
+                    var pipeStream = new NamedPipeClientStream(Program.PipeServerName);
+                    Console.WriteLine("Connecting to pipe {0}", Program.PipeServerName);
+                    pipeStream.Connect();
+
+                    // Wait for server to send something
+                    int input = pipeStream.ReadByte();
+                }
+            });
+        }
+    }
+}
diff --git a/src/SOS/SOS.UnitTests/Debuggees/WebApp/WebApp.csproj b/src/SOS/SOS.UnitTests/Debuggees/WebApp/WebApp.csproj
new file mode 100644 (file)
index 0000000..efb8edb
--- /dev/null
@@ -0,0 +1,12 @@
+<Project Sdk="Microsoft.NET.Sdk.Web">
+
+  <PropertyGroup>
+    <TargetFramework>netcoreapp2.1</TargetFramework>
+  </PropertyGroup>
+
+  <ItemGroup>
+    <PackageReference Include="Microsoft.AspNetCore.App" />
+    <PackageReference Include="Microsoft.AspNetCore.Razor.Design" Version="2.1.2" PrivateAssets="All" />
+  </ItemGroup>
+
+</Project>
diff --git a/src/SOS/SOS.UnitTests/Debuggees/WebApp3/Program.cs b/src/SOS/SOS.UnitTests/Debuggees/WebApp3/Program.cs
new file mode 100644 (file)
index 0000000..4090568
--- /dev/null
@@ -0,0 +1,46 @@
+using Microsoft.AspNetCore.Hosting;
+using Microsoft.Extensions.Hosting;
+using System;
+using System.Net.Http;
+
+namespace WebApp3
+{
+    public class Program
+    {
+        public static string PipeServerName;
+
+        public static void Main(string[] args)
+        {
+            if (args.Length > 0)
+            {
+                PipeServerName = args[0];
+                Console.WriteLine("Pipe server: {0}", PipeServerName);
+            }
+
+            using (IHost host = CreateHostBuilder(args).Build())
+            {
+                host.Start();
+
+                using (var client = new HttpClient())
+                {
+                    string url = $"http://localhost:5000";
+                    Console.WriteLine($"Starting request to {url}");
+                    try
+                    {
+                        HttpResponseMessage response = client.GetAsync(url).GetAwaiter().GetResult();
+                    }
+                    catch (HttpRequestException ex)
+                    {
+                        Console.WriteLine(ex.ToString());
+                    }
+                }
+
+                host.WaitForShutdown();
+            }
+        }
+
+        public static IHostBuilder CreateHostBuilder(string[] args) =>
+            Host.CreateDefaultBuilder(args).ConfigureWebHostDefaults(webBuilder =>
+                webBuilder.UseStartup<Startup>());
+    }
+}
diff --git a/src/SOS/SOS.UnitTests/Debuggees/WebApp3/Properties/launchSettings.json b/src/SOS/SOS.UnitTests/Debuggees/WebApp3/Properties/launchSettings.json
new file mode 100644 (file)
index 0000000..d2d3863
--- /dev/null
@@ -0,0 +1,27 @@
+{
+  "iisSettings": {
+    "windowsAuthentication": false,
+    "anonymousAuthentication": true,
+    "iisExpress": {
+      "applicationUrl": "http://localhost:55377/",
+      "sslPort": 0
+    }
+  },
+  "profiles": {
+    "IIS Express": {
+      "commandName": "IISExpress",
+      "launchBrowser": true,
+      "environmentVariables": {
+        "ASPNETCORE_ENVIRONMENT": "Development"
+      }
+    },
+    "WebApp3": {
+      "commandName": "Project",
+      "launchBrowser": true,
+      "applicationUrl": "https://localhost:5001;http://localhost:5000",
+      "environmentVariables": {
+        "ASPNETCORE_ENVIRONMENT": "Development"
+      }
+    }
+  }
+}
\ No newline at end of file
diff --git a/src/SOS/SOS.UnitTests/Debuggees/WebApp3/Startup.cs b/src/SOS/SOS.UnitTests/Debuggees/WebApp3/Startup.cs
new file mode 100644 (file)
index 0000000..ed10b03
--- /dev/null
@@ -0,0 +1,49 @@
+using Microsoft.AspNetCore.Builder;
+using Microsoft.AspNetCore.Hosting;
+using Microsoft.AspNetCore.Http;
+using Microsoft.Extensions.DependencyInjection;
+using Microsoft.Extensions.Hosting;
+using System;
+using System.IO.Pipes;
+
+namespace WebApp3
+{
+    public class Startup
+    {
+        // This method gets called by the runtime. Use this method to add services to the container.
+        // For more information on how to configure your application, visit https://go.microsoft.com/fwlink/?LinkID=398940
+        public void ConfigureServices(IServiceCollection services)
+        {
+        }
+
+        // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
+        public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
+        {
+            if (env.IsDevelopment())
+            {
+                app.UseDeveloperExceptionPage();
+            }
+
+            app.UseRouting();
+
+            app.UseEndpoints(endpoints =>
+            {
+                endpoints.MapGet("/", async context =>
+                {
+                    await context.Response.WriteAsync("Hello World!");
+
+                    if (Program.PipeServerName != null)
+                    {
+                        var pipeStream = new NamedPipeClientStream(Program.PipeServerName);
+                        Console.WriteLine("Connecting to pipe {0}", Program.PipeServerName);
+                        pipeStream.Connect();
+
+                        // Wait for server to send something
+                        int input = pipeStream.ReadByte();
+                    }
+                });
+            });
+
+        }
+    }
+}
diff --git a/src/SOS/SOS.UnitTests/Debuggees/WebApp3/WebApp3.csproj b/src/SOS/SOS.UnitTests/Debuggees/WebApp3/WebApp3.csproj
new file mode 100644 (file)
index 0000000..bb9ffce
--- /dev/null
@@ -0,0 +1,7 @@
+<Project Sdk="Microsoft.NET.Sdk.Web">
+
+  <PropertyGroup>
+    <TargetFramework>netcoreapp3.0</TargetFramework>
+  </PropertyGroup>
+
+</Project>
diff --git a/src/SOS/SOS.UnitTests/Debuggees/WebApp3/appsettings.Development.json b/src/SOS/SOS.UnitTests/Debuggees/WebApp3/appsettings.Development.json
new file mode 100644 (file)
index 0000000..e203e94
--- /dev/null
@@ -0,0 +1,9 @@
+{
+  "Logging": {
+    "LogLevel": {
+      "Default": "Debug",
+      "System": "Information",
+      "Microsoft": "Information"
+    }
+  }
+}
diff --git a/src/SOS/SOS.UnitTests/Debuggees/WebApp3/appsettings.json b/src/SOS/SOS.UnitTests/Debuggees/WebApp3/appsettings.json
new file mode 100644 (file)
index 0000000..d9d9a9b
--- /dev/null
@@ -0,0 +1,10 @@
+{
+  "Logging": {
+    "LogLevel": {
+      "Default": "Information",
+      "Microsoft": "Warning",
+      "Microsoft.Hosting.Lifetime": "Information"
+    }
+  },
+  "AllowedHosts": "*"
+}
index 4dcb14146aa9b52ff655ddd031b4828a83fe9b91..a1857811ca51de18a8dc090370978e3d45f4fcf3 100644 (file)
@@ -7,6 +7,7 @@ using System;
 using System.Collections.Generic;
 using System.IO;
 using System.Linq;
+using System.Text;
 using System.Threading.Tasks;
 using Xunit;
 using Xunit.Abstractions;
@@ -21,7 +22,13 @@ public class SOS
 
     ITestOutputHelper Output { get; set; }
 
-    public static IEnumerable<object[]> Configurations => TestRunConfiguration.Instance.Configurations.Select(c => new[] { c });
+    public static IEnumerable<object[]> GetConfigurations(string key, string value)
+    {
+        return TestRunConfiguration.Instance.Configurations.Where((c) => key == null || c.AllSettings.GetValueOrDefault(key) == value).Select(c => new[] { c });
+    }
+
+    public static IEnumerable<object[]> Configurations => GetConfigurations("TestName", null);
+
     private void SkipIfArm(TestConfiguration config)
     {
         if (config.TargetArchitecture == "arm" || config.TargetArchitecture == "arm64")
@@ -30,69 +37,79 @@ public class SOS
         }
     }
 
-    private static bool IsCreateDumpConfig(TestConfiguration config)
-    {
-        return config.DebuggeeDumpOutputRootDir() != null;
-    }
-
-    private static bool IsOpenDumpConfig(TestConfiguration config)
-    {
-        return config.DebuggeeDumpInputRootDir() != null;
-    }
-
-    private Task RunTest(TestConfiguration config, string debuggeeName, string scriptName, bool useCreateDump = true)
+    private async Task RunTest(string scriptName, bool testLive = true, bool testDump = true, SOSRunner.TestInformation information = null)
     {
-        return RunTest(config, "SOS." + debuggeeName, debuggeeName, scriptName, useCreateDump: useCreateDump);
-    }
+        information.OutputHelper = Output;
 
-    private async Task RunTest(TestConfiguration config, string testName, string debuggeeName, string scriptName, string debuggeeArguments = null, bool useCreateDump = true)
-    {
-        if (!SOSRunner.IsAlpine())
+        if (testLive && !SOSRunner.IsAlpine())
         {
             // Live
-            using (SOSRunner runner = await SOSRunner.StartDebugger(config, Output, testName, debuggeeName, debuggeeArguments))
+            using (SOSRunner runner = await SOSRunner.StartDebugger(information, SOSRunner.DebuggerAction.Live))
             {
                 await runner.RunScript(scriptName);
             }
         }
 
-        // Generate a crash dump.
-        if (IsCreateDumpConfig(config))
+        if (testDump)
         {
-            if (!useCreateDump && SOSRunner.IsAlpine())
+            // Generate a crash dump.
+            if (information.TestConfiguration.DebuggeeDumpOutputRootDir() != null)
             {
-                throw new SkipTestException("lldb tests not supported on Alpine");
+                if (information.DumpGenerator == SOSRunner.DumpGenerator.NativeDebugger && SOSRunner.IsAlpine())
+                {
+                    throw new SkipTestException("lldb tests not supported on Alpine");
+                }
+                await SOSRunner.CreateDump(information);
             }
-            await SOSRunner.CreateDump(config, Output, testName, debuggeeName, debuggeeArguments, useCreateDump);
-        }
 
-        // Test against a crash dump.
-        if (IsOpenDumpConfig(config))
-        {
-            if (!SOSRunner.IsAlpine())
+            // Test against a crash dump.
+            if (information.TestConfiguration.DebuggeeDumpInputRootDir() != null)
             {
-                // With cdb (Windows) or lldb (Linux or OSX)
-                using (SOSRunner runner = await SOSRunner.StartDebugger(config, Output, testName, debuggeeName, debuggeeArguments, SOSRunner.Options.LoadDump))
+                if (!SOSRunner.IsAlpine())
                 {
-                    await runner.RunScript(scriptName);
+                    // With cdb (Windows) or lldb (Linux or OSX)
+                    using (SOSRunner runner = await SOSRunner.StartDebugger(information, SOSRunner.DebuggerAction.LoadDump))
+                    {
+                        await runner.RunScript(scriptName);
+                    }
                 }
-            }
 
-            // With the dotnet-dump analyze tool
-            if (config.DotNetDumpPath() != null)
-            { 
-                using (SOSRunner runner = await SOSRunner.StartDebugger(config, Output, testName, debuggeeName, debuggeeArguments, SOSRunner.Options.LoadDumpWithDotNetDump))
+                // With the dotnet-dump analyze tool
+                if (information.TestConfiguration.DotNetDumpPath() != null)
                 {
-                    await runner.RunScript(scriptName);
+                    using (SOSRunner runner = await SOSRunner.StartDebugger(information, SOSRunner.DebuggerAction.LoadDumpWithDotNetDump))
+                    {
+                        await runner.RunScript(scriptName);
+                    }
                 }
             }
         }
     }
 
+    private async Task RunTest(TestConfiguration config, string debuggeeName, string scriptName, string testName = null, bool testLive = true, bool testDump = true, bool testTriage = false)
+    {
+        await RunTest(scriptName, testLive, testDump, new SOSRunner.TestInformation {
+            TestConfiguration = config,
+            TestName = testName,
+            DebuggeeName = debuggeeName,
+            DumpType = SOSRunner.DumpType.Heap
+        });
+
+        if (testTriage)
+        {
+            await RunTest(scriptName, testLive: false, testDump, new SOSRunner.TestInformation {
+                TestConfiguration = config,
+                TestName = testName,
+                DebuggeeName = debuggeeName,
+                DumpType = SOSRunner.DumpType.Triage
+            });
+        }
+    }
+
     [SkippableTheory, MemberData(nameof(Configurations))]
     public async Task DivZero(TestConfiguration config)
     {
-        await RunTest(config, "DivZero", "DivZero.script");
+        await RunTest(config, "DivZero", "DivZero.script", testTriage: true);
     }
 
     [SkippableTheory, MemberData(nameof(Configurations))]
@@ -101,64 +118,183 @@ public class SOS
         SkipIfArm(config);
 
         // Live only
-        if (SOSRunner.IsAlpine())
-        {
-            throw new SkipTestException("lldb tests not supported on Alpine");
-        }
-        using (SOSRunner runner = await SOSRunner.StartDebugger(config, Output, testName: "SOS.GCTests", debuggeeName: "GCWhere"))
-        {
-            await runner.RunScript("GCTests.script");
-        }
+        await RunTest(config, "GCWhere", "GCTests.script", testName: "SOS.GCTests", testDump: false);
     }
 
     [SkippableTheory, MemberData(nameof(Configurations))]
     public async Task Overflow(TestConfiguration config)
     {
         // The .NET Core createdump facility may not catch stack overflow so use gdb to generate dump
-        await RunTest(config, "Overflow", "Overflow.script", useCreateDump: config.StackOverflowCreatesDump);
+        await RunTest("Overflow.script", information: new SOSRunner.TestInformation {
+            TestConfiguration = config,
+            DebuggeeName = "Overflow",
+            DumpGenerator = config.StackOverflowCreatesDump ? SOSRunner.DumpGenerator.CreateDump : SOSRunner.DumpGenerator.NativeDebugger
+        });
     }
 
     [SkippableTheory, MemberData(nameof(Configurations))]
     public async Task Reflection(TestConfiguration config)
     {
-        await RunTest(config, "ReflectionTest", "Reflection.script");
+        await RunTest(config, "ReflectionTest", "Reflection.script", testTriage: true);
     }
 
     [SkippableTheory, MemberData(nameof(Configurations))]
     public async Task SimpleThrow(TestConfiguration config)
     {
-        await RunTest(config, "SimpleThrow", "SimpleThrow.script");
+        await RunTest(config, "SimpleThrow", "SimpleThrow.script", testTriage: true);
     }
 
     [SkippableTheory, MemberData(nameof(Configurations))]
     public async Task NestedExceptionTest(TestConfiguration config)
     {
-        await RunTest(config, "NestedExceptionTest", "NestedExceptionTest.script");
+        await RunTest(config, "NestedExceptionTest", "NestedExceptionTest.script", testTriage: true);
     }
 
     [SkippableTheory, MemberData(nameof(Configurations))]
     public async Task TaskNestedException(TestConfiguration config)
     {
-        await RunTest(config, "TaskNestedException", "TaskNestedException.script");
+        await RunTest(config, "TaskNestedException", "TaskNestedException.script", testTriage: true);
     }
 
     [SkippableTheory, MemberData(nameof(Configurations))]
     public async Task StackTests(TestConfiguration config)
     {
-        await RunTest(config, "SOS.StackTests", "NestedExceptionTest", "StackTests.script");
+        await RunTest(config, "NestedExceptionTest", "StackTests.script", testName: "SOS.StackTests");
     }
 
     [SkippableTheory, MemberData(nameof(Configurations))]
+    public async Task OtherCommands(TestConfiguration config)
+    {
+        // This debuggee needs the directory of the exes/dlls to load the SymbolTestDll assembly.
+        await RunTest("OtherCommands.script", information: new SOSRunner.TestInformation {
+            TestConfiguration = config,
+            TestName = "SOS.OtherCommands",
+            DebuggeeName = "SymbolTestApp",
+            DebuggeeArguments = "%DEBUG_ROOT%",
+        });
+    }
+
+    [SkippableTheory, MemberData(nameof(GetConfigurations), "TestName", "SOS.StackAndOtherTests")]
     public async Task StackAndOtherTests(TestConfiguration config)
     {
-        if (config.RuntimeFrameworkVersionMajor == 1)
-        {
-            throw new SkipTestException("The debuggee (SymbolTestApp) doesn't work on .NET Core 1.1 because of a AssemblyLoadContext problem");
-        }
         foreach (TestConfiguration currentConfig in TestRunner.EnumeratePdbTypeConfigs(config))
         {
             // This debuggee needs the directory of the exes/dlls to load the SymbolTestDll assembly.
-            await RunTest(currentConfig, "SOS.StackAndOtherTests", "SymbolTestApp", "StackAndOtherTests.script", debuggeeArguments: "%DEBUG_ROOT%");
+            await RunTest("StackAndOtherTests.script", information: new SOSRunner.TestInformation {
+                TestConfiguration = currentConfig,
+                TestName = "SOS.StackAndOtherTests",
+                DebuggeeName = "SymbolTestApp",
+                DebuggeeArguments = "%DEBUG_ROOT%",
+            });
+        }
+    }
+
+    [SkippableTheory, MemberData(nameof(GetConfigurations), "TestName", "SOS.WebApp")]
+    public async Task WebApp(TestConfiguration config)
+    {
+        await RunTest("WebApp.script", testLive: false, information: new SOSRunner.TestInformation {
+            TestConfiguration = config,
+            DebuggeeName = "WebApp",
+            UsePipeSync = true,
+            DumpGenerator = SOSRunner.DumpGenerator.DotNetDump
+        });
+    }
+
+    [SkippableTheory, MemberData(nameof(GetConfigurations), "TestName", "SOS.WebApp3")]
+    public async Task WebApp3(TestConfiguration config)
+    {
+        await RunTest("WebApp.script", testLive: false, information: new SOSRunner.TestInformation {
+            TestConfiguration = config,
+            DebuggeeName = "WebApp3",
+            UsePipeSync = true,
+            DumpGenerator = SOSRunner.DumpGenerator.DotNetDump
+        });
+    }
+
+    [SkippableTheory, MemberData(nameof(Configurations))]
+    public async Task LLDBPluginTests(TestConfiguration config)
+    {
+        if (OS.Kind == OSKind.Windows || config.IsDesktop || config.RuntimeFrameworkVersionMajor == 1 || SOSRunner.IsAlpine())
+        {
+            throw new SkipTestException("lldb plugin tests not supported on Windows, Alpine Linux or .NET Core 1.1");
+        }
+        string testName = "SOS." + nameof(LLDBPluginTests);
+        TestRunner.OutputHelper outputHelper = null;
+        try
+        {
+            // Setup the logging from the options in the config file
+            outputHelper = TestRunner.ConfigureLogging(config, Output, testName);
+
+            outputHelper.WriteLine("Starting {0}", testName);
+            outputHelper.WriteLine("{");
+
+            string program = "/usr/bin/python";
+            if (!File.Exists(program))
+            {
+                throw new ArgumentException($"{program} does not exists");
+            }
+            var arguments = new StringBuilder();
+            string repoRootDir = TestConfiguration.MakeCanonicalPath(config.AllSettings["RepoRootDir"]);
+
+            // Get test python script path
+            string scriptDir = Path.Combine(repoRootDir, "src", "SOS", "lldbplugin.tests");
+            arguments.Append(Path.Combine(scriptDir, "test_libsosplugin.py"));
+            arguments.Append(" ");
+            
+            // Get lldb path
+            arguments.AppendFormat("--lldb {0} ", Environment.GetEnvironmentVariable("LLDB_PATH") ?? throw new ArgumentException("LLDB_PATH environment variable not set"));
+
+            // Add dotnet host program and arguments
+            arguments.Append("--host \"");
+            arguments.Append(config.HostExe);
+            arguments.Append(" ");
+            if (!string.IsNullOrWhiteSpace(config.HostArgs))
+            {
+                arguments.Append(config.HostArgs);
+                arguments.Append(" ");
+            }
+            arguments.Append("\" ");
+
+            // Add lldb plugin path
+            arguments.AppendFormat("--plugin {0} ", config.SOSPath() ?? throw new ArgumentException("SOSPath config not set"));
+
+            // Add log directory
+            string logFileDir = Path.Combine(config.LogDirPath, config.RuntimeFrameworkVersion);
+            Directory.CreateDirectory(logFileDir);
+            arguments.AppendFormat("--logfiledir {0} ", logFileDir);
+
+            // Add test debuggee assembly
+            string testDebuggee = Path.Combine(repoRootDir, "artifacts", "bin", "TestDebuggee", config.TargetConfiguration, config.BuildProjectFramework, "TestDebuggee.dll");
+            arguments.AppendFormat("--assembly {0}", testDebuggee);
+
+            // Create the python script process runner
+            ProcessRunner processRunner = new ProcessRunner(program, arguments.ToString()).
+                WithLog(new TestRunner.TestLogger(outputHelper.IndentedOutput)).
+                WithTimeout(TimeSpan.FromMinutes(5)).
+                WithExpectedExitCode(0).
+                WithWorkingDirectory(scriptDir).
+                // Turn on stress logging so the dumplog and histinit commands pass
+                WithEnvironmentVariable("COMPlus_LogFacility", "0xffffffbf").
+                WithEnvironmentVariable("COMPlus_LogLevel", "6").
+                WithEnvironmentVariable("COMPlus_StressLog", "1").
+                WithEnvironmentVariable("COMPlus_StressLogSize", "65536");
+
+            // Start the process runner
+            processRunner.Start();
+
+            // Wait for the debuggee to finish
+            await processRunner.WaitForExit();
+        }
+        catch (Exception ex)
+        {
+            // Log the exception
+            outputHelper?.WriteLine(ex.ToString());
+            throw;
+        }
+        finally
+        {
+            outputHelper?.WriteLine("}");
+            outputHelper?.Dispose();
         }
     }
 }
index 24205b8fe444d734f59d008212b3116530e0adee..52fa87c27c8e331aacbf70d45d3cfbabe10f2df9 100644 (file)
@@ -5,7 +5,9 @@
 using Microsoft.Diagnostics.TestHelpers;
 using System;
 using System.Collections.Generic;
+using System.Diagnostics;
 using System.IO;
+using System.IO.Pipes;
 using System.Linq;
 using System.Text;
 using System.Text.RegularExpressions;
@@ -16,24 +18,40 @@ using Xunit.Extensions;
 
 public class SOSRunner : IDisposable
 {
-    readonly TestConfiguration _config;
-    readonly TestRunner.OutputHelper _outputHelper;
-    readonly Dictionary<string, string> _variables;
-    readonly ScriptLogger _scriptLogger;
-    readonly ProcessRunner _processRunner;
-    readonly bool _isDump;
+    /// <summary>
+    /// What to use to generate the dump
+    /// </summary>
+    public enum DumpGenerator
+    {
+        NativeDebugger,
+        CreateDump,
+        DotNetDump,
+    }
 
-    string _lastCommandOutput;
-    string _previousCommandCapture;
+    /// <summary>
+    /// Dump type
+    /// </summary>
+    public enum DumpType
+    {
+        Triage,
+        Heap,
+        Full
+    }
 
-    public enum Options
+    /// <summary>
+    /// What action should the debugger do
+    /// </summary>
+    public enum DebuggerAction
     {
-        None,
+        Live,
         GenerateDump,
         LoadDump,
         LoadDumpWithDotNetDump,
     }
 
+    /// <summary>
+    /// Which debugger to use
+    /// </summary>
     public enum NativeDebugger
     {
         Unknown,
@@ -43,6 +61,39 @@ public class SOSRunner : IDisposable
         DotNetDump,
     }
 
+    /// <summary>
+    /// SOS test runner config information
+    /// </summary>
+    public class TestInformation
+    {
+        private string _testName;
+
+        public TestConfiguration TestConfiguration { get; set; }
+
+        public ITestOutputHelper OutputHelper { get; set; }
+
+        public string TestName
+        { 
+            get { return _testName ?? "SOS." + DebuggeeName; }
+            set { _testName = value; }
+        }
+
+        public string DebuggeeName { get; set; }
+
+        public string DebuggeeArguments { get; set; }
+
+        public DumpGenerator DumpGenerator { get; set; } = DumpGenerator.CreateDump;
+
+        public DumpType DumpType { get; set; } = DumpType.Heap;
+
+        public bool UsePipeSync { get; set; } = false;
+
+        public bool IsValid()
+        {
+            return TestConfiguration != null && OutputHelper != null && DebuggeeName != null;
+        }
+    }
+
     public const string HexValueRegEx = "[A-Fa-f0-9]+(`[A-Fa-f0-9]+)?";
     public const string DecValueRegEx = "[0-9]+(`[0-9]+)?";
 
@@ -53,8 +104,18 @@ public class SOSRunner : IDisposable
         get { return Debugger.ToString().ToUpperInvariant(); }
     }
 
-    private SOSRunner(NativeDebugger debugger, TestConfiguration config, TestRunner.OutputHelper outputHelper, 
-        Dictionary<string, string> variables, ScriptLogger scriptLogger, ProcessRunner processRunner, bool isDump)
+    readonly TestConfiguration _config;
+    readonly TestRunner.OutputHelper _outputHelper;
+    readonly Dictionary<string, string> _variables;
+    readonly ScriptLogger _scriptLogger;
+    readonly ProcessRunner _processRunner;
+    readonly DumpType? _dumpType;
+
+    string _lastCommandOutput;
+    string _previousCommandCapture;
+
+    private SOSRunner(NativeDebugger debugger, TestConfiguration config, TestRunner.OutputHelper outputHelper, Dictionary<string, string> variables, 
+        ScriptLogger scriptLogger, ProcessRunner processRunner, DumpType? dumpType)
     {
         Debugger = debugger;
         _config = config;
@@ -62,73 +123,96 @@ public class SOSRunner : IDisposable
         _variables = variables;
         _scriptLogger = scriptLogger;
         _processRunner = processRunner;
-        _isDump = isDump;
+        _dumpType = dumpType;
     }
 
     /// <summary>
     /// Run a debuggee and create a dump.
     /// </summary>
-    /// <param name="config">test configuration</param>
-    /// <param name="output">output instance</param>
-    /// <param name="testName">name of test</param>
-    /// <param name="debuggeeName">debuggee name</param>
-    /// <param name="debuggeeArguments">optional args to pass to debuggee</param>
-    /// <param name="useCreateDump">if true, use "createdump" to generate core dump</param>
-    public static async Task CreateDump(TestConfiguration config, ITestOutputHelper output, string testName, string debuggeeName, 
-        string debuggeeArguments = null, bool useCreateDump = true)
+    /// <param name="information">test info</param>
+    public static async Task CreateDump(TestInformation information)
     {
+        if (!information.IsValid()) {
+            throw new ArgumentException("Invalid TestInformation");
+        }
+        TestConfiguration config = information.TestConfiguration;
+        DumpGenerator dumpGeneration = information.DumpGenerator;
+
         Directory.CreateDirectory(config.DebuggeeDumpOutputRootDir());
 
-        if (!config.CreateDumpExists || !useCreateDump || config.GenerateDumpWithLLDB() || config.GenerateDumpWithGDB())
+        if (dumpGeneration == DumpGenerator.CreateDump)
         {
-            using (SOSRunner runner = await SOSRunner.StartDebugger(config, output, testName, debuggeeName, debuggeeArguments, Options.GenerateDump))
+            if (!config.CreateDumpExists || config.GenerateDumpWithLLDB() || config.GenerateDumpWithGDB())
             {
-                try
-                {
-                    await runner.LoadSosExtension();
+                dumpGeneration = DumpGenerator.NativeDebugger;
+            }
+        }
 
-                    string command = null;
-                    switch (runner.Debugger)
-                    {
-                        case SOSRunner.NativeDebugger.Cdb:
-                            await runner.ContinueExecution();
-                            // On desktop create triage dump. On .NET Core, create full dump.
-                            command = config.IsDesktop ? ".dump /o /mshuRp %DUMP_NAME%" : ".dump /o /ma %DUMP_NAME%";
-                            break;
-                        case SOSRunner.NativeDebugger.Gdb:
-                            command = "generate-core-file %DUMP_NAME%";
-                            break;
-                        case SOSRunner.NativeDebugger.Lldb:
-                            await runner.ContinueExecution();
-                            command = "sos CreateDump %DUMP_NAME%";
-                            break;
-                        default:
-                            throw new Exception(runner.Debugger.ToString() + " does not support creating dumps");
-                    }
+        if (dumpGeneration == DumpGenerator.NativeDebugger)
+        {
+            // Force the dump type to full for .NET Core 1.1 because the heap dumps are broken (can't read ThreadStore).
+            if (config.IsNETCore && config.RuntimeFrameworkVersionMajor == 1)
+            {
+                information.DumpType = DumpType.Full;
+            }
+            using SOSRunner runner = await SOSRunner.StartDebugger(information, DebuggerAction.GenerateDump);
+            try
+            {
+                await runner.LoadSosExtension();
 
-                    await runner.RunCommand(command);
-                    await runner.QuitDebugger();
-                }
-                catch (Exception ex)
+                string command = null;
+                switch (runner.Debugger)
                 {
-                    runner.WriteLine(ex.ToString());
-                    throw;
+                    case SOSRunner.NativeDebugger.Cdb:
+                        await runner.ContinueExecution();
+                        switch (information.DumpType)
+                        {
+                            case DumpType.Heap:
+                                command = ".dump /o /mw %DUMP_NAME%";
+                                break;
+                            case DumpType.Triage:
+                                command = ".dump /o /mshuRp %DUMP_NAME%";
+                                break;
+                            case DumpType.Full:
+                                command = ".dump /o /ma %DUMP_NAME%";
+                                break;
+                        }
+                        break;
+                    case SOSRunner.NativeDebugger.Gdb:
+                        command = "generate-core-file %DUMP_NAME%";
+                        break;
+                    default:
+                        throw new Exception(runner.Debugger.ToString() + " does not support creating dumps");
                 }
+
+                await runner.RunCommand(command);
+            }
+            catch (Exception ex)
+            {
+                runner.WriteLine(ex.ToString());
+                throw;
+            }
+            finally
+            {
+                await runner.QuitDebugger();
             }
         }
         else
         {
             TestRunner.OutputHelper outputHelper = null;
+            NamedPipeServerStream pipeServer = null;
+            string pipeName = null;
             try
             {
                 // Setup the logging from the options in the config file
-                outputHelper = TestRunner.ConfigureLogging(config, output, testName);
+                outputHelper = TestRunner.ConfigureLogging(config, information.OutputHelper, information.TestName);
 
                 // Restore and build the debuggee. The debuggee name is lower cased because the 
                 // source directory name has been lowercased by the build system.
-                DebuggeeConfiguration debuggeeConfig = await DebuggeeCompiler.Execute(config, debuggeeName, outputHelper);
+                DebuggeeConfiguration debuggeeConfig = await DebuggeeCompiler.Execute(config, information.DebuggeeName, outputHelper);
+                Dictionary<string, string> variables = GenerateVariables(information, debuggeeConfig, DebuggerAction.GenerateDump);
 
-                outputHelper.WriteLine("Starting {0}", testName);
+                outputHelper.WriteLine("Starting {0}", information.TestName);
                 outputHelper.WriteLine("{");
 
                 // Get the full debuggee launch command line (includes the host if required)
@@ -144,29 +228,102 @@ public class SOSRunner : IDisposable
                     }
                     arguments.Append(debuggeeConfig.BinaryExePath);
                 }
-                if (!string.IsNullOrWhiteSpace(debuggeeArguments))
+                if (!string.IsNullOrWhiteSpace(information.DebuggeeArguments))
+                {
+                    arguments.Append(" ");
+                    arguments.Append(information.DebuggeeArguments);
+                }
+
+                // Setup a pipe server for the debuggee to connect to sync when to take a dump
+                if (information.UsePipeSync)
                 {
+                    int runnerId = Process.GetCurrentProcess().Id;
+                    pipeName = $"SOSRunner.{runnerId}.{information.DebuggeeName}";
+                    pipeServer = new NamedPipeServerStream(pipeName);
                     arguments.Append(" ");
-                    arguments.Append(debuggeeArguments);
+                    arguments.Append(pipeName);
                 }
 
-                // Run the debuggee with the createdump environment variables set to generate a coredump on unhandled exception
-                var testLogger = new TestRunner.TestLogger(outputHelper.IndentedOutput);
-                var variables = GenerateVariables(config, debuggeeConfig, Options.GenerateDump);
+                // Create the debuggee process runner
                 ProcessRunner processRunner = new ProcessRunner(exePath, ReplaceVariables(variables, arguments.ToString())).
-                    WithLog(testLogger).
-                    WithTimeout(TimeSpan.FromMinutes(5)).
-                    WithEnvironmentVariable("COMPlus_DbgEnableMiniDump", "1").
-                    WithEnvironmentVariable("COMPlus_DbgMiniDumpName", ReplaceVariables(variables,"%DUMP_NAME%"));
+                    WithLog(new TestRunner.TestLogger(outputHelper.IndentedOutput)).
+                    WithTimeout(TimeSpan.FromMinutes(5));
 
-                // Exit codes on Windows should always be 0, but not on Linux/OSX for the faulting test apps.
-                if (OS.Kind == OSKind.Windows)
+                if (dumpGeneration == DumpGenerator.CreateDump)
                 {
-                    processRunner.WithExpectedExitCode(0);
+                    if (OS.Kind != OSKind.Linux)
+                    {
+                        throw new SkipTestException("Createdump doesn't exists on Windows or macOS");
+                    }
+                    // Run the debuggee with the createdump environment variables set to generate a coredump on unhandled exception
+                    processRunner.
+                        WithEnvironmentVariable("COMPlus_DbgEnableMiniDump", "1").
+                        WithEnvironmentVariable("COMPlus_DbgMiniDumpName", ReplaceVariables(variables, "%DUMP_NAME%"));
+
+                    switch (information.DumpType)
+                    {
+                        case DumpType.Heap:
+                            processRunner.WithEnvironmentVariable("COMPlus_DbgMiniDumpType", "2");
+                            break;
+                        case DumpType.Triage:
+                            processRunner.WithEnvironmentVariable("COMPlus_DbgMiniDumpType", "3");
+                            break;
+                        case DumpType.Full:
+                            processRunner.WithEnvironmentVariable("COMPlus_DbgMiniDumpType", "4");
+                            break;
+                    }
                 }
 
+                // Start the debuggee
                 processRunner.Start();
 
+                if (dumpGeneration == DumpGenerator.DotNetDump)
+                {
+                    ITestOutputHelper dotnetDumpOutputHelper = new IndentedTestOutputHelper(outputHelper, "        ");
+                    try
+                    {
+                        if (string.IsNullOrWhiteSpace(config.HostExe) || string.IsNullOrWhiteSpace(config.DotNetDumpPath()))
+                        {
+                            throw new SkipTestException("dotnet-dump collect needs HostExe and DotNetDumpPath config variables");
+                        }
+
+                        // Wait until the debuggee gets started. It needs time to spin up before generating the core dump.
+                        if (pipeServer != null)
+                        {
+                            dotnetDumpOutputHelper.WriteLine("Waiting for connection on pipe {0}", pipeName);
+                            var source = new CancellationTokenSource(TimeSpan.FromMinutes(5));
+                            await pipeServer.WaitForConnectionAsync(source.Token);
+                        }
+
+                        // Start dotnet-dump collect
+                        var dotnetDumpArguments = new StringBuilder();
+                        dotnetDumpArguments.Append(config.DotNetDumpPath());
+                        dotnetDumpArguments.AppendFormat(" collect --process-id {0} --output %DUMP_NAME%", processRunner.ProcessId);
+
+                        ProcessRunner dotnetDumpRunner = new ProcessRunner(config.HostExe, ReplaceVariables(variables, dotnetDumpArguments.ToString())).
+                            WithLog(new TestRunner.TestLogger(dotnetDumpOutputHelper)).
+                            WithTimeout(TimeSpan.FromMinutes(5)).
+                            WithExpectedExitCode(0);
+
+                        dotnetDumpRunner.Start();
+
+                        // Wait until dotnet-dump collect finishes generating the dump
+                        await dotnetDumpRunner.WaitForExit();
+                    }
+                    catch (Exception ex)
+                    {
+                        // Log the exception
+                        dotnetDumpOutputHelper.WriteLine(ex.ToString());
+                    }
+                    finally
+                    {
+                        dotnetDumpOutputHelper.WriteLine("}");
+
+                        // Shutdown the debuggee
+                        processRunner.Kill();
+                    }
+                }
+
                 // Wait for the debuggee to finish
                 await processRunner.WaitForExit();
             }
@@ -180,6 +337,7 @@ public class SOSRunner : IDisposable
             {
                 outputHelper?.WriteLine("}");
                 outputHelper?.Dispose();
+                pipeServer?.Dispose();
             }
         }
     }
@@ -187,40 +345,40 @@ public class SOSRunner : IDisposable
     /// <summary>
     /// Start a debuggee under a native debugger returning a sos runner instance.
     /// </summary>
-    /// <param name="config">test configuration</param>
-    /// <param name="output">output instance</param>
-    /// <param name="testName">name of test</param>
-    /// <param name="debuggeeName">debuggee name</param>
-    /// <param name="debuggeeArguments">optional args to pass to debuggee</param>
-    /// <param name="options">dump options</param>
+    /// <param name="information">test info</param>
+    /// <param name="action">debugger action</param>
     /// <returns>sos runner instance</returns>
-    public static async Task<SOSRunner> StartDebugger(TestConfiguration config, ITestOutputHelper output, string testName, string debuggeeName, 
-        string debuggeeArguments = null, Options options = Options.None)
+    public static async Task<SOSRunner> StartDebugger(TestInformation information, DebuggerAction action)
     {
+        if (!information.IsValid())
+        {
+            throw new ArgumentException("Invalid TestInformation");
+        }
+        TestConfiguration config = information.TestConfiguration;
         TestRunner.OutputHelper outputHelper = null;
         SOSRunner sosRunner = null;
 
-        // Figure out which native debugger to use
-        NativeDebugger debugger = GetNativeDebuggerToUse(config, options);
-
         try
         {
             // Setup the logging from the options in the config file
-            outputHelper = TestRunner.ConfigureLogging(config, output, testName);
+            outputHelper = TestRunner.ConfigureLogging(config, information.OutputHelper, information.TestName);
+
+            // Figure out which native debugger to use
+            NativeDebugger debugger = GetNativeDebuggerToUse(config, action);
 
             // Restore and build the debuggee.
-            DebuggeeConfiguration debuggeeConfig = await DebuggeeCompiler.Execute(config, debuggeeName, outputHelper);
+            DebuggeeConfiguration debuggeeConfig = await DebuggeeCompiler.Execute(config, information.DebuggeeName, outputHelper);
 
-            outputHelper.WriteLine("SOSRunner processing {0}", testName);
+            outputHelper.WriteLine("SOSRunner processing {0}", information.TestName);
             outputHelper.WriteLine("{");
 
-            var variables = GenerateVariables(config, debuggeeConfig, options);
-            var scriptLogger = new ScriptLogger(debugger, outputHelper.IndentedOutput);
+            var variables = GenerateVariables(information, debuggeeConfig, action);
+            var scriptLogger = new ScriptLogger(outputHelper.IndentedOutput);
 
-            if (options == Options.LoadDump || options == Options.LoadDumpWithDotNetDump)
+            // Make sure the dump file exists
+            if (action == DebuggerAction.LoadDump || action == DebuggerAction.LoadDumpWithDotNetDump)
             {
-                if (!variables.TryGetValue("%DUMP_NAME%", out string dumpName) || !File.Exists(dumpName))
-                {
+                if (!variables.TryGetValue("%DUMP_NAME%", out string dumpName) || !File.Exists(dumpName)) {
                     throw new FileNotFoundException($"Dump file does not exist: {dumpName ?? ""}");
                 }
             }
@@ -238,10 +396,10 @@ public class SOSRunner : IDisposable
                 }
             }
             debuggeeCommandLine.Append(debuggeeConfig.BinaryExePath);
-            if (!string.IsNullOrWhiteSpace(debuggeeArguments))
+            if (!string.IsNullOrWhiteSpace(information.DebuggeeArguments))
             {
                 debuggeeCommandLine.Append(" ");
-                debuggeeCommandLine.Append(debuggeeArguments);
+                debuggeeCommandLine.Append(information.DebuggeeArguments);
             }
 
             // Get the native debugger path
@@ -265,7 +423,7 @@ public class SOSRunner : IDisposable
                     }
                     arguments.AppendFormat(@"-c "".load {0}""", helperExtension);
 
-                    if (options == Options.LoadDump)
+                    if (action == DebuggerAction.LoadDump)
                     {
                         arguments.Append(" -z %DUMP_NAME%");
                     }
@@ -287,8 +445,10 @@ public class SOSRunner : IDisposable
                         initialCommands.Add(".sympath+ " + runtimeSymbolsPath);
                     }
                     // Turn off warnings that can happen in the middle of a command's output
-                    initialCommands.Add(".outmask- 4");
+                    initialCommands.Add(".outmask- 0x244");
+                    initialCommands.Add("!sym quiet");
                     break;
+
                 case NativeDebugger.Lldb:
                     // Get the lldb python script file path necessary to capture the output of commands
                     // by printing a prompt after all the command output is printed.
@@ -300,7 +460,7 @@ public class SOSRunner : IDisposable
                     arguments.AppendFormat(@"--no-lldbinit -o ""settings set interpreter.prompt-on-quit false"" -o ""command script import {0}"" -o ""version""", lldbHelperScript);
 
                     // Load the dump or launch the debuggee process
-                    if (options == Options.LoadDump)
+                    if (action == DebuggerAction.LoadDump)
                     {
                         initialCommands.Add($@"target create --core ""%DUMP_NAME%"" ""{config.HostExe}""");
                     }
@@ -316,9 +476,9 @@ public class SOSRunner : IDisposable
                             }
                         }
                         sb.AppendFormat(@" ""{0}""", debuggeeConfig.BinaryExePath);
-                        if (!string.IsNullOrWhiteSpace(debuggeeArguments))
+                        if (!string.IsNullOrWhiteSpace(information.DebuggeeArguments))
                         {
-                            string[] args = ReplaceVariables(variables, debuggeeArguments).Trim().Split(' ');
+                            string[] args = ReplaceVariables(variables, information.DebuggeeArguments).Trim().Split(' ');
                             foreach (string arg in args)
                             {
                                 sb.AppendFormat(@" ""{0}""", arg);
@@ -341,12 +501,15 @@ public class SOSRunner : IDisposable
                         initialCommands.Add("process handle -s true -n true -p true SIGABRT");
                     }
                     break;
+
                 case NativeDebugger.Gdb:
-                    if (options == Options.LoadDump || options == Options.LoadDumpWithDotNetDump)
+                    if (action == DebuggerAction.LoadDump || action == DebuggerAction.LoadDumpWithDotNetDump)
                     {
                         throw new ArgumentException("GDB not meant for loading core dumps");
                     }
-                    arguments.AppendFormat("--args {0}", debuggeeCommandLine);
+
+                    arguments.Append(@"--init-eval-command=""set prompt <END_COMMAND_OUTPUT>\n""");
+                    arguments.AppendFormat(" --args {0}", debuggeeCommandLine);
 
                     // .NET Core 1.1 or less don't catch stack overflow and abort so need to catch SIGSEGV 
                     if (config.StackOverflowSIGSEGV)
@@ -365,14 +528,16 @@ public class SOSRunner : IDisposable
                     break;
 
                 case NativeDebugger.DotNetDump:
-                    if (options != Options.LoadDumpWithDotNetDump)
+                    if (action != DebuggerAction.LoadDumpWithDotNetDump)
                     {
-                        throw new ArgumentException($"{options} not supported for dotnet-dump testing");
+                        throw new ArgumentException($"{action} not supported for dotnet-dump testing");
                     }
                     if (string.IsNullOrWhiteSpace(config.HostExe))
                     {
                         throw new ArgumentException("No HostExe in configuration");
                     }
+                    initialCommands.Add("setsymbolserver -directory %DEBUG_ROOT%");
+
                     arguments.Append(debuggerPath);
                     arguments.Append(@" analyze %DUMP_NAME%");
                     debuggerPath = config.HostExe;
@@ -384,14 +549,20 @@ public class SOSRunner : IDisposable
                 WithLog(scriptLogger).
                 WithTimeout(TimeSpan.FromMinutes(10));
 
-            // Exit codes on Windows should always be 0, but not on Linux/OSX for the faulting test apps.
+            // Exit codes on Windows should always be 0, but not on Linux/OSX for the faulting debuggees.
             if (OS.Kind == OSKind.Windows)
             {
                 processRunner.WithExpectedExitCode(0);
             }
 
+            DumpType? dumpType = null;
+            if (action == DebuggerAction.LoadDump || action == DebuggerAction.LoadDumpWithDotNetDump)
+            {
+                dumpType = information.DumpType;
+            }
+
             // Create the sos runner instance
-            sosRunner = new SOSRunner(debugger, config, outputHelper, variables, scriptLogger, processRunner, options == Options.LoadDump || options == Options.LoadDumpWithDotNetDump);
+            sosRunner = new SOSRunner(debugger, config, outputHelper, variables, scriptLogger, processRunner, dumpType);
 
             // Start the native debugger
             processRunner.Start();
@@ -500,7 +671,12 @@ public class SOSRunner : IDisposable
                     else if (line.StartsWith("VERIFY:"))
                     {
                         string verifyLine = line.Substring("VERIFY:".Length);
-                        VerifyOutput(verifyLine);
+                        VerifyOutput(verifyLine, match: true);
+                    }
+                    else if (line.StartsWith("!VERIFY:"))
+                    {
+                        string verifyLine = line.Substring("!VERIFY:".Length);
+                        VerifyOutput(verifyLine, match: false);
                     }
                     else
                     {
@@ -542,6 +718,7 @@ public class SOSRunner : IDisposable
         switch (Debugger)
         {
             case NativeDebugger.Cdb:
+                commands.Add($".unload sos.dll");
                 commands.Add($".load {sosPath}");
                 commands.Add(".lines");
                 commands.Add(".reload");
@@ -549,6 +726,16 @@ public class SOSRunner : IDisposable
                 {
                     commands.Add($"!SetHostRuntime {sosHostRuntime}");
                 }
+                // Because Windows triage dumps don't have the target coreclr.dll module path the 
+                // fallback of using this target runtime for hosting SOS's managed doesn't work.
+                if (_dumpType.HasValue && _dumpType.Value == DumpType.Triage)
+                {
+                    string hostRuntimeDir = _config.HostRuntimeDir();
+                    if (hostRuntimeDir != null)
+                    {
+                        commands.Add($"!SetHostRuntime {hostRuntimeDir}");
+                    }
+                }
                 break;
             case NativeDebugger.Lldb:
                 commands.Add($"plugin load {sosPath}");
@@ -571,7 +758,8 @@ public class SOSRunner : IDisposable
         // Helper function to switch to the thread with an exception
         void SwitchToExceptionThread()
         {
-            if (_isDump)
+            // If dump session
+            if (_dumpType.HasValue)
             {
                 // lldb/dotnet-dump don't load dump with the initial thread set to one
                 // with the exception. This SOS command looks for a thread with a managed
@@ -583,30 +771,34 @@ public class SOSRunner : IDisposable
 
     public async Task ContinueExecution()
     {
-        string command = null;
-        bool addPrefix = true;
-        switch (Debugger)
-        {
-            case NativeDebugger.Cdb:
-                command = "g";
-                // Don't add the !runcommand prefix because it gets printed when cdb stops
-                // again because the helper extension used .pcmd to set a stop command.
-                addPrefix = false;
-                break;
-            case NativeDebugger.Lldb:
-                command = "process continue";
-                break;
-            case NativeDebugger.Gdb:
-                command = "continue";
-                break;
-            case NativeDebugger.DotNetDump:
-                break;
-        }
-        if (command != null)
+        // If live session
+        if (!_dumpType.HasValue)
         {
-            if (!await RunCommand(command, addPrefix))
+            string command = null;
+            bool addPrefix = true;
+            switch (Debugger)
             {
-                throw new Exception($"'{command}' FAILED");
+                case NativeDebugger.Cdb:
+                    command = "g";
+                    // Don't add the !runcommand prefix because it gets printed when cdb stops
+                    // again because the helper extension used .pcmd to set a stop command.
+                    addPrefix = false;
+                    break;
+                case NativeDebugger.Lldb:
+                    command = "process continue";
+                    break;
+                case NativeDebugger.Gdb:
+                    command = "continue";
+                    break;
+                case NativeDebugger.DotNetDump:
+                    break;
+            }
+            if (command != null)
+            {
+                if (!await RunCommand(command, addPrefix))
+                {
+                    throw new Exception($"'{command}' FAILED");
+                }
             }
         }
     }
@@ -683,7 +875,7 @@ public class SOSRunner : IDisposable
         await _processRunner.WaitForExit();
     }
 
-    public void VerifyOutput(string verifyLine)
+    public void VerifyOutput(string verifyLine, bool match)
     {
         string regex = ReplaceVariables(verifyLine.TrimStart());
 
@@ -691,18 +883,19 @@ public class SOSRunner : IDisposable
         {
             throw new Exception("VerifyOutput: no last command output or debugger exited unexpectedly: " + regex);
         }
-        if (!new Regex(regex, RegexOptions.Multiline).IsMatch(_lastCommandOutput))
+
+        if (new Regex(regex, RegexOptions.Multiline).IsMatch(_lastCommandOutput) != match)
         {
             throw new Exception("Debugger output did not match the expression: " + regex);
         }
     }
 
-    public static string GenerateDumpFileName(TestConfiguration config, string debuggeeName, Options options)
+    public static string GenerateDumpFileName(TestInformation information, string debuggeeName, DebuggerAction action)
     {
-        string dumpRoot = options == Options.GenerateDump ? config.DebuggeeDumpOutputRootDir() : config.DebuggeeDumpInputRootDir();
-        if (dumpRoot != null)
-        {
-            return Path.Combine(dumpRoot, Path.GetFileNameWithoutExtension(debuggeeName) + ".dmp");
+        TestConfiguration config = information.TestConfiguration;
+        string dumpRoot = action == DebuggerAction.GenerateDump ? config.DebuggeeDumpOutputRootDir() : config.DebuggeeDumpInputRootDir();
+        if (!string.IsNullOrEmpty(dumpRoot)) {
+            return Path.Combine(dumpRoot, Path.GetFileNameWithoutExtension(debuggeeName) + "." + information.DumpType.ToString() + ".dmp");
         }
         return null;
     }
@@ -723,8 +916,6 @@ public class SOSRunner : IDisposable
         {
             _processRunner.Kill();
         }
-        _processRunner.WaitForExit().GetAwaiter().GetResult();
-
         _outputHelper.WriteLine("}");
         _outputHelper.Dispose();
     }
@@ -745,13 +936,13 @@ public class SOSRunner : IDisposable
         return false;
     }
 
-    private static NativeDebugger GetNativeDebuggerToUse(TestConfiguration config, Options options)
+    private static NativeDebugger GetNativeDebuggerToUse(TestConfiguration config, DebuggerAction action)
     {
         switch (OS.Kind)
         {
             case OSKind.Windows:
-                switch (options) {
-                    case Options.LoadDumpWithDotNetDump:
+                switch (action) {
+                    case DebuggerAction.LoadDumpWithDotNetDump:
                         return NativeDebugger.DotNetDump;
                     default:
                         return NativeDebugger.Cdb;
@@ -759,17 +950,17 @@ public class SOSRunner : IDisposable
 
             case OSKind.Linux:
             case OSKind.OSX:
-                switch (options) {
-                    case Options.GenerateDump: 
+                switch (action) {
+                    case DebuggerAction.GenerateDump: 
                         return config.GenerateDumpWithLLDB() ? NativeDebugger.Lldb : NativeDebugger.Gdb;
-                    case Options.LoadDumpWithDotNetDump:
+                    case DebuggerAction.LoadDumpWithDotNetDump:
                         return NativeDebugger.DotNetDump;
                     default:
                         return NativeDebugger.Lldb;
                 }
 
             default:
-                throw new Exception(OS.Kind.ToString() + " not supported");
+                throw new PlatformNotSupportedException(OS.Kind.ToString() + " not supported");
         }
     }
 
@@ -852,7 +1043,7 @@ public class SOSRunner : IDisposable
         string command = ReplaceVariables(input);
         if (addPrefix)
         {
-            command = _scriptLogger.ProcessCommand(command);
+            command = ProcessCommand(command);
         }
         _processRunner.StandardInputWriteLine(command);
 
@@ -862,6 +1053,21 @@ public class SOSRunner : IDisposable
         return result.CommandSucceeded;
     }
 
+    private string ProcessCommand(string command)
+    {
+        switch (Debugger)
+        {
+            case NativeDebugger.Cdb:
+                command = string.Format("!runcommand {0}", command);
+                break;
+
+            case NativeDebugger.Lldb:
+                command = string.Format("runcommand {0}", command);
+                break;
+        }
+        return command;
+    }
+
     private void LogProcessingReproInfo(string scriptFile, HashSet<string> enabledDefines)
     {
         WriteLine("    STARTING SCRIPT: {0}", scriptFile);
@@ -882,7 +1088,7 @@ public class SOSRunner : IDisposable
             DebuggerToString,
             OS.Kind.ToString().ToUpperInvariant(),
             _config.TestProduct.ToUpperInvariant(),
-            _config.TargetArchitecture.ToUpperInvariant(),
+            _config.TargetArchitecture.ToUpperInvariant()
         };
         try
         {
@@ -891,8 +1097,20 @@ public class SOSRunner : IDisposable
         catch (SkipTestException)
         {
         }
-        if (_isDump)
+        if (_dumpType.HasValue)
         {
+            switch (_dumpType.Value)
+            {
+                case DumpType.Triage:
+                    defines.Add("TRIAGE_DUMP");
+                    break;
+                case DumpType.Heap:
+                    defines.Add("HEAP_DUMP");
+                    break;
+                case DumpType.Full:
+                    defines.Add("FULL_DUMP");
+                    break;
+            }
             defines.Add("DUMP");
         }
         else
@@ -931,11 +1149,11 @@ public class SOSRunner : IDisposable
         return true;
     }
 
-    private static Dictionary<string, string> GenerateVariables(TestConfiguration config, DebuggeeConfiguration debuggeeConfig, Options options)
+    private static Dictionary<string, string> GenerateVariables(TestInformation information, DebuggeeConfiguration debuggeeConfig, DebuggerAction action)
     {
         var vars = new Dictionary<string, string>();
         string debuggeeExe = debuggeeConfig.BinaryExePath;
-        string dumpFileName = GenerateDumpFileName(config, Path.GetFileNameWithoutExtension(debuggeeExe), options);
+        string dumpFileName = GenerateDumpFileName(information, debuggeeExe, action);
 
         vars.Add("%DEBUGGEE_EXE%", debuggeeExe);
         if (dumpFileName != null)
@@ -943,7 +1161,7 @@ public class SOSRunner : IDisposable
             vars.Add("%DUMP_NAME%", dumpFileName);
         }
         vars.Add("%DEBUG_ROOT%", debuggeeConfig.BinaryDirPath);
-        vars.Add("%SOS_PATH%", config.SOSPath());
+        vars.Add("%SOS_PATH%", information.TestConfiguration.SOSPath());
 
         // Can be used in an RegEx expression
         vars.Add("<DEBUGGEE_EXE>", debuggeeExe.Replace(@"\", @"\\"));
@@ -986,19 +1204,19 @@ public class SOSRunner : IDisposable
             }
         }
 
-        readonly NativeDebugger _debugger;
         readonly List<Task<CommandResult>> _taskQueue;
+        readonly StringBuilder _lineBuffer;
         readonly StringBuilder _lastCommandOutput;
         TaskCompletionSource<CommandResult> _taskSource;
 
         public bool HasProcessExited { get; private set; }
 
-        public ScriptLogger(NativeDebugger debugger, ITestOutputHelper output)
+        public ScriptLogger(ITestOutputHelper output)
             : base(output)
         {
             lock (this)
             {
-                _debugger = debugger;
+                _lineBuffer = new StringBuilder();
                 _lastCommandOutput = new StringBuilder();
                 _taskQueue = new List<Task<CommandResult>>();
                 AddTask();
@@ -1032,21 +1250,6 @@ public class SOSRunner : IDisposable
             return currentTask;
         }
 
-        public string ProcessCommand(string command)
-        {
-            switch (_debugger)
-            {
-                case NativeDebugger.Cdb:
-                    command = string.Format("!runcommand {0}", command);
-                    break;
-
-                case NativeDebugger.Lldb:
-                    command = string.Format("runcommand {0}", command);
-                    break;
-            }
-            return command;
-        }
-
         public override void Write(ProcessRunner runner, string data, ProcessStream stream)
         {
             lock (this)
@@ -1054,38 +1257,14 @@ public class SOSRunner : IDisposable
                 base.Write(runner, data, stream);
                 if (stream == ProcessStream.StandardOut)
                 {
-                    _lastCommandOutput.Append(data);
-
-                    string lastCommandOutput = _lastCommandOutput.ToString();
-                    bool commandError = false;
-                    bool commandEnd = false;
-
-                    switch (_debugger)
-                    {
-                        case NativeDebugger.Cdb:
-                        case NativeDebugger.Lldb:
-                        case NativeDebugger.DotNetDump:
-                            commandError = lastCommandOutput.EndsWith("<END_COMMAND_ERROR>");
-                            commandEnd = commandError || lastCommandOutput.EndsWith("<END_COMMAND_OUTPUT>");
-                            break;
-                        case NativeDebugger.Gdb:
-                            commandEnd = lastCommandOutput.EndsWith("(gdb) ");
-                            break;
-                        default:
-                            throw new Exception("Debugger prompt not supported");
-                    }
-
-                    if (commandEnd)
-                    {
-                        FlushOutput();
-                        _taskSource.TrySetResult(new CommandResult(lastCommandOutput, !commandError));
-                        _lastCommandOutput.Clear();
-                        AddTask();
-                    }
+                    _lineBuffer.Append(data);
                 }
             }
         }
 
+        static readonly string s_endCommandOutput = "<END_COMMAND_OUTPUT>";
+        static readonly string s_endCommandError = "<END_COMMAND_ERROR>";
+
         public override void WriteLine(ProcessRunner runner, string data, ProcessStream stream)
         {
             lock (this)
@@ -1093,7 +1272,25 @@ public class SOSRunner : IDisposable
                 base.WriteLine(runner, data, stream);
                 if (stream == ProcessStream.StandardOut)
                 {
-                    _lastCommandOutput.AppendLine(data);
+                    _lineBuffer.Append(data);
+                    string lineBuffer = _lineBuffer.ToString();
+                    _lineBuffer.Clear();
+
+                    bool commandError = lineBuffer.EndsWith(s_endCommandError);
+                    bool commandEnd = commandError || lineBuffer.EndsWith(s_endCommandOutput);
+                    if (commandEnd)
+                    {
+                        FlushOutput();
+                        _lastCommandOutput.AppendLine();
+                        string lastCommandOutput = _lastCommandOutput.ToString();
+                        _lastCommandOutput.Clear();
+                        _taskSource.TrySetResult(new CommandResult(lastCommandOutput, !commandError));
+                        AddTask();
+                    }
+                    else
+                    {
+                        _lastCommandOutput.AppendLine(lineBuffer);
+                    }
                 }
             }
         }
@@ -1164,6 +1361,11 @@ public static class TestConfigurationExtensions
         return TestConfiguration.MakeCanonicalPath(config.GetValue("SOSHostRuntime"));
     }
 
+    public static string HostRuntimeDir(this TestConfiguration config)
+    {
+        return TestConfiguration.MakeCanonicalPath(config.GetValue("HostRuntimeDir"));
+    }
+
     public static bool GenerateDumpWithLLDB(this TestConfiguration config)
     {
         return config.GetValue("GenerateDumpWithLLDB")?.ToLowerInvariant() == "true";
index 20bdcb40ef5d7b51a8e6c063b9cf039d378d2ded..ac5a6fb71b5a1baac8258ed9d1f3aa53402458c1 100644 (file)
@@ -4,11 +4,9 @@
 # 3) Take a dump of the executable.
 # 4) Open the dump and compare the output
 
-LOADSOS
-
-IFDEF:LIVE
 CONTINUE
-ENDIF:LIVE
+
+LOADSOS
 
 # Verifying that PrintException gives us the right exception in the format above.
 SOSCOMMAND:PrintException
@@ -24,4 +22,29 @@ VERIFY:\s+<HEXVAL>\s+<HEXVAL>\s+[Dd]iv[Zz]ero.*!C\.F3(\(.*\))?\+0x<HEXVAL>\s+
 VERIFY:\s+<HEXVAL>\s+<HEXVAL>\s+[Dd]iv[Zz]ero.*!C\.F2(\(.*\))?\+0x<HEXVAL>\s+
 VERIFY:\s+<HEXVAL>\s+<HEXVAL>\s+[Dd]iv[Zz]ero.*!C\.Main(\(.*\))?\+0x<HEXVAL>\s+
 VERIFY:(StackTraceString: <none>\s+)?\s+
-VERIFY:HResult:\s+80020012\s+
\ No newline at end of file
+VERIFY:HResult:\s+80020012\s+
+
+# Verify that Threads (clrthreads) works
+IFDEF:DOTNETDUMP
+SOSCOMMAND:clrthreads
+ENDIF:DOTNETDUMP
+!IFDEF:DOTNETDUMP
+SOSCOMMAND:Threads
+ENDIF:DOTNETDUMP
+VERIFY:\s*ThreadCount:\s+<DECVAL>\s+
+VERIFY:\s+UnstartedThread:\s+<DECVAL>\s+
+VERIFY:\s+BackgroundThread:\s+<DECVAL>\s+
+VERIFY:\s+PendingThread:\s+<DECVAL>\s+
+VERIFY:\s+DeadThread:\s+<DECVAL>\s+
+VERIFY:\s+Hosted Runtime:\s+no\s+
+VERIFY:\s+ID\s+OSID\s+ThreadOBJ\s+State.*\s+
+VERIFY:\s+<DECVAL>\s+<DECVAL>\s+<HEXVAL>\s+<HEXVAL>.*\s+
+
+# Verify that ClrStack with no options works
+SOSCOMMAND:ClrStack
+VERIFY:.*OS Thread Id:\s+0x<HEXVAL>\s+.*
+VERIFY:\s+Child\s+SP\s+IP\s+Call Site\s+
+VERIFY:\s+<HEXVAL>\s+<HEXVAL>\s+(\*\*\* WARNING: Unable to verify checksum for DivZero.exe\s*)?C\.DivideByZero(\(.*\))?\s+\[(?i:.*[\\|/]DivZero\.cs) @ 12\s*\]\s+
+VERIFY:\s+<HEXVAL>\s+<HEXVAL>\s+C\.F3(\(.*\))?\s+\[(?i:.*[\\|/]DivZero\.cs) @ 21\s*\]\s+
+VERIFY:\s+<HEXVAL>\s+<HEXVAL>\s+C\.F2(\(.*\))?\s+\[(?i:.*[\\|/]DivZero\.cs) @ 33\s*\]\s+
+VERIFY:\s+<HEXVAL>\s+<HEXVAL>\s+C\.Main(\(.*\))?\s+\[(?i:.*[\\|/]DivZero\.cs) @ 54\s*\]\s+
\ No newline at end of file
index 82d4dee684f88fdf5e564de8ebd9b271d1e1df72..d8e97d4484134b9365d65933231344395e810f8c 100644 (file)
@@ -1,14 +1,12 @@
-# Overflow debugging scenario
+# Nested exception debugging scenario
 # 1) load the executable
-# 2) load sos
-# 3) run to the exception
+# 2) run to the exception
+# 3) load sos
 # We are only verifying the main PrintException fields and for the stacktrace, source lines in the program.
 
-LOADSOS
-
-IFDEF:LIVE
 CONTINUE
-ENDIF:LIVE
+
+LOADSOS
 
 # 4) Verifying that !pe gives us the right exception in the format above.
 SOSCOMMAND:PrintException
@@ -67,10 +65,36 @@ VERIFY:InnerException:\s+System\.FormatException, Use !PrintException <HEXVAL> t
 VERIFY:StackTrace \(generated\):
 VERIFY:\s+SP\s+IP\s+Function\s+
 VERIFY:\s+<HEXVAL>\s+<HEXVAL>\s+[Nn]ested[Ee]xception[Tt]est.*!NestedExceptionTest\.Program\.Main(\(.*\))?\+0x<HEXVAL>\s*
-# Desktop sos has a bug that prevents the line number/source file info from being printed. Fixed in ProjectK.
+# Desktop sos has a bug that prevents the line number/source file info from being printed.
 IFDEF:PROJECTK
 VERIFY:\[.*[\\|/]Debuggees[\\|/](dotnet.+[\\|/])?[Nn]ested[Ee]xception[Tt]est[\\|/][Nn]ested[Ee]xception[Tt]est\.cs @ 8\s*\]\s*
 ENDIF:PROJECTK
 VERIFY:(StackTraceString: <none>\s+)?
 VERIFY:HResult:\s+80131509\s+
 VERIFY:There are nested exceptions on this thread. Run with -nested for details
+
+# Verify that Threads (clrthreads) works
+IFDEF:DOTNETDUMP
+SOSCOMMAND:clrthreads
+ENDIF:DOTNETDUMP
+!IFDEF:DOTNETDUMP
+SOSCOMMAND:Threads
+ENDIF:DOTNETDUMP
+VERIFY:\s*ThreadCount:\s+<DECVAL>\s+
+VERIFY:\s+UnstartedThread:\s+<DECVAL>\s+
+VERIFY:\s+BackgroundThread:\s+<DECVAL>\s+
+VERIFY:\s+PendingThread:\s+<DECVAL>\s+
+VERIFY:\s+DeadThread:\s+<DECVAL>\s+
+VERIFY:\s+Hosted Runtime:\s+no\s+
+VERIFY:\s+ID\s+OSID\s+ThreadOBJ\s+State.*\s+
+VERIFY:\s+<DECVAL>\s+<DECVAL>\s+<HEXVAL>\s+<HEXVAL>.*\s+
+
+# Verify that ClrStack with no options works
+SOSCOMMAND:ClrStack
+VERIFY:.*OS Thread Id:\s+0x<HEXVAL>\s+.*
+VERIFY:\s+Child\s+SP\s+IP\s+Call Site\s+
+VERIFY:\s+<HEXVAL>\s+<HEXVAL>\s+NestedExceptionTest\.Program\.Main(\(.*\))?\s*
+# Desktop sos has a bug that prevents the line number/source file info from being printed.
+IFDEF:PROJECTK
+VERIFY:\[.*[\\|/]Debuggees[\\|/](dotnet.+[\\|/])?[Nn]ested[Ee]xception[Tt]est[\\|/][Nn]ested[Ee]xception[Tt]est\.cs @ 8\s*\]\s*
+ENDIF:PROJECTK
\ No newline at end of file
diff --git a/src/SOS/SOS.UnitTests/Scripts/OtherCommands.script b/src/SOS/SOS.UnitTests/Scripts/OtherCommands.script
new file mode 100644 (file)
index 0000000..85e37b5
--- /dev/null
@@ -0,0 +1,86 @@
+#
+# Tests the various SOS commands with the SymbolTestApp debuggee
+#
+
+CONTINUE
+
+LOADSOS
+
+IFDEF:DOTNETDUMP
+COMMAND:clrmodules
+VERIFY:\s*<HEXVAL>.*
+COMMAND:modules
+VERIFY:\s*<HEXVAL>\s+<HEXVAL>.*
+COMMAND:threads
+VERIFY:\s*<DECVAL>\s+0x<HEXVAL>\s+\(<DECVAL>\)\s+
+COMMAND:registers
+VERIFY:\s*([r|e]ip|pc) = <HEXVAL>\s+
+ENDIF:DOTNETDUMP
+
+# Issue: https://github.com/dotnet/diagnostics/issues/503
+!IFDEF:ALPINE
+SOSCOMMAND:DumpHeap
+VERIFY:\s+Address\s+MT\s+Size\s+
+VERIFY:\s+<HEXVAL>\s+<HEXVAL>\s+<DECVAL>.*
+VERIFY:\s*Statistics:\s+
+VERIFY:\s+MT\s+Count\s+TotalSize\s+Class Name\s+
+VERIFY:\s*<HEXVAL>\s+<DECVAL>\s+<DECVAL>\s+.*
+VERIFY:\s*Total\s+<DECVAL>\s+objects\s+
+ENDIF:ALPINE
+
+SOSCOMMAND:DumpDomain
+VERIFY:\s*System Domain:\s+<HEXVAL>\s+
+VERIFY:\s*LowFrequencyHeap:\s+<HEXVAL>\s+
+VERIFY:\s*HighFrequencyHeap:\s+<HEXVAL>\s+
+VERIFY:\s*Domain 1:\s+<HEXVAL>\s+
+VERIFY:\s*Assembly:\s+<HEXVAL>\s+\[.*(System\.Private\.CoreLib(\.ni)?\.dll|mscorlib.dll)\]\s+
+
+SOSCOMMAND:DumpAssembly <POUT>\s*Assembly:\s+(<HEXVAL>)\s+\[.*<POUT>
+VERIFY:\s*Parent Domain:\s+<HEXVAL>\s+
+VERIFY:\s*Name:\s+.*(System\.Private\.CoreLib(\.ni)?\.dll|mscorlib.dll)\s+
+
+SOSCOMMAND:DumpModule <POUT>\s+Module Name\s+(<HEXVAL>)\s+.*<POUT>
+!IFDEF:DESKTOP
+VERIFY:\s*PEFile:\s+<HEXVAL>\s+
+VERIFY:\s*ModuleId:\s+<HEXVAL>\s+
+ENDIF:DESKTOP
+VERIFY:\s*LoaderHeap:\s+<HEXVAL>\s+
+VERIFY:\s*TypeDefToMethodTableMap:\s+<HEXVAL>\s+
+
+# Verify that IP2MD, DumpMD, DumpClass and DumpMT (uses IP from ClrStack)
+SOSCOMMAND:ClrStack
+SOSCOMMAND:IP2MD <POUT>.*\s+(<HEXVAL>)\s+SymbolTestApp\.Program\.Foo1.*\s+<POUT>
+VERIFY:.*\s+Method Name:\s+SymbolTestApp\.Program\.Foo1\(Int32, System\.String\)\s+
+VERIFY:.*\s+Source file:\s+(?i:.*[\\|/]SymbolTestApp\.cs) @ 24\s+
+
+# Verify DumpMD
+SOSCOMMAND:DumpMD <POUT>\s+MethodDesc:\s+(<HEXVAL>)\s+<POUT>
+VERIFY:.*\s+Method Name:\s+SymbolTestApp\.Program\.Foo1\(Int32, System\.String\)\s+
+
+# Verify DumpClass
+SOSCOMMAND:DumpClass <POUT>\s*Class:\s+(<HEXVAL>)\s+<POUT>
+VERIFY:\s*Class Name:\s+SymbolTestApp.Program\s+
+VERIFY:\s*File:\s+.*SymbolTestApp\.(dll|exe)\s+
+
+# Verify DumpMT
+SOSCOMMAND:DumpMT <POUT>\s*Method Table:\s+(<HEXVAL>)\s+<POUT>
+VERIFY:\s*Name:\s+SymbolTestApp.Program\s+
+VERIFY:\s*File:\s+.*SymbolTestApp\.(dll|exe)\s+
+
+SOSCOMMAND:FinalizeQueue
+VERIFY:\s*SyncBlocks to be cleaned up:\s+<DECVAL>\s+
+VERIFY:(\s*Free-Threaded Interfaces to be released:\s+<DECVAL>\s+)?
+VERIFY:\s*Statistics for all finalizable objects.*:\s+
+VERIFY:\s+MT\s+Count\s+TotalSize\s+Class Name\s+
+VERIFY:(\s*<HEXVAL>\s+<DECVAL>\s+<DECVAL>\s+.*)?
+VERIFY:\s*Total\s+<DECVAL>\s+objects\s+
+
+SOSCOMMAND:SyncBlk
+!IFDEF:LINUX
+VERIFY:\s*Index\s+SyncBlock\s+MonitorHeld\s+Recursion\s+Owning\s+Thread\s+Info\s+SyncBlock\s+Owner\s+
+VERIFY:\s*Total\s+<DECVAL>
+IFDEF:WINDOWS
+VERIFY:\s*CCW\s+<DECVAL>
+VERIFY:\s*RCW\s+<DECVAL>
+ENDIF:WINDOWS
+ENDIF:LINUX
\ No newline at end of file
index 9af1aa070c6c63a83351aba61ac4e1c80d5f5584..ab83e315606aa9b230bef09efd4e659cb835bfec 100644 (file)
@@ -1,15 +1,13 @@
 # Overflow debugging scenario
-# 1) load the executable
+# 1) Load the executable
 # 2) Run the executable and wait for it to crash
 # 3) Take a dump of the executable.
 # 4) Open the dump and compare the output
 # We do not expect that there is a managed exception since overflow is a special exception.
 
-LOADSOS
-
-IFDEF:LIVE
 CONTINUE
-ENDIF:LIVE
+
+LOADSOS
 
 # 5) Verifying that PrintException gives us the right exception in the format above.
 SOSCOMMAND:PrintException
index 222ab37e1c77bf919a9022e6e0120eb253efc0f6..b5ff39b97aefe83e979bd0162c02f7c6a2e1d368 100644 (file)
@@ -5,11 +5,9 @@
 # 4) Open the dump and compare the output
 # We are only verifying the main PrintException fields and for the stacktrace, source lines in the program.
 
-LOADSOS
-
-IFDEF:LIVE
 CONTINUE
-ENDIF:LIVE
+
+LOADSOS
 
 # 5) Verifying that !pe gives us the right exception in the format above.
 SOSCOMMAND:PrintException
@@ -40,9 +38,35 @@ VERIFY:Message:\s+(<Invalid Object>|Exception has been thrown by the target of a
 VERIFY:InnerException:\s+System\.Exception, Use !PrintException <HEXVAL> to see more\.\s+
 VERIFY:StackTrace \(generated\):\s+
 VERIFY:\s+<HEXVAL>\s+<HEXVAL>\s+[Rr]eflection[Tt]est.*!(\$0_)?RefLoader\.Loader\.Main(\(\))?\+0x<HEXVAL>\s*
-# Desktop sos has a bug that prevents the line number/source file info from being printed. Fixed in ProjectK.
+# Desktop sos has a bug that prevents the line number/source file info from being printed.
 IFDEF:PROJECTK
 VERIFY:[.*[\\|/]Debuggees[\\|/](dotnet.+[\\|/])?[Rr]eflection[Tt]est[\\|/][Rr]eflection[Tt]est\.cs @ 32\s*\]
 ENDIF:PROJECTK
 VERIFY:(StackTraceString: <none>\s+)?
-VERIFY:HResult:\s+80131604
\ No newline at end of file
+VERIFY:HResult:\s+80131604
+
+# Verify that Threads (clrthreads) works
+IFDEF:DOTNETDUMP
+SOSCOMMAND:clrthreads
+ENDIF:DOTNETDUMP
+!IFDEF:DOTNETDUMP
+SOSCOMMAND:Threads
+ENDIF:DOTNETDUMP
+VERIFY:\s*ThreadCount:\s+<DECVAL>\s+
+VERIFY:\s+UnstartedThread:\s+<DECVAL>\s+
+VERIFY:\s+BackgroundThread:\s+<DECVAL>\s+
+VERIFY:\s+PendingThread:\s+<DECVAL>\s+
+VERIFY:\s+DeadThread:\s+<DECVAL>\s+
+VERIFY:\s+Hosted Runtime:\s+no\s+
+VERIFY:\s+ID\s+OSID\s+ThreadOBJ\s+State.*\s+
+VERIFY:\s+<DECVAL>\s+<DECVAL>\s+<HEXVAL>\s+<HEXVAL>.*\s+
+
+# Verify that ClrStack with no options works
+SOSCOMMAND:ClrStack
+VERIFY:.*OS Thread Id:\s+0x<HEXVAL>\s+.*
+VERIFY:\s+Child\s+SP\s+IP\s+Call Site\s+
+VERIFY:\s+<HEXVAL>\s+<HEXVAL>\s+(\*\*\* WARNING: Unable to verify checksum for ReflectionTest.exe\s*)?RefLoader\.Loader\.Main(\(\))?\s*
+# Desktop sos has a bug that prevents the line number/source file info from being printed.
+IFDEF:PROJECTK
+VERIFY:[.*[\\|/]Debuggees[\\|/](dotnet.+[\\|/])?[Rr]eflection[Tt]est[\\|/][Rr]eflection[Tt]est\.cs @ 32\s*\]
+ENDIF:PROJECTK
\ No newline at end of file
index 6e310a9b62db284923390d91639e5b3207c3f073..8f350f5ea3e9e5b3b1a3c7bac0e83db9b9c4517b 100644 (file)
@@ -1,38 +1,13 @@
 # PrintException debugging scenario
-# 1) load the executable
+# 1) Load the executable
 # 2) Run the executable and wait for it to crash
 # 3) Take a dump of the executable. (MUST BE AT SECOND CHANCE EXCEPTION!)
 # 4) Open the dump and compare the output
-# [EXPECTED OUTPUT (DESKTOP)]
-# Exception object: <HEXVAL>
-# Exception type:   System.InvalidOperationException
-# Message:          <Invalid Object>
-# InnerException:   <none>
-# StackTrace (generated):
-#    SP               IP               Function
-#    <HEXVAL> <HEXVAL> SimpleThrow!UserObject.UseObject(System.String)+0xc8
-#    <HEXVAL> <HEXVAL> SimpleThrow!Simple.Main()+0x9f
-# StackTraceString: <none>
-# HResult: 80131509
 
-# [EXPECTED OUTPUT (PROJECTN)]
-# Exception type:   System.InvalidOperationException
-# Message:          <Invalid Object>
-# InnerException:   <none>
-# StackTrace (generated):
-#    IP               Function
-#    <HEXVAL> SimpleThrow_<HEXVAL>!$0_UserObject.UseObject+0x8a
-#    <HEXVAL> SimpleThrow_<HEXVAL>!$0_Simple.Main+0x66
-#    <HEXVAL> SimpleThrow_<HEXVAL>!$0_Simple.{ILT$Main}+0xd
-#    <HEXVAL> SimpleThrow_<HEXVAL>!RHBinder__ShimExeMain+0x20
-# HResult: 80131509
+CONTINUE
 
 LOADSOS
 
-IFDEF:LIVE
-CONTINUE
-ENDIF:LIVE
-
 # B) Verifying that !pe gives us the right exception in the format above.
 # For desktop, it has an SP, so we conditionally will match it.  (ProjectN does not though.)
 SOSCOMMAND:PrintException
@@ -57,3 +32,33 @@ VERIFY:\s+SP\s+IP\s+Function\s+
 VERIFY:\s+<HEXVAL>\s+<HEXVAL>\s+[Ss]imple[Tt]hrow.*!(\$0_)?UserObject\.UseObject.*\+0x<HEXVAL>\s+
 VERIFY:\s+<HEXVAL>\s+<HEXVAL>\s+[Ss]imple[Tt]hrow.*!(\$0_)?Simple\.Main.*\+0x<HEXVAL>\s+
 VERIFY:HResult:\s+80131509
+
+# Verify that Threads (clrthreads) works
+IFDEF:DOTNETDUMP
+SOSCOMMAND:clrthreads
+ENDIF:DOTNETDUMP
+!IFDEF:DOTNETDUMP
+SOSCOMMAND:Threads
+ENDIF:DOTNETDUMP
+VERIFY:\s*ThreadCount:\s+<DECVAL>\s+
+VERIFY:\s+UnstartedThread:\s+<DECVAL>\s+
+VERIFY:\s+BackgroundThread:\s+<DECVAL>\s+
+VERIFY:\s+PendingThread:\s+<DECVAL>\s+
+VERIFY:\s+DeadThread:\s+<DECVAL>\s+
+VERIFY:\s+Hosted Runtime:\s+no\s+
+VERIFY:\s+ID\s+OSID\s+ThreadOBJ\s+State.*\s+
+VERIFY:\s+<DECVAL>\s+<DECVAL>\s+<HEXVAL>\s+<HEXVAL>.*\s+
+
+# Verify that ClrStack with no options works
+SOSCOMMAND:ClrStack
+VERIFY:.*OS Thread Id:\s+0x<HEXVAL>\s+.*
+VERIFY:\s+Child\s+SP\s+IP\s+Call Site\s+
+VERIFY:\s+<HEXVAL>\s+<HEXVAL>\s+(\*\*\* WARNING: Unable to verify checksum for SimpleThrow.exe\s*)?UserObject\.UseObject.*\s+
+# Desktop sos has a bug that prevents the line number/source file info from being printed.
+IFDEF:PROJECTK
+VERIFY:[.*[\\|/]Debuggees[\\|/](dotnet.+[\\|/])?SimpleThrow[\\|/]UserObject\.cs @ 18\s*\]
+ENDIF:PROJECTK
+VERIFY:\s+<HEXVAL>\s+<HEXVAL>\s+Simple\.Main\(\)\s+
+IFDEF:PROJECTK
+VERIFY:[.*[\\|/]Debuggees[\\|/](dotnet.+[\\|/])?SimpleThrow[\\|/]SimpleThrow\.cs @ 9\s*\]
+ENDIF:PROJECTK
\ No newline at end of file
index 6f8e24aa78eaa1dcff1789d538901925c6b11acf..5a8931e5b582f701277f2466475ae068d8e78969 100644 (file)
@@ -1,13 +1,12 @@
 #
 # Tests the various SOS stack and other commands with the Windows/Portable PDB debuggee
 #
-# Commands Verified: ClrStack, DumpStackObjects, DumpStack, EEStack, IP2MD, u, Name2EE, Threads (clrthreads)
+# Commands Verified: ClrStack, DumpStackObjects, DumpStack, EEStack, IP2MD, u, Name2EE, Threads (clrthreads) and others
 #
-LOADSOS
 
-IFDEF:LIVE
 CONTINUE
-ENDIF:LIVE
+
+LOADSOS
 
 # Verify that ClrStack with no options works
 SOSCOMMAND:SetSymbolServer -ms
@@ -17,7 +16,7 @@ ENDIF:DOTNETDUMP
 SOSCOMMAND:ClrStack
 VERIFY:.*OS Thread Id:\s+0x<HEXVAL>\s+.*
 VERIFY:\s+Child\s+SP\s+IP\s+Call Site\s+
-VERIFY:.*\s+<HEXVAL>\s+<HEXVAL>.*\s+SymbolTestApp\.Program\.Foo4\(System\.String\)\s+\[(?i:.*[\\|/]SymbolTestApp\.cs) @ 54\]\s*
+VERIFY:.*\s+<HEXVAL>\s+<HEXVAL>.*\s+SymbolTestApp\.Program\.Foo4\(System\.String\)\s+\[(?i:.*[\\|/]SymbolTestApp\.cs) @ (50|54)\]\s*
 VERIFY:\s+<HEXVAL>\s+<HEXVAL>\s+SymbolTestApp\.Program\.Foo2\(.*\)\s+\[(?i:.*[\\|/]SymbolTestApp\.cs) @ 29\]\s*
 VERIFY:\s+<HEXVAL>\s+<HEXVAL>\s+SymbolTestApp\.Program\.Foo1\(.*\)\s+\[(?i:.*[\\|/]SymbolTestApp\.cs) @ 24\]\s*
 VERIFY:\s+<HEXVAL>\s+<HEXVAL>\s+SymbolTestApp\.Program\.Main\(.*\)\s+\[(?i:.*[\\|/]SymbolTestApp\.cs) @ 19\]\s*
@@ -32,7 +31,7 @@ IFDEF:PROJECTK
 SOSCOMMAND:ClrStack -f
 VERIFY:.*OS Thread Id:\s+0x<HEXVAL>\s+.*
 VERIFY:\s+Child\s+SP\s+IP\s+Call Site\s+
-VERIFY:\s+<HEXVAL>\s+<HEXVAL>\s+SymbolTestApp\.(dll|exe)!SymbolTestApp\.Program\.Foo4\(System\.String\)\s+\+\s+<DECVAL>\s+\[(?i:.*[\\|/]SymbolTestApp\.cs) @ 54\]\s*
+VERIFY:\s+<HEXVAL>\s+<HEXVAL>\s+SymbolTestApp\.(dll|exe)!SymbolTestApp\.Program\.Foo4\(System\.String\)\s+\+\s+<DECVAL>\s+\[(?i:.*[\\|/]SymbolTestApp\.cs) @ (50|54)\]\s*
 VERIFY:\s+<HEXVAL>\s+<HEXVAL>\s+SymbolTestApp\.(dll|exe)!SymbolTestApp\.Program\.Foo2\(.*\)\s+\+\s+<DECVAL>\s+\[(?i:.*[\\|/]SymbolTestApp\.cs) @ 29\]\s*
 VERIFY:\s+<HEXVAL>\s+<HEXVAL>\s+SymbolTestApp\.(dll|exe)!SymbolTestApp\.Program\.Foo1\(.*\)\s+\+\s+<DECVAL>\s+\[(?i:.*[\\|/]SymbolTestApp\.cs) @ 24\]\s*
 VERIFY:\s+<HEXVAL>\s+<HEXVAL>\s+SymbolTestApp\.(dll|exe)!SymbolTestApp\.Program\.Main\(.*\)\s+\+\s+<DECVAL>\s+\[(?i:.*[\\|/]SymbolTestApp\.cs) @ 19\]\s*
@@ -43,7 +42,7 @@ IFDEF:PROJECTK
 SOSCOMMAND:ClrStack -a
 VERIFY:.*OS Thread Id:\s+0x<HEXVAL>\s+.*
 VERIFY:\s+Child\s+SP\s+IP\s+Call Site\s+
-VERIFY:.*\s+<HEXVAL>\s+<HEXVAL>\s+SymbolTestApp\.Program\.Foo4\(System\.String\)\s+\[(?i:.*[\\|/]SymbolTestApp\.cs) @ 54\]\s*
+VERIFY:.*\s+<HEXVAL>\s+<HEXVAL>\s+SymbolTestApp\.Program\.Foo4\(System\.String\)\s+\[(?i:.*[\\|/]SymbolTestApp\.cs) @ (50|54)\]\s*
 VERIFY:\s+PARAMETERS:\s+
 VERIFY:\s+dllPath \(0x<HEXVAL>\) = 0x<HEXVAL>\s+
 VERIFY:.*\s+LOCALS:\s+
@@ -59,7 +58,7 @@ SOSCOMMAND:ClrStack -r
 VERIFY:.*OS Thread Id:\s+0x<HEXVAL>\s+.*
 VERIFY:\s+Child\s+SP\s+IP\s+Call Site\s+
 
-VERIFY:.*\s+<HEXVAL>\s+<HEXVAL>\s+SymbolTestApp\.Program\.Foo4\(System\.String\)\s+\[(?i:.*[\\|/]SymbolTestApp\.cs) @ 54\]\s*
+VERIFY:.*\s+<HEXVAL>\s+<HEXVAL>\s+SymbolTestApp\.Program\.Foo4\(System\.String\)\s+\[(?i:.*[\\|/]SymbolTestApp\.cs) @ (50|54)\]\s*
 IFDEF:ARM
 VERIFY:\s+r0=<HEXVAL>\s+r1=<HEXVAL>\s+r2=<HEXVAL>\s+
 ENDIF:ARM
@@ -106,6 +105,7 @@ VERIFY:.*\s+<HEXVAL>\s+<HEXVAL>\s+\[DEFAULT\] Void SymbolTestApp\.Program\.Main\
 VERIFY:.*\s+Stack walk complete.\s+
 ENDIF:PROJECTK
 
+# Issue: https://github.com/dotnet/diagnostics/issues/504
 !IFDEF:ALPINE
 
 # Verify that ClrStack with the ICorDebug options and all option (locals/params) works
@@ -118,7 +118,9 @@ VERIFY:.*\s+<HEXVAL>\s+<HEXVAL>\s+\[DEFAULT\] Void SymbolTestApp\.Program\.Foo4\
 VERIFY:\s+PARAMETERS:\s+
 VERIFY:\s+\+ string dllPath\s+=\s+".*"\s+
 VERIFY:\s+LOCALS:\s+
+!IFDEF:MAJOR_RUNTIME_VERSION_1
 VERIFY:\s+\+ System.RuntimeType dllType @ 0x<HEXVAL>
+ENDIF:MAJOR_RUNTIME_VERSION_1
 VERIFY:.*\s+<HEXVAL>\s+<HEXVAL>\s+\[DEFAULT\] I4 SymbolTestApp\.Program\.Foo2\(.*\)\s+\(.*\)\s+
 VERIFY:.*\s+<HEXVAL>\s+<HEXVAL>\s+\[DEFAULT\] I4 SymbolTestApp\.Program\.Foo1\(.*\)\s+\(.*\)\s+
 VERIFY:.*\s+<HEXVAL>\s+<HEXVAL>\s+\[DEFAULT\] Void SymbolTestApp\.Program\.Main\(.*\)\s+\(.*\)\s+
@@ -174,11 +176,17 @@ ENDIF:DOTNETDUMP
 SOSCOMMAND:ClrStack
 SOSCOMMAND:IP2MD <POUT>.*\s+(<HEXVAL>)\s+SymbolTestApp\.Program\.Foo4.*\s+<POUT>
 VERIFY:.*\s+Method Name:\s+SymbolTestApp\.Program\.Foo4\(System\.String\)\s+
-VERIFY:.*\s+Source file:\s+(?i:.*[\\|/]SymbolTestApp\.cs) @ 54\s+
+VERIFY:.*\s+Source file:\s+(?i:.*[\\|/]SymbolTestApp\.cs) @ (50|54)\s+
 
 # Verify that DumpIL works (depends on the IP2MD right above)
 SOSCOMMAND:DumpIL <POUT>\s*MethodDesc:\s+(<HEXVAL>)\s*<POUT>
-VERIFY:.*IL_<HEXVAL>: call class \[System.Runtime\]System\.Reflection\.Assembly System\.Reflection\.Assembly::Load\(uint8\[\],uint8\[\]\)
+!IFDEF:DESKTOP
+VERIFY:.*IL_<HEXVAL>: callvirt class \[System\.(Runtime|Reflection)\]System\.Reflection\.Assembly System\.Runtime\.Loader\.AssemblyLoadContext::LoadFromStream\(class \[System\.(Runtime|IO)\]System\.IO\.Stream,class \[System\.(Runtime|IO)\]System\.IO\.Stream\)
+ENDIF:DESKTOP
+IFDEF:DESKTOP
+# Disable until the new SOS supports desktop clr
+# VERIFY:.*IL_<HEXVAL>: call class \[System.Runtime\]System\.Reflection\.Assembly System\.Reflection\.Assembly::Load\(uint8\[\],uint8\[\]\)
+ENDIF:DESKTOP
 
 !IFDEF:DOTNETDUMP
 IFDEF:PROJECTK
@@ -190,7 +198,7 @@ SOSCOMMAND:u <POUT>\s*MethodDesc:\s+(<HEXVAL>)\s*<POUT>
 VERIFY:\s*Normal JIT generated code\s+
 VERIFY:\s+SymbolTestApp\.Program\.Foo4\(System\.String\)\s+
 VERIFY:\s+Begin\s+<HEXVAL>,\s+size\s+<HEXVAL>\s+
-VERIFY:\s+(?i:.*[\\|/]SymbolTestApp\.cs) @ 54:\s+
+VERIFY:\s+(?i:.*[\\|/]SymbolTestApp\.cs) @ (50|54):\s+
 
 # Verify that "u" with no line info works
 SOSCOMMAND:u -n <PREVPOUT>
@@ -203,7 +211,7 @@ SOSCOMMAND:u -o <PREVPOUT>
 VERIFY:\s*Normal JIT generated code\s+
 VERIFY:\s+SymbolTestApp\.Program\.Foo4\(System\.String\)\s+
 VERIFY:\s+Begin\s+<HEXVAL>,\s+size\s+<HEXVAL>\s+
-VERIFY:\s+(?i:.*[\\|/]SymbolTestApp\.cs) @ 54:\s+
+VERIFY:\s+(?i:.*[\\|/]SymbolTestApp\.cs) @ (50|54):\s+
 
 ENDIF:PROJECTK
 ENDIF:DOTNETDUMP
@@ -231,4 +239,4 @@ VERIFY:\s+PendingThread:\s+<DECVAL>\s+
 VERIFY:\s+DeadThread:\s+<DECVAL>\s+
 VERIFY:\s+Hosted Runtime:\s+no\s+
 VERIFY:\s+ID\s+OSID\s+ThreadOBJ\s+State.*\s+
-VERIFY:\s+<DECVAL>\s+<DECVAL>\s+<HEXVAL>\s+<HEXVAL>.*\s+
+VERIFY:\s+<DECVAL>\s+<DECVAL>\s+<HEXVAL>\s+<HEXVAL>.*\s+
\ No newline at end of file
index ca21ffc2ee454703619763bfb59130061fcb6fac..4420604e3ff7b6ec6f0d1cb4239acfe7608cc3f8 100644 (file)
@@ -1,11 +1,10 @@
 #
 # Tests the various SOS stack commands against a debuggee that hit an exception
 #
-LOADSOS
 
-IFDEF:LIVE
 CONTINUE
-ENDIF:LIVE
+
+LOADSOS
 
 # Test eeversion command
 SOSCOMMAND:EEVersion
@@ -94,7 +93,11 @@ ENDIF:X86
 ENDIF:64BIT
 ENDIF:PROJECTK
 
+# Issue: https://github.com/dotnet/diagnostics/issues/504
+!IFDEF:ALPINE
+
 # 5) Verifying that ClrStack with the ICorDebug options works
+IFDEF:PROJECTK
 SOSCOMMAND:ClrStack -i
 VERIFY:.*\s+Dumping managed stack and managed variables using ICorDebug.\s+
 VERIFY:.*\s+Child\s+SP\s+IP\s+Call Site\s+
@@ -102,9 +105,9 @@ VERIFY:.*\s+<HEXVAL>\s+<HEXVAL>\s+\[NativeStackFrame\]\s+
 VERIFY:.*\s+<HEXVAL>\s+<HEXVAL>\s+\[DEFAULT\] Void NestedExceptionTest\.Program\.Main\(.*\)\s+\(.*\)\s+
 VERIFY:.*\s+<HEXVAL>\s+<HEXVAL>\s+\[DEFAULT\] Void NestedExceptionTest\.Program\.Main\(.*\)\s+\(.*\)\s+
 VERIFY:.*\s+Stack walk complete.\s+
+ENDIF:PROJECTK
 
 # 6) Verifying that ClrStack with the ICorDebug options and all option (locals/params) works
-!IFDEF:ALPINE
 IFDEF:PROJECTK
 SOSCOMMAND:ClrStack -i -a
 VERIFY:.*\s+Dumping managed stack and managed variables using ICorDebug.\s+
@@ -118,6 +121,7 @@ VERIFY:\s+\+ System.FormatException ex @ 0x<HEXVAL>\s+
 VERIFY:.*\s+<HEXVAL>\s+<HEXVAL>\s+\[DEFAULT\] Void NestedExceptionTest\.Program\.Main\(.*\)\s+\(.*\)\s+
 VERIFY:.*\s+Stack walk complete.\s+
 ENDIF:PROJECTK
+
 ENDIF:ALPINE
 
 # 7) Verify DumpStackObjects works
index 94b9fc8b9cfbda6b576bf5128642708e98231f0a..d17dbc47d1ffe19fc188c32617c7b5c1dcd7553b 100644 (file)
@@ -5,11 +5,9 @@
 # 4) Open the dump and compare the output
 # This tests that a nested task, when throwing an exception, you can access all of its properties.
 
-LOADSOS
-
-IFDEF:LIVE
 CONTINUE
-ENDIF:LIVE
+
+LOADSOS
 
 SOSCOMMAND:PrintException
 VERIFY:Exception object:\s+<HEXVAL>\s+
@@ -44,10 +42,14 @@ VERIFY:StackTrace \(generated\):\s+
 VERIFY:\s+SP\s+IP\s+Function\s+
 VERIFY:\s+<HEXVAL>\s+<HEXVAL>.+RandomTest(::|\.)RandomUserTask\.InnerException(\(\))?\+0x<HEXVAL>\s*
 # Desktop sos has a bug that prevents the line number/source file info from being printed. Fixed in ProjectK.
-IFDEF:PROJECTK
+!IFDEF:DESKTOP
+!IFDEF:TRIAGE_DUMP
 VERIFY:[.+[\\|/]Debuggees[\\|/](dotnet.+[\\|/])?[Tt]ask[Nn]ested[Ee]xception[\\|/][Rr]andom[Uu]ser[Ll]ibrary[\\|/][Rr]andom[Uu]ser[Tt]ask\.cs @ 34\]
-ENDIF:PROJECTK
+ENDIF:TRIAGE_DUMP
+ENDIF:DESKTOP
 VERIFY:\s+<HEXVAL>\s+<HEXVAL>.+RandomTest(::|\.)RandomUserTask\.<\.ctor>.+\+0x<HEXVAL>\s*
-IFDEF:PROJECTK
+!IFDEF:DESKTOP
+!IFDEF:TRIAGE_DUMP
 VERIFY:[.+[\\|/]Debuggees[\\|/](dotnet.+[\\|/])?[Tt]ask[Nn]ested[Ee]xception[\\|/][Rr]andom[Uu]ser[Ll]ibrary[\\|/][Rr]andom[Uu]ser[Tt]ask\.cs @ 19\]
-ENDIF:PROJECTK
\ No newline at end of file
+ENDIF:TRIAGE_DUMP
+ENDIF:DESKTOP
\ No newline at end of file
diff --git a/src/SOS/SOS.UnitTests/Scripts/WebApp.script b/src/SOS/SOS.UnitTests/Scripts/WebApp.script
new file mode 100644 (file)
index 0000000..44dbb3d
--- /dev/null
@@ -0,0 +1,163 @@
+#
+# Tests the various SOS stack and other commands against a webapp 3.x app
+#
+# Commands Verified: ClrStack, DumpStackObjects, DumpStack, EEStack, IP2MD, u, Name2EE, Threads (clrthreads)
+#
+
+CONTINUE
+
+LOADSOS
+
+SOSCOMMAND:SetSymbolServer -ms
+
+!IFDEF:DOTNETDUMP
+SOSCOMMAND:SetHostRuntime
+ENDIF:DOTNETDUMP
+
+IFDEF:DOTNETDUMP
+COMMAND:clrmodules
+VERIFY:\s*<HEXVAL>.*
+COMMAND:modules
+VERIFY:\s*<HEXVAL>\s+<HEXVAL>.*
+COMMAND:threads
+VERIFY:\s*<DECVAL>\s+0x<HEXVAL>\s+\(<DECVAL>\)\s+
+COMMAND:registers
+VERIFY:\s*([r|e]ip|pc) = <HEXVAL>\s+
+ENDIF:DOTNETDUMP
+
+# Verify that ClrStack with no options works
+SOSCOMMAND:ClrStack
+VERIFY:.*OS Thread Id:\s+0x<HEXVAL>\s+.*
+VERIFY:\s+Child\s+SP\s+IP\s+Call Site\s+
+
+# Verify that ClrStack for all threads works
+SOSCOMMAND:ClrStack -all
+
+# Verify that ClrStack with managed/native mixed works
+SOSCOMMAND:ClrStack -f
+VERIFY:.*OS Thread Id:\s+0x<HEXVAL>\s+.*
+VERIFY:\s+Child\s+SP\s+IP\s+Call Site\s+
+
+# Verify that ClrStack all option works (locals/params)
+SOSCOMMAND:ClrStack -a
+VERIFY:.*OS Thread Id:\s+0x<HEXVAL>\s+.*
+VERIFY:\s+Child\s+SP\s+IP\s+Call Site\s+
+
+# Verify that ClrStack displays registers
+SOSCOMMAND:ClrStack -r
+VERIFY:.*OS Thread Id:\s+0x<HEXVAL>\s+.*
+VERIFY:\s+Child\s+SP\s+IP\s+Call Site\s+
+VERIFY:.*\s
+
+IFDEF:ARM
+VERIFY:\s+r0=<HEXVAL>\s+r1=<HEXVAL>\s+r2=<HEXVAL>\s+
+ENDIF:ARM
+IFDEF:ARM64
+VERIFY:\s+x0=<HEXVAL>\s+x1=<HEXVAL>\s+x2=<HEXVAL>\s+
+ENDIF:ARM64
+VERIFY:\s+([r|e]sp|sp)=<HEXVAL>\s+([r|e]bp|lr)=<HEXVAL>\s+([r|e]ip|pc)=<HEXVAL>\s+
+IFDEF:X64
+VERIFY:\s+rax=<HEXVAL>\s+rbx=<HEXVAL>\s+rcx=<HEXVAL>\s+
+ENDIF:X64
+IFDEF:X86
+VERIFY:\s+eax=<HEXVAL>\s+ebx=<HEXVAL>\s+ecx=<HEXVAL>\s+
+ENDIF:X86
+
+VERIFY:.*\s
+
+IFDEF:ARM
+VERIFY:\s+r0=<HEXVAL>\s+r1=<HEXVAL>\s+r2=<HEXVAL>\s+
+ENDIF:ARM
+IFDEF:ARM64
+VERIFY:\s+x0=<HEXVAL>\s+x1=<HEXVAL>\s+x2=<HEXVAL>\s+
+ENDIF:ARM64
+VERIFY:\s+([r|e]sp|sp)=<HEXVAL>\s+([r|e]bp|lr)=<HEXVAL>\s+([r|e]ip|pc)=<HEXVAL>\s+
+IFDEF:X64
+VERIFY:\s+rax=<HEXVAL>\s+rbx=<HEXVAL>\s+rcx=<HEXVAL>\s+
+ENDIF:X64
+IFDEF:X86
+VERIFY:\s+eax=<HEXVAL>\s+ebx=<HEXVAL>\s+ecx=<HEXVAL>\s+
+ENDIF:X86
+
+# Issue: https://github.com/dotnet/diagnostics/issues/504
+!IFDEF:ALPINE
+
+# Verify that ClrStack with the ICorDebug options works
+SOSCOMMAND:ClrStack -i
+VERIFY:.*\s+Dumping managed stack and managed variables using ICorDebug.\s+
+VERIFY:.*\s+Child\s+SP\s+IP\s+Call Site\s+
+VERIFY:.*\s+Stack walk complete.\s+
+
+ENDIF:ALPINE
+
+# Verify that Threads (clrthreads) works
+IFDEF:DOTNETDUMP
+SOSCOMMAND:clrthreads
+ENDIF:DOTNETDUMP
+!IFDEF:DOTNETDUMP
+SOSCOMMAND:Threads
+ENDIF:DOTNETDUMP
+VERIFY:\s*ThreadCount:\s+<DECVAL>\s+
+VERIFY:\s+UnstartedThread:\s+<DECVAL>\s+
+VERIFY:\s+BackgroundThread:\s+<DECVAL>\s+
+VERIFY:\s+PendingThread:\s+<DECVAL>\s+
+VERIFY:\s+DeadThread:\s+<DECVAL>\s+
+VERIFY:\s+Hosted Runtime:\s+no\s+
+VERIFY:\s+ID\s+OSID\s+ThreadOBJ\s+State.*\s+
+VERIFY:\s+<DECVAL>\s+<DECVAL>\s+<HEXVAL>\s+<HEXVAL>.*\s+
+
+# dumpheap, dumpasync may not work on Windows and Alpine dotnet-dump
+# Issue: https://github.com/dotnet/diagnostics/issues/503
+!IFDEF:DOTNETDUMP
+
+SOSCOMMAND:DumpHeap -stat
+VERIFY:\s*Statistics:\s+
+VERIFY:\s+MT\s+Count\s+TotalSize\s+Class Name\s+
+VERIFY:\s*<HEXVAL>\s+<DECVAL>\s+<DECVAL>\s+.*
+VERIFY:\s*Total\s+<DECVAL>\s+objects\s+
+!VERIFY:.*UNKNOWN.*
+
+SOSCOMMAND:DumpAsync
+VERIFY:\s*Statistics:\s+
+VERIFY:\s+MT\s+Count\s+TotalSize\s+Class Name\s+
+VERIFY:\s*<HEXVAL>\s+<DECVAL>\s+<DECVAL>\s+.*
+VERIFY:\s*Total\s+<DECVAL>\s+objects\s+
+
+SOSCOMMAND:DumpAsync -mt <POUT>\s+MT\s+Count\s+TotalSize\s+Class Name\s+(<HEXVAL>)\s+<DECVAL>\s+<DECVAL>\s+.*<POUT>
+VERIFY:\s*Statistics:\s+
+VERIFY:\s+MT\s+Count\s+TotalSize\s+Class Name\s+
+VERIFY:\s*<HEXVAL>\s+<DECVAL>\s+<DECVAL>\s+.*
+VERIFY:\s*Total\s+<DECVAL>\s+objects\s+
+
+SOSCOMMAND:DumpAsync -mt <PREVOUT> -fields
+
+ENDIF:DOTNETDUMP
+
+# This duplication allows these commands to run on lldb/xplat
+# Issue: https://github.com/dotnet/diagnostics/issues/503
+!IFDEF:ALPINE
+!IFDEF:WINDOWS
+
+SOSCOMMAND:DumpHeap -stat
+VERIFY:\s*Statistics:\s+
+VERIFY:\s+MT\s+Count\s+TotalSize\s+Class Name\s+
+VERIFY:\s*<HEXVAL>\s+<DECVAL>\s+<DECVAL>\s+.*
+VERIFY:\s*Total\s+<DECVAL>\s+objects\s+
+!VERIFY:.*UNKNOWN.*
+
+SOSCOMMAND:DumpAsync
+VERIFY:\s*Statistics:\s+
+VERIFY:\s+MT\s+Count\s+TotalSize\s+Class Name\s+
+VERIFY:\s*<HEXVAL>\s+<DECVAL>\s+<DECVAL>\s+.*
+VERIFY:\s*Total\s+<DECVAL>\s+objects\s+
+
+SOSCOMMAND:DumpAsync -mt <POUT>\s+MT\s+Count\s+TotalSize\s+Class Name\s+(<HEXVAL>)\s+<DECVAL>\s+<DECVAL>\s+.*<POUT>
+VERIFY:\s*Statistics:\s+
+VERIFY:\s+MT\s+Count\s+TotalSize\s+Class Name\s+
+VERIFY:\s*<HEXVAL>\s+<DECVAL>\s+<DECVAL>\s+.*
+VERIFY:\s*Total\s+<DECVAL>\s+objects\s+
+
+SOSCOMMAND:DumpAsync -mt <PREVOUT> -fields
+
+ENDIF:WINDOWS
+ENDIF:ALPINE
\ No newline at end of file
index e9bcf395dd747fab4806b6b2f7df93d2a0d47bea..e763d4aa87bfe657a1267ead0be3bce89fbee8e0 100644 (file)
@@ -151,7 +151,12 @@ DataTarget::ReadVirtual(
         }
     }
 #endif
-    return g_ExtData->ReadVirtual(address, (PVOID)buffer, request, (PULONG)done);
+    HRESULT hr = g_ExtData->ReadVirtual(address, (PVOID)buffer, request, (PULONG)done);
+    if (FAILED(hr)) 
+    {
+        ExtDbgOut("DataTarget::ReadVirtual FAILED %08x address %p size %08x\n", hr, address, request);
+    }
+    return hr;
 }
 
 HRESULT STDMETHODCALLTYPE
index 69c77acaee851615835aa7e5387534895e226919..32083f858c6ae3c44b26051ad6da17e2fb24249e 100644 (file)
@@ -27,8 +27,6 @@ OnUnloadTask *OnUnloadTask::s_pUnloadTaskList = NULL;
 // Valid for the lifetime of the debug session.
 //
 
-DWORD_PTR g_filterHint = 0;
-
 PDEBUG_CLIENT         g_ExtClient;    
 PDEBUG_DATA_SPACES2   g_ExtData2;
 PDEBUG_ADVANCED       g_ExtAdvanced;
index 606078309191093e0d872a56cf3ca451030dc43e..a54b480827da308c13216255828ec55731b95951 100644 (file)
@@ -166,10 +166,6 @@ ArchQuery(void);
 void
 ExtRelease(void);
 
-#ifdef _DEBUG
-extern DWORD_PTR g_filterHint;
-#endif
-
 extern BOOL ControlC;
 
 inline BOOL IsInterrupt()
index 339898c09bd10bbc6fbe197db66ae18eb1a5c29e..863a337c286e3d2d75ed41265b9ec287cf60f2fc 100644 (file)
@@ -242,6 +242,7 @@ static HRESULT GetCoreClrDirectory(std::string& coreClrDirectory)
     }
     if (!GetAbsolutePath(directory, coreClrDirectory))
     {
+        ExtDbgOut("Error: Runtime directory %s doesn't exist\n", directory);
         return E_FAIL;
     }
 #else
@@ -261,7 +262,9 @@ static HRESULT GetCoreClrDirectory(std::string& coreClrDirectory)
     }
     if (GetFileAttributesA(szModuleName) == INVALID_FILE_ATTRIBUTES)
     {
-        return HRESULT_FROM_WIN32(GetLastError());
+        Status = HRESULT_FROM_WIN32(GetLastError());
+        ExtDbgOut("Error: Runtime module %s doesn't exist %08x\n", szModuleName, Status);
+        return Status;
     }
     coreClrDirectory = szModuleName;
 
@@ -269,6 +272,7 @@ static HRESULT GetCoreClrDirectory(std::string& coreClrDirectory)
     size_t lastSlash = coreClrDirectory.rfind(DIRECTORY_SEPARATOR_CHAR_A);
     if (lastSlash == std::string::npos)
     {
+        ExtDbgOut("Error: Runtime module %s has no directory separator\n", szModuleName);
         return E_FAIL;
     }
     coreClrDirectory.assign(coreClrDirectory, 0, lastSlash);
@@ -648,6 +652,7 @@ HRESULT InitializeHosting()
     HRESULT Status = GetHostRuntime(coreClrPath, hostRuntimeDirectory);
     if (FAILED(Status))
     {
+        ExtDbgOut("Error: Failed to get host runtime directory\n");
         return Status;
     }
 #ifdef FEATURE_PAL
@@ -1112,6 +1117,9 @@ HRESULT SymbolReader::LoadSymbolsForWindowsPDB(___in IMetaDataImport* pMD, ___in
     if (m_pSymReader != NULL) 
         return S_OK;
 
+    if (pMD == nullptr)
+        return E_INVALIDARG;
+
     if (g_pSymBinder == nullptr)
     {
         // Ignore errors to be able to run under a managed host (dotnet-dump).
index bb1a2c51f341f22bc243420e50cddceeefd4e682..8bbfcf17114ad9f458e98e17cb8986791a2165ea 100644 (file)
@@ -182,10 +182,9 @@ EXPORTS
     DumpPermissionSet
     dps=DumpPermissionSet
     dumppermissionset=DumpPermissionSet
-    dbgout
-    filthint
 #endif
 
+    dbgout
     _EFN_GetManagedExcepStack
     _EFN_GetManagedExcepStackW
     _EFN_GetManagedObjectFieldInfo    
index 6533ce9c2444d15e425e45baf0af3035b2cecb67..b5c066d595627f33d5d10826c77b294d1579a642 100644 (file)
@@ -4,6 +4,7 @@
 
 bpmd
 ClrStack
+dbgout
 DumpArray
 DumpAssembly
 DumpAsync
index d3e0d55ee7862c5f1dd4e20d3e1a32ff5016899d..8c452f23494d7266a9b2a40f69e56f83ea528bd5 100644 (file)
@@ -7260,7 +7260,7 @@ public:
         IfFailRet(g_sos->GetModule(mod, &pModule));
 
         ToRelease<IMetaDataImport> pMDImport = NULL;
-        IfFailRet(pModule->QueryInterface(IID_IMetaDataImport, (LPVOID *) &pMDImport));
+        pModule->QueryInterface(IID_IMetaDataImport, (LPVOID *) &pMDImport);
 
         IfFailRet(pSymbolReader->LoadSymbols(pMDImport, pModule));
 
@@ -14383,7 +14383,8 @@ end:
     return Status;
 }
 
-#ifdef _DEBUG
+#endif // FEATURE_PAL
+
 DECLARE_API(dbgout)
 {
     INIT_API();
@@ -14401,41 +14402,9 @@ DECLARE_API(dbgout)
     }    
 
     Output::SetDebugOutputEnabled(!bOff);
+    ExtOut("Debug output logging %s\n", Output::IsDebugOutputEnabled() ? "enabled" : "disabled");
     return Status;
 }
-DECLARE_API(filthint)
-{
-    INIT_API();
-
-    BOOL bOff = FALSE;
-    DWORD_PTR filter = 0;
-
-    CMDOption option[] = 
-    {   // name, vptr, type, hasValue
-        {"-off", &bOff, COBOOL, FALSE},
-    };
-    CMDValue arg[] = 
-    {   // vptr, type
-        {&filter, COHEX}
-    };
-    size_t nArg;
-    if (!GetCMDOption(args, option, _countof(option),
-                      arg, _countof(arg), &nArg)) 
-    {
-        return Status;
-    }    
-    if (bOff)
-    {
-        g_filterHint = 0;
-        return Status;
-    }
-
-    g_filterHint = filter;
-    return Status;
-}
-#endif // _DEBUG
-
-#endif // FEATURE_PAL
 
 static HRESULT DumpMDInfoBuffer(DWORD_PTR dwStartAddr, DWORD Flags, ULONG64 Esp, 
         ULONG64 IPAddr, StringOutput& so)
@@ -15909,6 +15878,10 @@ DECLARE_API(SetSymbolServer)
         {
             ExtOut("Added Windows symbol path: %s\n", windowsSymbolPath.data);
         }
+        if (logging)
+        {
+            ExtOut("Symbol download logging enabled\n");
+        }
     }
     else if (loadNative)
     {
index 9a87e46ebf3a1676e703997241141e8bbca43ad7..a550da79ac84d9c8bcc6171086b8b6e8079bf502 100644 (file)
@@ -3465,7 +3465,7 @@ void StringObjectContent(size_t obj, BOOL fLiteral, const int length)
     DWORD_PTR dwAddr = (DWORD_PTR)pwszBuf.GetPtr();
     if (g_sos->GetObjectStringData(TO_CDADDR(obj), stInfo.m_StringLength+1, pwszBuf, NULL)!=S_OK)
     {
-        ExtOut("Error getting string data\n");
+        ExtOut("<Invalid Object>");
         return;
     }
 
@@ -5112,10 +5112,8 @@ void ExtErr(PCSTR Format, ...)
     va_end(Args);
 }
 
-
 void ExtDbgOut(PCSTR Format, ...)
 {
-#ifdef _DEBUG
     if (Output::g_bDbgOutput)
     {
         va_list Args;
@@ -5125,7 +5123,6 @@ void ExtDbgOut(PCSTR Format, ...)
         OutputVaList(DEBUG_OUTPUT_NORMAL, Format, Args);
         va_end(Args);
     }
-#endif
 }
 
 const char * const DMLFormats[] =
@@ -5487,7 +5484,7 @@ GetLineByOffset(
     IfFailRet(ConvertNativeToIlOffset(offset, &pModule, &methodToken, &methodOffs));
 
     ToRelease<IMetaDataImport> pMDImport(NULL);
-    IfFailRet(pModule->QueryInterface(IID_IMetaDataImport, (LPVOID *) &pMDImport));
+    pModule->QueryInterface(IID_IMetaDataImport, (LPVOID *) &pMDImport);
 
     SymbolReader symbolReader;
     IfFailRet(symbolReader.LoadSymbols(pMDImport, pModule));
index 411ba8955fbf8149d2616bb0a0f50aa6fbc06b1c..abed0ae94b8d25081f46d2b8815288464d3e08d9 100644 (file)
@@ -18,9 +18,6 @@
       <Platform>x64</Platform>
     </ProjectConfiguration>
   </ItemGroup>
-  <ItemGroup>
-    <Text Include="CMakeLists.txt" />
-  </ItemGroup>
   <ItemGroup>
     <ClCompile Include="gcdump.cpp" />
     <ClCompile Include="gcdumpnonx86.cpp" />
index 0b0c615805cc60cb2a57cac86ac574155ed9c55d..142ddad450e86647a69583f399a1c35a9a44ab66 100644 (file)
@@ -1,8 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
 <Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-  <ItemGroup>
-    <Text Include="CMakeLists.txt" />
-  </ItemGroup>
   <ItemGroup>
     <Filter Include="i386">
       <UniqueIdentifier>{f850f02d-2875-417b-a6cc-6058817844a0}</UniqueIdentifier>
index f779b8afd4f22f4098a210165cbc3cb94d30ee12..e8a518522a5a744757f1d570b412e6d35c51edf9 100644 (file)
@@ -2,9 +2,6 @@
 <Project Sdk="Microsoft.NET.Sdk">
   <PropertyGroup>
     <OutputType>Exe</OutputType>
-    <TargetFramework>netcoreapp2.0</TargetFramework>
-    <IsPackable>false</IsPackable>
-    <GenerateRuntimeConfigurationFiles>true</GenerateRuntimeConfigurationFiles>
-    <NoWarn>;1591;1701</NoWarn>
+    <TargetFrameworks>netcoreapp1.1;netcoreapp2.1;netcoreapp3.0</TargetFrameworks>
   </PropertyGroup>
 </Project>
index 725731196caac858d828e8ab487bb4002a9d21d3..f63befb647630ba6a0fc63349696568fca4eb522 100644 (file)
@@ -134,6 +134,7 @@ sosCommandInitialize(lldb::SBDebugger debugger)
     interpreter.AddCommand("clrstack", new sosCommand("ClrStack"), "Provides a stack trace of managed code only.");
     interpreter.AddCommand("clrthreads", new sosCommand("Threads"), "List the managed threads running.");
     interpreter.AddCommand("clru", new sosCommand("u"), "Displays an annotated disassembly of a managed method.");
+    interpreter.AddCommand("dbgout", new sosCommand("dbgout"), "Enable/disable (-off) internal SOS logging.");
     interpreter.AddCommand("dumparray", new sosCommand("DumpArray"), "Displays details about a managed array.");
     interpreter.AddCommand("dumpasync", new sosCommand("DumpAsync"), "Displays info about async state machines on the garbage-collected heap.");
     interpreter.AddCommand("dumpassembly", new sosCommand("DumpAssembly"), "Displays details about an assembly.");
index 35b6958d0ed83a9b73bc67470a3f370b422b9ccb..e6d6311cae910d87e6715451285c209b8062a973 100644 (file)
@@ -14,6 +14,7 @@ namespace Microsoft.Diagnostics.Tools.Dump
 {
     [Command(Name = "clrstack",         AliasExpansion = "ClrStack",            Help = "Provides a stack trace of managed code only.")]
     [Command(Name = "clrthreads",       AliasExpansion = "Threads",             Help = "List the managed threads running.")]
+    [Command(Name = "dbgout",           AliasExpansion = "dbgout",              Help = "Enable/disable (-off) internal SOS logging.")]
     [Command(Name = "dumparray",        AliasExpansion = "DumpArray",           Help = "Displays details about a managed array.")]
     [Command(Name = "dumpasync",        AliasExpansion = "DumpAsync",           Help = "Displays info about async state machines on the garbage-collected heap.")]
     [Command(Name = "dumpassembly",     AliasExpansion = "DumpAssembly",        Help = "Displays details about an assembly.")]