Add webapp debuggees and more SOS commmand tests (#507)

Add webapp debuggees and more SOS commmand tests

Add runtime version to TestConfiguration.ToString()

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

Enable "dbgout" command logging

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

Upgrade to 3.0.100 SDK

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

Add the lldb plugin test python script as an xunit test

Publish the dump and bin artifacts on failure

Enable triage dump testing.

Switch to BYOC pools
This commit is contained in:
Mike McLaughlin 2019-09-30 21:04:32 -07:00 коммит произвёл GitHub
Родитель 0800fb2e9e
Коммит 9a0df696f5
Не найден ключ, соответствующий данной подписи
Идентификатор ключа GPG: 4AEE18F83AFDEB23
65 изменённых файлов: 2442 добавлений и 690 удалений

Просмотреть файл

@ -1,11 +1,17 @@
phases:
trigger:
- master
- release/*
pr:
- master
- release/*
jobs:
- template: /eng/build.yml
parameters:
name: Windows
agentOs: Windows_NT
queue:
name: Hosted VS2017
parallel: 2
osGroup: Windows_NT
strategy:
matrix:
Build_Debug:
_BuildConfig: Debug
@ -17,11 +23,9 @@ phases:
- template: /eng/build.yml
parameters:
name: CentOS_7
agentOs: Linux
osGroup: Linux
dockerImage: mcr.microsoft.com/dotnet-buildtools/prereqs:centos-7-3e800f1-20190501005343
queue:
name: Hosted Ubuntu 1604
parallel: 2
strategy:
matrix:
Build_Debug:
_BuildConfig: Debug
@ -33,10 +37,8 @@ phases:
- template: /eng/build.yml
parameters:
name: MacOS
agentOs: Darwin
queue:
name: Hosted macOS
parallel: 2
osGroup: MacOS
strategy:
matrix:
Build_Debug:
_BuildConfig: Debug

Просмотреть файл

@ -1,12 +1,21 @@
phases:
trigger:
- master
- release/*
pr:
- master
- release/*
jobs:
- template: /eng/build.yml
parameters:
name: Windows
agentOs: Windows_NT
queue:
name: Hosted VS2017
parallel: 4
osGroup: Windows_NT
strategy:
matrix:
Build_Debug:
_BuildConfig: Debug
_BuildArch: x64
Build_Release:
_BuildConfig: Release
_BuildArch: x64
@ -23,11 +32,9 @@ phases:
- template: /eng/build.yml
parameters:
name: CentOS_7
agentOs: Linux
osGroup: Linux
dockerImage: mcr.microsoft.com/dotnet-buildtools/prereqs:centos-7-3e800f1-20190501005343
queue:
name: Hosted Ubuntu 1604
parallel: 2
strategy:
matrix:
Build_Debug:
_BuildConfig: Debug
@ -41,11 +48,10 @@ phases:
- template: /eng/build.yml
parameters:
name: Linux_cross
agentOs: Linux
osGroup: Linux
dockerImage: mcr.microsoft.com/dotnet-buildtools/prereqs:ubuntu-14.04-cross-1735d26-20190521133857
crossrootfsDir: '/crossrootfs/arm'
queue:
name: Hosted Ubuntu 1604
strategy:
matrix:
Build_Release:
_BuildConfig: Release
@ -55,11 +61,10 @@ phases:
- template: /eng/build.yml
parameters:
name: Linux_cross64
agentOs: Linux
osGroup: Linux
dockerImage: mcr.microsoft.com/dotnet-buildtools/prereqs:ubuntu-16.04-cross-arm64-a3ae44b-20180315221921
crossrootfsDir: '/crossrootfs/arm64'
queue:
name: Hosted Ubuntu 1604
strategy:
matrix:
Build_Release:
_BuildConfig: Release
@ -69,10 +74,9 @@ phases:
- template: /eng/build.yml
parameters:
name: Alpine3_6
agentOs: Linux
osGroup: Linux
dockerImage: mcr.microsoft.com/dotnet-buildtools/prereqs:alpine-3.6-WithNode-f4d3fe3-20181220200247
queue:
name: Hosted Ubuntu 1604
strategy:
matrix:
Build_Release:
_BuildConfig: Release
@ -82,10 +86,8 @@ phases:
- template: /eng/build.yml
parameters:
name: MacOS
agentOs: Darwin
queue:
name: Hosted macOS
parallel: 2
osGroup: MacOS
strategy:
matrix:
Build_Release:
_BuildConfig: Release
@ -97,12 +99,11 @@ phases:
- template: /eng/build.yml
parameters:
name: Debian_Stretch
agentOs: Linux
osGroup: Linux
dockerImage: mcr.microsoft.com/dotnet-buildtools/prereqs:debian-stretch-3e800f1-20190521154431
dependsOn: CentOS_7
testOnly: true
queue:
name: Hosted Ubuntu 1604
strategy:
matrix:
Build_Debug:
_BuildConfig: Debug
@ -111,12 +112,11 @@ phases:
- template: /eng/build.yml
parameters:
name: Fedora_28
agentOs: Linux
osGroup: Linux
dockerImage: mcr.microsoft.com/dotnet-buildtools/prereqs:fedora-28-09ca40b-20190508143249
dependsOn: CentOS_7
testOnly: true
queue:
name: Hosted Ubuntu 1604
strategy:
matrix:
Build_Debug:
_BuildConfig: Debug
@ -125,12 +125,11 @@ phases:
- template: /eng/build.yml
parameters:
name: Fedora_29
agentOs: Linux
osGroup: Linux
dockerImage: mcr.microsoft.com/dotnet-buildtools/prereqs:fedora-29-09ca40b-20190508143249
dependsOn: CentOS_7
testOnly: true
queue:
name: Hosted Ubuntu 1604
strategy:
matrix:
Build_Debug:
_BuildConfig: Debug
@ -139,12 +138,11 @@ phases:
- template: /eng/build.yml
parameters:
name: OpenSuse_42_1
agentOs: Linux
osGroup: Linux
dockerImage: mcr.microsoft.com/dotnet-buildtools/prereqs:opensuse-42.1-c103199-20180628122439
dependsOn: CentOS_7
testOnly: true
queue:
name: Hosted Ubuntu 1604
strategy:
matrix:
Build_Debug:
_BuildConfig: Debug
@ -153,12 +151,11 @@ phases:
- template: /eng/build.yml
parameters:
name: OpenSuse_42_3
agentOs: Linux
osGroup: Linux
dockerImage: mcr.microsoft.com/dotnet-buildtools/prereqs:opensuse-42.3-3e800f1-20190501005344
dependsOn: CentOS_7
testOnly: true
queue:
name: Hosted Ubuntu 1604
strategy:
matrix:
Build_Debug:
_BuildConfig: Debug
@ -167,12 +164,11 @@ phases:
- template: /eng/build.yml
parameters:
name: Ubuntu_14_04
agentOs: Linux
osGroup: Linux
dockerImage: mcr.microsoft.com/dotnet-buildtools/prereqs:ubuntu-14.04-1735d26-20190521133852
dependsOn: CentOS_7
testOnly: true
queue:
name: Hosted Ubuntu 1604
strategy:
matrix:
Build_Debug:
_BuildConfig: Debug
@ -181,12 +177,11 @@ phases:
- template: /eng/build.yml
parameters:
name: Ubuntu_16_04
agentOs: Linux
osGroup: Linux
dockerImage: mcr.microsoft.com/dotnet-buildtools/prereqs:ubuntu-16.04-09ca40b-20190520220842
dependsOn: CentOS_7
testOnly: true
queue:
name: Hosted Ubuntu 1604
strategy:
matrix:
Build_Debug:
_BuildConfig: Debug
@ -195,12 +190,11 @@ phases:
- template: /eng/build.yml
parameters:
name: Ubuntu_18_04
agentOs: Linux
osGroup: Linux
dockerImage: mcr.microsoft.com/dotnet-buildtools/prereqs:ubuntu-18.04-3e800f1-20190508143252
dependsOn: CentOS_7
testOnly: true
queue:
name: Hosted Ubuntu 1604
strategy:
matrix:
Build_Debug:
_BuildConfig: Debug

606
debuggees.sln Normal file
Просмотреть файл

@ -0,0 +1,606 @@

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 16
VisualStudioVersion = 16.0.29019.234
MinimumVisualStudioVersion = 10.0.40219.1
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "TestDebuggee", "src\SOS\lldbplugin.tests\TestDebuggee\TestDebuggee.csproj", "{6C43BE85-F8C3-4D76-8050-F25CE953A7FD}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "SOS", "SOS", "{41638A4C-0DAF-47ED-A774-ECBBAC0315D7}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{19FAB78C-3351-4911-8F0C-8C6056401740}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Debuggees", "Debuggees", "{C3072949-6D24-451B-A308-2F3621F858B0}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WebApp3", "src\SOS\SOS.UnitTests\Debuggees\WebApp3\WebApp3.csproj", "{252E5845-8D4C-4306-9D8F-ED2E2F7005F6}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WebApp", "src\SOS\SOS.UnitTests\Debuggees\WebApp\WebApp.csproj", "{E7FEA82E-0E16-4868-B122-4B0BC0014E7F}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SimpleThrow", "src\SOS\SOS.UnitTests\Debuggees\SimpleThrow\SimpleThrow.csproj", "{179EF543-E30A-4428-ABA0-2E2621860173}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DivZero", "src\SOS\SOS.UnitTests\Debuggees\DivZero\DivZero.csproj", "{447AC053-2E0A-4119-BD11-30A4A8E3F765}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "GCWhere", "src\SOS\SOS.UnitTests\Debuggees\GCWhere\GCWhere.csproj", "{664F46A9-3C99-489B-AAB9-4CD3A430C425}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "NestedExceptionTest", "src\SOS\SOS.UnitTests\Debuggees\NestedExceptionTest\NestedExceptionTest.csproj", "{0CB805C8-0B76-4B1D-8AAF-48535B180448}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Overflow", "src\SOS\SOS.UnitTests\Debuggees\Overflow\Overflow.csproj", "{20251748-AA7B-45BE-ADAA-C9375F5CC80F}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ReflectionTest", "src\SOS\SOS.UnitTests\Debuggees\ReflectionTest\ReflectionTest.csproj", "{DDDA69DF-2C4C-477A-B6C9-B4FE73C6E288}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "TaskNestedException", "src\SOS\SOS.UnitTests\Debuggees\TaskNestedException\TaskNestedException\TaskNestedException.csproj", "{73EA5188-1E4F-42D8-B63E-F1B878A4EB63}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "RandomUserLibrary", "src\SOS\SOS.UnitTests\Debuggees\TaskNestedException\RandomUserLibrary\RandomUserLibrary.csproj", "{B50D14DB-8EE5-47BD-B412-62FA5C693CC7}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SymbolTestApp", "src\SOS\SOS.UnitTests\Debuggees\SymbolTestApp\SymbolTestApp\SymbolTestApp.csproj", "{112FE2A7-3FD2-4496-8A14-171898AD5CF5}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SymbolTestDll", "src\SOS\SOS.UnitTests\Debuggees\SymbolTestApp\SymbolTestDll\SymbolTestDll.csproj", "{8C27904A-47C0-44C7-B191-88FF34580CBE}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Checked|Any CPU = Checked|Any CPU
Checked|ARM = Checked|ARM
Checked|ARM64 = Checked|ARM64
Checked|x64 = Checked|x64
Checked|x86 = Checked|x86
Debug|Any CPU = Debug|Any CPU
Debug|ARM = Debug|ARM
Debug|ARM64 = Debug|ARM64
Debug|x64 = Debug|x64
Debug|x86 = Debug|x86
Release|Any CPU = Release|Any CPU
Release|ARM = Release|ARM
Release|ARM64 = Release|ARM64
Release|x64 = Release|x64
Release|x86 = Release|x86
RelWithDebInfo|Any CPU = RelWithDebInfo|Any CPU
RelWithDebInfo|ARM = RelWithDebInfo|ARM
RelWithDebInfo|ARM64 = RelWithDebInfo|ARM64
RelWithDebInfo|x64 = RelWithDebInfo|x64
RelWithDebInfo|x86 = RelWithDebInfo|x86
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{6C43BE85-F8C3-4D76-8050-F25CE953A7FD}.Checked|Any CPU.ActiveCfg = Release|Any CPU
{6C43BE85-F8C3-4D76-8050-F25CE953A7FD}.Checked|Any CPU.Build.0 = Release|Any CPU
{6C43BE85-F8C3-4D76-8050-F25CE953A7FD}.Checked|ARM.ActiveCfg = Release|Any CPU
{6C43BE85-F8C3-4D76-8050-F25CE953A7FD}.Checked|ARM.Build.0 = Release|Any CPU
{6C43BE85-F8C3-4D76-8050-F25CE953A7FD}.Checked|ARM64.ActiveCfg = Release|Any CPU
{6C43BE85-F8C3-4D76-8050-F25CE953A7FD}.Checked|ARM64.Build.0 = Release|Any CPU
{6C43BE85-F8C3-4D76-8050-F25CE953A7FD}.Checked|x64.ActiveCfg = Release|Any CPU
{6C43BE85-F8C3-4D76-8050-F25CE953A7FD}.Checked|x64.Build.0 = Release|Any CPU
{6C43BE85-F8C3-4D76-8050-F25CE953A7FD}.Checked|x86.ActiveCfg = Release|Any CPU
{6C43BE85-F8C3-4D76-8050-F25CE953A7FD}.Checked|x86.Build.0 = Release|Any CPU
{6C43BE85-F8C3-4D76-8050-F25CE953A7FD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{6C43BE85-F8C3-4D76-8050-F25CE953A7FD}.Debug|Any CPU.Build.0 = Debug|Any CPU
{6C43BE85-F8C3-4D76-8050-F25CE953A7FD}.Debug|ARM.ActiveCfg = Debug|Any CPU
{6C43BE85-F8C3-4D76-8050-F25CE953A7FD}.Debug|ARM.Build.0 = Debug|Any CPU
{6C43BE85-F8C3-4D76-8050-F25CE953A7FD}.Debug|ARM64.ActiveCfg = Debug|Any CPU
{6C43BE85-F8C3-4D76-8050-F25CE953A7FD}.Debug|ARM64.Build.0 = Debug|Any CPU
{6C43BE85-F8C3-4D76-8050-F25CE953A7FD}.Debug|x64.ActiveCfg = Debug|Any CPU
{6C43BE85-F8C3-4D76-8050-F25CE953A7FD}.Debug|x64.Build.0 = Debug|Any CPU
{6C43BE85-F8C3-4D76-8050-F25CE953A7FD}.Debug|x86.ActiveCfg = Debug|Any CPU
{6C43BE85-F8C3-4D76-8050-F25CE953A7FD}.Debug|x86.Build.0 = Debug|Any CPU
{6C43BE85-F8C3-4D76-8050-F25CE953A7FD}.Release|Any CPU.ActiveCfg = Release|Any CPU
{6C43BE85-F8C3-4D76-8050-F25CE953A7FD}.Release|Any CPU.Build.0 = Release|Any CPU
{6C43BE85-F8C3-4D76-8050-F25CE953A7FD}.Release|ARM.ActiveCfg = Release|Any CPU
{6C43BE85-F8C3-4D76-8050-F25CE953A7FD}.Release|ARM.Build.0 = Release|Any CPU
{6C43BE85-F8C3-4D76-8050-F25CE953A7FD}.Release|ARM64.ActiveCfg = Release|Any CPU
{6C43BE85-F8C3-4D76-8050-F25CE953A7FD}.Release|ARM64.Build.0 = Release|Any CPU
{6C43BE85-F8C3-4D76-8050-F25CE953A7FD}.Release|x64.ActiveCfg = Release|Any CPU
{6C43BE85-F8C3-4D76-8050-F25CE953A7FD}.Release|x64.Build.0 = Release|Any CPU
{6C43BE85-F8C3-4D76-8050-F25CE953A7FD}.Release|x86.ActiveCfg = Release|Any CPU
{6C43BE85-F8C3-4D76-8050-F25CE953A7FD}.Release|x86.Build.0 = Release|Any CPU
{6C43BE85-F8C3-4D76-8050-F25CE953A7FD}.RelWithDebInfo|Any CPU.ActiveCfg = Release|Any CPU
{6C43BE85-F8C3-4D76-8050-F25CE953A7FD}.RelWithDebInfo|Any CPU.Build.0 = Release|Any CPU
{6C43BE85-F8C3-4D76-8050-F25CE953A7FD}.RelWithDebInfo|ARM.ActiveCfg = Release|Any CPU
{6C43BE85-F8C3-4D76-8050-F25CE953A7FD}.RelWithDebInfo|ARM.Build.0 = Release|Any CPU
{6C43BE85-F8C3-4D76-8050-F25CE953A7FD}.RelWithDebInfo|ARM64.ActiveCfg = Release|Any CPU
{6C43BE85-F8C3-4D76-8050-F25CE953A7FD}.RelWithDebInfo|ARM64.Build.0 = Release|Any CPU
{6C43BE85-F8C3-4D76-8050-F25CE953A7FD}.RelWithDebInfo|x64.ActiveCfg = Release|Any CPU
{6C43BE85-F8C3-4D76-8050-F25CE953A7FD}.RelWithDebInfo|x64.Build.0 = Release|Any CPU
{6C43BE85-F8C3-4D76-8050-F25CE953A7FD}.RelWithDebInfo|x86.ActiveCfg = Release|Any CPU
{6C43BE85-F8C3-4D76-8050-F25CE953A7FD}.RelWithDebInfo|x86.Build.0 = Release|Any CPU
{252E5845-8D4C-4306-9D8F-ED2E2F7005F6}.Checked|Any CPU.ActiveCfg = Debug|Any CPU
{252E5845-8D4C-4306-9D8F-ED2E2F7005F6}.Checked|Any CPU.Build.0 = Debug|Any CPU
{252E5845-8D4C-4306-9D8F-ED2E2F7005F6}.Checked|ARM.ActiveCfg = Debug|Any CPU
{252E5845-8D4C-4306-9D8F-ED2E2F7005F6}.Checked|ARM.Build.0 = Debug|Any CPU
{252E5845-8D4C-4306-9D8F-ED2E2F7005F6}.Checked|ARM64.ActiveCfg = Debug|Any CPU
{252E5845-8D4C-4306-9D8F-ED2E2F7005F6}.Checked|ARM64.Build.0 = Debug|Any CPU
{252E5845-8D4C-4306-9D8F-ED2E2F7005F6}.Checked|x64.ActiveCfg = Debug|Any CPU
{252E5845-8D4C-4306-9D8F-ED2E2F7005F6}.Checked|x64.Build.0 = Debug|Any CPU
{252E5845-8D4C-4306-9D8F-ED2E2F7005F6}.Checked|x86.ActiveCfg = Debug|Any CPU
{252E5845-8D4C-4306-9D8F-ED2E2F7005F6}.Checked|x86.Build.0 = Debug|Any CPU
{252E5845-8D4C-4306-9D8F-ED2E2F7005F6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{252E5845-8D4C-4306-9D8F-ED2E2F7005F6}.Debug|Any CPU.Build.0 = Debug|Any CPU
{252E5845-8D4C-4306-9D8F-ED2E2F7005F6}.Debug|ARM.ActiveCfg = Debug|Any CPU
{252E5845-8D4C-4306-9D8F-ED2E2F7005F6}.Debug|ARM.Build.0 = Debug|Any CPU
{252E5845-8D4C-4306-9D8F-ED2E2F7005F6}.Debug|ARM64.ActiveCfg = Debug|Any CPU
{252E5845-8D4C-4306-9D8F-ED2E2F7005F6}.Debug|ARM64.Build.0 = Debug|Any CPU
{252E5845-8D4C-4306-9D8F-ED2E2F7005F6}.Debug|x64.ActiveCfg = Debug|Any CPU
{252E5845-8D4C-4306-9D8F-ED2E2F7005F6}.Debug|x64.Build.0 = Debug|Any CPU
{252E5845-8D4C-4306-9D8F-ED2E2F7005F6}.Debug|x86.ActiveCfg = Debug|Any CPU
{252E5845-8D4C-4306-9D8F-ED2E2F7005F6}.Debug|x86.Build.0 = Debug|Any CPU
{252E5845-8D4C-4306-9D8F-ED2E2F7005F6}.Release|Any CPU.ActiveCfg = Release|Any CPU
{252E5845-8D4C-4306-9D8F-ED2E2F7005F6}.Release|Any CPU.Build.0 = Release|Any CPU
{252E5845-8D4C-4306-9D8F-ED2E2F7005F6}.Release|ARM.ActiveCfg = Release|Any CPU
{252E5845-8D4C-4306-9D8F-ED2E2F7005F6}.Release|ARM.Build.0 = Release|Any CPU
{252E5845-8D4C-4306-9D8F-ED2E2F7005F6}.Release|ARM64.ActiveCfg = Release|Any CPU
{252E5845-8D4C-4306-9D8F-ED2E2F7005F6}.Release|ARM64.Build.0 = Release|Any CPU
{252E5845-8D4C-4306-9D8F-ED2E2F7005F6}.Release|x64.ActiveCfg = Release|Any CPU
{252E5845-8D4C-4306-9D8F-ED2E2F7005F6}.Release|x64.Build.0 = Release|Any CPU
{252E5845-8D4C-4306-9D8F-ED2E2F7005F6}.Release|x86.ActiveCfg = Release|Any CPU
{252E5845-8D4C-4306-9D8F-ED2E2F7005F6}.Release|x86.Build.0 = Release|Any CPU
{252E5845-8D4C-4306-9D8F-ED2E2F7005F6}.RelWithDebInfo|Any CPU.ActiveCfg = Release|Any CPU
{252E5845-8D4C-4306-9D8F-ED2E2F7005F6}.RelWithDebInfo|Any CPU.Build.0 = Release|Any CPU
{252E5845-8D4C-4306-9D8F-ED2E2F7005F6}.RelWithDebInfo|ARM.ActiveCfg = Release|Any CPU
{252E5845-8D4C-4306-9D8F-ED2E2F7005F6}.RelWithDebInfo|ARM.Build.0 = Release|Any CPU
{252E5845-8D4C-4306-9D8F-ED2E2F7005F6}.RelWithDebInfo|ARM64.ActiveCfg = Release|Any CPU
{252E5845-8D4C-4306-9D8F-ED2E2F7005F6}.RelWithDebInfo|ARM64.Build.0 = Release|Any CPU
{252E5845-8D4C-4306-9D8F-ED2E2F7005F6}.RelWithDebInfo|x64.ActiveCfg = Release|Any CPU
{252E5845-8D4C-4306-9D8F-ED2E2F7005F6}.RelWithDebInfo|x64.Build.0 = Release|Any CPU
{252E5845-8D4C-4306-9D8F-ED2E2F7005F6}.RelWithDebInfo|x86.ActiveCfg = Release|Any CPU
{252E5845-8D4C-4306-9D8F-ED2E2F7005F6}.RelWithDebInfo|x86.Build.0 = Release|Any CPU
{E7FEA82E-0E16-4868-B122-4B0BC0014E7F}.Checked|Any CPU.ActiveCfg = Debug|Any CPU
{E7FEA82E-0E16-4868-B122-4B0BC0014E7F}.Checked|Any CPU.Build.0 = Debug|Any CPU
{E7FEA82E-0E16-4868-B122-4B0BC0014E7F}.Checked|ARM.ActiveCfg = Debug|Any CPU
{E7FEA82E-0E16-4868-B122-4B0BC0014E7F}.Checked|ARM.Build.0 = Debug|Any CPU
{E7FEA82E-0E16-4868-B122-4B0BC0014E7F}.Checked|ARM64.ActiveCfg = Debug|Any CPU
{E7FEA82E-0E16-4868-B122-4B0BC0014E7F}.Checked|ARM64.Build.0 = Debug|Any CPU
{E7FEA82E-0E16-4868-B122-4B0BC0014E7F}.Checked|x64.ActiveCfg = Debug|Any CPU
{E7FEA82E-0E16-4868-B122-4B0BC0014E7F}.Checked|x64.Build.0 = Debug|Any CPU
{E7FEA82E-0E16-4868-B122-4B0BC0014E7F}.Checked|x86.ActiveCfg = Debug|Any CPU
{E7FEA82E-0E16-4868-B122-4B0BC0014E7F}.Checked|x86.Build.0 = Debug|Any CPU
{E7FEA82E-0E16-4868-B122-4B0BC0014E7F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{E7FEA82E-0E16-4868-B122-4B0BC0014E7F}.Debug|Any CPU.Build.0 = Debug|Any CPU
{E7FEA82E-0E16-4868-B122-4B0BC0014E7F}.Debug|ARM.ActiveCfg = Debug|Any CPU
{E7FEA82E-0E16-4868-B122-4B0BC0014E7F}.Debug|ARM.Build.0 = Debug|Any CPU
{E7FEA82E-0E16-4868-B122-4B0BC0014E7F}.Debug|ARM64.ActiveCfg = Debug|Any CPU
{E7FEA82E-0E16-4868-B122-4B0BC0014E7F}.Debug|ARM64.Build.0 = Debug|Any CPU
{E7FEA82E-0E16-4868-B122-4B0BC0014E7F}.Debug|x64.ActiveCfg = Debug|Any CPU
{E7FEA82E-0E16-4868-B122-4B0BC0014E7F}.Debug|x64.Build.0 = Debug|Any CPU
{E7FEA82E-0E16-4868-B122-4B0BC0014E7F}.Debug|x86.ActiveCfg = Debug|Any CPU
{E7FEA82E-0E16-4868-B122-4B0BC0014E7F}.Debug|x86.Build.0 = Debug|Any CPU
{E7FEA82E-0E16-4868-B122-4B0BC0014E7F}.Release|Any CPU.ActiveCfg = Release|Any CPU
{E7FEA82E-0E16-4868-B122-4B0BC0014E7F}.Release|Any CPU.Build.0 = Release|Any CPU
{E7FEA82E-0E16-4868-B122-4B0BC0014E7F}.Release|ARM.ActiveCfg = Release|Any CPU
{E7FEA82E-0E16-4868-B122-4B0BC0014E7F}.Release|ARM.Build.0 = Release|Any CPU
{E7FEA82E-0E16-4868-B122-4B0BC0014E7F}.Release|ARM64.ActiveCfg = Release|Any CPU
{E7FEA82E-0E16-4868-B122-4B0BC0014E7F}.Release|ARM64.Build.0 = Release|Any CPU
{E7FEA82E-0E16-4868-B122-4B0BC0014E7F}.Release|x64.ActiveCfg = Release|Any CPU
{E7FEA82E-0E16-4868-B122-4B0BC0014E7F}.Release|x64.Build.0 = Release|Any CPU
{E7FEA82E-0E16-4868-B122-4B0BC0014E7F}.Release|x86.ActiveCfg = Release|Any CPU
{E7FEA82E-0E16-4868-B122-4B0BC0014E7F}.Release|x86.Build.0 = Release|Any CPU
{E7FEA82E-0E16-4868-B122-4B0BC0014E7F}.RelWithDebInfo|Any CPU.ActiveCfg = Release|Any CPU
{E7FEA82E-0E16-4868-B122-4B0BC0014E7F}.RelWithDebInfo|Any CPU.Build.0 = Release|Any CPU
{E7FEA82E-0E16-4868-B122-4B0BC0014E7F}.RelWithDebInfo|ARM.ActiveCfg = Release|Any CPU
{E7FEA82E-0E16-4868-B122-4B0BC0014E7F}.RelWithDebInfo|ARM.Build.0 = Release|Any CPU
{E7FEA82E-0E16-4868-B122-4B0BC0014E7F}.RelWithDebInfo|ARM64.ActiveCfg = Release|Any CPU
{E7FEA82E-0E16-4868-B122-4B0BC0014E7F}.RelWithDebInfo|ARM64.Build.0 = Release|Any CPU
{E7FEA82E-0E16-4868-B122-4B0BC0014E7F}.RelWithDebInfo|x64.ActiveCfg = Release|Any CPU
{E7FEA82E-0E16-4868-B122-4B0BC0014E7F}.RelWithDebInfo|x64.Build.0 = Release|Any CPU
{E7FEA82E-0E16-4868-B122-4B0BC0014E7F}.RelWithDebInfo|x86.ActiveCfg = Release|Any CPU
{E7FEA82E-0E16-4868-B122-4B0BC0014E7F}.RelWithDebInfo|x86.Build.0 = Release|Any CPU
{179EF543-E30A-4428-ABA0-2E2621860173}.Checked|Any CPU.ActiveCfg = Debug|Any CPU
{179EF543-E30A-4428-ABA0-2E2621860173}.Checked|Any CPU.Build.0 = Debug|Any CPU
{179EF543-E30A-4428-ABA0-2E2621860173}.Checked|ARM.ActiveCfg = Debug|Any CPU
{179EF543-E30A-4428-ABA0-2E2621860173}.Checked|ARM.Build.0 = Debug|Any CPU
{179EF543-E30A-4428-ABA0-2E2621860173}.Checked|ARM64.ActiveCfg = Debug|Any CPU
{179EF543-E30A-4428-ABA0-2E2621860173}.Checked|ARM64.Build.0 = Debug|Any CPU
{179EF543-E30A-4428-ABA0-2E2621860173}.Checked|x64.ActiveCfg = Debug|Any CPU
{179EF543-E30A-4428-ABA0-2E2621860173}.Checked|x64.Build.0 = Debug|Any CPU
{179EF543-E30A-4428-ABA0-2E2621860173}.Checked|x86.ActiveCfg = Debug|Any CPU
{179EF543-E30A-4428-ABA0-2E2621860173}.Checked|x86.Build.0 = Debug|Any CPU
{179EF543-E30A-4428-ABA0-2E2621860173}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{179EF543-E30A-4428-ABA0-2E2621860173}.Debug|Any CPU.Build.0 = Debug|Any CPU
{179EF543-E30A-4428-ABA0-2E2621860173}.Debug|ARM.ActiveCfg = Debug|Any CPU
{179EF543-E30A-4428-ABA0-2E2621860173}.Debug|ARM.Build.0 = Debug|Any CPU
{179EF543-E30A-4428-ABA0-2E2621860173}.Debug|ARM64.ActiveCfg = Debug|Any CPU
{179EF543-E30A-4428-ABA0-2E2621860173}.Debug|ARM64.Build.0 = Debug|Any CPU
{179EF543-E30A-4428-ABA0-2E2621860173}.Debug|x64.ActiveCfg = Debug|Any CPU
{179EF543-E30A-4428-ABA0-2E2621860173}.Debug|x64.Build.0 = Debug|Any CPU
{179EF543-E30A-4428-ABA0-2E2621860173}.Debug|x86.ActiveCfg = Debug|Any CPU
{179EF543-E30A-4428-ABA0-2E2621860173}.Debug|x86.Build.0 = Debug|Any CPU
{179EF543-E30A-4428-ABA0-2E2621860173}.Release|Any CPU.ActiveCfg = Release|Any CPU
{179EF543-E30A-4428-ABA0-2E2621860173}.Release|Any CPU.Build.0 = Release|Any CPU
{179EF543-E30A-4428-ABA0-2E2621860173}.Release|ARM.ActiveCfg = Release|Any CPU
{179EF543-E30A-4428-ABA0-2E2621860173}.Release|ARM.Build.0 = Release|Any CPU
{179EF543-E30A-4428-ABA0-2E2621860173}.Release|ARM64.ActiveCfg = Release|Any CPU
{179EF543-E30A-4428-ABA0-2E2621860173}.Release|ARM64.Build.0 = Release|Any CPU
{179EF543-E30A-4428-ABA0-2E2621860173}.Release|x64.ActiveCfg = Release|Any CPU
{179EF543-E30A-4428-ABA0-2E2621860173}.Release|x64.Build.0 = Release|Any CPU
{179EF543-E30A-4428-ABA0-2E2621860173}.Release|x86.ActiveCfg = Release|Any CPU
{179EF543-E30A-4428-ABA0-2E2621860173}.Release|x86.Build.0 = Release|Any CPU
{179EF543-E30A-4428-ABA0-2E2621860173}.RelWithDebInfo|Any CPU.ActiveCfg = Release|Any CPU
{179EF543-E30A-4428-ABA0-2E2621860173}.RelWithDebInfo|Any CPU.Build.0 = Release|Any CPU
{179EF543-E30A-4428-ABA0-2E2621860173}.RelWithDebInfo|ARM.ActiveCfg = Release|Any CPU
{179EF543-E30A-4428-ABA0-2E2621860173}.RelWithDebInfo|ARM.Build.0 = Release|Any CPU
{179EF543-E30A-4428-ABA0-2E2621860173}.RelWithDebInfo|ARM64.ActiveCfg = Release|Any CPU
{179EF543-E30A-4428-ABA0-2E2621860173}.RelWithDebInfo|ARM64.Build.0 = Release|Any CPU
{179EF543-E30A-4428-ABA0-2E2621860173}.RelWithDebInfo|x64.ActiveCfg = Release|Any CPU
{179EF543-E30A-4428-ABA0-2E2621860173}.RelWithDebInfo|x64.Build.0 = Release|Any CPU
{179EF543-E30A-4428-ABA0-2E2621860173}.RelWithDebInfo|x86.ActiveCfg = Release|Any CPU
{179EF543-E30A-4428-ABA0-2E2621860173}.RelWithDebInfo|x86.Build.0 = Release|Any CPU
{447AC053-2E0A-4119-BD11-30A4A8E3F765}.Checked|Any CPU.ActiveCfg = Debug|Any CPU
{447AC053-2E0A-4119-BD11-30A4A8E3F765}.Checked|Any CPU.Build.0 = Debug|Any CPU
{447AC053-2E0A-4119-BD11-30A4A8E3F765}.Checked|ARM.ActiveCfg = Debug|Any CPU
{447AC053-2E0A-4119-BD11-30A4A8E3F765}.Checked|ARM.Build.0 = Debug|Any CPU
{447AC053-2E0A-4119-BD11-30A4A8E3F765}.Checked|ARM64.ActiveCfg = Debug|Any CPU
{447AC053-2E0A-4119-BD11-30A4A8E3F765}.Checked|ARM64.Build.0 = Debug|Any CPU
{447AC053-2E0A-4119-BD11-30A4A8E3F765}.Checked|x64.ActiveCfg = Debug|Any CPU
{447AC053-2E0A-4119-BD11-30A4A8E3F765}.Checked|x64.Build.0 = Debug|Any CPU
{447AC053-2E0A-4119-BD11-30A4A8E3F765}.Checked|x86.ActiveCfg = Debug|Any CPU
{447AC053-2E0A-4119-BD11-30A4A8E3F765}.Checked|x86.Build.0 = Debug|Any CPU
{447AC053-2E0A-4119-BD11-30A4A8E3F765}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{447AC053-2E0A-4119-BD11-30A4A8E3F765}.Debug|Any CPU.Build.0 = Debug|Any CPU
{447AC053-2E0A-4119-BD11-30A4A8E3F765}.Debug|ARM.ActiveCfg = Debug|Any CPU
{447AC053-2E0A-4119-BD11-30A4A8E3F765}.Debug|ARM.Build.0 = Debug|Any CPU
{447AC053-2E0A-4119-BD11-30A4A8E3F765}.Debug|ARM64.ActiveCfg = Debug|Any CPU
{447AC053-2E0A-4119-BD11-30A4A8E3F765}.Debug|ARM64.Build.0 = Debug|Any CPU
{447AC053-2E0A-4119-BD11-30A4A8E3F765}.Debug|x64.ActiveCfg = Debug|Any CPU
{447AC053-2E0A-4119-BD11-30A4A8E3F765}.Debug|x64.Build.0 = Debug|Any CPU
{447AC053-2E0A-4119-BD11-30A4A8E3F765}.Debug|x86.ActiveCfg = Debug|Any CPU
{447AC053-2E0A-4119-BD11-30A4A8E3F765}.Debug|x86.Build.0 = Debug|Any CPU
{447AC053-2E0A-4119-BD11-30A4A8E3F765}.Release|Any CPU.ActiveCfg = Release|Any CPU
{447AC053-2E0A-4119-BD11-30A4A8E3F765}.Release|Any CPU.Build.0 = Release|Any CPU
{447AC053-2E0A-4119-BD11-30A4A8E3F765}.Release|ARM.ActiveCfg = Release|Any CPU
{447AC053-2E0A-4119-BD11-30A4A8E3F765}.Release|ARM.Build.0 = Release|Any CPU
{447AC053-2E0A-4119-BD11-30A4A8E3F765}.Release|ARM64.ActiveCfg = Release|Any CPU
{447AC053-2E0A-4119-BD11-30A4A8E3F765}.Release|ARM64.Build.0 = Release|Any CPU
{447AC053-2E0A-4119-BD11-30A4A8E3F765}.Release|x64.ActiveCfg = Release|Any CPU
{447AC053-2E0A-4119-BD11-30A4A8E3F765}.Release|x64.Build.0 = Release|Any CPU
{447AC053-2E0A-4119-BD11-30A4A8E3F765}.Release|x86.ActiveCfg = Release|Any CPU
{447AC053-2E0A-4119-BD11-30A4A8E3F765}.Release|x86.Build.0 = Release|Any CPU
{447AC053-2E0A-4119-BD11-30A4A8E3F765}.RelWithDebInfo|Any CPU.ActiveCfg = Release|Any CPU
{447AC053-2E0A-4119-BD11-30A4A8E3F765}.RelWithDebInfo|Any CPU.Build.0 = Release|Any CPU
{447AC053-2E0A-4119-BD11-30A4A8E3F765}.RelWithDebInfo|ARM.ActiveCfg = Release|Any CPU
{447AC053-2E0A-4119-BD11-30A4A8E3F765}.RelWithDebInfo|ARM.Build.0 = Release|Any CPU
{447AC053-2E0A-4119-BD11-30A4A8E3F765}.RelWithDebInfo|ARM64.ActiveCfg = Release|Any CPU
{447AC053-2E0A-4119-BD11-30A4A8E3F765}.RelWithDebInfo|ARM64.Build.0 = Release|Any CPU
{447AC053-2E0A-4119-BD11-30A4A8E3F765}.RelWithDebInfo|x64.ActiveCfg = Release|Any CPU
{447AC053-2E0A-4119-BD11-30A4A8E3F765}.RelWithDebInfo|x64.Build.0 = Release|Any CPU
{447AC053-2E0A-4119-BD11-30A4A8E3F765}.RelWithDebInfo|x86.ActiveCfg = Release|Any CPU
{447AC053-2E0A-4119-BD11-30A4A8E3F765}.RelWithDebInfo|x86.Build.0 = Release|Any CPU
{664F46A9-3C99-489B-AAB9-4CD3A430C425}.Checked|Any CPU.ActiveCfg = Debug|Any CPU
{664F46A9-3C99-489B-AAB9-4CD3A430C425}.Checked|Any CPU.Build.0 = Debug|Any CPU
{664F46A9-3C99-489B-AAB9-4CD3A430C425}.Checked|ARM.ActiveCfg = Debug|Any CPU
{664F46A9-3C99-489B-AAB9-4CD3A430C425}.Checked|ARM.Build.0 = Debug|Any CPU
{664F46A9-3C99-489B-AAB9-4CD3A430C425}.Checked|ARM64.ActiveCfg = Debug|Any CPU
{664F46A9-3C99-489B-AAB9-4CD3A430C425}.Checked|ARM64.Build.0 = Debug|Any CPU
{664F46A9-3C99-489B-AAB9-4CD3A430C425}.Checked|x64.ActiveCfg = Debug|Any CPU
{664F46A9-3C99-489B-AAB9-4CD3A430C425}.Checked|x64.Build.0 = Debug|Any CPU
{664F46A9-3C99-489B-AAB9-4CD3A430C425}.Checked|x86.ActiveCfg = Debug|Any CPU
{664F46A9-3C99-489B-AAB9-4CD3A430C425}.Checked|x86.Build.0 = Debug|Any CPU
{664F46A9-3C99-489B-AAB9-4CD3A430C425}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{664F46A9-3C99-489B-AAB9-4CD3A430C425}.Debug|Any CPU.Build.0 = Debug|Any CPU
{664F46A9-3C99-489B-AAB9-4CD3A430C425}.Debug|ARM.ActiveCfg = Debug|Any CPU
{664F46A9-3C99-489B-AAB9-4CD3A430C425}.Debug|ARM.Build.0 = Debug|Any CPU
{664F46A9-3C99-489B-AAB9-4CD3A430C425}.Debug|ARM64.ActiveCfg = Debug|Any CPU
{664F46A9-3C99-489B-AAB9-4CD3A430C425}.Debug|ARM64.Build.0 = Debug|Any CPU
{664F46A9-3C99-489B-AAB9-4CD3A430C425}.Debug|x64.ActiveCfg = Debug|Any CPU
{664F46A9-3C99-489B-AAB9-4CD3A430C425}.Debug|x64.Build.0 = Debug|Any CPU
{664F46A9-3C99-489B-AAB9-4CD3A430C425}.Debug|x86.ActiveCfg = Debug|Any CPU
{664F46A9-3C99-489B-AAB9-4CD3A430C425}.Debug|x86.Build.0 = Debug|Any CPU
{664F46A9-3C99-489B-AAB9-4CD3A430C425}.Release|Any CPU.ActiveCfg = Release|Any CPU
{664F46A9-3C99-489B-AAB9-4CD3A430C425}.Release|Any CPU.Build.0 = Release|Any CPU
{664F46A9-3C99-489B-AAB9-4CD3A430C425}.Release|ARM.ActiveCfg = Release|Any CPU
{664F46A9-3C99-489B-AAB9-4CD3A430C425}.Release|ARM.Build.0 = Release|Any CPU
{664F46A9-3C99-489B-AAB9-4CD3A430C425}.Release|ARM64.ActiveCfg = Release|Any CPU
{664F46A9-3C99-489B-AAB9-4CD3A430C425}.Release|ARM64.Build.0 = Release|Any CPU
{664F46A9-3C99-489B-AAB9-4CD3A430C425}.Release|x64.ActiveCfg = Release|Any CPU
{664F46A9-3C99-489B-AAB9-4CD3A430C425}.Release|x64.Build.0 = Release|Any CPU
{664F46A9-3C99-489B-AAB9-4CD3A430C425}.Release|x86.ActiveCfg = Release|Any CPU
{664F46A9-3C99-489B-AAB9-4CD3A430C425}.Release|x86.Build.0 = Release|Any CPU
{664F46A9-3C99-489B-AAB9-4CD3A430C425}.RelWithDebInfo|Any CPU.ActiveCfg = Release|Any CPU
{664F46A9-3C99-489B-AAB9-4CD3A430C425}.RelWithDebInfo|Any CPU.Build.0 = Release|Any CPU
{664F46A9-3C99-489B-AAB9-4CD3A430C425}.RelWithDebInfo|ARM.ActiveCfg = Release|Any CPU
{664F46A9-3C99-489B-AAB9-4CD3A430C425}.RelWithDebInfo|ARM.Build.0 = Release|Any CPU
{664F46A9-3C99-489B-AAB9-4CD3A430C425}.RelWithDebInfo|ARM64.ActiveCfg = Release|Any CPU
{664F46A9-3C99-489B-AAB9-4CD3A430C425}.RelWithDebInfo|ARM64.Build.0 = Release|Any CPU
{664F46A9-3C99-489B-AAB9-4CD3A430C425}.RelWithDebInfo|x64.ActiveCfg = Release|Any CPU
{664F46A9-3C99-489B-AAB9-4CD3A430C425}.RelWithDebInfo|x64.Build.0 = Release|Any CPU
{664F46A9-3C99-489B-AAB9-4CD3A430C425}.RelWithDebInfo|x86.ActiveCfg = Release|Any CPU
{664F46A9-3C99-489B-AAB9-4CD3A430C425}.RelWithDebInfo|x86.Build.0 = Release|Any CPU
{0CB805C8-0B76-4B1D-8AAF-48535B180448}.Checked|Any CPU.ActiveCfg = Debug|Any CPU
{0CB805C8-0B76-4B1D-8AAF-48535B180448}.Checked|Any CPU.Build.0 = Debug|Any CPU
{0CB805C8-0B76-4B1D-8AAF-48535B180448}.Checked|ARM.ActiveCfg = Debug|Any CPU
{0CB805C8-0B76-4B1D-8AAF-48535B180448}.Checked|ARM.Build.0 = Debug|Any CPU
{0CB805C8-0B76-4B1D-8AAF-48535B180448}.Checked|ARM64.ActiveCfg = Debug|Any CPU
{0CB805C8-0B76-4B1D-8AAF-48535B180448}.Checked|ARM64.Build.0 = Debug|Any CPU
{0CB805C8-0B76-4B1D-8AAF-48535B180448}.Checked|x64.ActiveCfg = Debug|Any CPU
{0CB805C8-0B76-4B1D-8AAF-48535B180448}.Checked|x64.Build.0 = Debug|Any CPU
{0CB805C8-0B76-4B1D-8AAF-48535B180448}.Checked|x86.ActiveCfg = Debug|Any CPU
{0CB805C8-0B76-4B1D-8AAF-48535B180448}.Checked|x86.Build.0 = Debug|Any CPU
{0CB805C8-0B76-4B1D-8AAF-48535B180448}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{0CB805C8-0B76-4B1D-8AAF-48535B180448}.Debug|Any CPU.Build.0 = Debug|Any CPU
{0CB805C8-0B76-4B1D-8AAF-48535B180448}.Debug|ARM.ActiveCfg = Debug|Any CPU
{0CB805C8-0B76-4B1D-8AAF-48535B180448}.Debug|ARM.Build.0 = Debug|Any CPU
{0CB805C8-0B76-4B1D-8AAF-48535B180448}.Debug|ARM64.ActiveCfg = Debug|Any CPU
{0CB805C8-0B76-4B1D-8AAF-48535B180448}.Debug|ARM64.Build.0 = Debug|Any CPU
{0CB805C8-0B76-4B1D-8AAF-48535B180448}.Debug|x64.ActiveCfg = Debug|Any CPU
{0CB805C8-0B76-4B1D-8AAF-48535B180448}.Debug|x64.Build.0 = Debug|Any CPU
{0CB805C8-0B76-4B1D-8AAF-48535B180448}.Debug|x86.ActiveCfg = Debug|Any CPU
{0CB805C8-0B76-4B1D-8AAF-48535B180448}.Debug|x86.Build.0 = Debug|Any CPU
{0CB805C8-0B76-4B1D-8AAF-48535B180448}.Release|Any CPU.ActiveCfg = Release|Any CPU
{0CB805C8-0B76-4B1D-8AAF-48535B180448}.Release|Any CPU.Build.0 = Release|Any CPU
{0CB805C8-0B76-4B1D-8AAF-48535B180448}.Release|ARM.ActiveCfg = Release|Any CPU
{0CB805C8-0B76-4B1D-8AAF-48535B180448}.Release|ARM.Build.0 = Release|Any CPU
{0CB805C8-0B76-4B1D-8AAF-48535B180448}.Release|ARM64.ActiveCfg = Release|Any CPU
{0CB805C8-0B76-4B1D-8AAF-48535B180448}.Release|ARM64.Build.0 = Release|Any CPU
{0CB805C8-0B76-4B1D-8AAF-48535B180448}.Release|x64.ActiveCfg = Release|Any CPU
{0CB805C8-0B76-4B1D-8AAF-48535B180448}.Release|x64.Build.0 = Release|Any CPU
{0CB805C8-0B76-4B1D-8AAF-48535B180448}.Release|x86.ActiveCfg = Release|Any CPU
{0CB805C8-0B76-4B1D-8AAF-48535B180448}.Release|x86.Build.0 = Release|Any CPU
{0CB805C8-0B76-4B1D-8AAF-48535B180448}.RelWithDebInfo|Any CPU.ActiveCfg = Release|Any CPU
{0CB805C8-0B76-4B1D-8AAF-48535B180448}.RelWithDebInfo|Any CPU.Build.0 = Release|Any CPU
{0CB805C8-0B76-4B1D-8AAF-48535B180448}.RelWithDebInfo|ARM.ActiveCfg = Release|Any CPU
{0CB805C8-0B76-4B1D-8AAF-48535B180448}.RelWithDebInfo|ARM.Build.0 = Release|Any CPU
{0CB805C8-0B76-4B1D-8AAF-48535B180448}.RelWithDebInfo|ARM64.ActiveCfg = Release|Any CPU
{0CB805C8-0B76-4B1D-8AAF-48535B180448}.RelWithDebInfo|ARM64.Build.0 = Release|Any CPU
{0CB805C8-0B76-4B1D-8AAF-48535B180448}.RelWithDebInfo|x64.ActiveCfg = Release|Any CPU
{0CB805C8-0B76-4B1D-8AAF-48535B180448}.RelWithDebInfo|x64.Build.0 = Release|Any CPU
{0CB805C8-0B76-4B1D-8AAF-48535B180448}.RelWithDebInfo|x86.ActiveCfg = Release|Any CPU
{0CB805C8-0B76-4B1D-8AAF-48535B180448}.RelWithDebInfo|x86.Build.0 = Release|Any CPU
{20251748-AA7B-45BE-ADAA-C9375F5CC80F}.Checked|Any CPU.ActiveCfg = Debug|Any CPU
{20251748-AA7B-45BE-ADAA-C9375F5CC80F}.Checked|Any CPU.Build.0 = Debug|Any CPU
{20251748-AA7B-45BE-ADAA-C9375F5CC80F}.Checked|ARM.ActiveCfg = Debug|Any CPU
{20251748-AA7B-45BE-ADAA-C9375F5CC80F}.Checked|ARM.Build.0 = Debug|Any CPU
{20251748-AA7B-45BE-ADAA-C9375F5CC80F}.Checked|ARM64.ActiveCfg = Debug|Any CPU
{20251748-AA7B-45BE-ADAA-C9375F5CC80F}.Checked|ARM64.Build.0 = Debug|Any CPU
{20251748-AA7B-45BE-ADAA-C9375F5CC80F}.Checked|x64.ActiveCfg = Debug|Any CPU
{20251748-AA7B-45BE-ADAA-C9375F5CC80F}.Checked|x64.Build.0 = Debug|Any CPU
{20251748-AA7B-45BE-ADAA-C9375F5CC80F}.Checked|x86.ActiveCfg = Debug|Any CPU
{20251748-AA7B-45BE-ADAA-C9375F5CC80F}.Checked|x86.Build.0 = Debug|Any CPU
{20251748-AA7B-45BE-ADAA-C9375F5CC80F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{20251748-AA7B-45BE-ADAA-C9375F5CC80F}.Debug|Any CPU.Build.0 = Debug|Any CPU
{20251748-AA7B-45BE-ADAA-C9375F5CC80F}.Debug|ARM.ActiveCfg = Debug|Any CPU
{20251748-AA7B-45BE-ADAA-C9375F5CC80F}.Debug|ARM.Build.0 = Debug|Any CPU
{20251748-AA7B-45BE-ADAA-C9375F5CC80F}.Debug|ARM64.ActiveCfg = Debug|Any CPU
{20251748-AA7B-45BE-ADAA-C9375F5CC80F}.Debug|ARM64.Build.0 = Debug|Any CPU
{20251748-AA7B-45BE-ADAA-C9375F5CC80F}.Debug|x64.ActiveCfg = Debug|Any CPU
{20251748-AA7B-45BE-ADAA-C9375F5CC80F}.Debug|x64.Build.0 = Debug|Any CPU
{20251748-AA7B-45BE-ADAA-C9375F5CC80F}.Debug|x86.ActiveCfg = Debug|Any CPU
{20251748-AA7B-45BE-ADAA-C9375F5CC80F}.Debug|x86.Build.0 = Debug|Any CPU
{20251748-AA7B-45BE-ADAA-C9375F5CC80F}.Release|Any CPU.ActiveCfg = Release|Any CPU
{20251748-AA7B-45BE-ADAA-C9375F5CC80F}.Release|Any CPU.Build.0 = Release|Any CPU
{20251748-AA7B-45BE-ADAA-C9375F5CC80F}.Release|ARM.ActiveCfg = Release|Any CPU
{20251748-AA7B-45BE-ADAA-C9375F5CC80F}.Release|ARM.Build.0 = Release|Any CPU
{20251748-AA7B-45BE-ADAA-C9375F5CC80F}.Release|ARM64.ActiveCfg = Release|Any CPU
{20251748-AA7B-45BE-ADAA-C9375F5CC80F}.Release|ARM64.Build.0 = Release|Any CPU
{20251748-AA7B-45BE-ADAA-C9375F5CC80F}.Release|x64.ActiveCfg = Release|Any CPU
{20251748-AA7B-45BE-ADAA-C9375F5CC80F}.Release|x64.Build.0 = Release|Any CPU
{20251748-AA7B-45BE-ADAA-C9375F5CC80F}.Release|x86.ActiveCfg = Release|Any CPU
{20251748-AA7B-45BE-ADAA-C9375F5CC80F}.Release|x86.Build.0 = Release|Any CPU
{20251748-AA7B-45BE-ADAA-C9375F5CC80F}.RelWithDebInfo|Any CPU.ActiveCfg = Release|Any CPU
{20251748-AA7B-45BE-ADAA-C9375F5CC80F}.RelWithDebInfo|Any CPU.Build.0 = Release|Any CPU
{20251748-AA7B-45BE-ADAA-C9375F5CC80F}.RelWithDebInfo|ARM.ActiveCfg = Release|Any CPU
{20251748-AA7B-45BE-ADAA-C9375F5CC80F}.RelWithDebInfo|ARM.Build.0 = Release|Any CPU
{20251748-AA7B-45BE-ADAA-C9375F5CC80F}.RelWithDebInfo|ARM64.ActiveCfg = Release|Any CPU
{20251748-AA7B-45BE-ADAA-C9375F5CC80F}.RelWithDebInfo|ARM64.Build.0 = Release|Any CPU
{20251748-AA7B-45BE-ADAA-C9375F5CC80F}.RelWithDebInfo|x64.ActiveCfg = Release|Any CPU
{20251748-AA7B-45BE-ADAA-C9375F5CC80F}.RelWithDebInfo|x64.Build.0 = Release|Any CPU
{20251748-AA7B-45BE-ADAA-C9375F5CC80F}.RelWithDebInfo|x86.ActiveCfg = Release|Any CPU
{20251748-AA7B-45BE-ADAA-C9375F5CC80F}.RelWithDebInfo|x86.Build.0 = Release|Any CPU
{DDDA69DF-2C4C-477A-B6C9-B4FE73C6E288}.Checked|Any CPU.ActiveCfg = Debug|Any CPU
{DDDA69DF-2C4C-477A-B6C9-B4FE73C6E288}.Checked|Any CPU.Build.0 = Debug|Any CPU
{DDDA69DF-2C4C-477A-B6C9-B4FE73C6E288}.Checked|ARM.ActiveCfg = Debug|Any CPU
{DDDA69DF-2C4C-477A-B6C9-B4FE73C6E288}.Checked|ARM.Build.0 = Debug|Any CPU
{DDDA69DF-2C4C-477A-B6C9-B4FE73C6E288}.Checked|ARM64.ActiveCfg = Debug|Any CPU
{DDDA69DF-2C4C-477A-B6C9-B4FE73C6E288}.Checked|ARM64.Build.0 = Debug|Any CPU
{DDDA69DF-2C4C-477A-B6C9-B4FE73C6E288}.Checked|x64.ActiveCfg = Debug|Any CPU
{DDDA69DF-2C4C-477A-B6C9-B4FE73C6E288}.Checked|x64.Build.0 = Debug|Any CPU
{DDDA69DF-2C4C-477A-B6C9-B4FE73C6E288}.Checked|x86.ActiveCfg = Debug|Any CPU
{DDDA69DF-2C4C-477A-B6C9-B4FE73C6E288}.Checked|x86.Build.0 = Debug|Any CPU
{DDDA69DF-2C4C-477A-B6C9-B4FE73C6E288}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{DDDA69DF-2C4C-477A-B6C9-B4FE73C6E288}.Debug|Any CPU.Build.0 = Debug|Any CPU
{DDDA69DF-2C4C-477A-B6C9-B4FE73C6E288}.Debug|ARM.ActiveCfg = Debug|Any CPU
{DDDA69DF-2C4C-477A-B6C9-B4FE73C6E288}.Debug|ARM.Build.0 = Debug|Any CPU
{DDDA69DF-2C4C-477A-B6C9-B4FE73C6E288}.Debug|ARM64.ActiveCfg = Debug|Any CPU
{DDDA69DF-2C4C-477A-B6C9-B4FE73C6E288}.Debug|ARM64.Build.0 = Debug|Any CPU
{DDDA69DF-2C4C-477A-B6C9-B4FE73C6E288}.Debug|x64.ActiveCfg = Debug|Any CPU
{DDDA69DF-2C4C-477A-B6C9-B4FE73C6E288}.Debug|x64.Build.0 = Debug|Any CPU
{DDDA69DF-2C4C-477A-B6C9-B4FE73C6E288}.Debug|x86.ActiveCfg = Debug|Any CPU
{DDDA69DF-2C4C-477A-B6C9-B4FE73C6E288}.Debug|x86.Build.0 = Debug|Any CPU
{DDDA69DF-2C4C-477A-B6C9-B4FE73C6E288}.Release|Any CPU.ActiveCfg = Release|Any CPU
{DDDA69DF-2C4C-477A-B6C9-B4FE73C6E288}.Release|Any CPU.Build.0 = Release|Any CPU
{DDDA69DF-2C4C-477A-B6C9-B4FE73C6E288}.Release|ARM.ActiveCfg = Release|Any CPU
{DDDA69DF-2C4C-477A-B6C9-B4FE73C6E288}.Release|ARM.Build.0 = Release|Any CPU
{DDDA69DF-2C4C-477A-B6C9-B4FE73C6E288}.Release|ARM64.ActiveCfg = Release|Any CPU
{DDDA69DF-2C4C-477A-B6C9-B4FE73C6E288}.Release|ARM64.Build.0 = Release|Any CPU
{DDDA69DF-2C4C-477A-B6C9-B4FE73C6E288}.Release|x64.ActiveCfg = Release|Any CPU
{DDDA69DF-2C4C-477A-B6C9-B4FE73C6E288}.Release|x64.Build.0 = Release|Any CPU
{DDDA69DF-2C4C-477A-B6C9-B4FE73C6E288}.Release|x86.ActiveCfg = Release|Any CPU
{DDDA69DF-2C4C-477A-B6C9-B4FE73C6E288}.Release|x86.Build.0 = Release|Any CPU
{DDDA69DF-2C4C-477A-B6C9-B4FE73C6E288}.RelWithDebInfo|Any CPU.ActiveCfg = Release|Any CPU
{DDDA69DF-2C4C-477A-B6C9-B4FE73C6E288}.RelWithDebInfo|Any CPU.Build.0 = Release|Any CPU
{DDDA69DF-2C4C-477A-B6C9-B4FE73C6E288}.RelWithDebInfo|ARM.ActiveCfg = Release|Any CPU
{DDDA69DF-2C4C-477A-B6C9-B4FE73C6E288}.RelWithDebInfo|ARM.Build.0 = Release|Any CPU
{DDDA69DF-2C4C-477A-B6C9-B4FE73C6E288}.RelWithDebInfo|ARM64.ActiveCfg = Release|Any CPU
{DDDA69DF-2C4C-477A-B6C9-B4FE73C6E288}.RelWithDebInfo|ARM64.Build.0 = Release|Any CPU
{DDDA69DF-2C4C-477A-B6C9-B4FE73C6E288}.RelWithDebInfo|x64.ActiveCfg = Release|Any CPU
{DDDA69DF-2C4C-477A-B6C9-B4FE73C6E288}.RelWithDebInfo|x64.Build.0 = Release|Any CPU
{DDDA69DF-2C4C-477A-B6C9-B4FE73C6E288}.RelWithDebInfo|x86.ActiveCfg = Release|Any CPU
{DDDA69DF-2C4C-477A-B6C9-B4FE73C6E288}.RelWithDebInfo|x86.Build.0 = Release|Any CPU
{73EA5188-1E4F-42D8-B63E-F1B878A4EB63}.Checked|Any CPU.ActiveCfg = Debug|Any CPU
{73EA5188-1E4F-42D8-B63E-F1B878A4EB63}.Checked|Any CPU.Build.0 = Debug|Any CPU
{73EA5188-1E4F-42D8-B63E-F1B878A4EB63}.Checked|ARM.ActiveCfg = Debug|Any CPU
{73EA5188-1E4F-42D8-B63E-F1B878A4EB63}.Checked|ARM.Build.0 = Debug|Any CPU
{73EA5188-1E4F-42D8-B63E-F1B878A4EB63}.Checked|ARM64.ActiveCfg = Debug|Any CPU
{73EA5188-1E4F-42D8-B63E-F1B878A4EB63}.Checked|ARM64.Build.0 = Debug|Any CPU
{73EA5188-1E4F-42D8-B63E-F1B878A4EB63}.Checked|x64.ActiveCfg = Debug|Any CPU
{73EA5188-1E4F-42D8-B63E-F1B878A4EB63}.Checked|x64.Build.0 = Debug|Any CPU
{73EA5188-1E4F-42D8-B63E-F1B878A4EB63}.Checked|x86.ActiveCfg = Debug|Any CPU
{73EA5188-1E4F-42D8-B63E-F1B878A4EB63}.Checked|x86.Build.0 = Debug|Any CPU
{73EA5188-1E4F-42D8-B63E-F1B878A4EB63}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{73EA5188-1E4F-42D8-B63E-F1B878A4EB63}.Debug|Any CPU.Build.0 = Debug|Any CPU
{73EA5188-1E4F-42D8-B63E-F1B878A4EB63}.Debug|ARM.ActiveCfg = Debug|Any CPU
{73EA5188-1E4F-42D8-B63E-F1B878A4EB63}.Debug|ARM.Build.0 = Debug|Any CPU
{73EA5188-1E4F-42D8-B63E-F1B878A4EB63}.Debug|ARM64.ActiveCfg = Debug|Any CPU
{73EA5188-1E4F-42D8-B63E-F1B878A4EB63}.Debug|ARM64.Build.0 = Debug|Any CPU
{73EA5188-1E4F-42D8-B63E-F1B878A4EB63}.Debug|x64.ActiveCfg = Debug|Any CPU
{73EA5188-1E4F-42D8-B63E-F1B878A4EB63}.Debug|x64.Build.0 = Debug|Any CPU
{73EA5188-1E4F-42D8-B63E-F1B878A4EB63}.Debug|x86.ActiveCfg = Debug|Any CPU
{73EA5188-1E4F-42D8-B63E-F1B878A4EB63}.Debug|x86.Build.0 = Debug|Any CPU
{73EA5188-1E4F-42D8-B63E-F1B878A4EB63}.Release|Any CPU.ActiveCfg = Release|Any CPU
{73EA5188-1E4F-42D8-B63E-F1B878A4EB63}.Release|Any CPU.Build.0 = Release|Any CPU
{73EA5188-1E4F-42D8-B63E-F1B878A4EB63}.Release|ARM.ActiveCfg = Release|Any CPU
{73EA5188-1E4F-42D8-B63E-F1B878A4EB63}.Release|ARM.Build.0 = Release|Any CPU
{73EA5188-1E4F-42D8-B63E-F1B878A4EB63}.Release|ARM64.ActiveCfg = Release|Any CPU
{73EA5188-1E4F-42D8-B63E-F1B878A4EB63}.Release|ARM64.Build.0 = Release|Any CPU
{73EA5188-1E4F-42D8-B63E-F1B878A4EB63}.Release|x64.ActiveCfg = Release|Any CPU
{73EA5188-1E4F-42D8-B63E-F1B878A4EB63}.Release|x64.Build.0 = Release|Any CPU
{73EA5188-1E4F-42D8-B63E-F1B878A4EB63}.Release|x86.ActiveCfg = Release|Any CPU
{73EA5188-1E4F-42D8-B63E-F1B878A4EB63}.Release|x86.Build.0 = Release|Any CPU
{73EA5188-1E4F-42D8-B63E-F1B878A4EB63}.RelWithDebInfo|Any CPU.ActiveCfg = Release|Any CPU
{73EA5188-1E4F-42D8-B63E-F1B878A4EB63}.RelWithDebInfo|Any CPU.Build.0 = Release|Any CPU
{73EA5188-1E4F-42D8-B63E-F1B878A4EB63}.RelWithDebInfo|ARM.ActiveCfg = Release|Any CPU
{73EA5188-1E4F-42D8-B63E-F1B878A4EB63}.RelWithDebInfo|ARM.Build.0 = Release|Any CPU
{73EA5188-1E4F-42D8-B63E-F1B878A4EB63}.RelWithDebInfo|ARM64.ActiveCfg = Release|Any CPU
{73EA5188-1E4F-42D8-B63E-F1B878A4EB63}.RelWithDebInfo|ARM64.Build.0 = Release|Any CPU
{73EA5188-1E4F-42D8-B63E-F1B878A4EB63}.RelWithDebInfo|x64.ActiveCfg = Release|Any CPU
{73EA5188-1E4F-42D8-B63E-F1B878A4EB63}.RelWithDebInfo|x64.Build.0 = Release|Any CPU
{73EA5188-1E4F-42D8-B63E-F1B878A4EB63}.RelWithDebInfo|x86.ActiveCfg = Release|Any CPU
{73EA5188-1E4F-42D8-B63E-F1B878A4EB63}.RelWithDebInfo|x86.Build.0 = Release|Any CPU
{B50D14DB-8EE5-47BD-B412-62FA5C693CC7}.Checked|Any CPU.ActiveCfg = Debug|Any CPU
{B50D14DB-8EE5-47BD-B412-62FA5C693CC7}.Checked|Any CPU.Build.0 = Debug|Any CPU
{B50D14DB-8EE5-47BD-B412-62FA5C693CC7}.Checked|ARM.ActiveCfg = Debug|Any CPU
{B50D14DB-8EE5-47BD-B412-62FA5C693CC7}.Checked|ARM.Build.0 = Debug|Any CPU
{B50D14DB-8EE5-47BD-B412-62FA5C693CC7}.Checked|ARM64.ActiveCfg = Debug|Any CPU
{B50D14DB-8EE5-47BD-B412-62FA5C693CC7}.Checked|ARM64.Build.0 = Debug|Any CPU
{B50D14DB-8EE5-47BD-B412-62FA5C693CC7}.Checked|x64.ActiveCfg = Debug|Any CPU
{B50D14DB-8EE5-47BD-B412-62FA5C693CC7}.Checked|x64.Build.0 = Debug|Any CPU
{B50D14DB-8EE5-47BD-B412-62FA5C693CC7}.Checked|x86.ActiveCfg = Debug|Any CPU
{B50D14DB-8EE5-47BD-B412-62FA5C693CC7}.Checked|x86.Build.0 = Debug|Any CPU
{B50D14DB-8EE5-47BD-B412-62FA5C693CC7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{B50D14DB-8EE5-47BD-B412-62FA5C693CC7}.Debug|Any CPU.Build.0 = Debug|Any CPU
{B50D14DB-8EE5-47BD-B412-62FA5C693CC7}.Debug|ARM.ActiveCfg = Debug|Any CPU
{B50D14DB-8EE5-47BD-B412-62FA5C693CC7}.Debug|ARM.Build.0 = Debug|Any CPU
{B50D14DB-8EE5-47BD-B412-62FA5C693CC7}.Debug|ARM64.ActiveCfg = Debug|Any CPU
{B50D14DB-8EE5-47BD-B412-62FA5C693CC7}.Debug|ARM64.Build.0 = Debug|Any CPU
{B50D14DB-8EE5-47BD-B412-62FA5C693CC7}.Debug|x64.ActiveCfg = Debug|Any CPU
{B50D14DB-8EE5-47BD-B412-62FA5C693CC7}.Debug|x64.Build.0 = Debug|Any CPU
{B50D14DB-8EE5-47BD-B412-62FA5C693CC7}.Debug|x86.ActiveCfg = Debug|Any CPU
{B50D14DB-8EE5-47BD-B412-62FA5C693CC7}.Debug|x86.Build.0 = Debug|Any CPU
{B50D14DB-8EE5-47BD-B412-62FA5C693CC7}.Release|Any CPU.ActiveCfg = Release|Any CPU
{B50D14DB-8EE5-47BD-B412-62FA5C693CC7}.Release|Any CPU.Build.0 = Release|Any CPU
{B50D14DB-8EE5-47BD-B412-62FA5C693CC7}.Release|ARM.ActiveCfg = Release|Any CPU
{B50D14DB-8EE5-47BD-B412-62FA5C693CC7}.Release|ARM.Build.0 = Release|Any CPU
{B50D14DB-8EE5-47BD-B412-62FA5C693CC7}.Release|ARM64.ActiveCfg = Release|Any CPU
{B50D14DB-8EE5-47BD-B412-62FA5C693CC7}.Release|ARM64.Build.0 = Release|Any CPU
{B50D14DB-8EE5-47BD-B412-62FA5C693CC7}.Release|x64.ActiveCfg = Release|Any CPU
{B50D14DB-8EE5-47BD-B412-62FA5C693CC7}.Release|x64.Build.0 = Release|Any CPU
{B50D14DB-8EE5-47BD-B412-62FA5C693CC7}.Release|x86.ActiveCfg = Release|Any CPU
{B50D14DB-8EE5-47BD-B412-62FA5C693CC7}.Release|x86.Build.0 = Release|Any CPU
{B50D14DB-8EE5-47BD-B412-62FA5C693CC7}.RelWithDebInfo|Any CPU.ActiveCfg = Release|Any CPU
{B50D14DB-8EE5-47BD-B412-62FA5C693CC7}.RelWithDebInfo|Any CPU.Build.0 = Release|Any CPU
{B50D14DB-8EE5-47BD-B412-62FA5C693CC7}.RelWithDebInfo|ARM.ActiveCfg = Release|Any CPU
{B50D14DB-8EE5-47BD-B412-62FA5C693CC7}.RelWithDebInfo|ARM.Build.0 = Release|Any CPU
{B50D14DB-8EE5-47BD-B412-62FA5C693CC7}.RelWithDebInfo|ARM64.ActiveCfg = Release|Any CPU
{B50D14DB-8EE5-47BD-B412-62FA5C693CC7}.RelWithDebInfo|ARM64.Build.0 = Release|Any CPU
{B50D14DB-8EE5-47BD-B412-62FA5C693CC7}.RelWithDebInfo|x64.ActiveCfg = Release|Any CPU
{B50D14DB-8EE5-47BD-B412-62FA5C693CC7}.RelWithDebInfo|x64.Build.0 = Release|Any CPU
{B50D14DB-8EE5-47BD-B412-62FA5C693CC7}.RelWithDebInfo|x86.ActiveCfg = Release|Any CPU
{B50D14DB-8EE5-47BD-B412-62FA5C693CC7}.RelWithDebInfo|x86.Build.0 = Release|Any CPU
{112FE2A7-3FD2-4496-8A14-171898AD5CF5}.Checked|Any CPU.ActiveCfg = Debug|Any CPU
{112FE2A7-3FD2-4496-8A14-171898AD5CF5}.Checked|Any CPU.Build.0 = Debug|Any CPU
{112FE2A7-3FD2-4496-8A14-171898AD5CF5}.Checked|ARM.ActiveCfg = Debug|Any CPU
{112FE2A7-3FD2-4496-8A14-171898AD5CF5}.Checked|ARM.Build.0 = Debug|Any CPU
{112FE2A7-3FD2-4496-8A14-171898AD5CF5}.Checked|ARM64.ActiveCfg = Debug|Any CPU
{112FE2A7-3FD2-4496-8A14-171898AD5CF5}.Checked|ARM64.Build.0 = Debug|Any CPU
{112FE2A7-3FD2-4496-8A14-171898AD5CF5}.Checked|x64.ActiveCfg = Debug|Any CPU
{112FE2A7-3FD2-4496-8A14-171898AD5CF5}.Checked|x64.Build.0 = Debug|Any CPU
{112FE2A7-3FD2-4496-8A14-171898AD5CF5}.Checked|x86.ActiveCfg = Debug|Any CPU
{112FE2A7-3FD2-4496-8A14-171898AD5CF5}.Checked|x86.Build.0 = Debug|Any CPU
{112FE2A7-3FD2-4496-8A14-171898AD5CF5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{112FE2A7-3FD2-4496-8A14-171898AD5CF5}.Debug|Any CPU.Build.0 = Debug|Any CPU
{112FE2A7-3FD2-4496-8A14-171898AD5CF5}.Debug|ARM.ActiveCfg = Debug|Any CPU
{112FE2A7-3FD2-4496-8A14-171898AD5CF5}.Debug|ARM.Build.0 = Debug|Any CPU
{112FE2A7-3FD2-4496-8A14-171898AD5CF5}.Debug|ARM64.ActiveCfg = Debug|Any CPU
{112FE2A7-3FD2-4496-8A14-171898AD5CF5}.Debug|ARM64.Build.0 = Debug|Any CPU
{112FE2A7-3FD2-4496-8A14-171898AD5CF5}.Debug|x64.ActiveCfg = Debug|Any CPU
{112FE2A7-3FD2-4496-8A14-171898AD5CF5}.Debug|x64.Build.0 = Debug|Any CPU
{112FE2A7-3FD2-4496-8A14-171898AD5CF5}.Debug|x86.ActiveCfg = Debug|Any CPU
{112FE2A7-3FD2-4496-8A14-171898AD5CF5}.Debug|x86.Build.0 = Debug|Any CPU
{112FE2A7-3FD2-4496-8A14-171898AD5CF5}.Release|Any CPU.ActiveCfg = Release|Any CPU
{112FE2A7-3FD2-4496-8A14-171898AD5CF5}.Release|Any CPU.Build.0 = Release|Any CPU
{112FE2A7-3FD2-4496-8A14-171898AD5CF5}.Release|ARM.ActiveCfg = Release|Any CPU
{112FE2A7-3FD2-4496-8A14-171898AD5CF5}.Release|ARM.Build.0 = Release|Any CPU
{112FE2A7-3FD2-4496-8A14-171898AD5CF5}.Release|ARM64.ActiveCfg = Release|Any CPU
{112FE2A7-3FD2-4496-8A14-171898AD5CF5}.Release|ARM64.Build.0 = Release|Any CPU
{112FE2A7-3FD2-4496-8A14-171898AD5CF5}.Release|x64.ActiveCfg = Release|Any CPU
{112FE2A7-3FD2-4496-8A14-171898AD5CF5}.Release|x64.Build.0 = Release|Any CPU
{112FE2A7-3FD2-4496-8A14-171898AD5CF5}.Release|x86.ActiveCfg = Release|Any CPU
{112FE2A7-3FD2-4496-8A14-171898AD5CF5}.Release|x86.Build.0 = Release|Any CPU
{112FE2A7-3FD2-4496-8A14-171898AD5CF5}.RelWithDebInfo|Any CPU.ActiveCfg = Release|Any CPU
{112FE2A7-3FD2-4496-8A14-171898AD5CF5}.RelWithDebInfo|Any CPU.Build.0 = Release|Any CPU
{112FE2A7-3FD2-4496-8A14-171898AD5CF5}.RelWithDebInfo|ARM.ActiveCfg = Release|Any CPU
{112FE2A7-3FD2-4496-8A14-171898AD5CF5}.RelWithDebInfo|ARM.Build.0 = Release|Any CPU
{112FE2A7-3FD2-4496-8A14-171898AD5CF5}.RelWithDebInfo|ARM64.ActiveCfg = Release|Any CPU
{112FE2A7-3FD2-4496-8A14-171898AD5CF5}.RelWithDebInfo|ARM64.Build.0 = Release|Any CPU
{112FE2A7-3FD2-4496-8A14-171898AD5CF5}.RelWithDebInfo|x64.ActiveCfg = Release|Any CPU
{112FE2A7-3FD2-4496-8A14-171898AD5CF5}.RelWithDebInfo|x64.Build.0 = Release|Any CPU
{112FE2A7-3FD2-4496-8A14-171898AD5CF5}.RelWithDebInfo|x86.ActiveCfg = Release|Any CPU
{112FE2A7-3FD2-4496-8A14-171898AD5CF5}.RelWithDebInfo|x86.Build.0 = Release|Any CPU
{8C27904A-47C0-44C7-B191-88FF34580CBE}.Checked|Any CPU.ActiveCfg = Debug|Any CPU
{8C27904A-47C0-44C7-B191-88FF34580CBE}.Checked|Any CPU.Build.0 = Debug|Any CPU
{8C27904A-47C0-44C7-B191-88FF34580CBE}.Checked|ARM.ActiveCfg = Debug|Any CPU
{8C27904A-47C0-44C7-B191-88FF34580CBE}.Checked|ARM.Build.0 = Debug|Any CPU
{8C27904A-47C0-44C7-B191-88FF34580CBE}.Checked|ARM64.ActiveCfg = Debug|Any CPU
{8C27904A-47C0-44C7-B191-88FF34580CBE}.Checked|ARM64.Build.0 = Debug|Any CPU
{8C27904A-47C0-44C7-B191-88FF34580CBE}.Checked|x64.ActiveCfg = Debug|Any CPU
{8C27904A-47C0-44C7-B191-88FF34580CBE}.Checked|x64.Build.0 = Debug|Any CPU
{8C27904A-47C0-44C7-B191-88FF34580CBE}.Checked|x86.ActiveCfg = Debug|Any CPU
{8C27904A-47C0-44C7-B191-88FF34580CBE}.Checked|x86.Build.0 = Debug|Any CPU
{8C27904A-47C0-44C7-B191-88FF34580CBE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{8C27904A-47C0-44C7-B191-88FF34580CBE}.Debug|Any CPU.Build.0 = Debug|Any CPU
{8C27904A-47C0-44C7-B191-88FF34580CBE}.Debug|ARM.ActiveCfg = Debug|Any CPU
{8C27904A-47C0-44C7-B191-88FF34580CBE}.Debug|ARM.Build.0 = Debug|Any CPU
{8C27904A-47C0-44C7-B191-88FF34580CBE}.Debug|ARM64.ActiveCfg = Debug|Any CPU
{8C27904A-47C0-44C7-B191-88FF34580CBE}.Debug|ARM64.Build.0 = Debug|Any CPU
{8C27904A-47C0-44C7-B191-88FF34580CBE}.Debug|x64.ActiveCfg = Debug|Any CPU
{8C27904A-47C0-44C7-B191-88FF34580CBE}.Debug|x64.Build.0 = Debug|Any CPU
{8C27904A-47C0-44C7-B191-88FF34580CBE}.Debug|x86.ActiveCfg = Debug|Any CPU
{8C27904A-47C0-44C7-B191-88FF34580CBE}.Debug|x86.Build.0 = Debug|Any CPU
{8C27904A-47C0-44C7-B191-88FF34580CBE}.Release|Any CPU.ActiveCfg = Release|Any CPU
{8C27904A-47C0-44C7-B191-88FF34580CBE}.Release|Any CPU.Build.0 = Release|Any CPU
{8C27904A-47C0-44C7-B191-88FF34580CBE}.Release|ARM.ActiveCfg = Release|Any CPU
{8C27904A-47C0-44C7-B191-88FF34580CBE}.Release|ARM.Build.0 = Release|Any CPU
{8C27904A-47C0-44C7-B191-88FF34580CBE}.Release|ARM64.ActiveCfg = Release|Any CPU
{8C27904A-47C0-44C7-B191-88FF34580CBE}.Release|ARM64.Build.0 = Release|Any CPU
{8C27904A-47C0-44C7-B191-88FF34580CBE}.Release|x64.ActiveCfg = Release|Any CPU
{8C27904A-47C0-44C7-B191-88FF34580CBE}.Release|x64.Build.0 = Release|Any CPU
{8C27904A-47C0-44C7-B191-88FF34580CBE}.Release|x86.ActiveCfg = Release|Any CPU
{8C27904A-47C0-44C7-B191-88FF34580CBE}.Release|x86.Build.0 = Release|Any CPU
{8C27904A-47C0-44C7-B191-88FF34580CBE}.RelWithDebInfo|Any CPU.ActiveCfg = Release|Any CPU
{8C27904A-47C0-44C7-B191-88FF34580CBE}.RelWithDebInfo|Any CPU.Build.0 = Release|Any CPU
{8C27904A-47C0-44C7-B191-88FF34580CBE}.RelWithDebInfo|ARM.ActiveCfg = Release|Any CPU
{8C27904A-47C0-44C7-B191-88FF34580CBE}.RelWithDebInfo|ARM.Build.0 = Release|Any CPU
{8C27904A-47C0-44C7-B191-88FF34580CBE}.RelWithDebInfo|ARM64.ActiveCfg = Release|Any CPU
{8C27904A-47C0-44C7-B191-88FF34580CBE}.RelWithDebInfo|ARM64.Build.0 = Release|Any CPU
{8C27904A-47C0-44C7-B191-88FF34580CBE}.RelWithDebInfo|x64.ActiveCfg = Release|Any CPU
{8C27904A-47C0-44C7-B191-88FF34580CBE}.RelWithDebInfo|x64.Build.0 = Release|Any CPU
{8C27904A-47C0-44C7-B191-88FF34580CBE}.RelWithDebInfo|x86.ActiveCfg = Release|Any CPU
{8C27904A-47C0-44C7-B191-88FF34580CBE}.RelWithDebInfo|x86.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(NestedProjects) = preSolution
{6C43BE85-F8C3-4D76-8050-F25CE953A7FD} = {C3072949-6D24-451B-A308-2F3621F858B0}
{41638A4C-0DAF-47ED-A774-ECBBAC0315D7} = {19FAB78C-3351-4911-8F0C-8C6056401740}
{C3072949-6D24-451B-A308-2F3621F858B0} = {41638A4C-0DAF-47ED-A774-ECBBAC0315D7}
{252E5845-8D4C-4306-9D8F-ED2E2F7005F6} = {C3072949-6D24-451B-A308-2F3621F858B0}
{E7FEA82E-0E16-4868-B122-4B0BC0014E7F} = {C3072949-6D24-451B-A308-2F3621F858B0}
{179EF543-E30A-4428-ABA0-2E2621860173} = {C3072949-6D24-451B-A308-2F3621F858B0}
{447AC053-2E0A-4119-BD11-30A4A8E3F765} = {C3072949-6D24-451B-A308-2F3621F858B0}
{664F46A9-3C99-489B-AAB9-4CD3A430C425} = {C3072949-6D24-451B-A308-2F3621F858B0}
{0CB805C8-0B76-4B1D-8AAF-48535B180448} = {C3072949-6D24-451B-A308-2F3621F858B0}
{20251748-AA7B-45BE-ADAA-C9375F5CC80F} = {C3072949-6D24-451B-A308-2F3621F858B0}
{DDDA69DF-2C4C-477A-B6C9-B4FE73C6E288} = {C3072949-6D24-451B-A308-2F3621F858B0}
{73EA5188-1E4F-42D8-B63E-F1B878A4EB63} = {C3072949-6D24-451B-A308-2F3621F858B0}
{B50D14DB-8EE5-47BD-B412-62FA5C693CC7} = {C3072949-6D24-451B-A308-2F3621F858B0}
{112FE2A7-3FD2-4496-8A14-171898AD5CF5} = {C3072949-6D24-451B-A308-2F3621F858B0}
{8C27904A-47C0-44C7-B191-88FF34580CBE} = {C3072949-6D24-451B-A308-2F3621F858B0}
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {46465737-C938-44FC-BE1A-4CE139EBB5E0}
EndGlobalSection
EndGlobal

Просмотреть файл

@ -5,8 +5,6 @@ VisualStudioVersion = 16.0.29019.234
MinimumVisualStudioVersion = 10.0.40219.1
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SOS.NETCore", "src\SOS\SOS.NETCore\SOS.NETCore.csproj", "{20513BA2-A156-4A17-4C70-5AC2DBD4F833}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "TestDebuggee", "src\SOS\lldbplugin.tests\TestDebuggee\TestDebuggee.csproj", "{6C43BE85-F8C3-4D76-8050-F25CE953A7FD}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Diagnostics.TestHelpers", "src\Microsoft.Diagnostics.TestHelpers\Microsoft.Diagnostics.TestHelpers.csproj", "{730C1201-1848-4F1E-8C1F-6316FB886C35}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "SOS", "SOS", "{41638A4C-0DAF-47ED-A774-ECBBAC0315D7}"
@ -113,46 +111,6 @@ Global
{20513BA2-A156-4A17-4C70-5AC2DBD4F833}.RelWithDebInfo|x64.Build.0 = Release|Any CPU
{20513BA2-A156-4A17-4C70-5AC2DBD4F833}.RelWithDebInfo|x86.ActiveCfg = Release|Any CPU
{20513BA2-A156-4A17-4C70-5AC2DBD4F833}.RelWithDebInfo|x86.Build.0 = Release|Any CPU
{6C43BE85-F8C3-4D76-8050-F25CE953A7FD}.Checked|Any CPU.ActiveCfg = Release|Any CPU
{6C43BE85-F8C3-4D76-8050-F25CE953A7FD}.Checked|Any CPU.Build.0 = Release|Any CPU
{6C43BE85-F8C3-4D76-8050-F25CE953A7FD}.Checked|ARM.ActiveCfg = Release|Any CPU
{6C43BE85-F8C3-4D76-8050-F25CE953A7FD}.Checked|ARM.Build.0 = Release|Any CPU
{6C43BE85-F8C3-4D76-8050-F25CE953A7FD}.Checked|ARM64.ActiveCfg = Release|Any CPU
{6C43BE85-F8C3-4D76-8050-F25CE953A7FD}.Checked|ARM64.Build.0 = Release|Any CPU
{6C43BE85-F8C3-4D76-8050-F25CE953A7FD}.Checked|x64.ActiveCfg = Release|Any CPU
{6C43BE85-F8C3-4D76-8050-F25CE953A7FD}.Checked|x64.Build.0 = Release|Any CPU
{6C43BE85-F8C3-4D76-8050-F25CE953A7FD}.Checked|x86.ActiveCfg = Release|Any CPU
{6C43BE85-F8C3-4D76-8050-F25CE953A7FD}.Checked|x86.Build.0 = Release|Any CPU
{6C43BE85-F8C3-4D76-8050-F25CE953A7FD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{6C43BE85-F8C3-4D76-8050-F25CE953A7FD}.Debug|Any CPU.Build.0 = Debug|Any CPU
{6C43BE85-F8C3-4D76-8050-F25CE953A7FD}.Debug|ARM.ActiveCfg = Debug|Any CPU
{6C43BE85-F8C3-4D76-8050-F25CE953A7FD}.Debug|ARM.Build.0 = Debug|Any CPU
{6C43BE85-F8C3-4D76-8050-F25CE953A7FD}.Debug|ARM64.ActiveCfg = Debug|Any CPU
{6C43BE85-F8C3-4D76-8050-F25CE953A7FD}.Debug|ARM64.Build.0 = Debug|Any CPU
{6C43BE85-F8C3-4D76-8050-F25CE953A7FD}.Debug|x64.ActiveCfg = Debug|Any CPU
{6C43BE85-F8C3-4D76-8050-F25CE953A7FD}.Debug|x64.Build.0 = Debug|Any CPU
{6C43BE85-F8C3-4D76-8050-F25CE953A7FD}.Debug|x86.ActiveCfg = Debug|Any CPU
{6C43BE85-F8C3-4D76-8050-F25CE953A7FD}.Debug|x86.Build.0 = Debug|Any CPU
{6C43BE85-F8C3-4D76-8050-F25CE953A7FD}.Release|Any CPU.ActiveCfg = Release|Any CPU
{6C43BE85-F8C3-4D76-8050-F25CE953A7FD}.Release|Any CPU.Build.0 = Release|Any CPU
{6C43BE85-F8C3-4D76-8050-F25CE953A7FD}.Release|ARM.ActiveCfg = Release|Any CPU
{6C43BE85-F8C3-4D76-8050-F25CE953A7FD}.Release|ARM.Build.0 = Release|Any CPU
{6C43BE85-F8C3-4D76-8050-F25CE953A7FD}.Release|ARM64.ActiveCfg = Release|Any CPU
{6C43BE85-F8C3-4D76-8050-F25CE953A7FD}.Release|ARM64.Build.0 = Release|Any CPU
{6C43BE85-F8C3-4D76-8050-F25CE953A7FD}.Release|x64.ActiveCfg = Release|Any CPU
{6C43BE85-F8C3-4D76-8050-F25CE953A7FD}.Release|x64.Build.0 = Release|Any CPU
{6C43BE85-F8C3-4D76-8050-F25CE953A7FD}.Release|x86.ActiveCfg = Release|Any CPU
{6C43BE85-F8C3-4D76-8050-F25CE953A7FD}.Release|x86.Build.0 = Release|Any CPU
{6C43BE85-F8C3-4D76-8050-F25CE953A7FD}.RelWithDebInfo|Any CPU.ActiveCfg = Release|Any CPU
{6C43BE85-F8C3-4D76-8050-F25CE953A7FD}.RelWithDebInfo|Any CPU.Build.0 = Release|Any CPU
{6C43BE85-F8C3-4D76-8050-F25CE953A7FD}.RelWithDebInfo|ARM.ActiveCfg = Release|Any CPU
{6C43BE85-F8C3-4D76-8050-F25CE953A7FD}.RelWithDebInfo|ARM.Build.0 = Release|Any CPU
{6C43BE85-F8C3-4D76-8050-F25CE953A7FD}.RelWithDebInfo|ARM64.ActiveCfg = Release|Any CPU
{6C43BE85-F8C3-4D76-8050-F25CE953A7FD}.RelWithDebInfo|ARM64.Build.0 = Release|Any CPU
{6C43BE85-F8C3-4D76-8050-F25CE953A7FD}.RelWithDebInfo|x64.ActiveCfg = Release|Any CPU
{6C43BE85-F8C3-4D76-8050-F25CE953A7FD}.RelWithDebInfo|x64.Build.0 = Release|Any CPU
{6C43BE85-F8C3-4D76-8050-F25CE953A7FD}.RelWithDebInfo|x86.ActiveCfg = Release|Any CPU
{6C43BE85-F8C3-4D76-8050-F25CE953A7FD}.RelWithDebInfo|x86.Build.0 = Release|Any CPU
{730C1201-1848-4F1E-8C1F-6316FB886C35}.Checked|Any CPU.ActiveCfg = Release|Any CPU
{730C1201-1848-4F1E-8C1F-6316FB886C35}.Checked|Any CPU.Build.0 = Release|Any CPU
{730C1201-1848-4F1E-8C1F-6316FB886C35}.Checked|ARM.ActiveCfg = Release|Any CPU
@ -256,7 +214,6 @@ Global
{D52C65C4-2C7D-45E6-9F5C-6F3A96796018}.Release|x64.ActiveCfg = Release|x64
{D52C65C4-2C7D-45E6-9F5C-6F3A96796018}.Release|x64.Build.0 = Release|x64
{D52C65C4-2C7D-45E6-9F5C-6F3A96796018}.Release|x86.ActiveCfg = Release|x86
{D52C65C4-2C7D-45E6-9F5C-6F3A96796018}.Release|x86.Build.0 = Release|x86
{D52C65C4-2C7D-45E6-9F5C-6F3A96796018}.RelWithDebInfo|Any CPU.ActiveCfg = Release|x64
{D52C65C4-2C7D-45E6-9F5C-6F3A96796018}.RelWithDebInfo|Any CPU.Build.0 = Release|x64
{D52C65C4-2C7D-45E6-9F5C-6F3A96796018}.RelWithDebInfo|ARM.ActiveCfg = Release|x64
@ -809,7 +766,6 @@ Global
EndGlobalSection
GlobalSection(NestedProjects) = preSolution
{20513BA2-A156-4A17-4C70-5AC2DBD4F833} = {41638A4C-0DAF-47ED-A774-ECBBAC0315D7}
{6C43BE85-F8C3-4D76-8050-F25CE953A7FD} = {41638A4C-0DAF-47ED-A774-ECBBAC0315D7}
{730C1201-1848-4F1E-8C1F-6316FB886C35} = {19FAB78C-3351-4911-8F0C-8C6056401740}
{41638A4C-0DAF-47ED-A774-ECBBAC0315D7} = {19FAB78C-3351-4911-8F0C-8C6056401740}
{1532DB3C-7DCD-45C6-B697-62B8378A16A2} = {41638A4C-0DAF-47ED-A774-ECBBAC0315D7}

Просмотреть файл

@ -93,7 +93,7 @@ if /i "%1" == "-restore" (set processedArgs=!processedArgs! %1&shift
if /i "%1" == "-pack" (set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
if /i "%1" == "-publish" (set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
if /i "%1" == "-preparemachine" (set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
if /i "%1" == "-projects" (set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
if /i "%1" == "-projects" (set processedArgs=!processedArgs! %1 %2&shift&shift&goto Arg_Loop)
if [!processedArgs!] == [] (
set __UnprocessedBuildArgs=%__args%

Просмотреть файл

@ -175,7 +175,7 @@ while :; do
__TestArgs="$__TestArgs $1"
;;
--solution)
--projects)
__TestArgs="$__TestArgs $1 $2"
shift
;;
@ -245,7 +245,7 @@ while :; do
;;
# Ignored for a native build
--build|--rebuild|--sign|--restore|--pack|--publish|--preparemachine|--projects|--solution)
--build|--rebuild|--sign|--restore|--pack|--publish|--preparemachine)
;;
*)
@ -282,7 +282,6 @@ __ResultsDir=$__RootBinDir/TestResults/$__BuildType
__PackagesBinDir=$__RootBinDir/packages/$__BuildType/Shipping
__ExtraCmakeArgs="$__ExtraCmakeArgs -DCLR_MANAGED_BINARY_DIR=$__RootBinDir/bin -DCLR_BUILD_TYPE=$__BuildType"
__DotNetCli=$__ProjectRoot/.dotnet/dotnet
__DotNetRuntimeVersion=2.1.11
if [ ! -e $__DotNetCli ]; then
echo "dotnet cli not installed $__DotNetCli"
@ -379,6 +378,7 @@ initTargetDistroRid()
# Init the target distro name
initTargetDistroRid
echo "RID: $__DistroRid"
if [ "$__HostOS" == "OSX" ]; then
@ -449,7 +449,7 @@ if [ $__Test == true ]; then
if [ $__CrossBuild != true ]; then
# Install the other versions of .NET Core runtime we are going to test on
"$__ProjectRoot/eng/install-test-runtimes.sh" --dotnet-directory "$__ProjectRoot/.dotnet" --runtime-version-21 "$__DotNetRuntimeVersion" --temp-directory "$__IntermediatesDir" --architecture "$__BuildArch" $__DailyTest
"$__ProjectRoot/eng/install-test-runtimes.sh" --dotnet-directory "$__ProjectRoot/.dotnet" --temp-directory "$__IntermediatesDir" --architecture "$__BuildArch" $__DailyTest
if [ "$LLDB_PATH" == "" ]; then
export LLDB_PATH="$(which lldb-3.9.1 2> /dev/null)"
@ -478,21 +478,6 @@ if [ $__Test == true ]; then
if [ $? != 0 ]; then
exit 1
fi
# Skip Alpine because lldb doesn't work
if [ $__Alpine == false ]; then
if [ "$__BuildOS" == "OSX" ]; then
__Plugin=$__CMakeBinDir/libsosplugin.dylib
else
__Plugin=$__CMakeBinDir/libsosplugin.so
fi
# Run lldb python tests
"$__ProjectRoot/src/SOS/lldbplugin.tests/testsos.sh" "$__ProjectRoot" "$__Plugin" "$__DotNetRuntimeVersion" "$__RootBinDir/bin/TestDebuggee/$__BuildType/netcoreapp2.0/TestDebuggee.dll" "$__ResultsDir"
if [ $? != 0 ]; then
exit 1
fi
fi
fi
fi

Просмотреть файл

@ -1,93 +1,126 @@
# 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
dockerImage: ''
crossrootfsDir: ''
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
# Agent OS (Windows_NT, Linux, MacOS, FreeBSD)
osGroup: Windows_NT
# Additional variables
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.
# Build strategy - matrix
strategy: ''
phases:
- template: /eng/common/templates/phases/base.yml
# 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
# Depends on
dependsOn: ''
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)
- ${{ 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)
# 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(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(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: ''
${{ if eq(parameters.crossrootfsDir, '') }}:
_RootFs: ''
# This is only required for cross builds.
${{ if ne(parameters.crossrootfsDir, '') }}:
_RootFs: --rootfs ${{ parameters.crossrootfsDir }}
# This is only required for cross builds.
- ${{ if eq(parameters.crossrootfsDir, '') }}:
- _RootFs: ''
- ${{ if ne(parameters.crossrootfsDir, '') }}:
- _RootFs: --rootfs ${{ parameters.crossrootfsDir }}
steps:
- template: /eng/common/templates/steps/run-on-windows.yml
parameters:
agentOs: ${{ parameters.agentOs }}
steps:
- script: $(Build.SourcesDirectory)\eng\cibuild.cmd $(_DailyTest)
-configuration $(_BuildConfig)
-architecture $(_BuildArch)
-prepareMachine
/p:OfficialBuildId=$(BUILD.BUILDNUMBER)
displayName: Build / Test
condition: succeeded()
- ${{ if eq(parameters.osGroup, 'Windows_NT') }}:
- script: $(Build.SourcesDirectory)\eng\cibuild.cmd $(_DailyTest)
-configuration $(_BuildConfig)
-architecture $(_BuildArch)
-prepareMachine
/p:OfficialBuildId=$(BUILD.BUILDNUMBER)
displayName: Build / Test
condition: succeeded()
- ${{ if eq(parameters.agentOs, 'Linux') }}:
- ${{ if eq(parameters.osGroup, 'Linux') }}:
- ${{ if eq(parameters.testOnly, 'true') }}:
- task: DownloadBuildArtifacts@0
displayName: Download Linux-x64 Artifacts
@ -116,7 +149,7 @@ phases:
displayName: Docker Build / Test
condition: succeeded()
- ${{ if eq(parameters.agentOs, 'Darwin') }}:
- ${{ if eq(parameters.osGroup, 'MacOS') }}:
- script: $(Build.SourcesDirectory)/eng/cibuild.sh $(_DailyTest)
--configuration $(_BuildConfig)
--architecture $(_BuildArch)
@ -126,14 +159,32 @@ phases:
condition: succeeded()
- task: PublishBuildArtifacts@1
displayName: Upload Artifacts
displayName: Publish Build Artifacts
inputs:
pathtoPublish: '$(Build.SourcesDirectory)/artifacts/$(_PublishArtifacts)'
artifactName: $(_PhaseName)_$(_BuildArch)_$(_BuildConfig)
condition: ne(variables['_PublishArtifacts'], '')
- task: PublishBuildArtifacts@1
displayName: Publish Artifacts on failure
inputs:
PathtoPublish: '$(Build.SourcesDirectory)/artifacts/bin'
PublishLocation: Container
ArtifactName: Artifacts_$(_PhaseName)_$(_BuildArch)_$(_BuildConfig)
continueOnError: true
condition: failed()
- task: PublishBuildArtifacts@1
displayName: Publish Dump Artifacts on failure
inputs:
PathtoPublish: '$(Build.SourcesDirectory)/artifacts/tmp/$(_BuildConfig)/dumps'
PublishLocation: Container
ArtifactName: Dumps_$(_PhaseName)_$(_BuildArch)_$(_BuildConfig)
continueOnError: true
condition: failed()
- task: CopyFiles@2
displayName: Gather Build Logs
displayName: Gather Logs
inputs:
sourceFolder: '$(Build.SourcesDirectory)/artifacts'
contents: '?(log|TestResults)/**'
@ -142,7 +193,7 @@ phases:
condition: always()
- task: PublishBuildArtifacts@1
displayName: Publish Logs to VSTS
displayName: Publish Logs
inputs:
PathtoPublish: '$(Build.StagingDirectory)/BuildLogs'
PublishLocation: Container

Просмотреть файл

@ -12,23 +12,28 @@ Set-StrictMode -Version Latest
$ErrorActionPreference="Stop"
$RuntimeVersion11="1.1.13"
$RuntimeVersion21="2.1.11"
$RuntimeVersion22="2.2.5"
$RuntimeVersion21="2.1.12"
$RuntimeVersion22="2.2.6"
$RuntimeVersion30="3.0.0"
$AspNetCoreVersion30="3.0.0"
$DailyTestText="true"
# Always install 2.1 for the daily test (scheduled builds) scenario because xunit needs it
. $DotNetDir\dotnet-install.ps1 -Version $RuntimeVersion21 -Architecture $BuildArch -SkipNonVersionedFiles -Runtime dotnet -InstallDir $DotNetDir
. $DotNetDir\dotnet-install.ps1 -Version $RuntimeVersion21 -Architecture $BuildArch -SkipNonVersionedFiles -Runtime aspnetcore -InstallDir $DotNetDir
# Install the other versions of .NET Core runtime we are going to test. 1.1.x, 2.1.x, 2.2.x
# Install the other versions of .NET Core runtime we are going to test. 1.1.x, 2.1.x, 2.2.x, 3.0.x
# and latest. Only install the latest master for daily jobs and leave the RuntimeVersion*
# config properties blank.
if (!$DailyTest) {
$DailyTestText="false"
. $DotNetDir\dotnet-install.ps1 -Version $RuntimeVersion11 -Architecture $BuildArch -SkipNonVersionedFiles -Runtime dotnet -InstallDir $DotNetDir
. $DotNetDir\dotnet-install.ps1 -Version $RuntimeVersion22 -Architecture $BuildArch -SkipNonVersionedFiles -Runtime dotnet -InstallDir $DotNetDir
. $DotNetDir\dotnet-install.ps1 -Version $RuntimeVersion22 -Architecture $BuildArch -SkipNonVersionedFiles -Runtime aspnetcore -InstallDir $DotNetDir
}
. $DotNetDir\dotnet-install.ps1 -Channel $Branch -Version latest -Architecture $BuildArch -SkipNonVersionedFiles -Runtime dotnet -InstallDir $DotNetDir
. $DotNetDir\dotnet-install.ps1 -Channel $Branch -Version latest -Architecture $BuildArch -SkipNonVersionedFiles -Runtime aspnetcore -InstallDir $DotNetDir
# Now download the latest runtime version and create a config file containing it
$VersionFileUrl = "$UncachedFeed/Runtime/$Branch/latest.version"
@ -42,13 +47,15 @@ if (Test-Path $VersionFile) {
$Data = @($VersionText.Split([char[]]@(), [StringSplitOptions]::RemoveEmptyEntries));
$RuntimeVersionLatest = $Data[1].Trim()
Write-Host "Latest version: $RuntimeVersionLatest"
Write-Host "Latest $Branch version: $RuntimeVersionLatest"
'<Configuration>
<DailyTest>' + $DailyTestText +'</DailyTest>
<RuntimeVersion11>' + $RuntimeVersion11 + '</RuntimeVersion11>
<RuntimeVersion21>' + $RuntimeVersion21 + '</RuntimeVersion21>
<RuntimeVersion22>' + $RuntimeVersion22 + '</RuntimeVersion22>
<RuntimeVersion30>' + $RuntimeVersion30 + '</RuntimeVersion30>
<AspNetCoreVersion30>' + $AspNetCoreVersion30 + '</AspNetCoreVersion30>
<RuntimeVersionLatest>' + $RuntimeVersionLatest + '</RuntimeVersionLatest>
</Configuration>' | Set-Content $ConfigFile

Просмотреть файл

@ -10,8 +10,10 @@ branch="master"
uncached_feed="https://dotnetcli.blob.core.windows.net/dotnet"
runtime_version_11="1.1.13"
runtime_version_21=
runtime_version_22="2.2.5"
runtime_version_21="2.1.12"
runtime_version_22="2.2.6"
runtime_version_30="3.0.0"
aspnetcore_version_30="3.0.0"
while [ $# -ne 0 ]; do
name=$1
@ -20,10 +22,6 @@ while [ $# -ne 0 ]; do
shift
dotnet_dir=$1
;;
--runtime-version-21)
shift
runtime_version_21=$1
;;
--temp-directory)
shift
temp_dir=$1
@ -51,7 +49,7 @@ daily_test_text="true"
# Always install 2.1 for the daily test (scheduled builds) scenario because xunit needs it
bash "$dotnet_dir/dotnet-install.sh" --version "$runtime_version_21" --architecture "$build_arch" --skip-non-versioned-files --runtime dotnet --install-dir "$dotnet_dir"
# Install the other versions of .NET Core runtime we are going to test. 1.1.x, 2.1.x, 2.2.x
# Install the other versions of .NET Core runtime we are going to test. 1.1.x, 2.1.x, 2.2.x, 3.0.x
# and latest. Only install the latest master for daily jobs and leave the RuntimeVersion*
# config properties blank.
if [ $daily_test == 0 ]; then
@ -61,6 +59,7 @@ if [ $daily_test == 0 ]; then
fi
bash "$dotnet_dir/dotnet-install.sh" --channel $branch --version latest --architecture "$build_arch" --skip-non-versioned-files --runtime dotnet --install-dir "$dotnet_dir"
bash "$dotnet_dir/dotnet-install.sh" --channel $branch --version latest --architecture "$build_arch" --skip-non-versioned-files --runtime aspnetcore --install-dir "$dotnet_dir"
# Now download the latest runtime version and create a config file containing it
version_file_url="$uncached_feed/Runtime/$branch/latest.version"
@ -75,15 +74,17 @@ else
fi
if [ -f "$version_file" ]; then
runtime_version_latest=$(cat $version_file | tail -n 1 | sed 's/\r$//')
runtime_version_latest=$(cat $version_file | tail -n 1 | tr -d "\r")
echo "Latest version: $runtime_version_latest"
echo "Latest $branch version: '$runtime_version_latest'"
echo "<Configuration>
<DailyTest>$daily_test_text</DailyTest>
<RuntimeVersion11>$runtime_version_11</RuntimeVersion11>
<RuntimeVersion21>$runtime_version_21</RuntimeVersion21>
<RuntimeVersion22>$runtime_version_22</RuntimeVersion22>
<RuntimeVersion30>$runtime_version_30</RuntimeVersion30>
<AspNetCoreVersion30>$aspnetcore_version_30</AspNetCoreVersion30>
<RuntimeVersionLatest>$runtime_version_latest</RuntimeVersionLatest>
</Configuration>" > $config_file

Просмотреть файл

@ -1,9 +1,9 @@
{
"sdk": {
"version": "3.0.100-preview6-012264"
"version": "3.0.100"
},
"tools": {
"dotnet": "3.0.100-preview6-012264"
"dotnet": "3.0.100"
},
"msbuild-sdks": {
"Microsoft.DotNet.Arcade.Sdk": "1.0.0-beta.19309.1"

Просмотреть файл

@ -17,11 +17,11 @@
<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>

Просмотреть файл

@ -81,6 +81,12 @@ namespace Microsoft.Diagnostics.Repl
m_interactiveConsole = !Console.IsInputRedirected;
RefreshLine();
// The special prompts for the test runner are built into this
// console provider when the output has been redirected.
if (!m_interactiveConsole) {
WriteLine(OutputType.Normal, "<END_COMMAND_OUTPUT>");
}
// Start keyboard processing
while (!m_shutdown) {
if (m_interactiveConsole)
@ -91,12 +97,20 @@ namespace Microsoft.Diagnostics.Repl
else
{
// The input has been redirected (i.e. testing or in script)
WriteLine(OutputType.Normal, "<END_COMMAND_OUTPUT>");
string line = Console.ReadLine();
if (string.IsNullOrEmpty(line)) {
continue;
}
await Dispatch(line, dispatchCommand);
bool result = await Dispatch(line, dispatchCommand);
if (!m_shutdown)
{
if (result) {
WriteLine(OutputType.Normal, "<END_COMMAND_OUTPUT>");
}
else {
WriteLine(OutputType.Normal, "<END_COMMAND_ERROR>");
}
}
}
}
}
@ -410,8 +424,9 @@ namespace Microsoft.Diagnostics.Repl
}
}
private async Task Dispatch(string newCommand, Func<string, CancellationToken, Task> dispatchCommand)
private async Task<bool> Dispatch(string newCommand, Func<string, CancellationToken, Task> dispatchCommand)
{
bool result = true;
CommandStarting();
m_interruptExecutingCommand = new CancellationTokenSource();
try
@ -435,6 +450,7 @@ namespace Microsoft.Diagnostics.Repl
{
WriteLine(OutputType.Error, "ERROR: {0}", ex.Message);
m_lastCommandLine = null;
result = false;
}
}
finally
@ -442,6 +458,7 @@ namespace Microsoft.Diagnostics.Repl
m_interruptExecutingCommand = null;
CommandFinished();
}
return result;
}
private void AppendNewText(string text)

Просмотреть файл

@ -122,6 +122,10 @@ namespace Microsoft.Diagnostics.TestHelpers
protected static string GetDebuggeeNativeLibDirPath(TestConfiguration config, string debuggeeName)
{
if (config.DebuggeeNativeLibRoot == null)
{
return null;
}
return Path.Combine(config.DebuggeeNativeLibRoot, debuggeeName);
}

Просмотреть файл

@ -16,20 +16,24 @@ namespace Microsoft.Diagnostics.TestHelpers
{
async public static Task<DebuggeeConfiguration> Execute(TestConfiguration config, string debuggeeName, ITestOutputHelper output)
{
IDebuggeeCompiler compiler = null;
if (config.DebuggeeBuildProcess == "prebuilt")
IDebuggeeCompiler compiler;
switch (config.DebuggeeBuildProcess)
{
compiler = new PrebuiltDebuggeeCompiler(config, debuggeeName);
case "prebuilt":
// Backwards compatibility for the diagnostics test repo
compiler = new PrebuiltDebuggeeCompiler(config, debuggeeName);
break;
case "sdk.prebuilt":
// The .NET Core SDK layout
compiler = new SdkPrebuiltDebuggeeCompiler(config, debuggeeName);
break;
case "cli":
// Builds the debuggee with the .NET Core CLI
compiler = new CliDebuggeeCompiler(config, debuggeeName);
break;
default:
throw new Exception("Invalid DebuggeeBuildProcess configuration value. Expected 'prebuilt', actual \'" + config.DebuggeeBuildProcess + "\'");
}
else if (config.DebuggeeBuildProcess == "cli")
{
compiler = new CliDebuggeeCompiler(config, debuggeeName);
}
else
{
throw new Exception("Invalid DebuggeeBuildProcess configuration value. Expected 'prebuilt', actual \'" + config.DebuggeeBuildProcess + "\'");
}
return await compiler.Execute(output);
}
}

Просмотреть файл

@ -0,0 +1,37 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
// See the LICENSE file in the project root for more information.
using System.IO;
using System.Threading.Tasks;
using Xunit.Abstractions;
namespace Microsoft.Diagnostics.TestHelpers
{
public class SdkPrebuiltDebuggeeCompiler : IDebuggeeCompiler
{
readonly string _sourcePath;
readonly string _binaryPath;
readonly string _binaryExePath;
public SdkPrebuiltDebuggeeCompiler(TestConfiguration config, string debuggeeName)
{
// The layout is how the current .NET Core SDK layouts the binaries out:
// Source Path: <DebuggeeSourceRoot>/<DebuggeeName>/[<DebuggeeName>]
// Binary Path: <DebuggeeBuildRoot>/bin/<DebuggeeName>/<TargetConfiguration>/<BuildProjectFramework>
// Binary Exe Path: <DebuggeeBuildRoot>/bin/<DebuggeeName>/<TargetConfiguration>/<BuildProjectFramework>/<DebuggeeName>.dll
_sourcePath = Path.Combine(config.DebuggeeSourceRoot, debuggeeName);
if (Directory.Exists(Path.Combine(_sourcePath, debuggeeName)))
{
_sourcePath = Path.Combine(_sourcePath, debuggeeName);
}
_binaryPath = Path.Combine(config.DebuggeeBuildRoot, "bin", debuggeeName, config.TargetConfiguration, config.BuildProjectFramework);
_binaryExePath = Path.Combine(_binaryPath, debuggeeName) + (config.IsDesktop ? ".exe" : ".dll");
}
public Task<DebuggeeConfiguration> Execute(ITestOutputHelper output)
{
return Task.Factory.StartNew<DebuggeeConfiguration>(() => new DebuggeeConfiguration(_sourcePath, _binaryPath, _binaryExePath));
}
}
}

Просмотреть файл

@ -284,18 +284,23 @@ namespace Microsoft.Diagnostics.TestHelpers
get { return _settings; }
}
/// <summary>
/// Creates a new test config with the new PDB type (full, portable or embedded)
/// </summary>
/// <param name="pdbType">new pdb type</param>
/// <returns>new test config</returns>
public TestConfiguration CloneWithNewDebugType(string pdbType)
{
Debug.Assert(!string.IsNullOrWhiteSpace(pdbType));
var currentSettings = new Dictionary<string, string>(_settings);
var currentSettings = new Dictionary<string, string>(_settings) {
// Set or replace if the pdb debug type
currentSettings[DebugTypeKey] = pdbType;
// The debuggee build root must exist. Append the pdb type to make it unique.
currentSettings[DebuggeeBuildRootKey] = Path.Combine(currentSettings[DebuggeeBuildRootKey], pdbType);
// Set or replace if the pdb debug type
[DebugTypeKey] = pdbType,
// The debuggee build root must exist. Append the pdb type to make it unique.
[DebuggeeBuildRootKey] = Path.Combine(_settings[DebuggeeBuildRootKey], pdbType)
};
return new TestConfiguration(currentSettings);
}
@ -649,7 +654,17 @@ namespace Microsoft.Diagnostics.TestHelpers
public override string ToString()
{
return TestProduct + "." + DebuggeeBuildProcess;
var sb = new StringBuilder();
sb.Append(TestProduct);
sb.Append(".");
sb.Append(DebuggeeBuildProcess);
string version = RuntimeFrameworkVersion;
if (!string.IsNullOrEmpty(version))
{
sb.Append(".");
sb.Append(version);
}
return sb.ToString();
}
}

Просмотреть файл

@ -669,9 +669,27 @@ namespace SOS
uint* index,
ulong* baseAddress)
{
Write(index);
Write(baseAddress);
return E_NOTIMPL;
Debug.Assert(startIndex == 0);
// This causes way too many problems on Linux because of various
// bugs in the CLRMD ELF dump reader module enumeration and isn't
// necessary on linux anyway.
if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
{
// Find the module that contains the offset.
uint i = 0;
foreach (ModuleInfo module in DataReader.EnumerateModules())
{
if (offset >= module.ImageBase && offset < (module.ImageBase + module.FileSize))
{
Write(index, i);
Write(baseAddress, module.ImageBase);
return S_OK;
}
i++;
}
}
return E_FAIL;
}
internal unsafe int GetModuleNames(

Просмотреть файл

@ -20,9 +20,8 @@
<DumpDir>$(RootBinDir)/tmp/$(TargetConfiguration)\dumps</DumpDir>
<DebuggeeSourceRoot>$(RepoRootDir)/src/SOS/SOS.UnitTests/Debuggees</DebuggeeSourceRoot>
<DebuggeeBuildRoot>$(RootBinDir)/Debuggees</DebuggeeBuildRoot>
<DebuggeeNativeLibRoot>$(DebuggeeBuildRoot)/native</DebuggeeNativeLibRoot>
<DebuggeeBuildProcess>cli</DebuggeeBuildProcess>
<DebuggeeBuildProcess>sdk.prebuilt</DebuggeeBuildProcess>
<DebuggeeBuildRoot>$(RootBinDir)</DebuggeeBuildRoot>
<CliPath>$(RepoRootDir)/.dotnet/dotnet</CliPath>
<NuGetPackageFeeds>
@ -31,32 +30,84 @@
</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>

Просмотреть файл

@ -17,13 +17,13 @@
<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>
@ -32,52 +32,130 @@
</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>
</Option>
</Options>
<Options>
<Option Condition="$(TargetArchitecture) == x64">
<DotNetDumpPath>$(RootBinDir)/bin/dotnet-dump/$(TargetConfiguration)/netcoreapp2.1/publish/dotnet-dump.dll</DotNetDumpPath>
<SOSHostRuntime>$(HostRuntimeDir)</SOSHostRuntime>
</Option>
<!--
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>

Просмотреть файл

@ -0,0 +1,10 @@
<!-- Copyright (c) Microsoft. All Rights Reserved. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -->
<Project>
<Import Project="$(MSBuildThisFileDirectory)..\..\..\Directory.Build.props"/>
<PropertyGroup>
<DebugType Condition="'$(TargetFramework)' == 'net462'">full</DebugType>
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
<Optimize>false</Optimize>
</PropertyGroup>
</Project>

Просмотреть файл

@ -1,7 +1,7 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>$(BuildProjectFramework)</TargetFramework>
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
<TargetFramework Condition="'$(BuildProjectFramework)' != ''">$(BuildProjectFramework)</TargetFramework>
<TargetFrameworks Condition="'$(BuildProjectFramework)' == ''">netcoreapp1.1;netcoreapp2.1;netcoreapp3.0</TargetFrameworks>
</PropertyGroup>
</Project>

Просмотреть файл

@ -1,7 +1,7 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>$(BuildProjectFramework)</TargetFramework>
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
<TargetFramework Condition="'$(BuildProjectFramework)' != ''">$(BuildProjectFramework)</TargetFramework>
<TargetFrameworks Condition="'$(BuildProjectFramework)' == ''">netcoreapp1.1;netcoreapp2.1;netcoreapp3.0</TargetFrameworks>
</PropertyGroup>
</Project>

Просмотреть файл

@ -1,7 +1,7 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>$(BuildProjectFramework)</TargetFramework>
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
<TargetFramework Condition="'$(BuildProjectFramework)' != ''">$(BuildProjectFramework)</TargetFramework>
<TargetFrameworks Condition="'$(BuildProjectFramework)' == ''">netcoreapp1.1;netcoreapp2.1;netcoreapp3.0</TargetFrameworks>
</PropertyGroup>
</Project>

Просмотреть файл

@ -1,7 +1,7 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>$(BuildProjectFramework)</TargetFramework>
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
<TargetFramework Condition="'$(BuildProjectFramework)' != ''">$(BuildProjectFramework)</TargetFramework>
<TargetFrameworks Condition="'$(BuildProjectFramework)' == ''">netcoreapp1.1;netcoreapp2.1;netcoreapp3.0</TargetFrameworks>
</PropertyGroup>
</Project>

Просмотреть файл

@ -1,7 +1,7 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>$(BuildProjectFramework)</TargetFramework>
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
<TargetFramework Condition="'$(BuildProjectFramework)' != ''">$(BuildProjectFramework)</TargetFramework>
<TargetFrameworks Condition="'$(BuildProjectFramework)' == ''">netcoreapp1.1;netcoreapp2.1;netcoreapp3.0</TargetFrameworks>
</PropertyGroup>
</Project>

Просмотреть файл

@ -1,7 +1,7 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>$(BuildProjectFramework)</TargetFramework>
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
<TargetFramework Condition="'$(BuildProjectFramework)' != ''">$(BuildProjectFramework)</TargetFramework>
<TargetFrameworks Condition="'$(BuildProjectFramework)' == ''">netcoreapp1.1;netcoreapp2.1;netcoreapp3.0</TargetFrameworks>
</PropertyGroup>
</Project>

Просмотреть файл

@ -1,9 +1,9 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>$(BuildProjectFramework)</TargetFramework>
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
<DefineConstants Condition="'$(BuildProjectFramework)' != 'net461'">$(DefineConstants);FULL_CLR</DefineConstants>
<TargetFramework Condition="'$(BuildProjectFramework)' != ''">$(BuildProjectFramework)</TargetFramework>
<TargetFrameworks Condition="'$(BuildProjectFramework)' == ''">netcoreapp1.1;netcoreapp2.1;netcoreapp3.0</TargetFrameworks>
<DefineConstants Condition="'$(TargetFramework)' == 'net462'">$(DefineConstants);FULL_CLR</DefineConstants>
</PropertyGroup>
<ItemGroup>
@ -15,6 +15,6 @@
</ItemGroup>
<ItemGroup>
<PackageReference Condition="'$(BuildProjectFramework)' != 'net461'" Include="System.Runtime.Loader" Version="4.3.0" />
<PackageReference Condition="'$(TargetFramework)' != 'net462'" Include="System.Runtime.Loader" Version="4.3.0" />
</ItemGroup>
</Project>

Просмотреть файл

@ -1,7 +1,7 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Library</OutputType>
<TargetFramework>$(BuildProjectFramework)</TargetFramework>
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
<TargetFramework Condition="'$(BuildProjectFramework)' != ''">$(BuildProjectFramework)</TargetFramework>
<TargetFrameworks Condition="'$(BuildProjectFramework)' == ''">netcoreapp1.1;netcoreapp2.1;netcoreapp3.0</TargetFrameworks>
</PropertyGroup>
</Project>

Просмотреть файл

@ -1,7 +1,7 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Library</OutputType>
<TargetFramework>$(BuildProjectFramework)</TargetFramework>
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
<TargetFramework Condition="'$(BuildProjectFramework)' != ''">$(BuildProjectFramework)</TargetFramework>
<TargetFrameworks Condition="'$(BuildProjectFramework)' == ''">netcoreapp1.1;netcoreapp2.1;netcoreapp3.0</TargetFrameworks>
</PropertyGroup>
</Project>

Просмотреть файл

@ -1,14 +1,10 @@
<Project Sdk="Microsoft.NET.Sdk">
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>$(BuildProjectFramework)</TargetFramework>
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
<TargetFramework Condition="'$(BuildProjectFramework)' != ''">$(BuildProjectFramework)</TargetFramework>
<TargetFrameworks Condition="'$(BuildProjectFramework)' == ''">netcoreapp1.1;netcoreapp2.1;netcoreapp3.0</TargetFrameworks>
</PropertyGroup>
<ItemGroup>
<AdditionalSourceCopy Include="..\TaskNestedException.sln" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\RandomUserLibrary\RandomUserLibrary.csproj" />
</ItemGroup>

Просмотреть файл

@ -0,0 +1,46 @@
using Microsoft.AspNetCore;
using Microsoft.AspNetCore.Hosting;
using System;
using System.Net.Http;
namespace webapp
{
public class Program
{
public static string PipeServerName;
public static void Main(string[] args)
{
if (args.Length > 0)
{
PipeServerName = args[0];
Console.WriteLine("Pipe server: {0}", PipeServerName);
}
using (IWebHost host = CreateWebHostBuilder(args).Build())
{
host.Start();
using (var client = new HttpClient())
{
string url = $"http://localhost:5000";
Console.WriteLine($"Starting request to {url}");
try
{
HttpResponseMessage response = client.GetAsync(url).GetAwaiter().GetResult();
}
catch (HttpRequestException ex)
{
Console.WriteLine(ex.ToString());
}
}
host.WaitForShutdown();
}
}
public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseStartup<Startup>();
}
}

Просмотреть файл

@ -0,0 +1,27 @@
{
"iisSettings": {
"windowsAuthentication": false,
"anonymousAuthentication": true,
"iisExpress": {
"applicationUrl": "http://localhost:6270",
"sslPort": 44313
}
},
"profiles": {
"IIS Express": {
"commandName": "IISExpress",
"launchBrowser": true,
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
},
"WebApp": {
"commandName": "Project",
"launchBrowser": true,
"applicationUrl": "https://localhost:5001;http://localhost:5000",
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
}
}
}

Просмотреть файл

@ -0,0 +1,42 @@
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.DependencyInjection;
using System;
using System.IO.Pipes;
namespace webapp
{
public class Startup
{
// This method gets called by the runtime. Use this method to add services to the container.
// For more information on how to configure your application, visit https://go.microsoft.com/fwlink/?LinkID=398940
public void ConfigureServices(IServiceCollection services)
{
}
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
app.Run(async (context) =>
{
await context.Response.WriteAsync("Hello World!");
if (Program.PipeServerName != null)
{
var pipeStream = new NamedPipeClientStream(Program.PipeServerName);
Console.WriteLine("Connecting to pipe {0}", Program.PipeServerName);
pipeStream.Connect();
// Wait for server to send something
int input = pipeStream.ReadByte();
}
});
}
}
}

Просмотреть файл

@ -0,0 +1,12 @@
<Project Sdk="Microsoft.NET.Sdk.Web">
<PropertyGroup>
<TargetFramework>netcoreapp2.1</TargetFramework>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.AspNetCore.App" />
<PackageReference Include="Microsoft.AspNetCore.Razor.Design" Version="2.1.2" PrivateAssets="All" />
</ItemGroup>
</Project>

Просмотреть файл

@ -0,0 +1,46 @@
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Hosting;
using System;
using System.Net.Http;
namespace WebApp3
{
public class Program
{
public static string PipeServerName;
public static void Main(string[] args)
{
if (args.Length > 0)
{
PipeServerName = args[0];
Console.WriteLine("Pipe server: {0}", PipeServerName);
}
using (IHost host = CreateHostBuilder(args).Build())
{
host.Start();
using (var client = new HttpClient())
{
string url = $"http://localhost:5000";
Console.WriteLine($"Starting request to {url}");
try
{
HttpResponseMessage response = client.GetAsync(url).GetAwaiter().GetResult();
}
catch (HttpRequestException ex)
{
Console.WriteLine(ex.ToString());
}
}
host.WaitForShutdown();
}
}
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args).ConfigureWebHostDefaults(webBuilder =>
webBuilder.UseStartup<Startup>());
}
}

Просмотреть файл

@ -0,0 +1,27 @@
{
"iisSettings": {
"windowsAuthentication": false,
"anonymousAuthentication": true,
"iisExpress": {
"applicationUrl": "http://localhost:55377/",
"sslPort": 0
}
},
"profiles": {
"IIS Express": {
"commandName": "IISExpress",
"launchBrowser": true,
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
},
"WebApp3": {
"commandName": "Project",
"launchBrowser": true,
"applicationUrl": "https://localhost:5001;http://localhost:5000",
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
}
}
}

Просмотреть файл

@ -0,0 +1,49 @@
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using System;
using System.IO.Pipes;
namespace WebApp3
{
public class Startup
{
// This method gets called by the runtime. Use this method to add services to the container.
// For more information on how to configure your application, visit https://go.microsoft.com/fwlink/?LinkID=398940
public void ConfigureServices(IServiceCollection services)
{
}
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
app.UseRouting();
app.UseEndpoints(endpoints =>
{
endpoints.MapGet("/", async context =>
{
await context.Response.WriteAsync("Hello World!");
if (Program.PipeServerName != null)
{
var pipeStream = new NamedPipeClientStream(Program.PipeServerName);
Console.WriteLine("Connecting to pipe {0}", Program.PipeServerName);
pipeStream.Connect();
// Wait for server to send something
int input = pipeStream.ReadByte();
}
});
});
}
}
}

Просмотреть файл

@ -0,0 +1,7 @@
<Project Sdk="Microsoft.NET.Sdk.Web">
<PropertyGroup>
<TargetFramework>netcoreapp3.0</TargetFramework>
</PropertyGroup>
</Project>

Просмотреть файл

@ -0,0 +1,9 @@
{
"Logging": {
"LogLevel": {
"Default": "Debug",
"System": "Information",
"Microsoft": "Information"
}
}
}

Просмотреть файл

@ -0,0 +1,10 @@
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information"
}
},
"AllowedHosts": "*"
}

Просмотреть файл

@ -7,6 +7,7 @@ using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Xunit;
using Xunit.Abstractions;
@ -21,7 +22,13 @@ public class SOS
ITestOutputHelper Output { get; set; }
public static IEnumerable<object[]> Configurations => TestRunConfiguration.Instance.Configurations.Select(c => new[] { c });
public static IEnumerable<object[]> GetConfigurations(string key, string value)
{
return TestRunConfiguration.Instance.Configurations.Where((c) => key == null || c.AllSettings.GetValueOrDefault(key) == value).Select(c => new[] { c });
}
public static IEnumerable<object[]> Configurations => GetConfigurations("TestName", null);
private void SkipIfArm(TestConfiguration config)
{
if (config.TargetArchitecture == "arm" || config.TargetArchitecture == "arm64")
@ -30,69 +37,79 @@ public class SOS
}
}
private static bool IsCreateDumpConfig(TestConfiguration config)
private async Task RunTest(string scriptName, bool testLive = true, bool testDump = true, SOSRunner.TestInformation information = null)
{
return config.DebuggeeDumpOutputRootDir() != null;
}
information.OutputHelper = Output;
private static bool IsOpenDumpConfig(TestConfiguration config)
{
return config.DebuggeeDumpInputRootDir() != null;
}
private Task RunTest(TestConfiguration config, string debuggeeName, string scriptName, bool useCreateDump = true)
{
return RunTest(config, "SOS." + debuggeeName, debuggeeName, scriptName, useCreateDump: useCreateDump);
}
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);
}
// Test against a crash dump.
if (information.TestConfiguration.DebuggeeDumpInputRootDir() != null)
{
if (!SOSRunner.IsAlpine())
{
// 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 (information.TestConfiguration.DotNetDumpPath() != null)
{
using (SOSRunner runner = await SOSRunner.StartDebugger(information, SOSRunner.DebuggerAction.LoadDumpWithDotNetDump))
{
await runner.RunScript(scriptName);
}
}
}
await SOSRunner.CreateDump(config, Output, testName, debuggeeName, debuggeeArguments, useCreateDump);
}
}
// Test against a crash dump.
if (IsOpenDumpConfig(config))
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)
{
if (!SOSRunner.IsAlpine())
{
// With cdb (Windows) or lldb (Linux or OSX)
using (SOSRunner runner = await SOSRunner.StartDebugger(config, Output, testName, debuggeeName, debuggeeArguments, SOSRunner.Options.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))
{
await runner.RunScript(scriptName);
}
}
await RunTest(scriptName, testLive: false, testDump, new SOSRunner.TestInformation {
TestConfiguration = config,
TestName = testName,
DebuggeeName = debuggeeName,
DumpType = SOSRunner.DumpType.Triage
});
}
}
[SkippableTheory, MemberData(nameof(Configurations))]
public async Task DivZero(TestConfiguration config)
{
await RunTest(config, "DivZero", "DivZero.script");
await RunTest(config, "DivZero", "DivZero.script", testTriage: true);
}
[SkippableTheory, MemberData(nameof(Configurations))]
@ -101,64 +118,183 @@ public class SOS
SkipIfArm(config);
// Live only
if (SOSRunner.IsAlpine())
{
throw new SkipTestException("lldb tests not supported on Alpine");
}
using (SOSRunner runner = await SOSRunner.StartDebugger(config, Output, testName: "SOS.GCTests", debuggeeName: "GCWhere"))
{
await runner.RunScript("GCTests.script");
}
await RunTest(config, "GCWhere", "GCTests.script", testName: "SOS.GCTests", testDump: false);
}
[SkippableTheory, MemberData(nameof(Configurations))]
public async Task Overflow(TestConfiguration config)
{
// The .NET Core createdump facility may not catch stack overflow so use gdb to generate dump
await RunTest(config, "Overflow", "Overflow.script", useCreateDump: config.StackOverflowCreatesDump);
await RunTest("Overflow.script", information: new SOSRunner.TestInformation {
TestConfiguration = config,
DebuggeeName = "Overflow",
DumpGenerator = config.StackOverflowCreatesDump ? SOSRunner.DumpGenerator.CreateDump : SOSRunner.DumpGenerator.NativeDebugger
});
}
[SkippableTheory, MemberData(nameof(Configurations))]
public async Task Reflection(TestConfiguration config)
{
await RunTest(config, "ReflectionTest", "Reflection.script");
await RunTest(config, "ReflectionTest", "Reflection.script", testTriage: true);
}
[SkippableTheory, MemberData(nameof(Configurations))]
public async Task SimpleThrow(TestConfiguration config)
{
await RunTest(config, "SimpleThrow", "SimpleThrow.script");
await RunTest(config, "SimpleThrow", "SimpleThrow.script", testTriage: true);
}
[SkippableTheory, MemberData(nameof(Configurations))]
public async Task NestedExceptionTest(TestConfiguration config)
{
await RunTest(config, "NestedExceptionTest", "NestedExceptionTest.script");
await RunTest(config, "NestedExceptionTest", "NestedExceptionTest.script", testTriage: true);
}
[SkippableTheory, MemberData(nameof(Configurations))]
public async Task TaskNestedException(TestConfiguration config)
{
await RunTest(config, "TaskNestedException", "TaskNestedException.script");
await RunTest(config, "TaskNestedException", "TaskNestedException.script", testTriage: true);
}
[SkippableTheory, MemberData(nameof(Configurations))]
public async Task StackTests(TestConfiguration config)
{
await RunTest(config, "SOS.StackTests", "NestedExceptionTest", "StackTests.script");
await RunTest(config, "NestedExceptionTest", "StackTests.script", testName: "SOS.StackTests");
}
[SkippableTheory, MemberData(nameof(Configurations))]
public async Task OtherCommands(TestConfiguration config)
{
// This debuggee needs the directory of the exes/dlls to load the SymbolTestDll assembly.
await RunTest("OtherCommands.script", information: new SOSRunner.TestInformation {
TestConfiguration = config,
TestName = "SOS.OtherCommands",
DebuggeeName = "SymbolTestApp",
DebuggeeArguments = "%DEBUG_ROOT%",
});
}
[SkippableTheory, MemberData(nameof(GetConfigurations), "TestName", "SOS.StackAndOtherTests")]
public async Task StackAndOtherTests(TestConfiguration config)
{
if (config.RuntimeFrameworkVersionMajor == 1)
{
throw new SkipTestException("The debuggee (SymbolTestApp) doesn't work on .NET Core 1.1 because of a AssemblyLoadContext problem");
}
foreach (TestConfiguration currentConfig in TestRunner.EnumeratePdbTypeConfigs(config))
{
// This debuggee needs the directory of the exes/dlls to load the SymbolTestDll assembly.
await RunTest(currentConfig, "SOS.StackAndOtherTests", "SymbolTestApp", "StackAndOtherTests.script", debuggeeArguments: "%DEBUG_ROOT%");
await RunTest("StackAndOtherTests.script", information: new SOSRunner.TestInformation {
TestConfiguration = currentConfig,
TestName = "SOS.StackAndOtherTests",
DebuggeeName = "SymbolTestApp",
DebuggeeArguments = "%DEBUG_ROOT%",
});
}
}
[SkippableTheory, MemberData(nameof(GetConfigurations), "TestName", "SOS.WebApp")]
public async Task WebApp(TestConfiguration config)
{
await RunTest("WebApp.script", testLive: false, information: new SOSRunner.TestInformation {
TestConfiguration = config,
DebuggeeName = "WebApp",
UsePipeSync = true,
DumpGenerator = SOSRunner.DumpGenerator.DotNetDump
});
}
[SkippableTheory, MemberData(nameof(GetConfigurations), "TestName", "SOS.WebApp3")]
public async Task WebApp3(TestConfiguration config)
{
await RunTest("WebApp.script", testLive: false, information: new SOSRunner.TestInformation {
TestConfiguration = config,
DebuggeeName = "WebApp3",
UsePipeSync = true,
DumpGenerator = SOSRunner.DumpGenerator.DotNetDump
});
}
[SkippableTheory, MemberData(nameof(Configurations))]
public async Task LLDBPluginTests(TestConfiguration config)
{
if (OS.Kind == OSKind.Windows || config.IsDesktop || config.RuntimeFrameworkVersionMajor == 1 || SOSRunner.IsAlpine())
{
throw new SkipTestException("lldb plugin tests not supported on Windows, Alpine Linux or .NET Core 1.1");
}
string testName = "SOS." + nameof(LLDBPluginTests);
TestRunner.OutputHelper outputHelper = null;
try
{
// Setup the logging from the options in the config file
outputHelper = TestRunner.ConfigureLogging(config, Output, testName);
outputHelper.WriteLine("Starting {0}", testName);
outputHelper.WriteLine("{");
string program = "/usr/bin/python";
if (!File.Exists(program))
{
throw new ArgumentException($"{program} does not exists");
}
var arguments = new StringBuilder();
string repoRootDir = TestConfiguration.MakeCanonicalPath(config.AllSettings["RepoRootDir"]);
// Get test python script path
string scriptDir = Path.Combine(repoRootDir, "src", "SOS", "lldbplugin.tests");
arguments.Append(Path.Combine(scriptDir, "test_libsosplugin.py"));
arguments.Append(" ");
// Get lldb path
arguments.AppendFormat("--lldb {0} ", Environment.GetEnvironmentVariable("LLDB_PATH") ?? throw new ArgumentException("LLDB_PATH environment variable not set"));
// Add dotnet host program and arguments
arguments.Append("--host \"");
arguments.Append(config.HostExe);
arguments.Append(" ");
if (!string.IsNullOrWhiteSpace(config.HostArgs))
{
arguments.Append(config.HostArgs);
arguments.Append(" ");
}
arguments.Append("\" ");
// Add lldb plugin path
arguments.AppendFormat("--plugin {0} ", config.SOSPath() ?? throw new ArgumentException("SOSPath config not set"));
// Add log directory
string logFileDir = Path.Combine(config.LogDirPath, config.RuntimeFrameworkVersion);
Directory.CreateDirectory(logFileDir);
arguments.AppendFormat("--logfiledir {0} ", logFileDir);
// Add test debuggee assembly
string testDebuggee = Path.Combine(repoRootDir, "artifacts", "bin", "TestDebuggee", config.TargetConfiguration, config.BuildProjectFramework, "TestDebuggee.dll");
arguments.AppendFormat("--assembly {0}", testDebuggee);
// Create the python script process runner
ProcessRunner processRunner = new ProcessRunner(program, arguments.ToString()).
WithLog(new TestRunner.TestLogger(outputHelper.IndentedOutput)).
WithTimeout(TimeSpan.FromMinutes(5)).
WithExpectedExitCode(0).
WithWorkingDirectory(scriptDir).
// Turn on stress logging so the dumplog and histinit commands pass
WithEnvironmentVariable("COMPlus_LogFacility", "0xffffffbf").
WithEnvironmentVariable("COMPlus_LogLevel", "6").
WithEnvironmentVariable("COMPlus_StressLog", "1").
WithEnvironmentVariable("COMPlus_StressLogSize", "65536");
// Start the process runner
processRunner.Start();
// Wait for the debuggee to finish
await processRunner.WaitForExit();
}
catch (Exception ex)
{
// Log the exception
outputHelper?.WriteLine(ex.ToString());
throw;
}
finally
{
outputHelper?.WriteLine("}");
outputHelper?.Dispose();
}
}
}

Просмотреть файл

@ -5,7 +5,9 @@
using Microsoft.Diagnostics.TestHelpers;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.IO.Pipes;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
@ -16,24 +18,40 @@ using Xunit.Extensions;
public class SOSRunner : IDisposable
{
readonly TestConfiguration _config;
readonly TestRunner.OutputHelper _outputHelper;
readonly Dictionary<string, string> _variables;
readonly ScriptLogger _scriptLogger;
readonly ProcessRunner _processRunner;
readonly bool _isDump;
string _lastCommandOutput;
string _previousCommandCapture;
public enum Options
/// <summary>
/// What to use to generate the dump
/// </summary>
public enum DumpGenerator
{
None,
NativeDebugger,
CreateDump,
DotNetDump,
}
/// <summary>
/// Dump type
/// </summary>
public enum DumpType
{
Triage,
Heap,
Full
}
/// <summary>
/// What action should the debugger do
/// </summary>
public enum DebuggerAction
{
Live,
GenerateDump,
LoadDump,
LoadDumpWithDotNetDump,
}
/// <summary>
/// Which debugger to use
/// </summary>
public enum NativeDebugger
{
Unknown,
@ -43,6 +61,39 @@ public class SOSRunner : IDisposable
DotNetDump,
}
/// <summary>
/// SOS test runner config information
/// </summary>
public class TestInformation
{
private string _testName;
public TestConfiguration TestConfiguration { get; set; }
public ITestOutputHelper OutputHelper { get; set; }
public string TestName
{
get { return _testName ?? "SOS." + DebuggeeName; }
set { _testName = value; }
}
public string DebuggeeName { get; set; }
public string DebuggeeArguments { get; set; }
public DumpGenerator DumpGenerator { get; set; } = DumpGenerator.CreateDump;
public DumpType DumpType { get; set; } = DumpType.Heap;
public bool UsePipeSync { get; set; } = false;
public bool IsValid()
{
return TestConfiguration != null && OutputHelper != null && DebuggeeName != null;
}
}
public const string HexValueRegEx = "[A-Fa-f0-9]+(`[A-Fa-f0-9]+)?";
public const string DecValueRegEx = "[0-9]+(`[0-9]+)?";
@ -53,8 +104,18 @@ public class SOSRunner : IDisposable
get { return Debugger.ToString().ToUpperInvariant(); }
}
private SOSRunner(NativeDebugger debugger, TestConfiguration config, TestRunner.OutputHelper outputHelper,
Dictionary<string, string> variables, ScriptLogger scriptLogger, ProcessRunner processRunner, bool isDump)
readonly TestConfiguration _config;
readonly TestRunner.OutputHelper _outputHelper;
readonly Dictionary<string, string> _variables;
readonly ScriptLogger _scriptLogger;
readonly ProcessRunner _processRunner;
readonly DumpType? _dumpType;
string _lastCommandOutput;
string _previousCommandCapture;
private SOSRunner(NativeDebugger debugger, TestConfiguration config, TestRunner.OutputHelper outputHelper, Dictionary<string, string> variables,
ScriptLogger scriptLogger, ProcessRunner processRunner, DumpType? dumpType)
{
Debugger = debugger;
_config = config;
@ -62,73 +123,96 @@ public class SOSRunner : IDisposable
_variables = variables;
_scriptLogger = scriptLogger;
_processRunner = processRunner;
_isDump = isDump;
_dumpType = dumpType;
}
/// <summary>
/// Run a debuggee and create a dump.
/// </summary>
/// <param name="config">test configuration</param>
/// <param name="output">output instance</param>
/// <param name="testName">name of test</param>
/// <param name="debuggeeName">debuggee name</param>
/// <param name="debuggeeArguments">optional args to pass to debuggee</param>
/// <param name="useCreateDump">if true, use "createdump" to generate core dump</param>
public static async Task CreateDump(TestConfiguration config, ITestOutputHelper output, string testName, string debuggeeName,
string debuggeeArguments = null, bool useCreateDump = true)
/// <param name="information">test info</param>
public static async Task CreateDump(TestInformation information)
{
if (!information.IsValid()) {
throw new ArgumentException("Invalid TestInformation");
}
TestConfiguration config = information.TestConfiguration;
DumpGenerator dumpGeneration = information.DumpGenerator;
Directory.CreateDirectory(config.DebuggeeDumpOutputRootDir());
if (!config.CreateDumpExists || !useCreateDump || config.GenerateDumpWithLLDB() || config.GenerateDumpWithGDB())
if (dumpGeneration == DumpGenerator.CreateDump)
{
using (SOSRunner runner = await SOSRunner.StartDebugger(config, output, testName, debuggeeName, debuggeeArguments, Options.GenerateDump))
if (!config.CreateDumpExists || config.GenerateDumpWithLLDB() || config.GenerateDumpWithGDB())
{
try
{
await runner.LoadSosExtension();
dumpGeneration = DumpGenerator.NativeDebugger;
}
}
string command = null;
switch (runner.Debugger)
{
case SOSRunner.NativeDebugger.Cdb:
await runner.ContinueExecution();
// On desktop create triage dump. On .NET Core, create full dump.
command = config.IsDesktop ? ".dump /o /mshuRp %DUMP_NAME%" : ".dump /o /ma %DUMP_NAME%";
break;
case SOSRunner.NativeDebugger.Gdb:
command = "generate-core-file %DUMP_NAME%";
break;
case SOSRunner.NativeDebugger.Lldb:
await runner.ContinueExecution();
command = "sos CreateDump %DUMP_NAME%";
break;
default:
throw new Exception(runner.Debugger.ToString() + " does not support creating dumps");
}
if (dumpGeneration == DumpGenerator.NativeDebugger)
{
// Force the dump type to full for .NET Core 1.1 because the heap dumps are broken (can't read ThreadStore).
if (config.IsNETCore && config.RuntimeFrameworkVersionMajor == 1)
{
information.DumpType = DumpType.Full;
}
using SOSRunner runner = await SOSRunner.StartDebugger(information, DebuggerAction.GenerateDump);
try
{
await runner.LoadSosExtension();
await runner.RunCommand(command);
await runner.QuitDebugger();
}
catch (Exception ex)
string command = null;
switch (runner.Debugger)
{
runner.WriteLine(ex.ToString());
throw;
case SOSRunner.NativeDebugger.Cdb:
await runner.ContinueExecution();
switch (information.DumpType)
{
case DumpType.Heap:
command = ".dump /o /mw %DUMP_NAME%";
break;
case DumpType.Triage:
command = ".dump /o /mshuRp %DUMP_NAME%";
break;
case DumpType.Full:
command = ".dump /o /ma %DUMP_NAME%";
break;
}
break;
case SOSRunner.NativeDebugger.Gdb:
command = "generate-core-file %DUMP_NAME%";
break;
default:
throw new Exception(runner.Debugger.ToString() + " does not support creating dumps");
}
await runner.RunCommand(command);
}
catch (Exception ex)
{
runner.WriteLine(ex.ToString());
throw;
}
finally
{
await runner.QuitDebugger();
}
}
else
{
TestRunner.OutputHelper outputHelper = null;
NamedPipeServerStream pipeServer = null;
string pipeName = null;
try
{
// Setup the logging from the options in the config file
outputHelper = TestRunner.ConfigureLogging(config, output, testName);
outputHelper = TestRunner.ConfigureLogging(config, information.OutputHelper, information.TestName);
// Restore and build the debuggee. The debuggee name is lower cased because the
// source directory name has been lowercased by the build system.
DebuggeeConfiguration debuggeeConfig = await DebuggeeCompiler.Execute(config, debuggeeName, outputHelper);
DebuggeeConfiguration debuggeeConfig = await DebuggeeCompiler.Execute(config, information.DebuggeeName, outputHelper);
Dictionary<string, string> variables = GenerateVariables(information, debuggeeConfig, DebuggerAction.GenerateDump);
outputHelper.WriteLine("Starting {0}", testName);
outputHelper.WriteLine("Starting {0}", information.TestName);
outputHelper.WriteLine("{");
// Get the full debuggee launch command line (includes the host if required)
@ -144,29 +228,102 @@ public class SOSRunner : IDisposable
}
arguments.Append(debuggeeConfig.BinaryExePath);
}
if (!string.IsNullOrWhiteSpace(debuggeeArguments))
if (!string.IsNullOrWhiteSpace(information.DebuggeeArguments))
{
arguments.Append(" ");
arguments.Append(debuggeeArguments);
arguments.Append(information.DebuggeeArguments);
}
// 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);
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%"));
// Exit codes on Windows should always be 0, but not on Linux/OSX for the faulting test apps.
if (OS.Kind == OSKind.Windows)
// Setup a pipe server for the debuggee to connect to sync when to take a dump
if (information.UsePipeSync)
{
processRunner.WithExpectedExitCode(0);
int runnerId = Process.GetCurrentProcess().Id;
pipeName = $"SOSRunner.{runnerId}.{information.DebuggeeName}";
pipeServer = new NamedPipeServerStream(pipeName);
arguments.Append(" ");
arguments.Append(pipeName);
}
// Create the debuggee process runner
ProcessRunner processRunner = new ProcessRunner(exePath, ReplaceVariables(variables, arguments.ToString())).
WithLog(new TestRunner.TestLogger(outputHelper.IndentedOutput)).
WithTimeout(TimeSpan.FromMinutes(5));
if (dumpGeneration == DumpGenerator.CreateDump)
{
if (OS.Kind != OSKind.Linux)
{
throw new SkipTestException("Createdump doesn't exists on Windows or macOS");
}
// Run the debuggee with the createdump environment variables set to generate a coredump on unhandled exception
processRunner.
WithEnvironmentVariable("COMPlus_DbgEnableMiniDump", "1").
WithEnvironmentVariable("COMPlus_DbgMiniDumpName", ReplaceVariables(variables, "%DUMP_NAME%"));
switch (information.DumpType)
{
case DumpType.Heap:
processRunner.WithEnvironmentVariable("COMPlus_DbgMiniDumpType", "2");
break;
case DumpType.Triage:
processRunner.WithEnvironmentVariable("COMPlus_DbgMiniDumpType", "3");
break;
case DumpType.Full:
processRunner.WithEnvironmentVariable("COMPlus_DbgMiniDumpType", "4");
break;
}
}
// Start the debuggee
processRunner.Start();
if (dumpGeneration == DumpGenerator.DotNetDump)
{
ITestOutputHelper dotnetDumpOutputHelper = new IndentedTestOutputHelper(outputHelper, " ");
try
{
if (string.IsNullOrWhiteSpace(config.HostExe) || string.IsNullOrWhiteSpace(config.DotNetDumpPath()))
{
throw new SkipTestException("dotnet-dump collect needs HostExe and DotNetDumpPath config variables");
}
// Wait until the debuggee gets started. It needs time to spin up before generating the core dump.
if (pipeServer != null)
{
dotnetDumpOutputHelper.WriteLine("Waiting for connection on pipe {0}", pipeName);
var source = new CancellationTokenSource(TimeSpan.FromMinutes(5));
await pipeServer.WaitForConnectionAsync(source.Token);
}
// Start dotnet-dump collect
var dotnetDumpArguments = new StringBuilder();
dotnetDumpArguments.Append(config.DotNetDumpPath());
dotnetDumpArguments.AppendFormat(" collect --process-id {0} --output %DUMP_NAME%", processRunner.ProcessId);
ProcessRunner dotnetDumpRunner = new ProcessRunner(config.HostExe, ReplaceVariables(variables, dotnetDumpArguments.ToString())).
WithLog(new TestRunner.TestLogger(dotnetDumpOutputHelper)).
WithTimeout(TimeSpan.FromMinutes(5)).
WithExpectedExitCode(0);
dotnetDumpRunner.Start();
// Wait until dotnet-dump collect finishes generating the dump
await dotnetDumpRunner.WaitForExit();
}
catch (Exception ex)
{
// Log the exception
dotnetDumpOutputHelper.WriteLine(ex.ToString());
}
finally
{
dotnetDumpOutputHelper.WriteLine("}");
// Shutdown the debuggee
processRunner.Kill();
}
}
// Wait for the debuggee to finish
await processRunner.WaitForExit();
}
@ -180,6 +337,7 @@ public class SOSRunner : IDisposable
{
outputHelper?.WriteLine("}");
outputHelper?.Dispose();
pipeServer?.Dispose();
}
}
}
@ -187,40 +345,40 @@ public class SOSRunner : IDisposable
/// <summary>
/// Start a debuggee under a native debugger returning a sos runner instance.
/// </summary>
/// <param name="config">test configuration</param>
/// <param name="output">output instance</param>
/// <param name="testName">name of test</param>
/// <param name="debuggeeName">debuggee name</param>
/// <param name="debuggeeArguments">optional args to pass to debuggee</param>
/// <param name="options">dump options</param>
/// <param name="information">test info</param>
/// <param name="action">debugger action</param>
/// <returns>sos runner instance</returns>
public static async Task<SOSRunner> StartDebugger(TestConfiguration config, ITestOutputHelper output, string testName, string debuggeeName,
string debuggeeArguments = null, Options options = Options.None)
public static async Task<SOSRunner> StartDebugger(TestInformation information, DebuggerAction action)
{
if (!information.IsValid())
{
throw new ArgumentException("Invalid TestInformation");
}
TestConfiguration config = information.TestConfiguration;
TestRunner.OutputHelper outputHelper = null;
SOSRunner sosRunner = null;
// Figure out which native debugger to use
NativeDebugger debugger = GetNativeDebuggerToUse(config, options);
try
{
// Setup the logging from the options in the config file
outputHelper = TestRunner.ConfigureLogging(config, output, testName);
outputHelper = TestRunner.ConfigureLogging(config, information.OutputHelper, information.TestName);
// Figure out which native debugger to use
NativeDebugger debugger = GetNativeDebuggerToUse(config, action);
// Restore and build the debuggee.
DebuggeeConfiguration debuggeeConfig = await DebuggeeCompiler.Execute(config, debuggeeName, outputHelper);
DebuggeeConfiguration debuggeeConfig = await DebuggeeCompiler.Execute(config, information.DebuggeeName, outputHelper);
outputHelper.WriteLine("SOSRunner processing {0}", testName);
outputHelper.WriteLine("SOSRunner processing {0}", information.TestName);
outputHelper.WriteLine("{");
var variables = GenerateVariables(config, debuggeeConfig, options);
var scriptLogger = new ScriptLogger(debugger, outputHelper.IndentedOutput);
var variables = GenerateVariables(information, debuggeeConfig, action);
var scriptLogger = new ScriptLogger(outputHelper.IndentedOutput);
if (options == Options.LoadDump || options == Options.LoadDumpWithDotNetDump)
// Make sure the dump file exists
if (action == DebuggerAction.LoadDump || action == DebuggerAction.LoadDumpWithDotNetDump)
{
if (!variables.TryGetValue("%DUMP_NAME%", out string dumpName) || !File.Exists(dumpName))
{
if (!variables.TryGetValue("%DUMP_NAME%", out string dumpName) || !File.Exists(dumpName)) {
throw new FileNotFoundException($"Dump file does not exist: {dumpName ?? ""}");
}
}
@ -238,10 +396,10 @@ public class SOSRunner : IDisposable
}
}
debuggeeCommandLine.Append(debuggeeConfig.BinaryExePath);
if (!string.IsNullOrWhiteSpace(debuggeeArguments))
if (!string.IsNullOrWhiteSpace(information.DebuggeeArguments))
{
debuggeeCommandLine.Append(" ");
debuggeeCommandLine.Append(debuggeeArguments);
debuggeeCommandLine.Append(information.DebuggeeArguments);
}
// Get the native debugger path
@ -265,7 +423,7 @@ public class SOSRunner : IDisposable
}
arguments.AppendFormat(@"-c "".load {0}""", helperExtension);
if (options == Options.LoadDump)
if (action == DebuggerAction.LoadDump)
{
arguments.Append(" -z %DUMP_NAME%");
}
@ -287,8 +445,10 @@ public class SOSRunner : IDisposable
initialCommands.Add(".sympath+ " + runtimeSymbolsPath);
}
// Turn off warnings that can happen in the middle of a command's output
initialCommands.Add(".outmask- 4");
initialCommands.Add(".outmask- 0x244");
initialCommands.Add("!sym quiet");
break;
case NativeDebugger.Lldb:
// Get the lldb python script file path necessary to capture the output of commands
// by printing a prompt after all the command output is printed.
@ -300,7 +460,7 @@ public class SOSRunner : IDisposable
arguments.AppendFormat(@"--no-lldbinit -o ""settings set interpreter.prompt-on-quit false"" -o ""command script import {0}"" -o ""version""", lldbHelperScript);
// Load the dump or launch the debuggee process
if (options == Options.LoadDump)
if (action == DebuggerAction.LoadDump)
{
initialCommands.Add($@"target create --core ""%DUMP_NAME%"" ""{config.HostExe}""");
}
@ -316,9 +476,9 @@ public class SOSRunner : IDisposable
}
}
sb.AppendFormat(@" ""{0}""", debuggeeConfig.BinaryExePath);
if (!string.IsNullOrWhiteSpace(debuggeeArguments))
if (!string.IsNullOrWhiteSpace(information.DebuggeeArguments))
{
string[] args = ReplaceVariables(variables, debuggeeArguments).Trim().Split(' ');
string[] args = ReplaceVariables(variables, information.DebuggeeArguments).Trim().Split(' ');
foreach (string arg in args)
{
sb.AppendFormat(@" ""{0}""", arg);
@ -341,12 +501,15 @@ public class SOSRunner : IDisposable
initialCommands.Add("process handle -s true -n true -p true SIGABRT");
}
break;
case NativeDebugger.Gdb:
if (options == Options.LoadDump || options == Options.LoadDumpWithDotNetDump)
if (action == DebuggerAction.LoadDump || action == DebuggerAction.LoadDumpWithDotNetDump)
{
throw new ArgumentException("GDB not meant for loading core dumps");
}
arguments.AppendFormat("--args {0}", debuggeeCommandLine);
arguments.Append(@"--init-eval-command=""set prompt <END_COMMAND_OUTPUT>\n""");
arguments.AppendFormat(" --args {0}", debuggeeCommandLine);
// .NET Core 1.1 or less don't catch stack overflow and abort so need to catch SIGSEGV
if (config.StackOverflowSIGSEGV)
@ -365,14 +528,16 @@ public class SOSRunner : IDisposable
break;
case NativeDebugger.DotNetDump:
if (options != Options.LoadDumpWithDotNetDump)
if (action != DebuggerAction.LoadDumpWithDotNetDump)
{
throw new ArgumentException($"{options} not supported for dotnet-dump testing");
throw new ArgumentException($"{action} not supported for dotnet-dump testing");
}
if (string.IsNullOrWhiteSpace(config.HostExe))
{
throw new ArgumentException("No HostExe in configuration");
}
initialCommands.Add("setsymbolserver -directory %DEBUG_ROOT%");
arguments.Append(debuggerPath);
arguments.Append(@" analyze %DUMP_NAME%");
debuggerPath = config.HostExe;
@ -384,14 +549,20 @@ public class SOSRunner : IDisposable
WithLog(scriptLogger).
WithTimeout(TimeSpan.FromMinutes(10));
// Exit codes on Windows should always be 0, but not on Linux/OSX for the faulting test apps.
// Exit codes on Windows should always be 0, but not on Linux/OSX for the faulting debuggees.
if (OS.Kind == OSKind.Windows)
{
processRunner.WithExpectedExitCode(0);
}
DumpType? dumpType = null;
if (action == DebuggerAction.LoadDump || action == DebuggerAction.LoadDumpWithDotNetDump)
{
dumpType = information.DumpType;
}
// Create the sos runner instance
sosRunner = new SOSRunner(debugger, config, outputHelper, variables, scriptLogger, processRunner, options == Options.LoadDump || options == Options.LoadDumpWithDotNetDump);
sosRunner = new SOSRunner(debugger, config, outputHelper, variables, scriptLogger, processRunner, dumpType);
// Start the native debugger
processRunner.Start();
@ -500,7 +671,12 @@ public class SOSRunner : IDisposable
else if (line.StartsWith("VERIFY:"))
{
string verifyLine = line.Substring("VERIFY:".Length);
VerifyOutput(verifyLine);
VerifyOutput(verifyLine, match: true);
}
else if (line.StartsWith("!VERIFY:"))
{
string verifyLine = line.Substring("!VERIFY:".Length);
VerifyOutput(verifyLine, match: false);
}
else
{
@ -542,6 +718,7 @@ public class SOSRunner : IDisposable
switch (Debugger)
{
case NativeDebugger.Cdb:
commands.Add($".unload sos.dll");
commands.Add($".load {sosPath}");
commands.Add(".lines");
commands.Add(".reload");
@ -549,6 +726,16 @@ public class SOSRunner : IDisposable
{
commands.Add($"!SetHostRuntime {sosHostRuntime}");
}
// Because Windows triage dumps don't have the target coreclr.dll module path the
// fallback of using this target runtime for hosting SOS's managed doesn't work.
if (_dumpType.HasValue && _dumpType.Value == DumpType.Triage)
{
string hostRuntimeDir = _config.HostRuntimeDir();
if (hostRuntimeDir != null)
{
commands.Add($"!SetHostRuntime {hostRuntimeDir}");
}
}
break;
case NativeDebugger.Lldb:
commands.Add($"plugin load {sosPath}");
@ -571,7 +758,8 @@ public class SOSRunner : IDisposable
// Helper function to switch to the thread with an exception
void SwitchToExceptionThread()
{
if (_isDump)
// If dump session
if (_dumpType.HasValue)
{
// lldb/dotnet-dump don't load dump with the initial thread set to one
// with the exception. This SOS command looks for a thread with a managed
@ -583,30 +771,34 @@ public class SOSRunner : IDisposable
public async Task ContinueExecution()
{
string command = null;
bool addPrefix = true;
switch (Debugger)
// If live session
if (!_dumpType.HasValue)
{
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))
string command = null;
bool addPrefix = true;
switch (Debugger)
{
throw new Exception($"'{command}' FAILED");
case NativeDebugger.Cdb:
command = "g";
// Don't add the !runcommand prefix because it gets printed when cdb stops
// again because the helper extension used .pcmd to set a stop command.
addPrefix = false;
break;
case NativeDebugger.Lldb:
command = "process continue";
break;
case NativeDebugger.Gdb:
command = "continue";
break;
case NativeDebugger.DotNetDump:
break;
}
if (command != null)
{
if (!await RunCommand(command, addPrefix))
{
throw new Exception($"'{command}' FAILED");
}
}
}
}
@ -683,7 +875,7 @@ public class SOSRunner : IDisposable
await _processRunner.WaitForExit();
}
public void VerifyOutput(string verifyLine)
public void VerifyOutput(string verifyLine, bool match)
{
string regex = ReplaceVariables(verifyLine.TrimStart());
@ -691,18 +883,19 @@ public class SOSRunner : IDisposable
{
throw new Exception("VerifyOutput: no last command output or debugger exited unexpectedly: " + regex);
}
if (!new Regex(regex, RegexOptions.Multiline).IsMatch(_lastCommandOutput))
if (new Regex(regex, RegexOptions.Multiline).IsMatch(_lastCommandOutput) != match)
{
throw new Exception("Debugger output did not match the expression: " + regex);
}
}
public static string GenerateDumpFileName(TestConfiguration config, string debuggeeName, Options options)
public static string GenerateDumpFileName(TestInformation information, string debuggeeName, DebuggerAction action)
{
string dumpRoot = options == Options.GenerateDump ? config.DebuggeeDumpOutputRootDir() : config.DebuggeeDumpInputRootDir();
if (dumpRoot != null)
{
return Path.Combine(dumpRoot, Path.GetFileNameWithoutExtension(debuggeeName) + ".dmp");
TestConfiguration config = information.TestConfiguration;
string dumpRoot = action == DebuggerAction.GenerateDump ? config.DebuggeeDumpOutputRootDir() : config.DebuggeeDumpInputRootDir();
if (!string.IsNullOrEmpty(dumpRoot)) {
return Path.Combine(dumpRoot, Path.GetFileNameWithoutExtension(debuggeeName) + "." + information.DumpType.ToString() + ".dmp");
}
return null;
}
@ -723,8 +916,6 @@ public class SOSRunner : IDisposable
{
_processRunner.Kill();
}
_processRunner.WaitForExit().GetAwaiter().GetResult();
_outputHelper.WriteLine("}");
_outputHelper.Dispose();
}
@ -745,13 +936,13 @@ public class SOSRunner : IDisposable
return false;
}
private static NativeDebugger GetNativeDebuggerToUse(TestConfiguration config, Options options)
private static NativeDebugger GetNativeDebuggerToUse(TestConfiguration config, DebuggerAction action)
{
switch (OS.Kind)
{
case OSKind.Windows:
switch (options) {
case Options.LoadDumpWithDotNetDump:
switch (action) {
case DebuggerAction.LoadDumpWithDotNetDump:
return NativeDebugger.DotNetDump;
default:
return NativeDebugger.Cdb;
@ -759,17 +950,17 @@ public class SOSRunner : IDisposable
case OSKind.Linux:
case OSKind.OSX:
switch (options) {
case Options.GenerateDump:
switch (action) {
case DebuggerAction.GenerateDump:
return config.GenerateDumpWithLLDB() ? NativeDebugger.Lldb : NativeDebugger.Gdb;
case Options.LoadDumpWithDotNetDump:
case DebuggerAction.LoadDumpWithDotNetDump:
return NativeDebugger.DotNetDump;
default:
return NativeDebugger.Lldb;
}
default:
throw new Exception(OS.Kind.ToString() + " not supported");
throw new PlatformNotSupportedException(OS.Kind.ToString() + " not supported");
}
}
@ -852,7 +1043,7 @@ public class SOSRunner : IDisposable
string command = ReplaceVariables(input);
if (addPrefix)
{
command = _scriptLogger.ProcessCommand(command);
command = ProcessCommand(command);
}
_processRunner.StandardInputWriteLine(command);
@ -862,6 +1053,21 @@ public class SOSRunner : IDisposable
return result.CommandSucceeded;
}
private string ProcessCommand(string command)
{
switch (Debugger)
{
case NativeDebugger.Cdb:
command = string.Format("!runcommand {0}", command);
break;
case NativeDebugger.Lldb:
command = string.Format("runcommand {0}", command);
break;
}
return command;
}
private void LogProcessingReproInfo(string scriptFile, HashSet<string> enabledDefines)
{
WriteLine(" STARTING SCRIPT: {0}", scriptFile);
@ -882,7 +1088,7 @@ public class SOSRunner : IDisposable
DebuggerToString,
OS.Kind.ToString().ToUpperInvariant(),
_config.TestProduct.ToUpperInvariant(),
_config.TargetArchitecture.ToUpperInvariant(),
_config.TargetArchitecture.ToUpperInvariant()
};
try
{
@ -891,8 +1097,20 @@ public class SOSRunner : IDisposable
catch (SkipTestException)
{
}
if (_isDump)
if (_dumpType.HasValue)
{
switch (_dumpType.Value)
{
case DumpType.Triage:
defines.Add("TRIAGE_DUMP");
break;
case DumpType.Heap:
defines.Add("HEAP_DUMP");
break;
case DumpType.Full:
defines.Add("FULL_DUMP");
break;
}
defines.Add("DUMP");
}
else
@ -931,11 +1149,11 @@ public class SOSRunner : IDisposable
return true;
}
private static Dictionary<string, string> GenerateVariables(TestConfiguration config, DebuggeeConfiguration debuggeeConfig, Options options)
private static Dictionary<string, string> GenerateVariables(TestInformation information, DebuggeeConfiguration debuggeeConfig, DebuggerAction action)
{
var vars = new Dictionary<string, string>();
string debuggeeExe = debuggeeConfig.BinaryExePath;
string dumpFileName = GenerateDumpFileName(config, Path.GetFileNameWithoutExtension(debuggeeExe), options);
string dumpFileName = GenerateDumpFileName(information, debuggeeExe, action);
vars.Add("%DEBUGGEE_EXE%", debuggeeExe);
if (dumpFileName != null)
@ -943,7 +1161,7 @@ public class SOSRunner : IDisposable
vars.Add("%DUMP_NAME%", dumpFileName);
}
vars.Add("%DEBUG_ROOT%", debuggeeConfig.BinaryDirPath);
vars.Add("%SOS_PATH%", config.SOSPath());
vars.Add("%SOS_PATH%", information.TestConfiguration.SOSPath());
// Can be used in an RegEx expression
vars.Add("<DEBUGGEE_EXE>", debuggeeExe.Replace(@"\", @"\\"));
@ -986,19 +1204,19 @@ public class SOSRunner : IDisposable
}
}
readonly NativeDebugger _debugger;
readonly List<Task<CommandResult>> _taskQueue;
readonly StringBuilder _lineBuffer;
readonly StringBuilder _lastCommandOutput;
TaskCompletionSource<CommandResult> _taskSource;
public bool HasProcessExited { get; private set; }
public ScriptLogger(NativeDebugger debugger, ITestOutputHelper output)
public ScriptLogger(ITestOutputHelper output)
: base(output)
{
lock (this)
{
_debugger = debugger;
_lineBuffer = new StringBuilder();
_lastCommandOutput = new StringBuilder();
_taskQueue = new List<Task<CommandResult>>();
AddTask();
@ -1032,21 +1250,6 @@ public class SOSRunner : IDisposable
return currentTask;
}
public string ProcessCommand(string command)
{
switch (_debugger)
{
case NativeDebugger.Cdb:
command = string.Format("!runcommand {0}", command);
break;
case NativeDebugger.Lldb:
command = string.Format("runcommand {0}", command);
break;
}
return command;
}
public override void Write(ProcessRunner runner, string data, ProcessStream stream)
{
lock (this)
@ -1054,38 +1257,14 @@ public class SOSRunner : IDisposable
base.Write(runner, data, stream);
if (stream == ProcessStream.StandardOut)
{
_lastCommandOutput.Append(data);
string lastCommandOutput = _lastCommandOutput.ToString();
bool commandError = false;
bool commandEnd = false;
switch (_debugger)
{
case NativeDebugger.Cdb:
case NativeDebugger.Lldb:
case NativeDebugger.DotNetDump:
commandError = lastCommandOutput.EndsWith("<END_COMMAND_ERROR>");
commandEnd = commandError || lastCommandOutput.EndsWith("<END_COMMAND_OUTPUT>");
break;
case NativeDebugger.Gdb:
commandEnd = lastCommandOutput.EndsWith("(gdb) ");
break;
default:
throw new Exception("Debugger prompt not supported");
}
if (commandEnd)
{
FlushOutput();
_taskSource.TrySetResult(new CommandResult(lastCommandOutput, !commandError));
_lastCommandOutput.Clear();
AddTask();
}
_lineBuffer.Append(data);
}
}
}
static readonly string s_endCommandOutput = "<END_COMMAND_OUTPUT>";
static readonly string s_endCommandError = "<END_COMMAND_ERROR>";
public override void WriteLine(ProcessRunner runner, string data, ProcessStream stream)
{
lock (this)
@ -1093,7 +1272,25 @@ public class SOSRunner : IDisposable
base.WriteLine(runner, data, stream);
if (stream == ProcessStream.StandardOut)
{
_lastCommandOutput.AppendLine(data);
_lineBuffer.Append(data);
string lineBuffer = _lineBuffer.ToString();
_lineBuffer.Clear();
bool commandError = lineBuffer.EndsWith(s_endCommandError);
bool commandEnd = commandError || lineBuffer.EndsWith(s_endCommandOutput);
if (commandEnd)
{
FlushOutput();
_lastCommandOutput.AppendLine();
string lastCommandOutput = _lastCommandOutput.ToString();
_lastCommandOutput.Clear();
_taskSource.TrySetResult(new CommandResult(lastCommandOutput, !commandError));
AddTask();
}
else
{
_lastCommandOutput.AppendLine(lineBuffer);
}
}
}
}
@ -1164,6 +1361,11 @@ public static class TestConfigurationExtensions
return TestConfiguration.MakeCanonicalPath(config.GetValue("SOSHostRuntime"));
}
public static string HostRuntimeDir(this TestConfiguration config)
{
return TestConfiguration.MakeCanonicalPath(config.GetValue("HostRuntimeDir"));
}
public static bool GenerateDumpWithLLDB(this TestConfiguration config)
{
return config.GetValue("GenerateDumpWithLLDB")?.ToLowerInvariant() == "true";

Просмотреть файл

@ -4,11 +4,9 @@
# 3) Take a dump of the executable.
# 4) Open the dump and compare the output
LOADSOS
IFDEF:LIVE
CONTINUE
ENDIF:LIVE
LOADSOS
# Verifying that PrintException gives us the right exception in the format above.
SOSCOMMAND:PrintException
@ -24,4 +22,29 @@ VERIFY:\s+<HEXVAL>\s+<HEXVAL>\s+[Dd]iv[Zz]ero.*!C\.F3(\(.*\))?\+0x<HEXVAL>\s+
VERIFY:\s+<HEXVAL>\s+<HEXVAL>\s+[Dd]iv[Zz]ero.*!C\.F2(\(.*\))?\+0x<HEXVAL>\s+
VERIFY:\s+<HEXVAL>\s+<HEXVAL>\s+[Dd]iv[Zz]ero.*!C\.Main(\(.*\))?\+0x<HEXVAL>\s+
VERIFY:(StackTraceString: <none>\s+)?\s+
VERIFY:HResult:\s+80020012\s+
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+

Просмотреть файл

@ -1,14 +1,12 @@
# Overflow debugging scenario
# Nested exception debugging scenario
# 1) load the executable
# 2) load sos
# 3) run to the exception
# 2) run to the exception
# 3) load sos
# We are only verifying the main PrintException fields and for the stacktrace, source lines in the program.
LOADSOS
IFDEF:LIVE
CONTINUE
ENDIF:LIVE
LOADSOS
# 4) Verifying that !pe gives us the right exception in the format above.
SOSCOMMAND:PrintException
@ -67,10 +65,36 @@ VERIFY:InnerException:\s+System\.FormatException, Use !PrintException <HEXVAL> t
VERIFY:StackTrace \(generated\):
VERIFY:\s+SP\s+IP\s+Function\s+
VERIFY:\s+<HEXVAL>\s+<HEXVAL>\s+[Nn]ested[Ee]xception[Tt]est.*!NestedExceptionTest\.Program\.Main(\(.*\))?\+0x<HEXVAL>\s*
# Desktop sos has a bug that prevents the line number/source file info from being printed. Fixed in ProjectK.
# Desktop sos has a bug that prevents the line number/source file info from being printed.
IFDEF:PROJECTK
VERIFY:\[.*[\\|/]Debuggees[\\|/](dotnet.+[\\|/])?[Nn]ested[Ee]xception[Tt]est[\\|/][Nn]ested[Ee]xception[Tt]est\.cs @ 8\s*\]\s*
ENDIF:PROJECTK
VERIFY:(StackTraceString: <none>\s+)?
VERIFY:HResult:\s+80131509\s+
VERIFY:There are nested exceptions on this thread. Run with -nested for details
# Verify that Threads (clrthreads) works
IFDEF:DOTNETDUMP
SOSCOMMAND:clrthreads
ENDIF:DOTNETDUMP
!IFDEF:DOTNETDUMP
SOSCOMMAND:Threads
ENDIF:DOTNETDUMP
VERIFY:\s*ThreadCount:\s+<DECVAL>\s+
VERIFY:\s+UnstartedThread:\s+<DECVAL>\s+
VERIFY:\s+BackgroundThread:\s+<DECVAL>\s+
VERIFY:\s+PendingThread:\s+<DECVAL>\s+
VERIFY:\s+DeadThread:\s+<DECVAL>\s+
VERIFY:\s+Hosted Runtime:\s+no\s+
VERIFY:\s+ID\s+OSID\s+ThreadOBJ\s+State.*\s+
VERIFY:\s+<DECVAL>\s+<DECVAL>\s+<HEXVAL>\s+<HEXVAL>.*\s+
# Verify that ClrStack with no options works
SOSCOMMAND:ClrStack
VERIFY:.*OS Thread Id:\s+0x<HEXVAL>\s+.*
VERIFY:\s+Child\s+SP\s+IP\s+Call Site\s+
VERIFY:\s+<HEXVAL>\s+<HEXVAL>\s+NestedExceptionTest\.Program\.Main(\(.*\))?\s*
# Desktop sos has a bug that prevents the line number/source file info from being printed.
IFDEF:PROJECTK
VERIFY:\[.*[\\|/]Debuggees[\\|/](dotnet.+[\\|/])?[Nn]ested[Ee]xception[Tt]est[\\|/][Nn]ested[Ee]xception[Tt]est\.cs @ 8\s*\]\s*
ENDIF:PROJECTK

Просмотреть файл

@ -0,0 +1,86 @@
#
# Tests the various SOS commands with the SymbolTestApp debuggee
#
CONTINUE
LOADSOS
IFDEF:DOTNETDUMP
COMMAND:clrmodules
VERIFY:\s*<HEXVAL>.*
COMMAND:modules
VERIFY:\s*<HEXVAL>\s+<HEXVAL>.*
COMMAND:threads
VERIFY:\s*<DECVAL>\s+0x<HEXVAL>\s+\(<DECVAL>\)\s+
COMMAND:registers
VERIFY:\s*([r|e]ip|pc) = <HEXVAL>\s+
ENDIF:DOTNETDUMP
# Issue: https://github.com/dotnet/diagnostics/issues/503
!IFDEF:ALPINE
SOSCOMMAND:DumpHeap
VERIFY:\s+Address\s+MT\s+Size\s+
VERIFY:\s+<HEXVAL>\s+<HEXVAL>\s+<DECVAL>.*
VERIFY:\s*Statistics:\s+
VERIFY:\s+MT\s+Count\s+TotalSize\s+Class Name\s+
VERIFY:\s*<HEXVAL>\s+<DECVAL>\s+<DECVAL>\s+.*
VERIFY:\s*Total\s+<DECVAL>\s+objects\s+
ENDIF:ALPINE
SOSCOMMAND:DumpDomain
VERIFY:\s*System Domain:\s+<HEXVAL>\s+
VERIFY:\s*LowFrequencyHeap:\s+<HEXVAL>\s+
VERIFY:\s*HighFrequencyHeap:\s+<HEXVAL>\s+
VERIFY:\s*Domain 1:\s+<HEXVAL>\s+
VERIFY:\s*Assembly:\s+<HEXVAL>\s+\[.*(System\.Private\.CoreLib(\.ni)?\.dll|mscorlib.dll)\]\s+
SOSCOMMAND:DumpAssembly <POUT>\s*Assembly:\s+(<HEXVAL>)\s+\[.*<POUT>
VERIFY:\s*Parent Domain:\s+<HEXVAL>\s+
VERIFY:\s*Name:\s+.*(System\.Private\.CoreLib(\.ni)?\.dll|mscorlib.dll)\s+
SOSCOMMAND:DumpModule <POUT>\s+Module Name\s+(<HEXVAL>)\s+.*<POUT>
!IFDEF:DESKTOP
VERIFY:\s*PEFile:\s+<HEXVAL>\s+
VERIFY:\s*ModuleId:\s+<HEXVAL>\s+
ENDIF:DESKTOP
VERIFY:\s*LoaderHeap:\s+<HEXVAL>\s+
VERIFY:\s*TypeDefToMethodTableMap:\s+<HEXVAL>\s+
# Verify that IP2MD, DumpMD, DumpClass and DumpMT (uses IP from ClrStack)
SOSCOMMAND:ClrStack
SOSCOMMAND:IP2MD <POUT>.*\s+(<HEXVAL>)\s+SymbolTestApp\.Program\.Foo1.*\s+<POUT>
VERIFY:.*\s+Method Name:\s+SymbolTestApp\.Program\.Foo1\(Int32, System\.String\)\s+
VERIFY:.*\s+Source file:\s+(?i:.*[\\|/]SymbolTestApp\.cs) @ 24\s+
# Verify DumpMD
SOSCOMMAND:DumpMD <POUT>\s+MethodDesc:\s+(<HEXVAL>)\s+<POUT>
VERIFY:.*\s+Method Name:\s+SymbolTestApp\.Program\.Foo1\(Int32, System\.String\)\s+
# Verify DumpClass
SOSCOMMAND:DumpClass <POUT>\s*Class:\s+(<HEXVAL>)\s+<POUT>
VERIFY:\s*Class Name:\s+SymbolTestApp.Program\s+
VERIFY:\s*File:\s+.*SymbolTestApp\.(dll|exe)\s+
# Verify DumpMT
SOSCOMMAND:DumpMT <POUT>\s*Method Table:\s+(<HEXVAL>)\s+<POUT>
VERIFY:\s*Name:\s+SymbolTestApp.Program\s+
VERIFY:\s*File:\s+.*SymbolTestApp\.(dll|exe)\s+
SOSCOMMAND:FinalizeQueue
VERIFY:\s*SyncBlocks to be cleaned up:\s+<DECVAL>\s+
VERIFY:(\s*Free-Threaded Interfaces to be released:\s+<DECVAL>\s+)?
VERIFY:\s*Statistics for all finalizable objects.*:\s+
VERIFY:\s+MT\s+Count\s+TotalSize\s+Class Name\s+
VERIFY:(\s*<HEXVAL>\s+<DECVAL>\s+<DECVAL>\s+.*)?
VERIFY:\s*Total\s+<DECVAL>\s+objects\s+
SOSCOMMAND:SyncBlk
!IFDEF:LINUX
VERIFY:\s*Index\s+SyncBlock\s+MonitorHeld\s+Recursion\s+Owning\s+Thread\s+Info\s+SyncBlock\s+Owner\s+
VERIFY:\s*Total\s+<DECVAL>
IFDEF:WINDOWS
VERIFY:\s*CCW\s+<DECVAL>
VERIFY:\s*RCW\s+<DECVAL>
ENDIF:WINDOWS
ENDIF:LINUX

Просмотреть файл

@ -1,15 +1,13 @@
# Overflow debugging scenario
# 1) load the executable
# 1) Load the executable
# 2) Run the executable and wait for it to crash
# 3) Take a dump of the executable.
# 4) Open the dump and compare the output
# We do not expect that there is a managed exception since overflow is a special exception.
LOADSOS
IFDEF:LIVE
CONTINUE
ENDIF:LIVE
LOADSOS
# 5) Verifying that PrintException gives us the right exception in the format above.
SOSCOMMAND:PrintException

Просмотреть файл

@ -5,11 +5,9 @@
# 4) Open the dump and compare the output
# We are only verifying the main PrintException fields and for the stacktrace, source lines in the program.
LOADSOS
IFDEF:LIVE
CONTINUE
ENDIF:LIVE
LOADSOS
# 5) Verifying that !pe gives us the right exception in the format above.
SOSCOMMAND:PrintException
@ -40,9 +38,35 @@ VERIFY:Message:\s+(<Invalid Object>|Exception has been thrown by the target of a
VERIFY:InnerException:\s+System\.Exception, Use !PrintException <HEXVAL> to see more\.\s+
VERIFY:StackTrace \(generated\):\s+
VERIFY:\s+<HEXVAL>\s+<HEXVAL>\s+[Rr]eflection[Tt]est.*!(\$0_)?RefLoader\.Loader\.Main(\(\))?\+0x<HEXVAL>\s*
# Desktop sos has a bug that prevents the line number/source file info from being printed. Fixed in ProjectK.
# Desktop sos has a bug that prevents the line number/source file info from being printed.
IFDEF:PROJECTK
VERIFY:[.*[\\|/]Debuggees[\\|/](dotnet.+[\\|/])?[Rr]eflection[Tt]est[\\|/][Rr]eflection[Tt]est\.cs @ 32\s*\]
ENDIF:PROJECTK
VERIFY:(StackTraceString: <none>\s+)?
VERIFY:HResult:\s+80131604
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

Просмотреть файл

@ -1,38 +1,13 @@
# PrintException debugging scenario
# 1) load the executable
# 1) Load the executable
# 2) Run the executable and wait for it to crash
# 3) Take a dump of the executable. (MUST BE AT SECOND CHANCE EXCEPTION!)
# 4) Open the dump and compare the output
# [EXPECTED OUTPUT (DESKTOP)]
# Exception object: <HEXVAL>
# Exception type: System.InvalidOperationException
# Message: <Invalid Object>
# InnerException: <none>
# StackTrace (generated):
# SP IP Function
# <HEXVAL> <HEXVAL> SimpleThrow!UserObject.UseObject(System.String)+0xc8
# <HEXVAL> <HEXVAL> SimpleThrow!Simple.Main()+0x9f
# StackTraceString: <none>
# HResult: 80131509
# [EXPECTED OUTPUT (PROJECTN)]
# Exception type: System.InvalidOperationException
# Message: <Invalid Object>
# InnerException: <none>
# StackTrace (generated):
# IP Function
# <HEXVAL> SimpleThrow_<HEXVAL>!$0_UserObject.UseObject+0x8a
# <HEXVAL> SimpleThrow_<HEXVAL>!$0_Simple.Main+0x66
# <HEXVAL> SimpleThrow_<HEXVAL>!$0_Simple.{ILT$Main}+0xd
# <HEXVAL> SimpleThrow_<HEXVAL>!RHBinder__ShimExeMain+0x20
# HResult: 80131509
CONTINUE
LOADSOS
IFDEF:LIVE
CONTINUE
ENDIF:LIVE
# B) Verifying that !pe gives us the right exception in the format above.
# For desktop, it has an SP, so we conditionally will match it. (ProjectN does not though.)
SOSCOMMAND:PrintException
@ -57,3 +32,33 @@ VERIFY:\s+SP\s+IP\s+Function\s+
VERIFY:\s+<HEXVAL>\s+<HEXVAL>\s+[Ss]imple[Tt]hrow.*!(\$0_)?UserObject\.UseObject.*\+0x<HEXVAL>\s+
VERIFY:\s+<HEXVAL>\s+<HEXVAL>\s+[Ss]imple[Tt]hrow.*!(\$0_)?Simple\.Main.*\+0x<HEXVAL>\s+
VERIFY:HResult:\s+80131509
# Verify that Threads (clrthreads) works
IFDEF:DOTNETDUMP
SOSCOMMAND:clrthreads
ENDIF:DOTNETDUMP
!IFDEF:DOTNETDUMP
SOSCOMMAND:Threads
ENDIF:DOTNETDUMP
VERIFY:\s*ThreadCount:\s+<DECVAL>\s+
VERIFY:\s+UnstartedThread:\s+<DECVAL>\s+
VERIFY:\s+BackgroundThread:\s+<DECVAL>\s+
VERIFY:\s+PendingThread:\s+<DECVAL>\s+
VERIFY:\s+DeadThread:\s+<DECVAL>\s+
VERIFY:\s+Hosted Runtime:\s+no\s+
VERIFY:\s+ID\s+OSID\s+ThreadOBJ\s+State.*\s+
VERIFY:\s+<DECVAL>\s+<DECVAL>\s+<HEXVAL>\s+<HEXVAL>.*\s+
# Verify that ClrStack with no options works
SOSCOMMAND:ClrStack
VERIFY:.*OS Thread Id:\s+0x<HEXVAL>\s+.*
VERIFY:\s+Child\s+SP\s+IP\s+Call Site\s+
VERIFY:\s+<HEXVAL>\s+<HEXVAL>\s+(\*\*\* WARNING: Unable to verify checksum for SimpleThrow.exe\s*)?UserObject\.UseObject.*\s+
# Desktop sos has a bug that prevents the line number/source file info from being printed.
IFDEF:PROJECTK
VERIFY:[.*[\\|/]Debuggees[\\|/](dotnet.+[\\|/])?SimpleThrow[\\|/]UserObject\.cs @ 18\s*\]
ENDIF:PROJECTK
VERIFY:\s+<HEXVAL>\s+<HEXVAL>\s+Simple\.Main\(\)\s+
IFDEF:PROJECTK
VERIFY:[.*[\\|/]Debuggees[\\|/](dotnet.+[\\|/])?SimpleThrow[\\|/]SimpleThrow\.cs @ 9\s*\]
ENDIF:PROJECTK

Просмотреть файл

@ -1,13 +1,12 @@
#
# Tests the various SOS stack and other commands with the Windows/Portable PDB debuggee
#
# Commands Verified: ClrStack, DumpStackObjects, DumpStack, EEStack, IP2MD, u, Name2EE, Threads (clrthreads)
# Commands Verified: ClrStack, DumpStackObjects, DumpStack, EEStack, IP2MD, u, Name2EE, Threads (clrthreads) and others
#
LOADSOS
IFDEF:LIVE
CONTINUE
ENDIF:LIVE
LOADSOS
# Verify that ClrStack with no options works
SOSCOMMAND:SetSymbolServer -ms
@ -17,7 +16,7 @@ ENDIF:DOTNETDUMP
SOSCOMMAND:ClrStack
VERIFY:.*OS Thread Id:\s+0x<HEXVAL>\s+.*
VERIFY:\s+Child\s+SP\s+IP\s+Call Site\s+
VERIFY:.*\s+<HEXVAL>\s+<HEXVAL>.*\s+SymbolTestApp\.Program\.Foo4\(System\.String\)\s+\[(?i:.*[\\|/]SymbolTestApp\.cs) @ 54\]\s*
VERIFY:.*\s+<HEXVAL>\s+<HEXVAL>.*\s+SymbolTestApp\.Program\.Foo4\(System\.String\)\s+\[(?i:.*[\\|/]SymbolTestApp\.cs) @ (50|54)\]\s*
VERIFY:\s+<HEXVAL>\s+<HEXVAL>\s+SymbolTestApp\.Program\.Foo2\(.*\)\s+\[(?i:.*[\\|/]SymbolTestApp\.cs) @ 29\]\s*
VERIFY:\s+<HEXVAL>\s+<HEXVAL>\s+SymbolTestApp\.Program\.Foo1\(.*\)\s+\[(?i:.*[\\|/]SymbolTestApp\.cs) @ 24\]\s*
VERIFY:\s+<HEXVAL>\s+<HEXVAL>\s+SymbolTestApp\.Program\.Main\(.*\)\s+\[(?i:.*[\\|/]SymbolTestApp\.cs) @ 19\]\s*
@ -32,7 +31,7 @@ IFDEF:PROJECTK
SOSCOMMAND:ClrStack -f
VERIFY:.*OS Thread Id:\s+0x<HEXVAL>\s+.*
VERIFY:\s+Child\s+SP\s+IP\s+Call Site\s+
VERIFY:\s+<HEXVAL>\s+<HEXVAL>\s+SymbolTestApp\.(dll|exe)!SymbolTestApp\.Program\.Foo4\(System\.String\)\s+\+\s+<DECVAL>\s+\[(?i:.*[\\|/]SymbolTestApp\.cs) @ 54\]\s*
VERIFY:\s+<HEXVAL>\s+<HEXVAL>\s+SymbolTestApp\.(dll|exe)!SymbolTestApp\.Program\.Foo4\(System\.String\)\s+\+\s+<DECVAL>\s+\[(?i:.*[\\|/]SymbolTestApp\.cs) @ (50|54)\]\s*
VERIFY:\s+<HEXVAL>\s+<HEXVAL>\s+SymbolTestApp\.(dll|exe)!SymbolTestApp\.Program\.Foo2\(.*\)\s+\+\s+<DECVAL>\s+\[(?i:.*[\\|/]SymbolTestApp\.cs) @ 29\]\s*
VERIFY:\s+<HEXVAL>\s+<HEXVAL>\s+SymbolTestApp\.(dll|exe)!SymbolTestApp\.Program\.Foo1\(.*\)\s+\+\s+<DECVAL>\s+\[(?i:.*[\\|/]SymbolTestApp\.cs) @ 24\]\s*
VERIFY:\s+<HEXVAL>\s+<HEXVAL>\s+SymbolTestApp\.(dll|exe)!SymbolTestApp\.Program\.Main\(.*\)\s+\+\s+<DECVAL>\s+\[(?i:.*[\\|/]SymbolTestApp\.cs) @ 19\]\s*
@ -43,7 +42,7 @@ IFDEF:PROJECTK
SOSCOMMAND:ClrStack -a
VERIFY:.*OS Thread Id:\s+0x<HEXVAL>\s+.*
VERIFY:\s+Child\s+SP\s+IP\s+Call Site\s+
VERIFY:.*\s+<HEXVAL>\s+<HEXVAL>\s+SymbolTestApp\.Program\.Foo4\(System\.String\)\s+\[(?i:.*[\\|/]SymbolTestApp\.cs) @ 54\]\s*
VERIFY:.*\s+<HEXVAL>\s+<HEXVAL>\s+SymbolTestApp\.Program\.Foo4\(System\.String\)\s+\[(?i:.*[\\|/]SymbolTestApp\.cs) @ (50|54)\]\s*
VERIFY:\s+PARAMETERS:\s+
VERIFY:\s+dllPath \(0x<HEXVAL>\) = 0x<HEXVAL>\s+
VERIFY:.*\s+LOCALS:\s+
@ -59,7 +58,7 @@ SOSCOMMAND:ClrStack -r
VERIFY:.*OS Thread Id:\s+0x<HEXVAL>\s+.*
VERIFY:\s+Child\s+SP\s+IP\s+Call Site\s+
VERIFY:.*\s+<HEXVAL>\s+<HEXVAL>\s+SymbolTestApp\.Program\.Foo4\(System\.String\)\s+\[(?i:.*[\\|/]SymbolTestApp\.cs) @ 54\]\s*
VERIFY:.*\s+<HEXVAL>\s+<HEXVAL>\s+SymbolTestApp\.Program\.Foo4\(System\.String\)\s+\[(?i:.*[\\|/]SymbolTestApp\.cs) @ (50|54)\]\s*
IFDEF:ARM
VERIFY:\s+r0=<HEXVAL>\s+r1=<HEXVAL>\s+r2=<HEXVAL>\s+
ENDIF:ARM
@ -106,6 +105,7 @@ VERIFY:.*\s+<HEXVAL>\s+<HEXVAL>\s+\[DEFAULT\] Void SymbolTestApp\.Program\.Main\
VERIFY:.*\s+Stack walk complete.\s+
ENDIF:PROJECTK
# Issue: https://github.com/dotnet/diagnostics/issues/504
!IFDEF:ALPINE
# Verify that ClrStack with the ICorDebug options and all option (locals/params) works
@ -118,7 +118,9 @@ VERIFY:.*\s+<HEXVAL>\s+<HEXVAL>\s+\[DEFAULT\] Void SymbolTestApp\.Program\.Foo4\
VERIFY:\s+PARAMETERS:\s+
VERIFY:\s+\+ string dllPath\s+=\s+".*"\s+
VERIFY:\s+LOCALS:\s+
!IFDEF:MAJOR_RUNTIME_VERSION_1
VERIFY:\s+\+ System.RuntimeType dllType @ 0x<HEXVAL>
ENDIF:MAJOR_RUNTIME_VERSION_1
VERIFY:.*\s+<HEXVAL>\s+<HEXVAL>\s+\[DEFAULT\] I4 SymbolTestApp\.Program\.Foo2\(.*\)\s+\(.*\)\s+
VERIFY:.*\s+<HEXVAL>\s+<HEXVAL>\s+\[DEFAULT\] I4 SymbolTestApp\.Program\.Foo1\(.*\)\s+\(.*\)\s+
VERIFY:.*\s+<HEXVAL>\s+<HEXVAL>\s+\[DEFAULT\] Void SymbolTestApp\.Program\.Main\(.*\)\s+\(.*\)\s+
@ -174,11 +176,17 @@ ENDIF:DOTNETDUMP
SOSCOMMAND:ClrStack
SOSCOMMAND:IP2MD <POUT>.*\s+(<HEXVAL>)\s+SymbolTestApp\.Program\.Foo4.*\s+<POUT>
VERIFY:.*\s+Method Name:\s+SymbolTestApp\.Program\.Foo4\(System\.String\)\s+
VERIFY:.*\s+Source file:\s+(?i:.*[\\|/]SymbolTestApp\.cs) @ 54\s+
VERIFY:.*\s+Source file:\s+(?i:.*[\\|/]SymbolTestApp\.cs) @ (50|54)\s+
# Verify that DumpIL works (depends on the IP2MD right above)
SOSCOMMAND:DumpIL <POUT>\s*MethodDesc:\s+(<HEXVAL>)\s*<POUT>
VERIFY:.*IL_<HEXVAL>: call class \[System.Runtime\]System\.Reflection\.Assembly System\.Reflection\.Assembly::Load\(uint8\[\],uint8\[\]\)
!IFDEF:DESKTOP
VERIFY:.*IL_<HEXVAL>: callvirt class \[System\.(Runtime|Reflection)\]System\.Reflection\.Assembly System\.Runtime\.Loader\.AssemblyLoadContext::LoadFromStream\(class \[System\.(Runtime|IO)\]System\.IO\.Stream,class \[System\.(Runtime|IO)\]System\.IO\.Stream\)
ENDIF:DESKTOP
IFDEF:DESKTOP
# Disable until the new SOS supports desktop clr
# VERIFY:.*IL_<HEXVAL>: call class \[System.Runtime\]System\.Reflection\.Assembly System\.Reflection\.Assembly::Load\(uint8\[\],uint8\[\]\)
ENDIF:DESKTOP
!IFDEF:DOTNETDUMP
IFDEF:PROJECTK
@ -190,7 +198,7 @@ SOSCOMMAND:u <POUT>\s*MethodDesc:\s+(<HEXVAL>)\s*<POUT>
VERIFY:\s*Normal JIT generated code\s+
VERIFY:\s+SymbolTestApp\.Program\.Foo4\(System\.String\)\s+
VERIFY:\s+Begin\s+<HEXVAL>,\s+size\s+<HEXVAL>\s+
VERIFY:\s+(?i:.*[\\|/]SymbolTestApp\.cs) @ 54:\s+
VERIFY:\s+(?i:.*[\\|/]SymbolTestApp\.cs) @ (50|54):\s+
# Verify that "u" with no line info works
SOSCOMMAND:u -n <PREVPOUT>
@ -203,7 +211,7 @@ SOSCOMMAND:u -o <PREVPOUT>
VERIFY:\s*Normal JIT generated code\s+
VERIFY:\s+SymbolTestApp\.Program\.Foo4\(System\.String\)\s+
VERIFY:\s+Begin\s+<HEXVAL>,\s+size\s+<HEXVAL>\s+
VERIFY:\s+(?i:.*[\\|/]SymbolTestApp\.cs) @ 54:\s+
VERIFY:\s+(?i:.*[\\|/]SymbolTestApp\.cs) @ (50|54):\s+
ENDIF:PROJECTK
ENDIF:DOTNETDUMP
@ -231,4 +239,4 @@ VERIFY:\s+PendingThread:\s+<DECVAL>\s+
VERIFY:\s+DeadThread:\s+<DECVAL>\s+
VERIFY:\s+Hosted Runtime:\s+no\s+
VERIFY:\s+ID\s+OSID\s+ThreadOBJ\s+State.*\s+
VERIFY:\s+<DECVAL>\s+<DECVAL>\s+<HEXVAL>\s+<HEXVAL>.*\s+
VERIFY:\s+<DECVAL>\s+<DECVAL>\s+<HEXVAL>\s+<HEXVAL>.*\s+

Просмотреть файл

@ -1,11 +1,10 @@
#
# Tests the various SOS stack commands against a debuggee that hit an exception
#
LOADSOS
IFDEF:LIVE
CONTINUE
ENDIF:LIVE
LOADSOS
# Test eeversion command
SOSCOMMAND:EEVersion
@ -94,7 +93,11 @@ ENDIF:X86
ENDIF:64BIT
ENDIF:PROJECTK
# Issue: https://github.com/dotnet/diagnostics/issues/504
!IFDEF:ALPINE
# 5) Verifying that ClrStack with the ICorDebug options works
IFDEF:PROJECTK
SOSCOMMAND:ClrStack -i
VERIFY:.*\s+Dumping managed stack and managed variables using ICorDebug.\s+
VERIFY:.*\s+Child\s+SP\s+IP\s+Call Site\s+
@ -102,9 +105,9 @@ VERIFY:.*\s+<HEXVAL>\s+<HEXVAL>\s+\[NativeStackFrame\]\s+
VERIFY:.*\s+<HEXVAL>\s+<HEXVAL>\s+\[DEFAULT\] Void NestedExceptionTest\.Program\.Main\(.*\)\s+\(.*\)\s+
VERIFY:.*\s+<HEXVAL>\s+<HEXVAL>\s+\[DEFAULT\] Void NestedExceptionTest\.Program\.Main\(.*\)\s+\(.*\)\s+
VERIFY:.*\s+Stack walk complete.\s+
ENDIF:PROJECTK
# 6) Verifying that ClrStack with the ICorDebug options and all option (locals/params) works
!IFDEF:ALPINE
IFDEF:PROJECTK
SOSCOMMAND:ClrStack -i -a
VERIFY:.*\s+Dumping managed stack and managed variables using ICorDebug.\s+
@ -118,6 +121,7 @@ VERIFY:\s+\+ System.FormatException ex @ 0x<HEXVAL>\s+
VERIFY:.*\s+<HEXVAL>\s+<HEXVAL>\s+\[DEFAULT\] Void NestedExceptionTest\.Program\.Main\(.*\)\s+\(.*\)\s+
VERIFY:.*\s+Stack walk complete.\s+
ENDIF:PROJECTK
ENDIF:ALPINE
# 7) Verify DumpStackObjects works

Просмотреть файл

@ -5,11 +5,9 @@
# 4) Open the dump and compare the output
# This tests that a nested task, when throwing an exception, you can access all of its properties.
LOADSOS
IFDEF:LIVE
CONTINUE
ENDIF:LIVE
LOADSOS
SOSCOMMAND:PrintException
VERIFY:Exception object:\s+<HEXVAL>\s+
@ -44,10 +42,14 @@ VERIFY:StackTrace \(generated\):\s+
VERIFY:\s+SP\s+IP\s+Function\s+
VERIFY:\s+<HEXVAL>\s+<HEXVAL>.+RandomTest(::|\.)RandomUserTask\.InnerException(\(\))?\+0x<HEXVAL>\s*
# Desktop sos has a bug that prevents the line number/source file info from being printed. Fixed in ProjectK.
IFDEF:PROJECTK
!IFDEF:DESKTOP
!IFDEF:TRIAGE_DUMP
VERIFY:[.+[\\|/]Debuggees[\\|/](dotnet.+[\\|/])?[Tt]ask[Nn]ested[Ee]xception[\\|/][Rr]andom[Uu]ser[Ll]ibrary[\\|/][Rr]andom[Uu]ser[Tt]ask\.cs @ 34\]
ENDIF:PROJECTK
ENDIF:TRIAGE_DUMP
ENDIF:DESKTOP
VERIFY:\s+<HEXVAL>\s+<HEXVAL>.+RandomTest(::|\.)RandomUserTask\.<\.ctor>.+\+0x<HEXVAL>\s*
IFDEF:PROJECTK
!IFDEF:DESKTOP
!IFDEF:TRIAGE_DUMP
VERIFY:[.+[\\|/]Debuggees[\\|/](dotnet.+[\\|/])?[Tt]ask[Nn]ested[Ee]xception[\\|/][Rr]andom[Uu]ser[Ll]ibrary[\\|/][Rr]andom[Uu]ser[Tt]ask\.cs @ 19\]
ENDIF:PROJECTK
ENDIF:TRIAGE_DUMP
ENDIF:DESKTOP

Просмотреть файл

@ -0,0 +1,163 @@
#
# Tests the various SOS stack and other commands against a webapp 3.x app
#
# Commands Verified: ClrStack, DumpStackObjects, DumpStack, EEStack, IP2MD, u, Name2EE, Threads (clrthreads)
#
CONTINUE
LOADSOS
SOSCOMMAND:SetSymbolServer -ms
!IFDEF:DOTNETDUMP
SOSCOMMAND:SetHostRuntime
ENDIF:DOTNETDUMP
IFDEF:DOTNETDUMP
COMMAND:clrmodules
VERIFY:\s*<HEXVAL>.*
COMMAND:modules
VERIFY:\s*<HEXVAL>\s+<HEXVAL>.*
COMMAND:threads
VERIFY:\s*<DECVAL>\s+0x<HEXVAL>\s+\(<DECVAL>\)\s+
COMMAND:registers
VERIFY:\s*([r|e]ip|pc) = <HEXVAL>\s+
ENDIF:DOTNETDUMP
# Verify that ClrStack with no options works
SOSCOMMAND:ClrStack
VERIFY:.*OS Thread Id:\s+0x<HEXVAL>\s+.*
VERIFY:\s+Child\s+SP\s+IP\s+Call Site\s+
# Verify that ClrStack for all threads works
SOSCOMMAND:ClrStack -all
# Verify that ClrStack with managed/native mixed works
SOSCOMMAND:ClrStack -f
VERIFY:.*OS Thread Id:\s+0x<HEXVAL>\s+.*
VERIFY:\s+Child\s+SP\s+IP\s+Call Site\s+
# Verify that ClrStack all option works (locals/params)
SOSCOMMAND:ClrStack -a
VERIFY:.*OS Thread Id:\s+0x<HEXVAL>\s+.*
VERIFY:\s+Child\s+SP\s+IP\s+Call Site\s+
# Verify that ClrStack displays registers
SOSCOMMAND:ClrStack -r
VERIFY:.*OS Thread Id:\s+0x<HEXVAL>\s+.*
VERIFY:\s+Child\s+SP\s+IP\s+Call Site\s+
VERIFY:.*\s
IFDEF:ARM
VERIFY:\s+r0=<HEXVAL>\s+r1=<HEXVAL>\s+r2=<HEXVAL>\s+
ENDIF:ARM
IFDEF:ARM64
VERIFY:\s+x0=<HEXVAL>\s+x1=<HEXVAL>\s+x2=<HEXVAL>\s+
ENDIF:ARM64
VERIFY:\s+([r|e]sp|sp)=<HEXVAL>\s+([r|e]bp|lr)=<HEXVAL>\s+([r|e]ip|pc)=<HEXVAL>\s+
IFDEF:X64
VERIFY:\s+rax=<HEXVAL>\s+rbx=<HEXVAL>\s+rcx=<HEXVAL>\s+
ENDIF:X64
IFDEF:X86
VERIFY:\s+eax=<HEXVAL>\s+ebx=<HEXVAL>\s+ecx=<HEXVAL>\s+
ENDIF:X86
VERIFY:.*\s
IFDEF:ARM
VERIFY:\s+r0=<HEXVAL>\s+r1=<HEXVAL>\s+r2=<HEXVAL>\s+
ENDIF:ARM
IFDEF:ARM64
VERIFY:\s+x0=<HEXVAL>\s+x1=<HEXVAL>\s+x2=<HEXVAL>\s+
ENDIF:ARM64
VERIFY:\s+([r|e]sp|sp)=<HEXVAL>\s+([r|e]bp|lr)=<HEXVAL>\s+([r|e]ip|pc)=<HEXVAL>\s+
IFDEF:X64
VERIFY:\s+rax=<HEXVAL>\s+rbx=<HEXVAL>\s+rcx=<HEXVAL>\s+
ENDIF:X64
IFDEF:X86
VERIFY:\s+eax=<HEXVAL>\s+ebx=<HEXVAL>\s+ecx=<HEXVAL>\s+
ENDIF:X86
# Issue: https://github.com/dotnet/diagnostics/issues/504
!IFDEF:ALPINE
# Verify that ClrStack with the ICorDebug options works
SOSCOMMAND:ClrStack -i
VERIFY:.*\s+Dumping managed stack and managed variables using ICorDebug.\s+
VERIFY:.*\s+Child\s+SP\s+IP\s+Call Site\s+
VERIFY:.*\s+Stack walk complete.\s+
ENDIF:ALPINE
# Verify that Threads (clrthreads) works
IFDEF:DOTNETDUMP
SOSCOMMAND:clrthreads
ENDIF:DOTNETDUMP
!IFDEF:DOTNETDUMP
SOSCOMMAND:Threads
ENDIF:DOTNETDUMP
VERIFY:\s*ThreadCount:\s+<DECVAL>\s+
VERIFY:\s+UnstartedThread:\s+<DECVAL>\s+
VERIFY:\s+BackgroundThread:\s+<DECVAL>\s+
VERIFY:\s+PendingThread:\s+<DECVAL>\s+
VERIFY:\s+DeadThread:\s+<DECVAL>\s+
VERIFY:\s+Hosted Runtime:\s+no\s+
VERIFY:\s+ID\s+OSID\s+ThreadOBJ\s+State.*\s+
VERIFY:\s+<DECVAL>\s+<DECVAL>\s+<HEXVAL>\s+<HEXVAL>.*\s+
# dumpheap, dumpasync may not work on Windows and Alpine dotnet-dump
# Issue: https://github.com/dotnet/diagnostics/issues/503
!IFDEF:DOTNETDUMP
SOSCOMMAND:DumpHeap -stat
VERIFY:\s*Statistics:\s+
VERIFY:\s+MT\s+Count\s+TotalSize\s+Class Name\s+
VERIFY:\s*<HEXVAL>\s+<DECVAL>\s+<DECVAL>\s+.*
VERIFY:\s*Total\s+<DECVAL>\s+objects\s+
!VERIFY:.*UNKNOWN.*
SOSCOMMAND:DumpAsync
VERIFY:\s*Statistics:\s+
VERIFY:\s+MT\s+Count\s+TotalSize\s+Class Name\s+
VERIFY:\s*<HEXVAL>\s+<DECVAL>\s+<DECVAL>\s+.*
VERIFY:\s*Total\s+<DECVAL>\s+objects\s+
SOSCOMMAND:DumpAsync -mt <POUT>\s+MT\s+Count\s+TotalSize\s+Class Name\s+(<HEXVAL>)\s+<DECVAL>\s+<DECVAL>\s+.*<POUT>
VERIFY:\s*Statistics:\s+
VERIFY:\s+MT\s+Count\s+TotalSize\s+Class Name\s+
VERIFY:\s*<HEXVAL>\s+<DECVAL>\s+<DECVAL>\s+.*
VERIFY:\s*Total\s+<DECVAL>\s+objects\s+
SOSCOMMAND:DumpAsync -mt <PREVOUT> -fields
ENDIF:DOTNETDUMP
# This duplication allows these commands to run on lldb/xplat
# Issue: https://github.com/dotnet/diagnostics/issues/503
!IFDEF:ALPINE
!IFDEF:WINDOWS
SOSCOMMAND:DumpHeap -stat
VERIFY:\s*Statistics:\s+
VERIFY:\s+MT\s+Count\s+TotalSize\s+Class Name\s+
VERIFY:\s*<HEXVAL>\s+<DECVAL>\s+<DECVAL>\s+.*
VERIFY:\s*Total\s+<DECVAL>\s+objects\s+
!VERIFY:.*UNKNOWN.*
SOSCOMMAND:DumpAsync
VERIFY:\s*Statistics:\s+
VERIFY:\s+MT\s+Count\s+TotalSize\s+Class Name\s+
VERIFY:\s*<HEXVAL>\s+<DECVAL>\s+<DECVAL>\s+.*
VERIFY:\s*Total\s+<DECVAL>\s+objects\s+
SOSCOMMAND:DumpAsync -mt <POUT>\s+MT\s+Count\s+TotalSize\s+Class Name\s+(<HEXVAL>)\s+<DECVAL>\s+<DECVAL>\s+.*<POUT>
VERIFY:\s*Statistics:\s+
VERIFY:\s+MT\s+Count\s+TotalSize\s+Class Name\s+
VERIFY:\s*<HEXVAL>\s+<DECVAL>\s+<DECVAL>\s+.*
VERIFY:\s*Total\s+<DECVAL>\s+objects\s+
SOSCOMMAND:DumpAsync -mt <PREVOUT> -fields
ENDIF:WINDOWS
ENDIF:ALPINE

Просмотреть файл

@ -151,7 +151,12 @@ DataTarget::ReadVirtual(
}
}
#endif
return g_ExtData->ReadVirtual(address, (PVOID)buffer, request, (PULONG)done);
HRESULT hr = g_ExtData->ReadVirtual(address, (PVOID)buffer, request, (PULONG)done);
if (FAILED(hr))
{
ExtDbgOut("DataTarget::ReadVirtual FAILED %08x address %p size %08x\n", hr, address, request);
}
return hr;
}
HRESULT STDMETHODCALLTYPE

Просмотреть файл

@ -27,8 +27,6 @@ OnUnloadTask *OnUnloadTask::s_pUnloadTaskList = NULL;
// Valid for the lifetime of the debug session.
//
DWORD_PTR g_filterHint = 0;
PDEBUG_CLIENT g_ExtClient;
PDEBUG_DATA_SPACES2 g_ExtData2;
PDEBUG_ADVANCED g_ExtAdvanced;

Просмотреть файл

@ -166,10 +166,6 @@ ArchQuery(void);
void
ExtRelease(void);
#ifdef _DEBUG
extern DWORD_PTR g_filterHint;
#endif
extern BOOL ControlC;
inline BOOL IsInterrupt()

Просмотреть файл

@ -242,6 +242,7 @@ static HRESULT GetCoreClrDirectory(std::string& coreClrDirectory)
}
if (!GetAbsolutePath(directory, coreClrDirectory))
{
ExtDbgOut("Error: Runtime directory %s doesn't exist\n", directory);
return E_FAIL;
}
#else
@ -261,7 +262,9 @@ static HRESULT GetCoreClrDirectory(std::string& coreClrDirectory)
}
if (GetFileAttributesA(szModuleName) == INVALID_FILE_ATTRIBUTES)
{
return HRESULT_FROM_WIN32(GetLastError());
Status = HRESULT_FROM_WIN32(GetLastError());
ExtDbgOut("Error: Runtime module %s doesn't exist %08x\n", szModuleName, Status);
return Status;
}
coreClrDirectory = szModuleName;
@ -269,6 +272,7 @@ static HRESULT GetCoreClrDirectory(std::string& coreClrDirectory)
size_t lastSlash = coreClrDirectory.rfind(DIRECTORY_SEPARATOR_CHAR_A);
if (lastSlash == std::string::npos)
{
ExtDbgOut("Error: Runtime module %s has no directory separator\n", szModuleName);
return E_FAIL;
}
coreClrDirectory.assign(coreClrDirectory, 0, lastSlash);
@ -648,6 +652,7 @@ HRESULT InitializeHosting()
HRESULT Status = GetHostRuntime(coreClrPath, hostRuntimeDirectory);
if (FAILED(Status))
{
ExtDbgOut("Error: Failed to get host runtime directory\n");
return Status;
}
#ifdef FEATURE_PAL
@ -1112,6 +1117,9 @@ HRESULT SymbolReader::LoadSymbolsForWindowsPDB(___in IMetaDataImport* pMD, ___in
if (m_pSymReader != NULL)
return S_OK;
if (pMD == nullptr)
return E_INVALIDARG;
if (g_pSymBinder == nullptr)
{
// Ignore errors to be able to run under a managed host (dotnet-dump).

Просмотреть файл

@ -182,10 +182,9 @@ EXPORTS
DumpPermissionSet
dps=DumpPermissionSet
dumppermissionset=DumpPermissionSet
dbgout
filthint
#endif
dbgout
_EFN_GetManagedExcepStack
_EFN_GetManagedExcepStackW
_EFN_GetManagedObjectFieldInfo

Просмотреть файл

@ -4,6 +4,7 @@
bpmd
ClrStack
dbgout
DumpArray
DumpAssembly
DumpAsync

Просмотреть файл

@ -7260,7 +7260,7 @@ public:
IfFailRet(g_sos->GetModule(mod, &pModule));
ToRelease<IMetaDataImport> pMDImport = NULL;
IfFailRet(pModule->QueryInterface(IID_IMetaDataImport, (LPVOID *) &pMDImport));
pModule->QueryInterface(IID_IMetaDataImport, (LPVOID *) &pMDImport);
IfFailRet(pSymbolReader->LoadSymbols(pMDImport, pModule));
@ -14383,7 +14383,8 @@ end:
return Status;
}
#ifdef _DEBUG
#endif // FEATURE_PAL
DECLARE_API(dbgout)
{
INIT_API();
@ -14401,41 +14402,9 @@ DECLARE_API(dbgout)
}
Output::SetDebugOutputEnabled(!bOff);
ExtOut("Debug output logging %s\n", Output::IsDebugOutputEnabled() ? "enabled" : "disabled");
return Status;
}
DECLARE_API(filthint)
{
INIT_API();
BOOL bOff = FALSE;
DWORD_PTR filter = 0;
CMDOption option[] =
{ // name, vptr, type, hasValue
{"-off", &bOff, COBOOL, FALSE},
};
CMDValue arg[] =
{ // vptr, type
{&filter, COHEX}
};
size_t nArg;
if (!GetCMDOption(args, option, _countof(option),
arg, _countof(arg), &nArg))
{
return Status;
}
if (bOff)
{
g_filterHint = 0;
return Status;
}
g_filterHint = filter;
return Status;
}
#endif // _DEBUG
#endif // FEATURE_PAL
static HRESULT DumpMDInfoBuffer(DWORD_PTR dwStartAddr, DWORD Flags, ULONG64 Esp,
ULONG64 IPAddr, StringOutput& so)
@ -15909,6 +15878,10 @@ DECLARE_API(SetSymbolServer)
{
ExtOut("Added Windows symbol path: %s\n", windowsSymbolPath.data);
}
if (logging)
{
ExtOut("Symbol download logging enabled\n");
}
}
else if (loadNative)
{

Просмотреть файл

@ -3465,7 +3465,7 @@ void StringObjectContent(size_t obj, BOOL fLiteral, const int length)
DWORD_PTR dwAddr = (DWORD_PTR)pwszBuf.GetPtr();
if (g_sos->GetObjectStringData(TO_CDADDR(obj), stInfo.m_StringLength+1, pwszBuf, NULL)!=S_OK)
{
ExtOut("Error getting string data\n");
ExtOut("<Invalid Object>");
return;
}
@ -5112,10 +5112,8 @@ void ExtErr(PCSTR Format, ...)
va_end(Args);
}
void ExtDbgOut(PCSTR Format, ...)
{
#ifdef _DEBUG
if (Output::g_bDbgOutput)
{
va_list Args;
@ -5125,7 +5123,6 @@ void ExtDbgOut(PCSTR Format, ...)
OutputVaList(DEBUG_OUTPUT_NORMAL, Format, Args);
va_end(Args);
}
#endif
}
const char * const DMLFormats[] =
@ -5487,7 +5484,7 @@ GetLineByOffset(
IfFailRet(ConvertNativeToIlOffset(offset, &pModule, &methodToken, &methodOffs));
ToRelease<IMetaDataImport> pMDImport(NULL);
IfFailRet(pModule->QueryInterface(IID_IMetaDataImport, (LPVOID *) &pMDImport));
pModule->QueryInterface(IID_IMetaDataImport, (LPVOID *) &pMDImport);
SymbolReader symbolReader;
IfFailRet(symbolReader.LoadSymbols(pMDImport, pModule));

Просмотреть файл

@ -18,9 +18,6 @@
<Platform>x64</Platform>
</ProjectConfiguration>
</ItemGroup>
<ItemGroup>
<Text Include="CMakeLists.txt" />
</ItemGroup>
<ItemGroup>
<ClCompile Include="gcdump.cpp" />
<ClCompile Include="gcdumpnonx86.cpp" />

Просмотреть файл

@ -1,8 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup>
<Text Include="CMakeLists.txt" />
</ItemGroup>
<ItemGroup>
<Filter Include="i386">
<UniqueIdentifier>{f850f02d-2875-417b-a6cc-6058817844a0}</UniqueIdentifier>

Просмотреть файл

@ -2,9 +2,6 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>netcoreapp2.0</TargetFramework>
<IsPackable>false</IsPackable>
<GenerateRuntimeConfigurationFiles>true</GenerateRuntimeConfigurationFiles>
<NoWarn>;1591;1701</NoWarn>
<TargetFrameworks>netcoreapp1.1;netcoreapp2.1;netcoreapp3.0</TargetFrameworks>
</PropertyGroup>
</Project>

Просмотреть файл

@ -134,6 +134,7 @@ sosCommandInitialize(lldb::SBDebugger debugger)
interpreter.AddCommand("clrstack", new sosCommand("ClrStack"), "Provides a stack trace of managed code only.");
interpreter.AddCommand("clrthreads", new sosCommand("Threads"), "List the managed threads running.");
interpreter.AddCommand("clru", new sosCommand("u"), "Displays an annotated disassembly of a managed method.");
interpreter.AddCommand("dbgout", new sosCommand("dbgout"), "Enable/disable (-off) internal SOS logging.");
interpreter.AddCommand("dumparray", new sosCommand("DumpArray"), "Displays details about a managed array.");
interpreter.AddCommand("dumpasync", new sosCommand("DumpAsync"), "Displays info about async state machines on the garbage-collected heap.");
interpreter.AddCommand("dumpassembly", new sosCommand("DumpAssembly"), "Displays details about an assembly.");

Просмотреть файл

@ -14,6 +14,7 @@ namespace Microsoft.Diagnostics.Tools.Dump
{
[Command(Name = "clrstack", AliasExpansion = "ClrStack", Help = "Provides a stack trace of managed code only.")]
[Command(Name = "clrthreads", AliasExpansion = "Threads", Help = "List the managed threads running.")]
[Command(Name = "dbgout", AliasExpansion = "dbgout", Help = "Enable/disable (-off) internal SOS logging.")]
[Command(Name = "dumparray", AliasExpansion = "DumpArray", Help = "Displays details about a managed array.")]
[Command(Name = "dumpasync", AliasExpansion = "DumpAsync", Help = "Displays info about async state machines on the garbage-collected heap.")]
[Command(Name = "dumpassembly", AliasExpansion = "DumpAssembly", Help = "Displays details about an assembly.")]