From 9a0df696f5f0c955f1047a68c344de3767d438f3 Mon Sep 17 00:00:00 2001 From: Mike McLaughlin Date: Mon, 30 Sep 2019 21:04:32 -0700 Subject: [PATCH] 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 --- .vsts-dotnet-ci.yml | 28 +- .vsts-dotnet.yml | 86 ++- debuggees.sln | 606 ++++++++++++++++++ diagnostics.sln | 44 -- eng/Build-Native.cmd | 2 +- eng/build-native.sh | 23 +- eng/build.yml | 211 +++--- eng/install-test-runtimes.ps1 | 15 +- eng/install-test-runtimes.sh | 19 +- global.json | 4 +- src/Directory.Build.props | 4 +- .../Console/ConsoleProvider.cs | 23 +- .../BaseDebuggeeCompiler.cs | 4 + .../DebuggeeCompiler.cs | 28 +- .../SdkPrebuiltDebuggeeCompiler.cs | 37 ++ .../TestConfiguration.cs | 29 +- src/SOS/SOS.Hosting/SOSHost.cs | 24 +- .../Unix/Debugger.Tests.Config.txt | 71 +- .../Windows/Debugger.Tests.Config.txt | 112 +++- .../Debuggees/Directory.Build.props | 10 + .../Debuggees/DivZero/DivZero.csproj | 4 +- .../Debuggees/GCWhere/GCWhere.csproj | 4 +- .../NestedExceptionTest.csproj | 4 +- .../Debuggees/Overflow/Overflow.csproj | 4 +- .../ReflectionTest/ReflectionTest.csproj | 4 +- .../Debuggees/SimpleThrow/SimpleThrow.csproj | 4 +- .../SymbolTestApp/SymbolTestApp.csproj | 8 +- .../SymbolTestDll/SymbolTestDll.csproj | 4 +- .../RandomUserLibrary.csproj | 4 +- .../TaskNestedException.csproj | 10 +- .../SOS.UnitTests/Debuggees/WebApp/Program.cs | 46 ++ .../WebApp/Properties/launchSettings.json | 27 + .../SOS.UnitTests/Debuggees/WebApp/Startup.cs | 42 ++ .../Debuggees/WebApp/WebApp.csproj | 12 + .../Debuggees/WebApp3/Program.cs | 46 ++ .../WebApp3/Properties/launchSettings.json | 27 + .../Debuggees/WebApp3/Startup.cs | 49 ++ .../Debuggees/WebApp3/WebApp3.csproj | 7 + .../WebApp3/appsettings.Development.json | 9 + .../Debuggees/WebApp3/appsettings.json | 10 + src/SOS/SOS.UnitTests/SOS.cs | 250 ++++++-- src/SOS/SOS.UnitTests/SOSRunner.cs | 582 +++++++++++------ src/SOS/SOS.UnitTests/Scripts/DivZero.script | 33 +- .../Scripts/NestedExceptionTest.script | 40 +- .../Scripts/OtherCommands.script | 86 +++ src/SOS/SOS.UnitTests/Scripts/Overflow.script | 8 +- .../SOS.UnitTests/Scripts/Reflection.script | 36 +- .../SOS.UnitTests/Scripts/SimpleThrow.script | 59 +- .../Scripts/StackAndOtherTests.script | 34 +- .../SOS.UnitTests/Scripts/StackTests.script | 12 +- .../Scripts/TaskNestedException.script | 18 +- src/SOS/SOS.UnitTests/Scripts/WebApp.script | 163 +++++ src/SOS/Strike/datatarget.cpp | 7 +- src/SOS/Strike/exts.cpp | 2 - src/SOS/Strike/exts.h | 4 - src/SOS/Strike/hostcoreclr.cpp | 10 +- src/SOS/Strike/sos.def | 3 +- src/SOS/Strike/sos_unixexports.src | 1 + src/SOS/Strike/strike.cpp | 43 +- src/SOS/Strike/util.cpp | 7 +- src/SOS/gcdump/gcdump.vcxproj | 3 - src/SOS/gcdump/gcdump.vcxproj.filters | 3 - .../TestDebuggee/TestDebuggee.csproj | 5 +- src/SOS/lldbplugin/soscommand.cpp | 1 + src/Tools/dotnet-dump/Commands/SOSCommand.cs | 1 + 65 files changed, 2434 insertions(+), 682 deletions(-) create mode 100644 debuggees.sln create mode 100644 src/Microsoft.Diagnostics.TestHelpers/SdkPrebuiltDebuggeeCompiler.cs create mode 100644 src/SOS/SOS.UnitTests/Debuggees/Directory.Build.props create mode 100644 src/SOS/SOS.UnitTests/Debuggees/WebApp/Program.cs create mode 100644 src/SOS/SOS.UnitTests/Debuggees/WebApp/Properties/launchSettings.json create mode 100644 src/SOS/SOS.UnitTests/Debuggees/WebApp/Startup.cs create mode 100644 src/SOS/SOS.UnitTests/Debuggees/WebApp/WebApp.csproj create mode 100644 src/SOS/SOS.UnitTests/Debuggees/WebApp3/Program.cs create mode 100644 src/SOS/SOS.UnitTests/Debuggees/WebApp3/Properties/launchSettings.json create mode 100644 src/SOS/SOS.UnitTests/Debuggees/WebApp3/Startup.cs create mode 100644 src/SOS/SOS.UnitTests/Debuggees/WebApp3/WebApp3.csproj create mode 100644 src/SOS/SOS.UnitTests/Debuggees/WebApp3/appsettings.Development.json create mode 100644 src/SOS/SOS.UnitTests/Debuggees/WebApp3/appsettings.json create mode 100644 src/SOS/SOS.UnitTests/Scripts/OtherCommands.script create mode 100644 src/SOS/SOS.UnitTests/Scripts/WebApp.script diff --git a/.vsts-dotnet-ci.yml b/.vsts-dotnet-ci.yml index 005a83ec1..948485f9e 100644 --- a/.vsts-dotnet-ci.yml +++ b/.vsts-dotnet-ci.yml @@ -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 diff --git a/.vsts-dotnet.yml b/.vsts-dotnet.yml index a7cf34d92..d5653c145 100644 --- a/.vsts-dotnet.yml +++ b/.vsts-dotnet.yml @@ -1,12 +1,21 @@ -phases: +trigger: +- master +- release/* + +pr: +- master +- release/* + +jobs: - template: /eng/build.yml parameters: name: Windows - agentOs: Windows_NT - queue: - name: Hosted VS2017 - parallel: 4 + osGroup: Windows_NT + strategy: matrix: + Build_Debug: + _BuildConfig: Debug + _BuildArch: x64 Build_Release: _BuildConfig: Release _BuildArch: x64 @@ -23,11 +32,9 @@ phases: - template: /eng/build.yml parameters: name: CentOS_7 - agentOs: Linux + osGroup: Linux dockerImage: mcr.microsoft.com/dotnet-buildtools/prereqs:centos-7-3e800f1-20190501005343 - queue: - name: Hosted Ubuntu 1604 - parallel: 2 + strategy: matrix: Build_Debug: _BuildConfig: Debug @@ -41,11 +48,10 @@ phases: - template: /eng/build.yml parameters: name: Linux_cross - agentOs: Linux + osGroup: Linux dockerImage: mcr.microsoft.com/dotnet-buildtools/prereqs:ubuntu-14.04-cross-1735d26-20190521133857 crossrootfsDir: '/crossrootfs/arm' - queue: - name: Hosted Ubuntu 1604 + strategy: matrix: Build_Release: _BuildConfig: Release @@ -55,11 +61,10 @@ phases: - template: /eng/build.yml parameters: name: Linux_cross64 - agentOs: Linux + osGroup: Linux dockerImage: mcr.microsoft.com/dotnet-buildtools/prereqs:ubuntu-16.04-cross-arm64-a3ae44b-20180315221921 crossrootfsDir: '/crossrootfs/arm64' - queue: - name: Hosted Ubuntu 1604 + strategy: matrix: Build_Release: _BuildConfig: Release @@ -69,10 +74,9 @@ phases: - template: /eng/build.yml parameters: name: Alpine3_6 - agentOs: Linux + osGroup: Linux dockerImage: mcr.microsoft.com/dotnet-buildtools/prereqs:alpine-3.6-WithNode-f4d3fe3-20181220200247 - queue: - name: Hosted Ubuntu 1604 + strategy: matrix: Build_Release: _BuildConfig: Release @@ -82,10 +86,8 @@ phases: - template: /eng/build.yml parameters: name: MacOS - agentOs: Darwin - queue: - name: Hosted macOS - parallel: 2 + osGroup: MacOS + strategy: matrix: Build_Release: _BuildConfig: Release @@ -97,12 +99,11 @@ phases: - template: /eng/build.yml parameters: name: Debian_Stretch - agentOs: Linux + osGroup: Linux dockerImage: mcr.microsoft.com/dotnet-buildtools/prereqs:debian-stretch-3e800f1-20190521154431 dependsOn: CentOS_7 testOnly: true - queue: - name: Hosted Ubuntu 1604 + strategy: matrix: Build_Debug: _BuildConfig: Debug @@ -111,12 +112,11 @@ phases: - template: /eng/build.yml parameters: name: Fedora_28 - agentOs: Linux + osGroup: Linux dockerImage: mcr.microsoft.com/dotnet-buildtools/prereqs:fedora-28-09ca40b-20190508143249 dependsOn: CentOS_7 testOnly: true - queue: - name: Hosted Ubuntu 1604 + strategy: matrix: Build_Debug: _BuildConfig: Debug @@ -125,12 +125,11 @@ phases: - template: /eng/build.yml parameters: name: Fedora_29 - agentOs: Linux + osGroup: Linux dockerImage: mcr.microsoft.com/dotnet-buildtools/prereqs:fedora-29-09ca40b-20190508143249 dependsOn: CentOS_7 testOnly: true - queue: - name: Hosted Ubuntu 1604 + strategy: matrix: Build_Debug: _BuildConfig: Debug @@ -139,12 +138,11 @@ phases: - template: /eng/build.yml parameters: name: OpenSuse_42_1 - agentOs: Linux + osGroup: Linux dockerImage: mcr.microsoft.com/dotnet-buildtools/prereqs:opensuse-42.1-c103199-20180628122439 dependsOn: CentOS_7 testOnly: true - queue: - name: Hosted Ubuntu 1604 + strategy: matrix: Build_Debug: _BuildConfig: Debug @@ -153,12 +151,11 @@ phases: - template: /eng/build.yml parameters: name: OpenSuse_42_3 - agentOs: Linux + osGroup: Linux dockerImage: mcr.microsoft.com/dotnet-buildtools/prereqs:opensuse-42.3-3e800f1-20190501005344 dependsOn: CentOS_7 testOnly: true - queue: - name: Hosted Ubuntu 1604 + strategy: matrix: Build_Debug: _BuildConfig: Debug @@ -167,12 +164,11 @@ phases: - template: /eng/build.yml parameters: name: Ubuntu_14_04 - agentOs: Linux + osGroup: Linux dockerImage: mcr.microsoft.com/dotnet-buildtools/prereqs:ubuntu-14.04-1735d26-20190521133852 dependsOn: CentOS_7 testOnly: true - queue: - name: Hosted Ubuntu 1604 + strategy: matrix: Build_Debug: _BuildConfig: Debug @@ -181,12 +177,11 @@ phases: - template: /eng/build.yml parameters: name: Ubuntu_16_04 - agentOs: Linux + osGroup: Linux dockerImage: mcr.microsoft.com/dotnet-buildtools/prereqs:ubuntu-16.04-09ca40b-20190520220842 dependsOn: CentOS_7 testOnly: true - queue: - name: Hosted Ubuntu 1604 + strategy: matrix: Build_Debug: _BuildConfig: Debug @@ -195,12 +190,11 @@ phases: - template: /eng/build.yml parameters: name: Ubuntu_18_04 - agentOs: Linux + osGroup: Linux dockerImage: mcr.microsoft.com/dotnet-buildtools/prereqs:ubuntu-18.04-3e800f1-20190508143252 dependsOn: CentOS_7 testOnly: true - queue: - name: Hosted Ubuntu 1604 + strategy: matrix: Build_Debug: _BuildConfig: Debug diff --git a/debuggees.sln b/debuggees.sln new file mode 100644 index 000000000..74b27053c --- /dev/null +++ b/debuggees.sln @@ -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 diff --git a/diagnostics.sln b/diagnostics.sln index 71e216bd7..de60049a9 100644 --- a/diagnostics.sln +++ b/diagnostics.sln @@ -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} diff --git a/eng/Build-Native.cmd b/eng/Build-Native.cmd index 957cb5669..52f620f1d 100644 --- a/eng/Build-Native.cmd +++ b/eng/Build-Native.cmd @@ -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% diff --git a/eng/build-native.sh b/eng/build-native.sh index ea9b45071..5035a8ef7 100755 --- a/eng/build-native.sh +++ b/eng/build-native.sh @@ -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 diff --git a/eng/build.yml b/eng/build.yml index 42c03e97f..0428f6084 100644 --- a/eng/build.yml +++ b/eng/build.yml @@ -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 + + # Agent OS (Windows_NT, Linux, MacOS, FreeBSD) + osGroup: Windows_NT + + # Additional variables + variables: {} + + # Build strategy - matrix + strategy: '' + + # Optional: Job timeout + timeoutInMinutes: 180 + + # Optional: Docker image to use dockerImage: '' + + # Optional: ROOTFS_DIR to use crossrootfsDir: '' + + # Optional: test only job if true testOnly: false - dependsOn: '' - # send telemetry - enableTelemetry: true - # install Microbuild plugin if not a public build - enableMicrobuild: true - # queue YAML object - https://github.com/Microsoft/vsts-agent/blob/master/docs/preview/yamlgettingstarted-schema.md#queue - queue: {} - # variables YAML object - https://github.com/Microsoft/vsts-agent/blob/master/docs/preview/yamlgettingstarted-schema.md#phase - variables: {} -# Common conditionals: There are a number of common conditionals that are useful. Generally these are used to decide what resources can be accessed, -# or what logic should be applied based on the context the build is being run in. -# - eq/ne(variables['Agent.Os'], 'Windows_NT') - Running/not running on a windows machine -# - eq/ne(variables['System.TeamProject'], 'public') - Running/not running on the dotnet public VSTS project -# - and(ne(variables['System.TeamProject'], 'public'), notin(variables['Build.Reason'], 'PullRequest') - Not running in public and not a pull request. -# - or(eq(variables['System.TeamProject'], 'public'), in(variables['Build.Reason'], 'PullRequest') - Running in public or a pull request. + # Depends on + dependsOn: '' -phases: -- template: /eng/common/templates/phases/base.yml +jobs: +- template: /eng/common/templates/job/job.yml parameters: - enableTelemetry: ${{ parameters.enableTelemetry }} - enableMicrobuild: ${{ parameters.enableMicrobuild }} name: ${{ parameters.name }} - agentOs: ${{ parameters.agentOs }} - dependsOn: ${{ parameters.dependsOn }} - queue: ${{ parameters.queue }} + timeoutInMinutes: ${{ parameters.timeoutInMinutes }} + enableMicrobuild: true + enableTelemetry: true + helixRepo: dotnet/sdk + + pool: + # Public Linux Build Pool + ${{ if and(eq(parameters.osGroup, 'Linux'), eq(variables['System.TeamProject'], 'public')) }}: + name: NetCorePublic-Pool + queue: BuildPool.Ubuntu.1604.Amd64.Open + + # Official Build Linux Pool + ${{ if and(eq(parameters.osGroup, 'Linux'), ne(variables['System.TeamProject'], 'public')) }}: + name: NetCoreInternal-Pool + queue: BuildPool.Ubuntu.1604.Amd64 + + # FreeBSD builds only in the internal project + ${{ if and(eq(parameters.osGroup, 'FreeBSD'), ne(variables['System.TeamProject'], 'public')) }}: + name: dnceng-freebsd-internal + + # Public OSX Build Pool + ${{ if and(eq(parameters.osGroup, 'MacOS'), ne(variables['System.TeamProject'], 'public')) }}: + name: Hosted Mac Internal + + # Official Build OSX Pool + ${{ if and(eq(parameters.osGroup, 'MacOS'), eq(variables['System.TeamProject'], 'public')) }}: + name: Hosted MacOS + + # Official Build Windows Pool + ${{ if and(eq(parameters.osGroup, 'Windows_NT'), ne(variables['System.TeamProject'], 'public')) }}: + name: NetCoreInternal-Pool + queue: BuildPool.Windows.10.Amd64.VS2017 + + # Public Windows Build Pool + ${{ if and(eq(parameters.osGroup, 'Windows_NT'), eq(variables['System.TeamProject'], 'public')) }}: + name: NetCorePublic-Pool + queue: BuildPool.Windows.10.Amd64.VS2017.Open + + ${{ if ne(parameters.strategy, '') }}: + strategy: ${{ parameters.strategy }} + + ${{ if ne(parameters.dependsOn, '') }}: + dependsOn: ${{ parameters.dependsOn }} + + workspace: + clean: all variables: - ${{ insert }}: ${{ parameters.variables }} - _PortableLinuxBuild: CentOS_7_$(_BuildArch)_$(_BuildConfig) - _DockerImageName: ${{ parameters.dockerImage }} - _PhaseName : ${{ parameters.name }} - _HelixType: build/product - _HelixBuildConfig: $(_BuildConfig) - - # Only enable publishing in non-public, non PR scenarios. - ${{ if and(ne(variables['System.TeamProject'], 'public'), notin(variables['Build.Reason'], 'PullRequest')) }}: - _HelixSource: official/dotnet/arcade/$(Build.SourceBranch) - ${{ if or(eq(variables['System.TeamProject'], 'public'), in(variables['Build.Reason'], 'PullRequest')) }}: - _HelixSource: pr/dotnet/arcade/$(Build.SourceBranch) - - ${{ if eq(parameters.testOnly, 'true') }}: - _LinuxScript: $(Build.SourcesDirectory)/eng/citest.sh - ${{ if ne(parameters.testOnly, 'true') }}: - _LinuxScript: $(Build.SourcesDirectory)/eng/cibuild.sh - - ${{ if eq(variables['Build.Reason'], 'Schedule') }}: - ${{ if eq(parameters.agentOs, 'Windows_NT') }}: - _DailyTest: -daily-test - ${{ if ne(parameters.agentOs, 'Windows_NT') }}: - _DailyTest: --daily-test - ${{ if ne(variables['Build.Reason'], 'Schedule') }}: - _DailyTest: '' - - ${{ if eq(parameters.crossrootfsDir, '') }}: - _RootFs: '' - # This is only required for cross builds. - ${{ if ne(parameters.crossrootfsDir, '') }}: - _RootFs: --rootfs ${{ parameters.crossrootfsDir }} + - ${{ insert }}: ${{ parameters.variables }} + - _PortableLinuxBuild: CentOS_7_$(_BuildArch)_$(_BuildConfig) + - _DockerImageName: ${{ parameters.dockerImage }} + - _PhaseName : ${{ parameters.name }} + - _HelixType: build/product + - _HelixBuildConfig: $(_BuildConfig) + + # Only enable publishing in non-public, non PR scenarios. + - ${{ if and(ne(variables['System.TeamProject'], 'public'), notin(variables['Build.Reason'], 'PullRequest')) }}: + - _HelixSource: official/dotnet/arcade/$(Build.SourceBranch) + - ${{ if or(eq(variables['System.TeamProject'], 'public'), in(variables['Build.Reason'], 'PullRequest')) }}: + - _HelixSource: pr/dotnet/arcade/$(Build.SourceBranch) + + - ${{ if eq(parameters.testOnly, 'true') }}: + - _LinuxScript: $(Build.SourcesDirectory)/eng/citest.sh + - ${{ if ne(parameters.testOnly, 'true') }}: + - _LinuxScript: $(Build.SourcesDirectory)/eng/cibuild.sh + + - ${{ if eq(variables['Build.Reason'], 'Schedule') }}: + - ${{ if eq(parameters.osGroup, 'Windows_NT') }}: + - _DailyTest: -daily-test + - ${{ if ne(parameters.osGroup, 'Windows_NT') }}: + - _DailyTest: --daily-test + - ${{ if ne(variables['Build.Reason'], 'Schedule') }}: + - _DailyTest: '' + + # This is only required for cross builds. + - ${{ if eq(parameters.crossrootfsDir, '') }}: + - _RootFs: '' + - ${{ if ne(parameters.crossrootfsDir, '') }}: + - _RootFs: --rootfs ${{ parameters.crossrootfsDir }} steps: - - template: /eng/common/templates/steps/run-on-windows.yml - parameters: - agentOs: ${{ parameters.agentOs }} - steps: - - script: $(Build.SourcesDirectory)\eng\cibuild.cmd $(_DailyTest) - -configuration $(_BuildConfig) - -architecture $(_BuildArch) - -prepareMachine - /p:OfficialBuildId=$(BUILD.BUILDNUMBER) - displayName: Build / Test - condition: succeeded() + - ${{ if eq(parameters.osGroup, 'Windows_NT') }}: + - script: $(Build.SourcesDirectory)\eng\cibuild.cmd $(_DailyTest) + -configuration $(_BuildConfig) + -architecture $(_BuildArch) + -prepareMachine + /p:OfficialBuildId=$(BUILD.BUILDNUMBER) + displayName: Build / Test + condition: succeeded() - - ${{ if eq(parameters.agentOs, 'Linux') }}: + - ${{ if eq(parameters.osGroup, 'Linux') }}: - ${{ if eq(parameters.testOnly, 'true') }}: - task: DownloadBuildArtifacts@0 displayName: Download Linux-x64 Artifacts @@ -116,7 +149,7 @@ phases: displayName: Docker Build / Test condition: succeeded() - - ${{ if eq(parameters.agentOs, 'Darwin') }}: + - ${{ if eq(parameters.osGroup, 'MacOS') }}: - script: $(Build.SourcesDirectory)/eng/cibuild.sh $(_DailyTest) --configuration $(_BuildConfig) --architecture $(_BuildArch) @@ -126,14 +159,32 @@ phases: condition: succeeded() - task: PublishBuildArtifacts@1 - displayName: Upload Artifacts + displayName: Publish Build Artifacts inputs: pathtoPublish: '$(Build.SourcesDirectory)/artifacts/$(_PublishArtifacts)' artifactName: $(_PhaseName)_$(_BuildArch)_$(_BuildConfig) condition: ne(variables['_PublishArtifacts'], '') + - task: PublishBuildArtifacts@1 + displayName: Publish Artifacts on failure + inputs: + PathtoPublish: '$(Build.SourcesDirectory)/artifacts/bin' + PublishLocation: Container + ArtifactName: Artifacts_$(_PhaseName)_$(_BuildArch)_$(_BuildConfig) + continueOnError: true + condition: failed() + + - task: PublishBuildArtifacts@1 + displayName: Publish Dump Artifacts on failure + inputs: + PathtoPublish: '$(Build.SourcesDirectory)/artifacts/tmp/$(_BuildConfig)/dumps' + PublishLocation: Container + ArtifactName: Dumps_$(_PhaseName)_$(_BuildArch)_$(_BuildConfig) + continueOnError: true + condition: failed() + - task: CopyFiles@2 - displayName: Gather Build Logs + displayName: Gather Logs inputs: sourceFolder: '$(Build.SourcesDirectory)/artifacts' contents: '?(log|TestResults)/**' @@ -142,7 +193,7 @@ phases: condition: always() - task: PublishBuildArtifacts@1 - displayName: Publish Logs to VSTS + displayName: Publish Logs inputs: PathtoPublish: '$(Build.StagingDirectory)/BuildLogs' PublishLocation: Container diff --git a/eng/install-test-runtimes.ps1 b/eng/install-test-runtimes.ps1 index ed0181564..0b0a617b6 100644 --- a/eng/install-test-runtimes.ps1 +++ b/eng/install-test-runtimes.ps1 @@ -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" ' ' + $DailyTestText +' ' + $RuntimeVersion11 + ' ' + $RuntimeVersion21 + ' ' + $RuntimeVersion22 + ' +' + $RuntimeVersion30 + ' +' + $AspNetCoreVersion30 + ' ' + $RuntimeVersionLatest + ' ' | Set-Content $ConfigFile diff --git a/eng/install-test-runtimes.sh b/eng/install-test-runtimes.sh index 9096c0188..20fb19a17 100755 --- a/eng/install-test-runtimes.sh +++ b/eng/install-test-runtimes.sh @@ -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 " $daily_test_text $runtime_version_11 $runtime_version_21 $runtime_version_22 +$runtime_version_30 +$aspnetcore_version_30 $runtime_version_latest " > $config_file diff --git a/global.json b/global.json index 5e4724015..add2e1c50 100644 --- a/global.json +++ b/global.json @@ -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" diff --git a/src/Directory.Build.props b/src/Directory.Build.props index 843f8b008..63e5b1ff8 100644 --- a/src/Directory.Build.props +++ b/src/Directory.Build.props @@ -17,11 +17,11 @@ false - + full - + portable diff --git a/src/Microsoft.Diagnostics.Repl/Console/ConsoleProvider.cs b/src/Microsoft.Diagnostics.Repl/Console/ConsoleProvider.cs index c5399a1fa..2083ec063 100644 --- a/src/Microsoft.Diagnostics.Repl/Console/ConsoleProvider.cs +++ b/src/Microsoft.Diagnostics.Repl/Console/ConsoleProvider.cs @@ -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, ""); + } + // 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, ""); 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, ""); + } + else { + WriteLine(OutputType.Normal, ""); + } + } } } } @@ -410,8 +424,9 @@ namespace Microsoft.Diagnostics.Repl } } - private async Task Dispatch(string newCommand, Func dispatchCommand) + private async Task Dispatch(string newCommand, Func 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) diff --git a/src/Microsoft.Diagnostics.TestHelpers/BaseDebuggeeCompiler.cs b/src/Microsoft.Diagnostics.TestHelpers/BaseDebuggeeCompiler.cs index 79d4ce3d9..0ab6285dd 100644 --- a/src/Microsoft.Diagnostics.TestHelpers/BaseDebuggeeCompiler.cs +++ b/src/Microsoft.Diagnostics.TestHelpers/BaseDebuggeeCompiler.cs @@ -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); } diff --git a/src/Microsoft.Diagnostics.TestHelpers/DebuggeeCompiler.cs b/src/Microsoft.Diagnostics.TestHelpers/DebuggeeCompiler.cs index 9dd2fced5..7609fe1f9 100644 --- a/src/Microsoft.Diagnostics.TestHelpers/DebuggeeCompiler.cs +++ b/src/Microsoft.Diagnostics.TestHelpers/DebuggeeCompiler.cs @@ -16,20 +16,24 @@ namespace Microsoft.Diagnostics.TestHelpers { async public static Task Execute(TestConfiguration config, string debuggeeName, ITestOutputHelper output) { - IDebuggeeCompiler compiler = null; - if (config.DebuggeeBuildProcess == "prebuilt") + IDebuggeeCompiler compiler; + switch (config.DebuggeeBuildProcess) { - compiler = new PrebuiltDebuggeeCompiler(config, debuggeeName); + case "prebuilt": + // Backwards compatibility for the diagnostics test repo + compiler = new PrebuiltDebuggeeCompiler(config, debuggeeName); + break; + case "sdk.prebuilt": + // The .NET Core SDK layout + compiler = new SdkPrebuiltDebuggeeCompiler(config, debuggeeName); + break; + case "cli": + // Builds the debuggee with the .NET Core CLI + compiler = new CliDebuggeeCompiler(config, debuggeeName); + break; + default: + throw new Exception("Invalid DebuggeeBuildProcess configuration value. Expected 'prebuilt', actual \'" + config.DebuggeeBuildProcess + "\'"); } - else if (config.DebuggeeBuildProcess == "cli") - { - compiler = new CliDebuggeeCompiler(config, debuggeeName); - } - else - { - throw new Exception("Invalid DebuggeeBuildProcess configuration value. Expected 'prebuilt', actual \'" + config.DebuggeeBuildProcess + "\'"); - } - return await compiler.Execute(output); } } diff --git a/src/Microsoft.Diagnostics.TestHelpers/SdkPrebuiltDebuggeeCompiler.cs b/src/Microsoft.Diagnostics.TestHelpers/SdkPrebuiltDebuggeeCompiler.cs new file mode 100644 index 000000000..53fd4187f --- /dev/null +++ b/src/Microsoft.Diagnostics.TestHelpers/SdkPrebuiltDebuggeeCompiler.cs @@ -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: //[] + // Binary Path: /bin/// + // Binary Exe Path: /bin////.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 Execute(ITestOutputHelper output) + { + return Task.Factory.StartNew(() => new DebuggeeConfiguration(_sourcePath, _binaryPath, _binaryExePath)); + } + } +} \ No newline at end of file diff --git a/src/Microsoft.Diagnostics.TestHelpers/TestConfiguration.cs b/src/Microsoft.Diagnostics.TestHelpers/TestConfiguration.cs index 001028d36..d1dfbba4f 100644 --- a/src/Microsoft.Diagnostics.TestHelpers/TestConfiguration.cs +++ b/src/Microsoft.Diagnostics.TestHelpers/TestConfiguration.cs @@ -284,18 +284,23 @@ namespace Microsoft.Diagnostics.TestHelpers get { return _settings; } } + /// + /// Creates a new test config with the new PDB type (full, portable or embedded) + /// + /// new pdb type + /// new test config public TestConfiguration CloneWithNewDebugType(string pdbType) { Debug.Assert(!string.IsNullOrWhiteSpace(pdbType)); - var currentSettings = new Dictionary(_settings); - - // Set or replace if the pdb debug type - currentSettings[DebugTypeKey] = pdbType; + var currentSettings = new Dictionary(_settings) { - // The debuggee build root must exist. Append the pdb type to make it unique. - currentSettings[DebuggeeBuildRootKey] = Path.Combine(currentSettings[DebuggeeBuildRootKey], pdbType); + // Set or replace if the pdb debug type + [DebugTypeKey] = pdbType, + // The debuggee build root must exist. Append the pdb type to make it unique. + [DebuggeeBuildRootKey] = Path.Combine(_settings[DebuggeeBuildRootKey], pdbType) + }; return new TestConfiguration(currentSettings); } @@ -649,7 +654,17 @@ namespace Microsoft.Diagnostics.TestHelpers public override string ToString() { - return TestProduct + "." + DebuggeeBuildProcess; + var sb = new StringBuilder(); + sb.Append(TestProduct); + sb.Append("."); + sb.Append(DebuggeeBuildProcess); + string version = RuntimeFrameworkVersion; + if (!string.IsNullOrEmpty(version)) + { + sb.Append("."); + sb.Append(version); + } + return sb.ToString(); } } diff --git a/src/SOS/SOS.Hosting/SOSHost.cs b/src/SOS/SOS.Hosting/SOSHost.cs index 8fa2e4f87..d3a7d8277 100644 --- a/src/SOS/SOS.Hosting/SOSHost.cs +++ b/src/SOS/SOS.Hosting/SOSHost.cs @@ -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( diff --git a/src/SOS/SOS.UnitTests/ConfigFiles/Unix/Debugger.Tests.Config.txt b/src/SOS/SOS.UnitTests/ConfigFiles/Unix/Debugger.Tests.Config.txt index d845fabbe..b94f6435f 100644 --- a/src/SOS/SOS.UnitTests/ConfigFiles/Unix/Debugger.Tests.Config.txt +++ b/src/SOS/SOS.UnitTests/ConfigFiles/Unix/Debugger.Tests.Config.txt @@ -20,9 +20,8 @@ $(RootBinDir)/tmp/$(TargetConfiguration)\dumps $(RepoRootDir)/src/SOS/SOS.UnitTests/Debuggees - $(RootBinDir)/Debuggees - $(DebuggeeBuildRoot)/native - cli + sdk.prebuilt + $(RootBinDir) $(RepoRootDir)/.dotnet/dotnet @@ -31,32 +30,84 @@ + + + + + + $(RepoRootDir)/.dotnet/dotnet diff --git a/src/SOS/SOS.UnitTests/ConfigFiles/Windows/Debugger.Tests.Config.txt b/src/SOS/SOS.UnitTests/ConfigFiles/Windows/Debugger.Tests.Config.txt index a837c13d6..818999d00 100644 --- a/src/SOS/SOS.UnitTests/ConfigFiles/Windows/Debugger.Tests.Config.txt +++ b/src/SOS/SOS.UnitTests/ConfigFiles/Windows/Debugger.Tests.Config.txt @@ -17,13 +17,13 @@ $(RootBinDir)\bin\Windows_NT.$(TargetArchitecture).$(TargetConfiguration) $(RootBinDir)\TestResults\$(TargetConfiguration)\sos.unittests_$(Timestamp) $(RootBinDir)\tmp\$(TargetConfiguration)\dumps - $(NuGetPackageCacheDir)\cdb-sos\10.0.18362\runtimes\win-$(TargetArchitecture)\native\cdb.exe + $(RootBinDir)\bin\SOS.UnitTests\$(TargetConfiguration)\netcoreapp2.0\publish\runtimes\win-$(TargetArchitecture)\native\cdb.exe $(InstallDir)\runcommand.dll + $(RepoRootDir)\.dotnet\shared\Microsoft.NETCore.App\$(RuntimeVersion21) $(RepoRootDir)\src\SOS\SOS.UnitTests\Debuggees - $(RootBinDir)\Debuggees - $(DebuggeeBuildRoot)\native - cli + sdk.prebuilt + $(RootBinDir) $(RepoRootDir)\.dotnet\dotnet.exe @@ -32,52 +32,130 @@ + + diff --git a/src/SOS/SOS.UnitTests/Debuggees/Directory.Build.props b/src/SOS/SOS.UnitTests/Debuggees/Directory.Build.props new file mode 100644 index 000000000..92a52fa50 --- /dev/null +++ b/src/SOS/SOS.UnitTests/Debuggees/Directory.Build.props @@ -0,0 +1,10 @@ + + + + + + full + true + false + + diff --git a/src/SOS/SOS.UnitTests/Debuggees/DivZero/DivZero.csproj b/src/SOS/SOS.UnitTests/Debuggees/DivZero/DivZero.csproj index 37c7f376a..754e64894 100644 --- a/src/SOS/SOS.UnitTests/Debuggees/DivZero/DivZero.csproj +++ b/src/SOS/SOS.UnitTests/Debuggees/DivZero/DivZero.csproj @@ -1,7 +1,7 @@ Exe - $(BuildProjectFramework) - true + $(BuildProjectFramework) + netcoreapp1.1;netcoreapp2.1;netcoreapp3.0 diff --git a/src/SOS/SOS.UnitTests/Debuggees/GCWhere/GCWhere.csproj b/src/SOS/SOS.UnitTests/Debuggees/GCWhere/GCWhere.csproj index 37c7f376a..754e64894 100644 --- a/src/SOS/SOS.UnitTests/Debuggees/GCWhere/GCWhere.csproj +++ b/src/SOS/SOS.UnitTests/Debuggees/GCWhere/GCWhere.csproj @@ -1,7 +1,7 @@ Exe - $(BuildProjectFramework) - true + $(BuildProjectFramework) + netcoreapp1.1;netcoreapp2.1;netcoreapp3.0 diff --git a/src/SOS/SOS.UnitTests/Debuggees/NestedExceptionTest/NestedExceptionTest.csproj b/src/SOS/SOS.UnitTests/Debuggees/NestedExceptionTest/NestedExceptionTest.csproj index 37c7f376a..754e64894 100644 --- a/src/SOS/SOS.UnitTests/Debuggees/NestedExceptionTest/NestedExceptionTest.csproj +++ b/src/SOS/SOS.UnitTests/Debuggees/NestedExceptionTest/NestedExceptionTest.csproj @@ -1,7 +1,7 @@ Exe - $(BuildProjectFramework) - true + $(BuildProjectFramework) + netcoreapp1.1;netcoreapp2.1;netcoreapp3.0 diff --git a/src/SOS/SOS.UnitTests/Debuggees/Overflow/Overflow.csproj b/src/SOS/SOS.UnitTests/Debuggees/Overflow/Overflow.csproj index 37c7f376a..754e64894 100644 --- a/src/SOS/SOS.UnitTests/Debuggees/Overflow/Overflow.csproj +++ b/src/SOS/SOS.UnitTests/Debuggees/Overflow/Overflow.csproj @@ -1,7 +1,7 @@ Exe - $(BuildProjectFramework) - true + $(BuildProjectFramework) + netcoreapp1.1;netcoreapp2.1;netcoreapp3.0 diff --git a/src/SOS/SOS.UnitTests/Debuggees/ReflectionTest/ReflectionTest.csproj b/src/SOS/SOS.UnitTests/Debuggees/ReflectionTest/ReflectionTest.csproj index 37c7f376a..754e64894 100644 --- a/src/SOS/SOS.UnitTests/Debuggees/ReflectionTest/ReflectionTest.csproj +++ b/src/SOS/SOS.UnitTests/Debuggees/ReflectionTest/ReflectionTest.csproj @@ -1,7 +1,7 @@ Exe - $(BuildProjectFramework) - true + $(BuildProjectFramework) + netcoreapp1.1;netcoreapp2.1;netcoreapp3.0 diff --git a/src/SOS/SOS.UnitTests/Debuggees/SimpleThrow/SimpleThrow.csproj b/src/SOS/SOS.UnitTests/Debuggees/SimpleThrow/SimpleThrow.csproj index 37c7f376a..754e64894 100644 --- a/src/SOS/SOS.UnitTests/Debuggees/SimpleThrow/SimpleThrow.csproj +++ b/src/SOS/SOS.UnitTests/Debuggees/SimpleThrow/SimpleThrow.csproj @@ -1,7 +1,7 @@ Exe - $(BuildProjectFramework) - true + $(BuildProjectFramework) + netcoreapp1.1;netcoreapp2.1;netcoreapp3.0 diff --git a/src/SOS/SOS.UnitTests/Debuggees/SymbolTestApp/SymbolTestApp/SymbolTestApp.csproj b/src/SOS/SOS.UnitTests/Debuggees/SymbolTestApp/SymbolTestApp/SymbolTestApp.csproj index f7cac32f2..e2d761403 100644 --- a/src/SOS/SOS.UnitTests/Debuggees/SymbolTestApp/SymbolTestApp/SymbolTestApp.csproj +++ b/src/SOS/SOS.UnitTests/Debuggees/SymbolTestApp/SymbolTestApp/SymbolTestApp.csproj @@ -1,9 +1,9 @@ Exe - $(BuildProjectFramework) - true - $(DefineConstants);FULL_CLR + $(BuildProjectFramework) + netcoreapp1.1;netcoreapp2.1;netcoreapp3.0 + $(DefineConstants);FULL_CLR @@ -15,6 +15,6 @@ - + diff --git a/src/SOS/SOS.UnitTests/Debuggees/SymbolTestApp/SymbolTestDll/SymbolTestDll.csproj b/src/SOS/SOS.UnitTests/Debuggees/SymbolTestApp/SymbolTestDll/SymbolTestDll.csproj index 5863a4282..62f23c4bb 100644 --- a/src/SOS/SOS.UnitTests/Debuggees/SymbolTestApp/SymbolTestDll/SymbolTestDll.csproj +++ b/src/SOS/SOS.UnitTests/Debuggees/SymbolTestApp/SymbolTestDll/SymbolTestDll.csproj @@ -1,7 +1,7 @@ Library - $(BuildProjectFramework) - true + $(BuildProjectFramework) + netcoreapp1.1;netcoreapp2.1;netcoreapp3.0 diff --git a/src/SOS/SOS.UnitTests/Debuggees/TaskNestedException/RandomUserLibrary/RandomUserLibrary.csproj b/src/SOS/SOS.UnitTests/Debuggees/TaskNestedException/RandomUserLibrary/RandomUserLibrary.csproj index 5863a4282..62f23c4bb 100644 --- a/src/SOS/SOS.UnitTests/Debuggees/TaskNestedException/RandomUserLibrary/RandomUserLibrary.csproj +++ b/src/SOS/SOS.UnitTests/Debuggees/TaskNestedException/RandomUserLibrary/RandomUserLibrary.csproj @@ -1,7 +1,7 @@ Library - $(BuildProjectFramework) - true + $(BuildProjectFramework) + netcoreapp1.1;netcoreapp2.1;netcoreapp3.0 diff --git a/src/SOS/SOS.UnitTests/Debuggees/TaskNestedException/TaskNestedException/TaskNestedException.csproj b/src/SOS/SOS.UnitTests/Debuggees/TaskNestedException/TaskNestedException/TaskNestedException.csproj index e886c02b3..f94fa66b4 100644 --- a/src/SOS/SOS.UnitTests/Debuggees/TaskNestedException/TaskNestedException/TaskNestedException.csproj +++ b/src/SOS/SOS.UnitTests/Debuggees/TaskNestedException/TaskNestedException/TaskNestedException.csproj @@ -1,14 +1,10 @@ - + Exe - $(BuildProjectFramework) - true + $(BuildProjectFramework) + netcoreapp1.1;netcoreapp2.1;netcoreapp3.0 - - - - diff --git a/src/SOS/SOS.UnitTests/Debuggees/WebApp/Program.cs b/src/SOS/SOS.UnitTests/Debuggees/WebApp/Program.cs new file mode 100644 index 000000000..022b4d6e2 --- /dev/null +++ b/src/SOS/SOS.UnitTests/Debuggees/WebApp/Program.cs @@ -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(); + } +} diff --git a/src/SOS/SOS.UnitTests/Debuggees/WebApp/Properties/launchSettings.json b/src/SOS/SOS.UnitTests/Debuggees/WebApp/Properties/launchSettings.json new file mode 100644 index 000000000..1bdad9eea --- /dev/null +++ b/src/SOS/SOS.UnitTests/Debuggees/WebApp/Properties/launchSettings.json @@ -0,0 +1,27 @@ +{ + "iisSettings": { + "windowsAuthentication": false, + "anonymousAuthentication": true, + "iisExpress": { + "applicationUrl": "http://localhost:6270", + "sslPort": 44313 + } + }, + "profiles": { + "IIS Express": { + "commandName": "IISExpress", + "launchBrowser": true, + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + }, + "WebApp": { + "commandName": "Project", + "launchBrowser": true, + "applicationUrl": "https://localhost:5001;http://localhost:5000", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + } + } +} \ No newline at end of file diff --git a/src/SOS/SOS.UnitTests/Debuggees/WebApp/Startup.cs b/src/SOS/SOS.UnitTests/Debuggees/WebApp/Startup.cs new file mode 100644 index 000000000..a6ab8606c --- /dev/null +++ b/src/SOS/SOS.UnitTests/Debuggees/WebApp/Startup.cs @@ -0,0 +1,42 @@ +using Microsoft.AspNetCore.Builder; +using Microsoft.AspNetCore.Hosting; +using Microsoft.AspNetCore.Http; +using Microsoft.Extensions.DependencyInjection; +using System; +using System.IO.Pipes; + +namespace webapp +{ + public class Startup + { + // This method gets called by the runtime. Use this method to add services to the container. + // For more information on how to configure your application, visit https://go.microsoft.com/fwlink/?LinkID=398940 + public void ConfigureServices(IServiceCollection services) + { + } + + // This method gets called by the runtime. Use this method to configure the HTTP request pipeline. + public void Configure(IApplicationBuilder app, IHostingEnvironment env) + { + if (env.IsDevelopment()) + { + app.UseDeveloperExceptionPage(); + } + + app.Run(async (context) => + { + await context.Response.WriteAsync("Hello World!"); + + if (Program.PipeServerName != null) + { + var pipeStream = new NamedPipeClientStream(Program.PipeServerName); + Console.WriteLine("Connecting to pipe {0}", Program.PipeServerName); + pipeStream.Connect(); + + // Wait for server to send something + int input = pipeStream.ReadByte(); + } + }); + } + } +} diff --git a/src/SOS/SOS.UnitTests/Debuggees/WebApp/WebApp.csproj b/src/SOS/SOS.UnitTests/Debuggees/WebApp/WebApp.csproj new file mode 100644 index 000000000..efb8edb78 --- /dev/null +++ b/src/SOS/SOS.UnitTests/Debuggees/WebApp/WebApp.csproj @@ -0,0 +1,12 @@ + + + + netcoreapp2.1 + + + + + + + + diff --git a/src/SOS/SOS.UnitTests/Debuggees/WebApp3/Program.cs b/src/SOS/SOS.UnitTests/Debuggees/WebApp3/Program.cs new file mode 100644 index 000000000..409056854 --- /dev/null +++ b/src/SOS/SOS.UnitTests/Debuggees/WebApp3/Program.cs @@ -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()); + } +} diff --git a/src/SOS/SOS.UnitTests/Debuggees/WebApp3/Properties/launchSettings.json b/src/SOS/SOS.UnitTests/Debuggees/WebApp3/Properties/launchSettings.json new file mode 100644 index 000000000..d2d3863b7 --- /dev/null +++ b/src/SOS/SOS.UnitTests/Debuggees/WebApp3/Properties/launchSettings.json @@ -0,0 +1,27 @@ +{ + "iisSettings": { + "windowsAuthentication": false, + "anonymousAuthentication": true, + "iisExpress": { + "applicationUrl": "http://localhost:55377/", + "sslPort": 0 + } + }, + "profiles": { + "IIS Express": { + "commandName": "IISExpress", + "launchBrowser": true, + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + }, + "WebApp3": { + "commandName": "Project", + "launchBrowser": true, + "applicationUrl": "https://localhost:5001;http://localhost:5000", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + } + } +} \ No newline at end of file diff --git a/src/SOS/SOS.UnitTests/Debuggees/WebApp3/Startup.cs b/src/SOS/SOS.UnitTests/Debuggees/WebApp3/Startup.cs new file mode 100644 index 000000000..ed10b038c --- /dev/null +++ b/src/SOS/SOS.UnitTests/Debuggees/WebApp3/Startup.cs @@ -0,0 +1,49 @@ +using Microsoft.AspNetCore.Builder; +using Microsoft.AspNetCore.Hosting; +using Microsoft.AspNetCore.Http; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Hosting; +using System; +using System.IO.Pipes; + +namespace WebApp3 +{ + public class Startup + { + // This method gets called by the runtime. Use this method to add services to the container. + // For more information on how to configure your application, visit https://go.microsoft.com/fwlink/?LinkID=398940 + public void ConfigureServices(IServiceCollection services) + { + } + + // This method gets called by the runtime. Use this method to configure the HTTP request pipeline. + public void Configure(IApplicationBuilder app, IWebHostEnvironment env) + { + if (env.IsDevelopment()) + { + app.UseDeveloperExceptionPage(); + } + + app.UseRouting(); + + app.UseEndpoints(endpoints => + { + endpoints.MapGet("/", async context => + { + await context.Response.WriteAsync("Hello World!"); + + if (Program.PipeServerName != null) + { + var pipeStream = new NamedPipeClientStream(Program.PipeServerName); + Console.WriteLine("Connecting to pipe {0}", Program.PipeServerName); + pipeStream.Connect(); + + // Wait for server to send something + int input = pipeStream.ReadByte(); + } + }); + }); + + } + } +} diff --git a/src/SOS/SOS.UnitTests/Debuggees/WebApp3/WebApp3.csproj b/src/SOS/SOS.UnitTests/Debuggees/WebApp3/WebApp3.csproj new file mode 100644 index 000000000..bb9ffced1 --- /dev/null +++ b/src/SOS/SOS.UnitTests/Debuggees/WebApp3/WebApp3.csproj @@ -0,0 +1,7 @@ + + + + netcoreapp3.0 + + + diff --git a/src/SOS/SOS.UnitTests/Debuggees/WebApp3/appsettings.Development.json b/src/SOS/SOS.UnitTests/Debuggees/WebApp3/appsettings.Development.json new file mode 100644 index 000000000..e203e9407 --- /dev/null +++ b/src/SOS/SOS.UnitTests/Debuggees/WebApp3/appsettings.Development.json @@ -0,0 +1,9 @@ +{ + "Logging": { + "LogLevel": { + "Default": "Debug", + "System": "Information", + "Microsoft": "Information" + } + } +} diff --git a/src/SOS/SOS.UnitTests/Debuggees/WebApp3/appsettings.json b/src/SOS/SOS.UnitTests/Debuggees/WebApp3/appsettings.json new file mode 100644 index 000000000..d9d9a9bff --- /dev/null +++ b/src/SOS/SOS.UnitTests/Debuggees/WebApp3/appsettings.json @@ -0,0 +1,10 @@ +{ + "Logging": { + "LogLevel": { + "Default": "Information", + "Microsoft": "Warning", + "Microsoft.Hosting.Lifetime": "Information" + } + }, + "AllowedHosts": "*" +} diff --git a/src/SOS/SOS.UnitTests/SOS.cs b/src/SOS/SOS.UnitTests/SOS.cs index 4dcb14146..a1857811c 100644 --- a/src/SOS/SOS.UnitTests/SOS.cs +++ b/src/SOS/SOS.UnitTests/SOS.cs @@ -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 Configurations => TestRunConfiguration.Instance.Configurations.Select(c => new[] { c }); + public static IEnumerable 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 Configurations => GetConfigurations("TestName", null); + private void SkipIfArm(TestConfiguration config) { if (config.TargetArchitecture == "arm" || config.TargetArchitecture == "arm64") @@ -30,69 +37,79 @@ public class SOS } } - private static bool IsCreateDumpConfig(TestConfiguration config) - { - return config.DebuggeeDumpOutputRootDir() != null; - } - - private static bool IsOpenDumpConfig(TestConfiguration config) - { - return config.DebuggeeDumpInputRootDir() != null; - } - - private Task RunTest(TestConfiguration config, string debuggeeName, string scriptName, bool useCreateDump = true) + private async Task RunTest(string scriptName, bool testLive = true, bool testDump = true, SOSRunner.TestInformation information = null) { - return RunTest(config, "SOS." + debuggeeName, debuggeeName, scriptName, useCreateDump: useCreateDump); - } + information.OutputHelper = Output; - private async Task RunTest(TestConfiguration config, string testName, string debuggeeName, string scriptName, string debuggeeArguments = null, bool useCreateDump = true) - { - if (!SOSRunner.IsAlpine()) + if (testLive && !SOSRunner.IsAlpine()) { // Live - using (SOSRunner runner = await SOSRunner.StartDebugger(config, Output, testName, debuggeeName, debuggeeArguments)) + using (SOSRunner runner = await SOSRunner.StartDebugger(information, SOSRunner.DebuggerAction.Live)) { await runner.RunScript(scriptName); } } - // Generate a crash dump. - if (IsCreateDumpConfig(config)) + if (testDump) { - if (!useCreateDump && SOSRunner.IsAlpine()) + // Generate a crash dump. + if (information.TestConfiguration.DebuggeeDumpOutputRootDir() != null) { - throw new SkipTestException("lldb tests not supported on Alpine"); + if (information.DumpGenerator == SOSRunner.DumpGenerator.NativeDebugger && SOSRunner.IsAlpine()) + { + throw new SkipTestException("lldb tests not supported on Alpine"); + } + await SOSRunner.CreateDump(information); } - await SOSRunner.CreateDump(config, Output, testName, debuggeeName, debuggeeArguments, useCreateDump); - } - // Test against a crash dump. - if (IsOpenDumpConfig(config)) - { - if (!SOSRunner.IsAlpine()) + // Test against a crash dump. + if (information.TestConfiguration.DebuggeeDumpInputRootDir() != null) { - // With cdb (Windows) or lldb (Linux or OSX) - using (SOSRunner runner = await SOSRunner.StartDebugger(config, Output, testName, debuggeeName, debuggeeArguments, SOSRunner.Options.LoadDump)) + if (!SOSRunner.IsAlpine()) { - await runner.RunScript(scriptName); + // With cdb (Windows) or lldb (Linux or OSX) + using (SOSRunner runner = await SOSRunner.StartDebugger(information, SOSRunner.DebuggerAction.LoadDump)) + { + await runner.RunScript(scriptName); + } } - } - // With the dotnet-dump analyze tool - if (config.DotNetDumpPath() != null) - { - using (SOSRunner runner = await SOSRunner.StartDebugger(config, Output, testName, debuggeeName, debuggeeArguments, SOSRunner.Options.LoadDumpWithDotNetDump)) + // With the dotnet-dump analyze tool + if (information.TestConfiguration.DotNetDumpPath() != null) { - await runner.RunScript(scriptName); + using (SOSRunner runner = await SOSRunner.StartDebugger(information, SOSRunner.DebuggerAction.LoadDumpWithDotNetDump)) + { + await runner.RunScript(scriptName); + } } } } } + private async Task RunTest(TestConfiguration config, string debuggeeName, string scriptName, string testName = null, bool testLive = true, bool testDump = true, bool testTriage = false) + { + await RunTest(scriptName, testLive, testDump, new SOSRunner.TestInformation { + TestConfiguration = config, + TestName = testName, + DebuggeeName = debuggeeName, + DumpType = SOSRunner.DumpType.Heap + }); + + if (testTriage) + { + await RunTest(scriptName, testLive: false, testDump, new SOSRunner.TestInformation { + TestConfiguration = config, + TestName = testName, + DebuggeeName = debuggeeName, + DumpType = SOSRunner.DumpType.Triage + }); + } + } + [SkippableTheory, MemberData(nameof(Configurations))] public async Task DivZero(TestConfiguration config) { - await RunTest(config, "DivZero", "DivZero.script"); + await RunTest(config, "DivZero", "DivZero.script", testTriage: true); } [SkippableTheory, MemberData(nameof(Configurations))] @@ -101,64 +118,183 @@ public class SOS SkipIfArm(config); // Live only - if (SOSRunner.IsAlpine()) - { - throw new SkipTestException("lldb tests not supported on Alpine"); - } - using (SOSRunner runner = await SOSRunner.StartDebugger(config, Output, testName: "SOS.GCTests", debuggeeName: "GCWhere")) - { - await runner.RunScript("GCTests.script"); - } + await RunTest(config, "GCWhere", "GCTests.script", testName: "SOS.GCTests", testDump: false); } [SkippableTheory, MemberData(nameof(Configurations))] public async Task Overflow(TestConfiguration config) { // The .NET Core createdump facility may not catch stack overflow so use gdb to generate dump - await RunTest(config, "Overflow", "Overflow.script", useCreateDump: config.StackOverflowCreatesDump); + await RunTest("Overflow.script", information: new SOSRunner.TestInformation { + TestConfiguration = config, + DebuggeeName = "Overflow", + DumpGenerator = config.StackOverflowCreatesDump ? SOSRunner.DumpGenerator.CreateDump : SOSRunner.DumpGenerator.NativeDebugger + }); } [SkippableTheory, MemberData(nameof(Configurations))] public async Task Reflection(TestConfiguration config) { - await RunTest(config, "ReflectionTest", "Reflection.script"); + await RunTest(config, "ReflectionTest", "Reflection.script", testTriage: true); } [SkippableTheory, MemberData(nameof(Configurations))] public async Task SimpleThrow(TestConfiguration config) { - await RunTest(config, "SimpleThrow", "SimpleThrow.script"); + await RunTest(config, "SimpleThrow", "SimpleThrow.script", testTriage: true); } [SkippableTheory, MemberData(nameof(Configurations))] public async Task NestedExceptionTest(TestConfiguration config) { - await RunTest(config, "NestedExceptionTest", "NestedExceptionTest.script"); + await RunTest(config, "NestedExceptionTest", "NestedExceptionTest.script", testTriage: true); } [SkippableTheory, MemberData(nameof(Configurations))] public async Task TaskNestedException(TestConfiguration config) { - await RunTest(config, "TaskNestedException", "TaskNestedException.script"); + await RunTest(config, "TaskNestedException", "TaskNestedException.script", testTriage: true); } [SkippableTheory, MemberData(nameof(Configurations))] public async Task StackTests(TestConfiguration config) { - await RunTest(config, "SOS.StackTests", "NestedExceptionTest", "StackTests.script"); + await RunTest(config, "NestedExceptionTest", "StackTests.script", testName: "SOS.StackTests"); } [SkippableTheory, MemberData(nameof(Configurations))] + public async Task OtherCommands(TestConfiguration config) + { + // This debuggee needs the directory of the exes/dlls to load the SymbolTestDll assembly. + await RunTest("OtherCommands.script", information: new SOSRunner.TestInformation { + TestConfiguration = config, + TestName = "SOS.OtherCommands", + DebuggeeName = "SymbolTestApp", + DebuggeeArguments = "%DEBUG_ROOT%", + }); + } + + [SkippableTheory, MemberData(nameof(GetConfigurations), "TestName", "SOS.StackAndOtherTests")] public async Task StackAndOtherTests(TestConfiguration config) { - if (config.RuntimeFrameworkVersionMajor == 1) - { - throw new SkipTestException("The debuggee (SymbolTestApp) doesn't work on .NET Core 1.1 because of a AssemblyLoadContext problem"); - } foreach (TestConfiguration currentConfig in TestRunner.EnumeratePdbTypeConfigs(config)) { // This debuggee needs the directory of the exes/dlls to load the SymbolTestDll assembly. - await RunTest(currentConfig, "SOS.StackAndOtherTests", "SymbolTestApp", "StackAndOtherTests.script", debuggeeArguments: "%DEBUG_ROOT%"); + await RunTest("StackAndOtherTests.script", information: new SOSRunner.TestInformation { + TestConfiguration = currentConfig, + TestName = "SOS.StackAndOtherTests", + DebuggeeName = "SymbolTestApp", + DebuggeeArguments = "%DEBUG_ROOT%", + }); + } + } + + [SkippableTheory, MemberData(nameof(GetConfigurations), "TestName", "SOS.WebApp")] + public async Task WebApp(TestConfiguration config) + { + await RunTest("WebApp.script", testLive: false, information: new SOSRunner.TestInformation { + TestConfiguration = config, + DebuggeeName = "WebApp", + UsePipeSync = true, + DumpGenerator = SOSRunner.DumpGenerator.DotNetDump + }); + } + + [SkippableTheory, MemberData(nameof(GetConfigurations), "TestName", "SOS.WebApp3")] + public async Task WebApp3(TestConfiguration config) + { + await RunTest("WebApp.script", testLive: false, information: new SOSRunner.TestInformation { + TestConfiguration = config, + DebuggeeName = "WebApp3", + UsePipeSync = true, + DumpGenerator = SOSRunner.DumpGenerator.DotNetDump + }); + } + + [SkippableTheory, MemberData(nameof(Configurations))] + public async Task LLDBPluginTests(TestConfiguration config) + { + if (OS.Kind == OSKind.Windows || config.IsDesktop || config.RuntimeFrameworkVersionMajor == 1 || SOSRunner.IsAlpine()) + { + throw new SkipTestException("lldb plugin tests not supported on Windows, Alpine Linux or .NET Core 1.1"); + } + string testName = "SOS." + nameof(LLDBPluginTests); + TestRunner.OutputHelper outputHelper = null; + try + { + // Setup the logging from the options in the config file + outputHelper = TestRunner.ConfigureLogging(config, Output, testName); + + outputHelper.WriteLine("Starting {0}", testName); + outputHelper.WriteLine("{"); + + string program = "/usr/bin/python"; + if (!File.Exists(program)) + { + throw new ArgumentException($"{program} does not exists"); + } + var arguments = new StringBuilder(); + string repoRootDir = TestConfiguration.MakeCanonicalPath(config.AllSettings["RepoRootDir"]); + + // Get test python script path + string scriptDir = Path.Combine(repoRootDir, "src", "SOS", "lldbplugin.tests"); + arguments.Append(Path.Combine(scriptDir, "test_libsosplugin.py")); + arguments.Append(" "); + + // Get lldb path + arguments.AppendFormat("--lldb {0} ", Environment.GetEnvironmentVariable("LLDB_PATH") ?? throw new ArgumentException("LLDB_PATH environment variable not set")); + + // Add dotnet host program and arguments + arguments.Append("--host \""); + arguments.Append(config.HostExe); + arguments.Append(" "); + if (!string.IsNullOrWhiteSpace(config.HostArgs)) + { + arguments.Append(config.HostArgs); + arguments.Append(" "); + } + arguments.Append("\" "); + + // Add lldb plugin path + arguments.AppendFormat("--plugin {0} ", config.SOSPath() ?? throw new ArgumentException("SOSPath config not set")); + + // Add log directory + string logFileDir = Path.Combine(config.LogDirPath, config.RuntimeFrameworkVersion); + Directory.CreateDirectory(logFileDir); + arguments.AppendFormat("--logfiledir {0} ", logFileDir); + + // Add test debuggee assembly + string testDebuggee = Path.Combine(repoRootDir, "artifacts", "bin", "TestDebuggee", config.TargetConfiguration, config.BuildProjectFramework, "TestDebuggee.dll"); + arguments.AppendFormat("--assembly {0}", testDebuggee); + + // Create the python script process runner + ProcessRunner processRunner = new ProcessRunner(program, arguments.ToString()). + WithLog(new TestRunner.TestLogger(outputHelper.IndentedOutput)). + WithTimeout(TimeSpan.FromMinutes(5)). + WithExpectedExitCode(0). + WithWorkingDirectory(scriptDir). + // Turn on stress logging so the dumplog and histinit commands pass + WithEnvironmentVariable("COMPlus_LogFacility", "0xffffffbf"). + WithEnvironmentVariable("COMPlus_LogLevel", "6"). + WithEnvironmentVariable("COMPlus_StressLog", "1"). + WithEnvironmentVariable("COMPlus_StressLogSize", "65536"); + + // Start the process runner + processRunner.Start(); + + // Wait for the debuggee to finish + await processRunner.WaitForExit(); + } + catch (Exception ex) + { + // Log the exception + outputHelper?.WriteLine(ex.ToString()); + throw; + } + finally + { + outputHelper?.WriteLine("}"); + outputHelper?.Dispose(); } } } diff --git a/src/SOS/SOS.UnitTests/SOSRunner.cs b/src/SOS/SOS.UnitTests/SOSRunner.cs index 24205b8fe..52fa87c27 100644 --- a/src/SOS/SOS.UnitTests/SOSRunner.cs +++ b/src/SOS/SOS.UnitTests/SOSRunner.cs @@ -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 _variables; - readonly ScriptLogger _scriptLogger; - readonly ProcessRunner _processRunner; - readonly bool _isDump; + /// + /// What to use to generate the dump + /// + public enum DumpGenerator + { + NativeDebugger, + CreateDump, + DotNetDump, + } - string _lastCommandOutput; - string _previousCommandCapture; + /// + /// Dump type + /// + public enum DumpType + { + Triage, + Heap, + Full + } - public enum Options + /// + /// What action should the debugger do + /// + public enum DebuggerAction { - None, + Live, GenerateDump, LoadDump, LoadDumpWithDotNetDump, } + /// + /// Which debugger to use + /// public enum NativeDebugger { Unknown, @@ -43,6 +61,39 @@ public class SOSRunner : IDisposable DotNetDump, } + /// + /// SOS test runner config information + /// + 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 variables, ScriptLogger scriptLogger, ProcessRunner processRunner, bool isDump) + readonly TestConfiguration _config; + readonly TestRunner.OutputHelper _outputHelper; + readonly Dictionary _variables; + readonly ScriptLogger _scriptLogger; + readonly ProcessRunner _processRunner; + readonly DumpType? _dumpType; + + string _lastCommandOutput; + string _previousCommandCapture; + + private SOSRunner(NativeDebugger debugger, TestConfiguration config, TestRunner.OutputHelper outputHelper, Dictionary 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; } /// /// Run a debuggee and create a dump. /// - /// test configuration - /// output instance - /// name of test - /// debuggee name - /// optional args to pass to debuggee - /// if true, use "createdump" to generate core dump - public static async Task CreateDump(TestConfiguration config, ITestOutputHelper output, string testName, string debuggeeName, - string debuggeeArguments = null, bool useCreateDump = true) + /// test info + 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 variables = GenerateVariables(information, debuggeeConfig, DebuggerAction.GenerateDump); - outputHelper.WriteLine("Starting {0}", testName); + outputHelper.WriteLine("Starting {0}", information.TestName); outputHelper.WriteLine("{"); // Get the full debuggee launch command line (includes the host if required) @@ -144,29 +228,102 @@ public class SOSRunner : IDisposable } arguments.Append(debuggeeConfig.BinaryExePath); } - if (!string.IsNullOrWhiteSpace(debuggeeArguments)) + if (!string.IsNullOrWhiteSpace(information.DebuggeeArguments)) + { + arguments.Append(" "); + arguments.Append(information.DebuggeeArguments); + } + + // Setup a pipe server for the debuggee to connect to sync when to take a dump + if (information.UsePipeSync) { + int runnerId = Process.GetCurrentProcess().Id; + pipeName = $"SOSRunner.{runnerId}.{information.DebuggeeName}"; + pipeServer = new NamedPipeServerStream(pipeName); arguments.Append(" "); - arguments.Append(debuggeeArguments); + arguments.Append(pipeName); } - // Run the debuggee with the createdump environment variables set to generate a coredump on unhandled exception - var testLogger = new TestRunner.TestLogger(outputHelper.IndentedOutput); - var variables = GenerateVariables(config, debuggeeConfig, Options.GenerateDump); + // Create the debuggee process runner ProcessRunner processRunner = new ProcessRunner(exePath, ReplaceVariables(variables, arguments.ToString())). - WithLog(testLogger). - WithTimeout(TimeSpan.FromMinutes(5)). - WithEnvironmentVariable("COMPlus_DbgEnableMiniDump", "1"). - WithEnvironmentVariable("COMPlus_DbgMiniDumpName", ReplaceVariables(variables,"%DUMP_NAME%")); + WithLog(new TestRunner.TestLogger(outputHelper.IndentedOutput)). + WithTimeout(TimeSpan.FromMinutes(5)); - // Exit codes on Windows should always be 0, but not on Linux/OSX for the faulting test apps. - if (OS.Kind == OSKind.Windows) + if (dumpGeneration == DumpGenerator.CreateDump) { - processRunner.WithExpectedExitCode(0); + if (OS.Kind != OSKind.Linux) + { + throw new SkipTestException("Createdump doesn't exists on Windows or macOS"); + } + // Run the debuggee with the createdump environment variables set to generate a coredump on unhandled exception + processRunner. + WithEnvironmentVariable("COMPlus_DbgEnableMiniDump", "1"). + WithEnvironmentVariable("COMPlus_DbgMiniDumpName", ReplaceVariables(variables, "%DUMP_NAME%")); + + switch (information.DumpType) + { + case DumpType.Heap: + processRunner.WithEnvironmentVariable("COMPlus_DbgMiniDumpType", "2"); + break; + case DumpType.Triage: + processRunner.WithEnvironmentVariable("COMPlus_DbgMiniDumpType", "3"); + break; + case DumpType.Full: + processRunner.WithEnvironmentVariable("COMPlus_DbgMiniDumpType", "4"); + break; + } } + // Start the debuggee processRunner.Start(); + if (dumpGeneration == DumpGenerator.DotNetDump) + { + ITestOutputHelper dotnetDumpOutputHelper = new IndentedTestOutputHelper(outputHelper, " "); + try + { + if (string.IsNullOrWhiteSpace(config.HostExe) || string.IsNullOrWhiteSpace(config.DotNetDumpPath())) + { + throw new SkipTestException("dotnet-dump collect needs HostExe and DotNetDumpPath config variables"); + } + + // Wait until the debuggee gets started. It needs time to spin up before generating the core dump. + if (pipeServer != null) + { + dotnetDumpOutputHelper.WriteLine("Waiting for connection on pipe {0}", pipeName); + var source = new CancellationTokenSource(TimeSpan.FromMinutes(5)); + await pipeServer.WaitForConnectionAsync(source.Token); + } + + // Start dotnet-dump collect + var dotnetDumpArguments = new StringBuilder(); + dotnetDumpArguments.Append(config.DotNetDumpPath()); + dotnetDumpArguments.AppendFormat(" collect --process-id {0} --output %DUMP_NAME%", processRunner.ProcessId); + + ProcessRunner dotnetDumpRunner = new ProcessRunner(config.HostExe, ReplaceVariables(variables, dotnetDumpArguments.ToString())). + WithLog(new TestRunner.TestLogger(dotnetDumpOutputHelper)). + WithTimeout(TimeSpan.FromMinutes(5)). + WithExpectedExitCode(0); + + dotnetDumpRunner.Start(); + + // Wait until dotnet-dump collect finishes generating the dump + await dotnetDumpRunner.WaitForExit(); + } + catch (Exception ex) + { + // Log the exception + dotnetDumpOutputHelper.WriteLine(ex.ToString()); + } + finally + { + dotnetDumpOutputHelper.WriteLine("}"); + + // Shutdown the debuggee + processRunner.Kill(); + } + } + // Wait for the debuggee to finish await processRunner.WaitForExit(); } @@ -180,6 +337,7 @@ public class SOSRunner : IDisposable { outputHelper?.WriteLine("}"); outputHelper?.Dispose(); + pipeServer?.Dispose(); } } } @@ -187,40 +345,40 @@ public class SOSRunner : IDisposable /// /// Start a debuggee under a native debugger returning a sos runner instance. /// - /// test configuration - /// output instance - /// name of test - /// debuggee name - /// optional args to pass to debuggee - /// dump options + /// test info + /// debugger action /// sos runner instance - public static async Task StartDebugger(TestConfiguration config, ITestOutputHelper output, string testName, string debuggeeName, - string debuggeeArguments = null, Options options = Options.None) + public static async Task 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 \n"""); + arguments.AppendFormat(" --args {0}", debuggeeCommandLine); // .NET Core 1.1 or less don't catch stack overflow and abort so need to catch SIGSEGV if (config.StackOverflowSIGSEGV) @@ -365,14 +528,16 @@ public class SOSRunner : IDisposable break; case NativeDebugger.DotNetDump: - if (options != Options.LoadDumpWithDotNetDump) + if (action != DebuggerAction.LoadDumpWithDotNetDump) { - throw new ArgumentException($"{options} not supported for dotnet-dump testing"); + throw new ArgumentException($"{action} not supported for dotnet-dump testing"); } if (string.IsNullOrWhiteSpace(config.HostExe)) { throw new ArgumentException("No HostExe in configuration"); } + initialCommands.Add("setsymbolserver -directory %DEBUG_ROOT%"); + arguments.Append(debuggerPath); arguments.Append(@" analyze %DUMP_NAME%"); debuggerPath = config.HostExe; @@ -384,14 +549,20 @@ public class SOSRunner : IDisposable WithLog(scriptLogger). WithTimeout(TimeSpan.FromMinutes(10)); - // Exit codes on Windows should always be 0, but not on Linux/OSX for the faulting test apps. + // Exit codes on Windows should always be 0, but not on Linux/OSX for the faulting debuggees. if (OS.Kind == OSKind.Windows) { processRunner.WithExpectedExitCode(0); } + DumpType? dumpType = null; + if (action == DebuggerAction.LoadDump || action == DebuggerAction.LoadDumpWithDotNetDump) + { + dumpType = information.DumpType; + } + // Create the sos runner instance - sosRunner = new SOSRunner(debugger, config, outputHelper, variables, scriptLogger, processRunner, options == Options.LoadDump || options == Options.LoadDumpWithDotNetDump); + sosRunner = new SOSRunner(debugger, config, outputHelper, variables, scriptLogger, processRunner, dumpType); // Start the native debugger processRunner.Start(); @@ -500,7 +671,12 @@ public class SOSRunner : IDisposable else if (line.StartsWith("VERIFY:")) { string verifyLine = line.Substring("VERIFY:".Length); - VerifyOutput(verifyLine); + VerifyOutput(verifyLine, match: true); + } + else if (line.StartsWith("!VERIFY:")) + { + string verifyLine = line.Substring("!VERIFY:".Length); + VerifyOutput(verifyLine, match: false); } else { @@ -542,6 +718,7 @@ public class SOSRunner : IDisposable switch (Debugger) { case NativeDebugger.Cdb: + commands.Add($".unload sos.dll"); commands.Add($".load {sosPath}"); commands.Add(".lines"); commands.Add(".reload"); @@ -549,6 +726,16 @@ public class SOSRunner : IDisposable { commands.Add($"!SetHostRuntime {sosHostRuntime}"); } + // Because Windows triage dumps don't have the target coreclr.dll module path the + // fallback of using this target runtime for hosting SOS's managed doesn't work. + if (_dumpType.HasValue && _dumpType.Value == DumpType.Triage) + { + string hostRuntimeDir = _config.HostRuntimeDir(); + if (hostRuntimeDir != null) + { + commands.Add($"!SetHostRuntime {hostRuntimeDir}"); + } + } break; case NativeDebugger.Lldb: commands.Add($"plugin load {sosPath}"); @@ -571,7 +758,8 @@ public class SOSRunner : IDisposable // Helper function to switch to the thread with an exception void SwitchToExceptionThread() { - if (_isDump) + // If dump session + if (_dumpType.HasValue) { // lldb/dotnet-dump don't load dump with the initial thread set to one // with the exception. This SOS command looks for a thread with a managed @@ -583,30 +771,34 @@ public class SOSRunner : IDisposable public async Task ContinueExecution() { - string command = null; - bool addPrefix = true; - switch (Debugger) - { - case NativeDebugger.Cdb: - command = "g"; - // Don't add the !runcommand prefix because it gets printed when cdb stops - // again because the helper extension used .pcmd to set a stop command. - addPrefix = false; - break; - case NativeDebugger.Lldb: - command = "process continue"; - break; - case NativeDebugger.Gdb: - command = "continue"; - break; - case NativeDebugger.DotNetDump: - break; - } - if (command != null) + // If live session + if (!_dumpType.HasValue) { - if (!await RunCommand(command, addPrefix)) + string command = null; + bool addPrefix = true; + switch (Debugger) { - throw new Exception($"'{command}' FAILED"); + case NativeDebugger.Cdb: + command = "g"; + // Don't add the !runcommand prefix because it gets printed when cdb stops + // again because the helper extension used .pcmd to set a stop command. + addPrefix = false; + break; + case NativeDebugger.Lldb: + command = "process continue"; + break; + case NativeDebugger.Gdb: + command = "continue"; + break; + case NativeDebugger.DotNetDump: + break; + } + if (command != null) + { + if (!await RunCommand(command, addPrefix)) + { + throw new Exception($"'{command}' FAILED"); + } } } } @@ -683,7 +875,7 @@ public class SOSRunner : IDisposable await _processRunner.WaitForExit(); } - public void VerifyOutput(string verifyLine) + public void VerifyOutput(string verifyLine, bool match) { string regex = ReplaceVariables(verifyLine.TrimStart()); @@ -691,18 +883,19 @@ public class SOSRunner : IDisposable { throw new Exception("VerifyOutput: no last command output or debugger exited unexpectedly: " + regex); } - if (!new Regex(regex, RegexOptions.Multiline).IsMatch(_lastCommandOutput)) + + if (new Regex(regex, RegexOptions.Multiline).IsMatch(_lastCommandOutput) != match) { throw new Exception("Debugger output did not match the expression: " + regex); } } - public static string GenerateDumpFileName(TestConfiguration config, string debuggeeName, Options options) + public static string GenerateDumpFileName(TestInformation information, string debuggeeName, DebuggerAction action) { - string dumpRoot = options == Options.GenerateDump ? config.DebuggeeDumpOutputRootDir() : config.DebuggeeDumpInputRootDir(); - if (dumpRoot != null) - { - return Path.Combine(dumpRoot, Path.GetFileNameWithoutExtension(debuggeeName) + ".dmp"); + TestConfiguration config = information.TestConfiguration; + string dumpRoot = action == DebuggerAction.GenerateDump ? config.DebuggeeDumpOutputRootDir() : config.DebuggeeDumpInputRootDir(); + if (!string.IsNullOrEmpty(dumpRoot)) { + return Path.Combine(dumpRoot, Path.GetFileNameWithoutExtension(debuggeeName) + "." + information.DumpType.ToString() + ".dmp"); } return null; } @@ -723,8 +916,6 @@ public class SOSRunner : IDisposable { _processRunner.Kill(); } - _processRunner.WaitForExit().GetAwaiter().GetResult(); - _outputHelper.WriteLine("}"); _outputHelper.Dispose(); } @@ -745,13 +936,13 @@ public class SOSRunner : IDisposable return false; } - private static NativeDebugger GetNativeDebuggerToUse(TestConfiguration config, Options options) + private static NativeDebugger GetNativeDebuggerToUse(TestConfiguration config, DebuggerAction action) { switch (OS.Kind) { case OSKind.Windows: - switch (options) { - case Options.LoadDumpWithDotNetDump: + switch (action) { + case DebuggerAction.LoadDumpWithDotNetDump: return NativeDebugger.DotNetDump; default: return NativeDebugger.Cdb; @@ -759,17 +950,17 @@ public class SOSRunner : IDisposable case OSKind.Linux: case OSKind.OSX: - switch (options) { - case Options.GenerateDump: + switch (action) { + case DebuggerAction.GenerateDump: return config.GenerateDumpWithLLDB() ? NativeDebugger.Lldb : NativeDebugger.Gdb; - case Options.LoadDumpWithDotNetDump: + case DebuggerAction.LoadDumpWithDotNetDump: return NativeDebugger.DotNetDump; default: return NativeDebugger.Lldb; } default: - throw new Exception(OS.Kind.ToString() + " not supported"); + throw new PlatformNotSupportedException(OS.Kind.ToString() + " not supported"); } } @@ -852,7 +1043,7 @@ public class SOSRunner : IDisposable string command = ReplaceVariables(input); if (addPrefix) { - command = _scriptLogger.ProcessCommand(command); + command = ProcessCommand(command); } _processRunner.StandardInputWriteLine(command); @@ -862,6 +1053,21 @@ public class SOSRunner : IDisposable return result.CommandSucceeded; } + private string ProcessCommand(string command) + { + switch (Debugger) + { + case NativeDebugger.Cdb: + command = string.Format("!runcommand {0}", command); + break; + + case NativeDebugger.Lldb: + command = string.Format("runcommand {0}", command); + break; + } + return command; + } + private void LogProcessingReproInfo(string scriptFile, HashSet 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 GenerateVariables(TestConfiguration config, DebuggeeConfiguration debuggeeConfig, Options options) + private static Dictionary GenerateVariables(TestInformation information, DebuggeeConfiguration debuggeeConfig, DebuggerAction action) { var vars = new Dictionary(); 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("", debuggeeExe.Replace(@"\", @"\\")); @@ -986,19 +1204,19 @@ public class SOSRunner : IDisposable } } - readonly NativeDebugger _debugger; readonly List> _taskQueue; + readonly StringBuilder _lineBuffer; readonly StringBuilder _lastCommandOutput; TaskCompletionSource _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>(); 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(""); - commandEnd = commandError || lastCommandOutput.EndsWith(""); - 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 = ""; + static readonly string s_endCommandError = ""; + 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"; diff --git a/src/SOS/SOS.UnitTests/Scripts/DivZero.script b/src/SOS/SOS.UnitTests/Scripts/DivZero.script index 20bdcb40e..ac5a6fb71 100644 --- a/src/SOS/SOS.UnitTests/Scripts/DivZero.script +++ b/src/SOS/SOS.UnitTests/Scripts/DivZero.script @@ -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+\s+\s+[Dd]iv[Zz]ero.*!C\.F3(\(.*\))?\+0x\s+ VERIFY:\s+\s+\s+[Dd]iv[Zz]ero.*!C\.F2(\(.*\))?\+0x\s+ VERIFY:\s+\s+\s+[Dd]iv[Zz]ero.*!C\.Main(\(.*\))?\+0x\s+ VERIFY:(StackTraceString: \s+)?\s+ -VERIFY:HResult:\s+80020012\s+ \ No newline at end of file +VERIFY:HResult:\s+80020012\s+ + +# Verify that Threads (clrthreads) works +IFDEF:DOTNETDUMP +SOSCOMMAND:clrthreads +ENDIF:DOTNETDUMP +!IFDEF:DOTNETDUMP +SOSCOMMAND:Threads +ENDIF:DOTNETDUMP +VERIFY:\s*ThreadCount:\s+\s+ +VERIFY:\s+UnstartedThread:\s+\s+ +VERIFY:\s+BackgroundThread:\s+\s+ +VERIFY:\s+PendingThread:\s+\s+ +VERIFY:\s+DeadThread:\s+\s+ +VERIFY:\s+Hosted Runtime:\s+no\s+ +VERIFY:\s+ID\s+OSID\s+ThreadOBJ\s+State.*\s+ +VERIFY:\s+\s+\s+\s+.*\s+ + +# Verify that ClrStack with no options works +SOSCOMMAND:ClrStack +VERIFY:.*OS Thread Id:\s+0x\s+.* +VERIFY:\s+Child\s+SP\s+IP\s+Call Site\s+ +VERIFY:\s+\s+\s+(\*\*\* WARNING: Unable to verify checksum for DivZero.exe\s*)?C\.DivideByZero(\(.*\))?\s+\[(?i:.*[\\|/]DivZero\.cs) @ 12\s*\]\s+ +VERIFY:\s+\s+\s+C\.F3(\(.*\))?\s+\[(?i:.*[\\|/]DivZero\.cs) @ 21\s*\]\s+ +VERIFY:\s+\s+\s+C\.F2(\(.*\))?\s+\[(?i:.*[\\|/]DivZero\.cs) @ 33\s*\]\s+ +VERIFY:\s+\s+\s+C\.Main(\(.*\))?\s+\[(?i:.*[\\|/]DivZero\.cs) @ 54\s*\]\s+ \ No newline at end of file diff --git a/src/SOS/SOS.UnitTests/Scripts/NestedExceptionTest.script b/src/SOS/SOS.UnitTests/Scripts/NestedExceptionTest.script index 82d4dee68..d8e97d448 100644 --- a/src/SOS/SOS.UnitTests/Scripts/NestedExceptionTest.script +++ b/src/SOS/SOS.UnitTests/Scripts/NestedExceptionTest.script @@ -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 t VERIFY:StackTrace \(generated\): VERIFY:\s+SP\s+IP\s+Function\s+ VERIFY:\s+\s+\s+[Nn]ested[Ee]xception[Tt]est.*!NestedExceptionTest\.Program\.Main(\(.*\))?\+0x\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: \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+\s+ +VERIFY:\s+UnstartedThread:\s+\s+ +VERIFY:\s+BackgroundThread:\s+\s+ +VERIFY:\s+PendingThread:\s+\s+ +VERIFY:\s+DeadThread:\s+\s+ +VERIFY:\s+Hosted Runtime:\s+no\s+ +VERIFY:\s+ID\s+OSID\s+ThreadOBJ\s+State.*\s+ +VERIFY:\s+\s+\s+\s+.*\s+ + +# Verify that ClrStack with no options works +SOSCOMMAND:ClrStack +VERIFY:.*OS Thread Id:\s+0x\s+.* +VERIFY:\s+Child\s+SP\s+IP\s+Call Site\s+ +VERIFY:\s+\s+\s+NestedExceptionTest\.Program\.Main(\(.*\))?\s* +# Desktop sos has a bug that prevents the line number/source file info from being printed. +IFDEF:PROJECTK +VERIFY:\[.*[\\|/]Debuggees[\\|/](dotnet.+[\\|/])?[Nn]ested[Ee]xception[Tt]est[\\|/][Nn]ested[Ee]xception[Tt]est\.cs @ 8\s*\]\s* +ENDIF:PROJECTK \ No newline at end of file diff --git a/src/SOS/SOS.UnitTests/Scripts/OtherCommands.script b/src/SOS/SOS.UnitTests/Scripts/OtherCommands.script new file mode 100644 index 000000000..85e37b577 --- /dev/null +++ b/src/SOS/SOS.UnitTests/Scripts/OtherCommands.script @@ -0,0 +1,86 @@ +# +# Tests the various SOS commands with the SymbolTestApp debuggee +# + +CONTINUE + +LOADSOS + +IFDEF:DOTNETDUMP +COMMAND:clrmodules +VERIFY:\s*.* +COMMAND:modules +VERIFY:\s*\s+.* +COMMAND:threads +VERIFY:\s*\s+0x\s+\(\)\s+ +COMMAND:registers +VERIFY:\s*([r|e]ip|pc) = \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+\s+\s+.* +VERIFY:\s*Statistics:\s+ +VERIFY:\s+MT\s+Count\s+TotalSize\s+Class Name\s+ +VERIFY:\s*\s+\s+\s+.* +VERIFY:\s*Total\s+\s+objects\s+ +ENDIF:ALPINE + +SOSCOMMAND:DumpDomain +VERIFY:\s*System Domain:\s+\s+ +VERIFY:\s*LowFrequencyHeap:\s+\s+ +VERIFY:\s*HighFrequencyHeap:\s+\s+ +VERIFY:\s*Domain 1:\s+\s+ +VERIFY:\s*Assembly:\s+\s+\[.*(System\.Private\.CoreLib(\.ni)?\.dll|mscorlib.dll)\]\s+ + +SOSCOMMAND:DumpAssembly \s*Assembly:\s+()\s+\[.* +VERIFY:\s*Parent Domain:\s+\s+ +VERIFY:\s*Name:\s+.*(System\.Private\.CoreLib(\.ni)?\.dll|mscorlib.dll)\s+ + +SOSCOMMAND:DumpModule \s+Module Name\s+()\s+.* +!IFDEF:DESKTOP +VERIFY:\s*PEFile:\s+\s+ +VERIFY:\s*ModuleId:\s+\s+ +ENDIF:DESKTOP +VERIFY:\s*LoaderHeap:\s+\s+ +VERIFY:\s*TypeDefToMethodTableMap:\s+\s+ + +# Verify that IP2MD, DumpMD, DumpClass and DumpMT (uses IP from ClrStack) +SOSCOMMAND:ClrStack +SOSCOMMAND:IP2MD .*\s+()\s+SymbolTestApp\.Program\.Foo1.*\s+ +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 \s+MethodDesc:\s+()\s+ +VERIFY:.*\s+Method Name:\s+SymbolTestApp\.Program\.Foo1\(Int32, System\.String\)\s+ + +# Verify DumpClass +SOSCOMMAND:DumpClass \s*Class:\s+()\s+ +VERIFY:\s*Class Name:\s+SymbolTestApp.Program\s+ +VERIFY:\s*File:\s+.*SymbolTestApp\.(dll|exe)\s+ + +# Verify DumpMT +SOSCOMMAND:DumpMT \s*Method Table:\s+()\s+ +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+\s+ +VERIFY:(\s*Free-Threaded Interfaces to be released:\s+\s+)? +VERIFY:\s*Statistics for all finalizable objects.*:\s+ +VERIFY:\s+MT\s+Count\s+TotalSize\s+Class Name\s+ +VERIFY:(\s*\s+\s+\s+.*)? +VERIFY:\s*Total\s+\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+ +IFDEF:WINDOWS +VERIFY:\s*CCW\s+ +VERIFY:\s*RCW\s+ +ENDIF:WINDOWS +ENDIF:LINUX \ No newline at end of file diff --git a/src/SOS/SOS.UnitTests/Scripts/Overflow.script b/src/SOS/SOS.UnitTests/Scripts/Overflow.script index 9af1aa070..ab83e3156 100644 --- a/src/SOS/SOS.UnitTests/Scripts/Overflow.script +++ b/src/SOS/SOS.UnitTests/Scripts/Overflow.script @@ -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 diff --git a/src/SOS/SOS.UnitTests/Scripts/Reflection.script b/src/SOS/SOS.UnitTests/Scripts/Reflection.script index 222ab37e1..b5ff39b97 100644 --- a/src/SOS/SOS.UnitTests/Scripts/Reflection.script +++ b/src/SOS/SOS.UnitTests/Scripts/Reflection.script @@ -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+(|Exception has been thrown by the target of a VERIFY:InnerException:\s+System\.Exception, Use !PrintException to see more\.\s+ VERIFY:StackTrace \(generated\):\s+ VERIFY:\s+\s+\s+[Rr]eflection[Tt]est.*!(\$0_)?RefLoader\.Loader\.Main(\(\))?\+0x\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: \s+)? -VERIFY:HResult:\s+80131604 \ No newline at end of file +VERIFY:HResult:\s+80131604 + +# Verify that Threads (clrthreads) works +IFDEF:DOTNETDUMP +SOSCOMMAND:clrthreads +ENDIF:DOTNETDUMP +!IFDEF:DOTNETDUMP +SOSCOMMAND:Threads +ENDIF:DOTNETDUMP +VERIFY:\s*ThreadCount:\s+\s+ +VERIFY:\s+UnstartedThread:\s+\s+ +VERIFY:\s+BackgroundThread:\s+\s+ +VERIFY:\s+PendingThread:\s+\s+ +VERIFY:\s+DeadThread:\s+\s+ +VERIFY:\s+Hosted Runtime:\s+no\s+ +VERIFY:\s+ID\s+OSID\s+ThreadOBJ\s+State.*\s+ +VERIFY:\s+\s+\s+\s+.*\s+ + +# Verify that ClrStack with no options works +SOSCOMMAND:ClrStack +VERIFY:.*OS Thread Id:\s+0x\s+.* +VERIFY:\s+Child\s+SP\s+IP\s+Call Site\s+ +VERIFY:\s+\s+\s+(\*\*\* WARNING: Unable to verify checksum for ReflectionTest.exe\s*)?RefLoader\.Loader\.Main(\(\))?\s* +# Desktop sos has a bug that prevents the line number/source file info from being printed. +IFDEF:PROJECTK +VERIFY:[.*[\\|/]Debuggees[\\|/](dotnet.+[\\|/])?[Rr]eflection[Tt]est[\\|/][Rr]eflection[Tt]est\.cs @ 32\s*\] +ENDIF:PROJECTK \ No newline at end of file diff --git a/src/SOS/SOS.UnitTests/Scripts/SimpleThrow.script b/src/SOS/SOS.UnitTests/Scripts/SimpleThrow.script index 6e310a9b6..8f350f5ea 100644 --- a/src/SOS/SOS.UnitTests/Scripts/SimpleThrow.script +++ b/src/SOS/SOS.UnitTests/Scripts/SimpleThrow.script @@ -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: -# Exception type: System.InvalidOperationException -# Message: -# InnerException: -# StackTrace (generated): -# SP IP Function -# SimpleThrow!UserObject.UseObject(System.String)+0xc8 -# SimpleThrow!Simple.Main()+0x9f -# StackTraceString: -# HResult: 80131509 -# [EXPECTED OUTPUT (PROJECTN)] -# Exception type: System.InvalidOperationException -# Message: -# InnerException: -# StackTrace (generated): -# IP Function -# SimpleThrow_!$0_UserObject.UseObject+0x8a -# SimpleThrow_!$0_Simple.Main+0x66 -# SimpleThrow_!$0_Simple.{ILT$Main}+0xd -# SimpleThrow_!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+\s+\s+[Ss]imple[Tt]hrow.*!(\$0_)?UserObject\.UseObject.*\+0x\s+ VERIFY:\s+\s+\s+[Ss]imple[Tt]hrow.*!(\$0_)?Simple\.Main.*\+0x\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+\s+ +VERIFY:\s+UnstartedThread:\s+\s+ +VERIFY:\s+BackgroundThread:\s+\s+ +VERIFY:\s+PendingThread:\s+\s+ +VERIFY:\s+DeadThread:\s+\s+ +VERIFY:\s+Hosted Runtime:\s+no\s+ +VERIFY:\s+ID\s+OSID\s+ThreadOBJ\s+State.*\s+ +VERIFY:\s+\s+\s+\s+.*\s+ + +# Verify that ClrStack with no options works +SOSCOMMAND:ClrStack +VERIFY:.*OS Thread Id:\s+0x\s+.* +VERIFY:\s+Child\s+SP\s+IP\s+Call Site\s+ +VERIFY:\s+\s+\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+\s+\s+Simple\.Main\(\)\s+ +IFDEF:PROJECTK +VERIFY:[.*[\\|/]Debuggees[\\|/](dotnet.+[\\|/])?SimpleThrow[\\|/]SimpleThrow\.cs @ 9\s*\] +ENDIF:PROJECTK \ No newline at end of file diff --git a/src/SOS/SOS.UnitTests/Scripts/StackAndOtherTests.script b/src/SOS/SOS.UnitTests/Scripts/StackAndOtherTests.script index 6f8e24aa7..5a8931e5b 100644 --- a/src/SOS/SOS.UnitTests/Scripts/StackAndOtherTests.script +++ b/src/SOS/SOS.UnitTests/Scripts/StackAndOtherTests.script @@ -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\s+.* VERIFY:\s+Child\s+SP\s+IP\s+Call Site\s+ -VERIFY:.*\s+\s+.*\s+SymbolTestApp\.Program\.Foo4\(System\.String\)\s+\[(?i:.*[\\|/]SymbolTestApp\.cs) @ 54\]\s* +VERIFY:.*\s+\s+.*\s+SymbolTestApp\.Program\.Foo4\(System\.String\)\s+\[(?i:.*[\\|/]SymbolTestApp\.cs) @ (50|54)\]\s* VERIFY:\s+\s+\s+SymbolTestApp\.Program\.Foo2\(.*\)\s+\[(?i:.*[\\|/]SymbolTestApp\.cs) @ 29\]\s* VERIFY:\s+\s+\s+SymbolTestApp\.Program\.Foo1\(.*\)\s+\[(?i:.*[\\|/]SymbolTestApp\.cs) @ 24\]\s* VERIFY:\s+\s+\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\s+.* VERIFY:\s+Child\s+SP\s+IP\s+Call Site\s+ -VERIFY:\s+\s+\s+SymbolTestApp\.(dll|exe)!SymbolTestApp\.Program\.Foo4\(System\.String\)\s+\+\s+\s+\[(?i:.*[\\|/]SymbolTestApp\.cs) @ 54\]\s* +VERIFY:\s+\s+\s+SymbolTestApp\.(dll|exe)!SymbolTestApp\.Program\.Foo4\(System\.String\)\s+\+\s+\s+\[(?i:.*[\\|/]SymbolTestApp\.cs) @ (50|54)\]\s* VERIFY:\s+\s+\s+SymbolTestApp\.(dll|exe)!SymbolTestApp\.Program\.Foo2\(.*\)\s+\+\s+\s+\[(?i:.*[\\|/]SymbolTestApp\.cs) @ 29\]\s* VERIFY:\s+\s+\s+SymbolTestApp\.(dll|exe)!SymbolTestApp\.Program\.Foo1\(.*\)\s+\+\s+\s+\[(?i:.*[\\|/]SymbolTestApp\.cs) @ 24\]\s* VERIFY:\s+\s+\s+SymbolTestApp\.(dll|exe)!SymbolTestApp\.Program\.Main\(.*\)\s+\+\s+\s+\[(?i:.*[\\|/]SymbolTestApp\.cs) @ 19\]\s* @@ -43,7 +42,7 @@ IFDEF:PROJECTK SOSCOMMAND:ClrStack -a VERIFY:.*OS Thread Id:\s+0x\s+.* VERIFY:\s+Child\s+SP\s+IP\s+Call Site\s+ -VERIFY:.*\s+\s+\s+SymbolTestApp\.Program\.Foo4\(System\.String\)\s+\[(?i:.*[\\|/]SymbolTestApp\.cs) @ 54\]\s* +VERIFY:.*\s+\s+\s+SymbolTestApp\.Program\.Foo4\(System\.String\)\s+\[(?i:.*[\\|/]SymbolTestApp\.cs) @ (50|54)\]\s* VERIFY:\s+PARAMETERS:\s+ VERIFY:\s+dllPath \(0x\) = 0x\s+ VERIFY:.*\s+LOCALS:\s+ @@ -59,7 +58,7 @@ SOSCOMMAND:ClrStack -r VERIFY:.*OS Thread Id:\s+0x\s+.* VERIFY:\s+Child\s+SP\s+IP\s+Call Site\s+ -VERIFY:.*\s+\s+\s+SymbolTestApp\.Program\.Foo4\(System\.String\)\s+\[(?i:.*[\\|/]SymbolTestApp\.cs) @ 54\]\s* +VERIFY:.*\s+\s+\s+SymbolTestApp\.Program\.Foo4\(System\.String\)\s+\[(?i:.*[\\|/]SymbolTestApp\.cs) @ (50|54)\]\s* IFDEF:ARM VERIFY:\s+r0=\s+r1=\s+r2=\s+ ENDIF:ARM @@ -106,6 +105,7 @@ VERIFY:.*\s+\s+\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+\s+\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 +ENDIF:MAJOR_RUNTIME_VERSION_1 VERIFY:.*\s+\s+\s+\[DEFAULT\] I4 SymbolTestApp\.Program\.Foo2\(.*\)\s+\(.*\)\s+ VERIFY:.*\s+\s+\s+\[DEFAULT\] I4 SymbolTestApp\.Program\.Foo1\(.*\)\s+\(.*\)\s+ VERIFY:.*\s+\s+\s+\[DEFAULT\] Void SymbolTestApp\.Program\.Main\(.*\)\s+\(.*\)\s+ @@ -174,11 +176,17 @@ ENDIF:DOTNETDUMP SOSCOMMAND:ClrStack SOSCOMMAND:IP2MD .*\s+()\s+SymbolTestApp\.Program\.Foo4.*\s+ 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 \s*MethodDesc:\s+()\s* -VERIFY:.*IL_: call class \[System.Runtime\]System\.Reflection\.Assembly System\.Reflection\.Assembly::Load\(uint8\[\],uint8\[\]\) +!IFDEF:DESKTOP +VERIFY:.*IL_: 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_: 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 \s*MethodDesc:\s+()\s* VERIFY:\s*Normal JIT generated code\s+ VERIFY:\s+SymbolTestApp\.Program\.Foo4\(System\.String\)\s+ VERIFY:\s+Begin\s+,\s+size\s+\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 @@ -203,7 +211,7 @@ SOSCOMMAND:u -o VERIFY:\s*Normal JIT generated code\s+ VERIFY:\s+SymbolTestApp\.Program\.Foo4\(System\.String\)\s+ VERIFY:\s+Begin\s+,\s+size\s+\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+\s+ VERIFY:\s+DeadThread:\s+\s+ VERIFY:\s+Hosted Runtime:\s+no\s+ VERIFY:\s+ID\s+OSID\s+ThreadOBJ\s+State.*\s+ -VERIFY:\s+\s+\s+\s+.*\s+ +VERIFY:\s+\s+\s+\s+.*\s+ \ No newline at end of file diff --git a/src/SOS/SOS.UnitTests/Scripts/StackTests.script b/src/SOS/SOS.UnitTests/Scripts/StackTests.script index ca21ffc2e..4420604e3 100644 --- a/src/SOS/SOS.UnitTests/Scripts/StackTests.script +++ b/src/SOS/SOS.UnitTests/Scripts/StackTests.script @@ -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+\s+\s+\[NativeStackFrame\]\s+ VERIFY:.*\s+\s+\s+\[DEFAULT\] Void NestedExceptionTest\.Program\.Main\(.*\)\s+\(.*\)\s+ VERIFY:.*\s+\s+\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\s+ VERIFY:.*\s+\s+\s+\[DEFAULT\] Void NestedExceptionTest\.Program\.Main\(.*\)\s+\(.*\)\s+ VERIFY:.*\s+Stack walk complete.\s+ ENDIF:PROJECTK + ENDIF:ALPINE # 7) Verify DumpStackObjects works diff --git a/src/SOS/SOS.UnitTests/Scripts/TaskNestedException.script b/src/SOS/SOS.UnitTests/Scripts/TaskNestedException.script index 94b9fc8b9..d17dbc47d 100644 --- a/src/SOS/SOS.UnitTests/Scripts/TaskNestedException.script +++ b/src/SOS/SOS.UnitTests/Scripts/TaskNestedException.script @@ -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+\s+ @@ -44,10 +42,14 @@ VERIFY:StackTrace \(generated\):\s+ VERIFY:\s+SP\s+IP\s+Function\s+ VERIFY:\s+\s+.+RandomTest(::|\.)RandomUserTask\.InnerException(\(\))?\+0x\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+\s+.+RandomTest(::|\.)RandomUserTask\.<\.ctor>.+\+0x\s* -IFDEF:PROJECTK +!IFDEF:DESKTOP +!IFDEF:TRIAGE_DUMP VERIFY:[.+[\\|/]Debuggees[\\|/](dotnet.+[\\|/])?[Tt]ask[Nn]ested[Ee]xception[\\|/][Rr]andom[Uu]ser[Ll]ibrary[\\|/][Rr]andom[Uu]ser[Tt]ask\.cs @ 19\] -ENDIF:PROJECTK \ No newline at end of file +ENDIF:TRIAGE_DUMP +ENDIF:DESKTOP \ No newline at end of file diff --git a/src/SOS/SOS.UnitTests/Scripts/WebApp.script b/src/SOS/SOS.UnitTests/Scripts/WebApp.script new file mode 100644 index 000000000..44dbb3d8a --- /dev/null +++ b/src/SOS/SOS.UnitTests/Scripts/WebApp.script @@ -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*.* +COMMAND:modules +VERIFY:\s*\s+.* +COMMAND:threads +VERIFY:\s*\s+0x\s+\(\)\s+ +COMMAND:registers +VERIFY:\s*([r|e]ip|pc) = \s+ +ENDIF:DOTNETDUMP + +# Verify that ClrStack with no options works +SOSCOMMAND:ClrStack +VERIFY:.*OS Thread Id:\s+0x\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\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\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\s+.* +VERIFY:\s+Child\s+SP\s+IP\s+Call Site\s+ +VERIFY:.*\s + +IFDEF:ARM +VERIFY:\s+r0=\s+r1=\s+r2=\s+ +ENDIF:ARM +IFDEF:ARM64 +VERIFY:\s+x0=\s+x1=\s+x2=\s+ +ENDIF:ARM64 +VERIFY:\s+([r|e]sp|sp)=\s+([r|e]bp|lr)=\s+([r|e]ip|pc)=\s+ +IFDEF:X64 +VERIFY:\s+rax=\s+rbx=\s+rcx=\s+ +ENDIF:X64 +IFDEF:X86 +VERIFY:\s+eax=\s+ebx=\s+ecx=\s+ +ENDIF:X86 + +VERIFY:.*\s + +IFDEF:ARM +VERIFY:\s+r0=\s+r1=\s+r2=\s+ +ENDIF:ARM +IFDEF:ARM64 +VERIFY:\s+x0=\s+x1=\s+x2=\s+ +ENDIF:ARM64 +VERIFY:\s+([r|e]sp|sp)=\s+([r|e]bp|lr)=\s+([r|e]ip|pc)=\s+ +IFDEF:X64 +VERIFY:\s+rax=\s+rbx=\s+rcx=\s+ +ENDIF:X64 +IFDEF:X86 +VERIFY:\s+eax=\s+ebx=\s+ecx=\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+\s+ +VERIFY:\s+UnstartedThread:\s+\s+ +VERIFY:\s+BackgroundThread:\s+\s+ +VERIFY:\s+PendingThread:\s+\s+ +VERIFY:\s+DeadThread:\s+\s+ +VERIFY:\s+Hosted Runtime:\s+no\s+ +VERIFY:\s+ID\s+OSID\s+ThreadOBJ\s+State.*\s+ +VERIFY:\s+\s+\s+\s+.*\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*\s+\s+\s+.* +VERIFY:\s*Total\s+\s+objects\s+ +!VERIFY:.*UNKNOWN.* + +SOSCOMMAND:DumpAsync +VERIFY:\s*Statistics:\s+ +VERIFY:\s+MT\s+Count\s+TotalSize\s+Class Name\s+ +VERIFY:\s*\s+\s+\s+.* +VERIFY:\s*Total\s+\s+objects\s+ + +SOSCOMMAND:DumpAsync -mt \s+MT\s+Count\s+TotalSize\s+Class Name\s+()\s+\s+\s+.* +VERIFY:\s*Statistics:\s+ +VERIFY:\s+MT\s+Count\s+TotalSize\s+Class Name\s+ +VERIFY:\s*\s+\s+\s+.* +VERIFY:\s*Total\s+\s+objects\s+ + +SOSCOMMAND:DumpAsync -mt -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*\s+\s+\s+.* +VERIFY:\s*Total\s+\s+objects\s+ +!VERIFY:.*UNKNOWN.* + +SOSCOMMAND:DumpAsync +VERIFY:\s*Statistics:\s+ +VERIFY:\s+MT\s+Count\s+TotalSize\s+Class Name\s+ +VERIFY:\s*\s+\s+\s+.* +VERIFY:\s*Total\s+\s+objects\s+ + +SOSCOMMAND:DumpAsync -mt \s+MT\s+Count\s+TotalSize\s+Class Name\s+()\s+\s+\s+.* +VERIFY:\s*Statistics:\s+ +VERIFY:\s+MT\s+Count\s+TotalSize\s+Class Name\s+ +VERIFY:\s*\s+\s+\s+.* +VERIFY:\s*Total\s+\s+objects\s+ + +SOSCOMMAND:DumpAsync -mt -fields + +ENDIF:WINDOWS +ENDIF:ALPINE \ No newline at end of file diff --git a/src/SOS/Strike/datatarget.cpp b/src/SOS/Strike/datatarget.cpp index e9bcf395d..e763d4aa8 100644 --- a/src/SOS/Strike/datatarget.cpp +++ b/src/SOS/Strike/datatarget.cpp @@ -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 diff --git a/src/SOS/Strike/exts.cpp b/src/SOS/Strike/exts.cpp index 69c77acae..32083f858 100644 --- a/src/SOS/Strike/exts.cpp +++ b/src/SOS/Strike/exts.cpp @@ -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; diff --git a/src/SOS/Strike/exts.h b/src/SOS/Strike/exts.h index 606078309..a54b48082 100644 --- a/src/SOS/Strike/exts.h +++ b/src/SOS/Strike/exts.h @@ -166,10 +166,6 @@ ArchQuery(void); void ExtRelease(void); -#ifdef _DEBUG -extern DWORD_PTR g_filterHint; -#endif - extern BOOL ControlC; inline BOOL IsInterrupt() diff --git a/src/SOS/Strike/hostcoreclr.cpp b/src/SOS/Strike/hostcoreclr.cpp index 339898c09..863a337c2 100644 --- a/src/SOS/Strike/hostcoreclr.cpp +++ b/src/SOS/Strike/hostcoreclr.cpp @@ -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). diff --git a/src/SOS/Strike/sos.def b/src/SOS/Strike/sos.def index bb1a2c51f..8bbfcf171 100644 --- a/src/SOS/Strike/sos.def +++ b/src/SOS/Strike/sos.def @@ -182,10 +182,9 @@ EXPORTS DumpPermissionSet dps=DumpPermissionSet dumppermissionset=DumpPermissionSet - dbgout - filthint #endif + dbgout _EFN_GetManagedExcepStack _EFN_GetManagedExcepStackW _EFN_GetManagedObjectFieldInfo diff --git a/src/SOS/Strike/sos_unixexports.src b/src/SOS/Strike/sos_unixexports.src index 6533ce9c2..b5c066d59 100644 --- a/src/SOS/Strike/sos_unixexports.src +++ b/src/SOS/Strike/sos_unixexports.src @@ -4,6 +4,7 @@ bpmd ClrStack +dbgout DumpArray DumpAssembly DumpAsync diff --git a/src/SOS/Strike/strike.cpp b/src/SOS/Strike/strike.cpp index d3e0d55ee..8c452f234 100644 --- a/src/SOS/Strike/strike.cpp +++ b/src/SOS/Strike/strike.cpp @@ -7260,7 +7260,7 @@ public: IfFailRet(g_sos->GetModule(mod, &pModule)); ToRelease 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) { diff --git a/src/SOS/Strike/util.cpp b/src/SOS/Strike/util.cpp index 9a87e46eb..a550da79a 100644 --- a/src/SOS/Strike/util.cpp +++ b/src/SOS/Strike/util.cpp @@ -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(""); 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 pMDImport(NULL); - IfFailRet(pModule->QueryInterface(IID_IMetaDataImport, (LPVOID *) &pMDImport)); + pModule->QueryInterface(IID_IMetaDataImport, (LPVOID *) &pMDImport); SymbolReader symbolReader; IfFailRet(symbolReader.LoadSymbols(pMDImport, pModule)); diff --git a/src/SOS/gcdump/gcdump.vcxproj b/src/SOS/gcdump/gcdump.vcxproj index 411ba8955..abed0ae94 100644 --- a/src/SOS/gcdump/gcdump.vcxproj +++ b/src/SOS/gcdump/gcdump.vcxproj @@ -18,9 +18,6 @@ x64 - - - diff --git a/src/SOS/gcdump/gcdump.vcxproj.filters b/src/SOS/gcdump/gcdump.vcxproj.filters index 0b0c61580..142ddad45 100644 --- a/src/SOS/gcdump/gcdump.vcxproj.filters +++ b/src/SOS/gcdump/gcdump.vcxproj.filters @@ -1,8 +1,5 @@  - - - {f850f02d-2875-417b-a6cc-6058817844a0} diff --git a/src/SOS/lldbplugin.tests/TestDebuggee/TestDebuggee.csproj b/src/SOS/lldbplugin.tests/TestDebuggee/TestDebuggee.csproj index f779b8afd..e8a518522 100644 --- a/src/SOS/lldbplugin.tests/TestDebuggee/TestDebuggee.csproj +++ b/src/SOS/lldbplugin.tests/TestDebuggee/TestDebuggee.csproj @@ -2,9 +2,6 @@ Exe - netcoreapp2.0 - false - true - ;1591;1701 + netcoreapp1.1;netcoreapp2.1;netcoreapp3.0 diff --git a/src/SOS/lldbplugin/soscommand.cpp b/src/SOS/lldbplugin/soscommand.cpp index 725731196..f63befb64 100644 --- a/src/SOS/lldbplugin/soscommand.cpp +++ b/src/SOS/lldbplugin/soscommand.cpp @@ -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."); diff --git a/src/Tools/dotnet-dump/Commands/SOSCommand.cs b/src/Tools/dotnet-dump/Commands/SOSCommand.cs index 35b6958d0..e6d6311ca 100644 --- a/src/Tools/dotnet-dump/Commands/SOSCommand.cs +++ b/src/Tools/dotnet-dump/Commands/SOSCommand.cs @@ -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.")] -- 2.34.1