-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
- 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
- template: /eng/build.yml
parameters:
name: MacOS
- agentOs: Darwin
- queue:
- name: Hosted macOS
- parallel: 2
+ osGroup: MacOS
+ strategy:
matrix:
Build_Debug:
_BuildConfig: Debug
-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
- 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
- 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
- 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
- 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
- template: /eng/build.yml
parameters:
name: MacOS
- agentOs: Darwin
- queue:
- name: Hosted macOS
- parallel: 2
+ osGroup: MacOS
+ strategy:
matrix:
Build_Release:
_BuildConfig: Release
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
--- /dev/null
+
+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
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}"
{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
{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
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}
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%
__TestArgs="$__TestArgs $1"
;;
- --solution)
+ --projects)
__TestArgs="$__TestArgs $1 $2"
shift
;;
;;
# Ignored for a native build
- --build|--rebuild|--sign|--restore|--pack|--publish|--preparemachine|--projects|--solution)
+ --build|--rebuild|--sign|--restore|--pack|--publish|--preparemachine)
;;
*)
__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"
# Init the target distro name
initTargetDistroRid
+
echo "RID: $__DistroRid"
if [ "$__HostOS" == "OSX" ]; 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)"
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
-# 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
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)
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)/**'
condition: always()
- task: PublishBuildArtifacts@1
- displayName: Publish Logs to VSTS
+ displayName: Publish Logs
inputs:
PathtoPublish: '$(Build.StagingDirectory)/BuildLogs'
PublishLocation: Container
$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"
$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
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
shift
dotnet_dir=$1
;;
- --runtime-version-21)
- shift
- runtime_version_21=$1
- ;;
--temp-directory)
shift
temp_dir=$1
# 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
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"
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
{
"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"
<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>
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)
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>");
+ }
+ }
}
}
}
}
}
- 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
{
WriteLine(OutputType.Error, "ERROR: {0}", ex.Message);
m_lastCommandLine = null;
+ result = false;
}
}
finally
m_interruptExecutingCommand = null;
CommandFinished();
}
+ return result;
}
private void AppendNewText(string text)
protected static string GetDebuggeeNativeLibDirPath(TestConfiguration config, string debuggeeName)
{
+ if (config.DebuggeeNativeLibRoot == null)
+ {
+ return null;
+ }
return Path.Combine(config.DebuggeeNativeLibRoot, debuggeeName);
}
{
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);
}
}
--- /dev/null
+// 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
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);
}
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();
}
}
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(
<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>
<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>
--- /dev/null
+<!-- 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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
</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>
<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>
<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>
-<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>
--- /dev/null
+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>();
+ }
+}
--- /dev/null
+{
+ "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
--- /dev/null
+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();
+ }
+ });
+ }
+ }
+}
--- /dev/null
+<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>
--- /dev/null
+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>());
+ }
+}
--- /dev/null
+{
+ "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
--- /dev/null
+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();
+ }
+ });
+ });
+
+ }
+ }
+}
--- /dev/null
+<Project Sdk="Microsoft.NET.Sdk.Web">
+
+ <PropertyGroup>
+ <TargetFramework>netcoreapp3.0</TargetFramework>
+ </PropertyGroup>
+
+</Project>
--- /dev/null
+{
+ "Logging": {
+ "LogLevel": {
+ "Default": "Debug",
+ "System": "Information",
+ "Microsoft": "Information"
+ }
+ }
+}
--- /dev/null
+{
+ "Logging": {
+ "LogLevel": {
+ "Default": "Information",
+ "Microsoft": "Warning",
+ "Microsoft.Hosting.Lifetime": "Information"
+ }
+ },
+ "AllowedHosts": "*"
+}
using System.Collections.Generic;
using System.IO;
using System.Linq;
+using System.Text;
using System.Threading.Tasks;
using Xunit;
using Xunit.Abstractions;
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")
}
}
- 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))]
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();
}
}
}
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;
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,
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]+)?";
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;
_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)
}
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();
}
{
outputHelper?.WriteLine("}");
outputHelper?.Dispose();
+ pipeServer?.Dispose();
}
}
}
/// <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 ?? ""}");
}
}
}
}
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
}
arguments.AppendFormat(@"-c "".load {0}""", helperExtension);
- if (options == Options.LoadDump)
+ if (action == DebuggerAction.LoadDump)
{
arguments.Append(" -z %DUMP_NAME%");
}
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.
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}""");
}
}
}
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);
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)
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;
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();
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
{
switch (Debugger)
{
case NativeDebugger.Cdb:
+ commands.Add($".unload sos.dll");
commands.Add($".load {sosPath}");
commands.Add(".lines");
commands.Add(".reload");
{
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}");
// 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
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");
+ }
}
}
}
await _processRunner.WaitForExit();
}
- public void VerifyOutput(string verifyLine)
+ public void VerifyOutput(string verifyLine, bool match)
{
string regex = ReplaceVariables(verifyLine.TrimStart());
{
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;
}
{
_processRunner.Kill();
}
- _processRunner.WaitForExit().GetAwaiter().GetResult();
-
_outputHelper.WriteLine("}");
_outputHelper.Dispose();
}
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;
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");
}
}
string command = ReplaceVariables(input);
if (addPrefix)
{
- command = _scriptLogger.ProcessCommand(command);
+ command = ProcessCommand(command);
}
_processRunner.StandardInputWriteLine(command);
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);
DebuggerToString,
OS.Kind.ToString().ToUpperInvariant(),
_config.TestProduct.ToUpperInvariant(),
- _config.TargetArchitecture.ToUpperInvariant(),
+ _config.TargetArchitecture.ToUpperInvariant()
};
try
{
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
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)
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(@"\", @"\\"));
}
}
- 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();
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)
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)
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);
+ }
}
}
}
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";
# 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
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
-# 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
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
--- /dev/null
+#
+# 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
# 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
# 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
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
# 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
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
#
# 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
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*
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*
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+
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
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
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+
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
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>
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
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
#
# 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
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+
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+
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
# 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+
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
--- /dev/null
+#
+# 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
}
}
#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
// 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;
void
ExtRelease(void);
-#ifdef _DEBUG
-extern DWORD_PTR g_filterHint;
-#endif
-
extern BOOL ControlC;
inline BOOL IsInterrupt()
}
if (!GetAbsolutePath(directory, coreClrDirectory))
{
+ ExtDbgOut("Error: Runtime directory %s doesn't exist\n", directory);
return E_FAIL;
}
#else
}
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;
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);
HRESULT Status = GetHostRuntime(coreClrPath, hostRuntimeDirectory);
if (FAILED(Status))
{
+ ExtDbgOut("Error: Failed to get host runtime directory\n");
return Status;
}
#ifdef FEATURE_PAL
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).
DumpPermissionSet
dps=DumpPermissionSet
dumppermissionset=DumpPermissionSet
- dbgout
- filthint
#endif
+ dbgout
_EFN_GetManagedExcepStack
_EFN_GetManagedExcepStackW
_EFN_GetManagedObjectFieldInfo
bpmd
ClrStack
+dbgout
DumpArray
DumpAssembly
DumpAsync
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));
return Status;
}
-#ifdef _DEBUG
+#endif // FEATURE_PAL
+
DECLARE_API(dbgout)
{
INIT_API();
}
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)
{
ExtOut("Added Windows symbol path: %s\n", windowsSymbolPath.data);
}
+ if (logging)
+ {
+ ExtOut("Symbol download logging enabled\n");
+ }
}
else if (loadNative)
{
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;
}
va_end(Args);
}
-
void ExtDbgOut(PCSTR Format, ...)
{
-#ifdef _DEBUG
if (Output::g_bDbgOutput)
{
va_list Args;
OutputVaList(DEBUG_OUTPUT_NORMAL, Format, Args);
va_end(Args);
}
-#endif
}
const char * const DMLFormats[] =
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));
<Platform>x64</Platform>
</ProjectConfiguration>
</ItemGroup>
- <ItemGroup>
- <Text Include="CMakeLists.txt" />
- </ItemGroup>
<ItemGroup>
<ClCompile Include="gcdump.cpp" />
<ClCompile Include="gcdumpnonx86.cpp" />
<?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>
<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>
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.");
{
[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.")]