From e7d1e890f8d78e98cd9c669a485e59a0af202ef1 Mon Sep 17 00:00:00 2001 From: Mitchell Hwang <16830051+mdh1418@users.noreply.github.com> Date: Tue, 14 Oct 2025 10:27:56 -0400 Subject: [PATCH 01/44] [SOSTests] Avoid double counting GCRoots (#5595) On Win-x86, `FindRootsOlderGeneration` failed with double counting the same GC Root. My guess is that the same GCRoot was found on multiple subheaps, so adding deduplication logic during counting would account for that. Example failing test ``` SOSRunner processing SOS.FindRootsOlderGeneration { Running Process: D:\a\_work\1\s\.packages\cdb-sos\10.0.26100.1\runtimes\win-x86\native\cdb.exe -y "D:\a\_work\1\s\artifacts\bin\FindRootsOlderGeneration\Release\net10.0" -c ".load D:\a\_work\1\s\artifacts\bin\Windows_NT.x86.Release\runcommand.dll" -Gsins D:\a\_work\1\s\.dotnet-test\x86\dotnet.exe --fx-version 10.0.0-rtm.25476.104 D:\a\_work\1\s\artifacts\bin\FindRootsOlderGeneration\Release\net10.0\FindRootsOlderGeneration.dll Working Directory: Additional Environment Variables: DOTNET_ROOT=D:\a\_work\1\s\.dotnet-test\x86, DOTNET_ENABLED_SOS_LOGGING=D:\a\_work\1\s\artifacts\TestResults\Release\sos.unittests_2025_10_06_09_09_31_9438\SOS.FindRootsOlderGeneration.projectk.sdk.prebuilt.10.0.0-rtm.25476.104.soslog, DOTNET_EnableWriteXorExecute=0, COMPlus_EnableWriteXorExecute=0, DOTNET_gcServer=1 { 00:00.133: 00:00.133: ************* Preparing the environment for Debugger Extensions Gallery repositories ************** 00:00.133: ExtensionRepository : Implicit 00:00.133: UseExperimentalFeatureForNugetShare : true 00:00.133: AllowNugetExeUpdate : true 00:00.133: NonInteractiveNuget : true 00:00.133: AllowNugetMSCredentialProviderInstall : true 00:00.133: AllowParallelInitializationOfLocalRepositories : true 00:00.133: 00:00.133: EnableRedirectToV8JsProvider : false 00:00.133: 00:00.133: -- Configuring repositories 00:00.133: ----> Repository : LocalInstalled, Enabled: true 00:00.133: ----> Repository : UserExtensions, Enabled: true 00:00.133: 00:00.133: >>>>>>>>>>>>> Preparing the environment for Debugger Extensions Gallery repositories completed, duration 0.000 seconds 00:00.133: 00:00.133: ************* Waiting for Debugger Extensions Gallery to Initialize ************** 00:00.144: 00:00.144: >>>>>>>>>>>>> Waiting for Debugger Extensions Gallery to Initialize completed, duration 0.015 seconds 00:00.144: ----> Repository : UserExtensions, Enabled: true, Packages count: 0 00:00.144: ----> Repository : LocalInstalled, Enabled: true, Packages count: 0 00:00.144: 00:00.144: Microsoft (R) Windows Debugger Version 10.0.26100.1 X86 00:00.144: Copyright (c) Microsoft Corporation. All rights reserved. 00:00.144: 00:00.144: CommandLine: D:\a\_work\1\s\.dotnet-test\x86\dotnet.exe --fx-version 10.0.0-rtm.25476.104 D:\a\_work\1\s\artifacts\bin\FindRootsOlderGeneration\Release\net10.0\FindRootsOlderGeneration.dll 00:00.149: Unable to add extension DLL: ntsdexts 00:00.149: Unable to add extension DLL: uext 00:00.149: Unable to add extension DLL: exts 00:00.150: Unable to add extension DLL: wow64exts 00:00.150: 00:00.150: ************* Path validation summary ************** 00:00.150: Response Time (ms) Location 00:00.150: OK D:\a\_work\1\s\artifacts\bin\FindRootsOlderGeneration\Release\net10.0 00:00.150: Symbol search path is: D:\a\_work\1\s\artifacts\bin\FindRootsOlderGeneration\Release\net10.0 00:00.150: Executable search path is: 00:00.150: ModLoad: 00310000 00334000 dotnet.exe 00:00.151: ModLoad: 775e0000 77789000 ntdll.dll 00:00.154: ModLoad: 77020000 77110000 C:\Windows\SysWOW64\KERNEL32.DLL 00:00.155: ModLoad: 759e0000 75c31000 C:\Windows\SysWOW64\KERNELBASE.dll 00:00.156: ModLoad: 76720000 76833000 C:\Windows\SysWOW64\ucrtbase.dll 00:00.157: (c68.2610): Break instruction exception - code 80000003 (first chance) 00:00.164: eax=00000000 ebx=030cd000 ecx=ab570000 edx=00000000 esi=ffffffff edi=003100f8 00:00.164: eip=77695c51 esp=0337f334 ebp=0337f360 iopl=0 nv up ei pl zr na pe nc 00:00.164: cs=0023 ss=002b ds=002b es=002b fs=0053 gs=002b efl=00000246 00:00.164: ntdll!LdrInitShimEngineDynamic+0x6b1: 00:00.164: 77695c51 cc int 3 00:00.164: 0:000> cdb: Reading initial command '.load D:\a\_work\1\s\artifacts\bin\Windows_NT.x86.Release\runcommand.dll' 00:00.164: 00:00.164: 0:000> STDIN: 00:00.164: !runcommand sxd dz 00:00.164: 00:00.164: 0:000> STDIN: 00:00.165: !runcommand sxd iov 00:00.165: 00:00.165: 0:000> STDIN: 00:00.165: !runcommand .extpath D:\a\_work\1\s\artifacts\bin\Windows_NT.x86.Release 00:00.165: Extension search path is: D:\a\_work\1\s\artifacts\bin\Windows_NT.x86.Release 00:00.165: 00:00.165: 0:000> STDIN: 00:00.165: !runcommand .outmask- 0x244 00:00.165: Client 06703CF8 mask is 1B3 00:00.165: 00:00.165: 0:000> STDIN: 00:00.165: !runcommand !sym quiet 00:00.165: quiet mode - symbol prompts off 00:00.165: 00:00.165: 0:000> STDIN: 00:00.165: !runcommand .lines 00:00.165: Line number information will be loaded 00:00.166: 00:00.166: 0:000> STDIN: 00:00.166: !runcommand dx @Debugger.Settings.EngineInitialization.SecureLoadDotNetExtensions=false 00:00.166: @Debugger.Settings.EngineInitialization.SecureLoadDotNetExtensions=false : false 00:00.166: STARTING SCRIPT: D:\a\_work\1\s\src\SOS\SOS.UnitTests\Scripts\FindRootsOlderGeneration.script %DEBUGGEE_EXE% => D:\a\_work\1\s\artifacts\bin\FindRootsOlderGeneration\Release\net10.0\FindRootsOlderGeneration.dll %DUMP_NAME% => D:\a\_work\1\s\artifacts\tmp\Release\dumps\ProjectK\10.0.0-rtm.25476.104\net10.0\SOS.FindRootsOlderGeneration.Heap.dmp %DEBUG_ROOT% => D:\a\_work\1\s\artifacts\bin\FindRootsOlderGeneration\Release\net10.0 %TEST_NAME% => SOS.FindRootsOlderGeneration %LOG_PATH% => D:\a\_work\1\s\artifacts\TestResults\Release\sos.unittests_2025_10_06_09_09_31_9438 %LOG_SUFFIX% => projectk.sdk.prebuilt.10.0.0-rtm.25476.104 %SOS_PATH% => D:\a\_work\1\s\artifacts\bin\Windows_NT.x86.Release\sos.dll %DESKTOP_RUNTIME_PATH% => => D:\\a\\_work\\1\\s\\artifacts\\bin\\FindRootsOlderGeneration\\Release\\net10.0\\FindRootsOlderGeneration.dll => D:\\a\\_work\\1\\s\\artifacts\\bin\\FindRootsOlderGeneration\\Release\\net10.0 => D:\\a\\_work\\1\\s\\src\\SOS\\SOS.UnitTests\\Debuggees\\FindRootsOlderGeneration => [A-Fa-f0-9]+(`[A-Fa-f0-9]+)? => [,0-9]+(`[,0-9]+)? CDB WINDOWS PROJECTK X86 MAJOR_RUNTIME_VERSION_10 MAJOR_RUNTIME_VERSION_GE_3 MAJOR_RUNTIME_VERSION_GE_5 MAJOR_RUNTIME_VERSION_GE_6 MAJOR_RUNTIME_VERSION_GE_7 MAJOR_RUNTIME_VERSION_GE_8 MAJOR_RUNTIME_VERSION_GE_9 LIVE 32BIT NETCORE_OR_DOTNETDUMP 00:00.166: 0:000> STDIN: 00:00.166: g 00:00.171: ModLoad: 6f760000 6f7ad000 D:\a\_work\1\s\.dotnet-test\x86\host\fxr\10.0.0-rtm.25476.104\hostfxr.dll 00:00.171: ModLoad: 75430000 754ae000 C:\Windows\SysWOW64\ADVAPI32.dll 00:00.171: ModLoad: 77110000 771d2000 C:\Windows\SysWOW64\msvcrt.dll 00:00.172: ModLoad: 761f0000 7626d000 C:\Windows\SysWOW64\sechost.dll 00:00.172: ModLoad: 76610000 76629000 C:\Windows\SysWOW64\bcrypt.dll 00:00.172: ModLoad: 76390000 7644c000 C:\Windows\SysWOW64\RPCRT4.dll 00:00.175: ModLoad: 6f710000 6f75f000 D:\a\_work\1\s\.dotnet-test\x86\shared\Microsoft.NETCore.App\10.0.0-rtm.25476.104\hostpolicy.dll 00:00.186: ModLoad: 69960000 69d1a000 D:\a\_work\1\s\.dotnet-test\x86\shared\Microsoft.NETCore.App\10.0.0-rtm.25476.104\coreclr.dll 00:00.186: ModLoad: 75550000 7563a000 C:\Windows\SysWOW64\ole32.dll 00:00.187: ModLoad: 77490000 7750e000 C:\Windows\SysWOW64\msvcp_win.dll 00:00.187: ModLoad: 772f0000 77314000 C:\Windows\SysWOW64\GDI32.dll 00:00.187: ModLoad: 75cc0000 75cda000 C:\Windows\SysWOW64\win32u.dll 00:00.187: ModLoad: 771e0000 772c9000 C:\Windows\SysWOW64\gdi32full.dll 00:00.188: ModLoad: 76e70000 77015000 C:\Windows\SysWOW64\USER32.dll 00:00.188: ModLoad: 75750000 759d7000 C:\Windows\SysWOW64\combase.dll 00:00.189: ModLoad: 764e0000 7657d000 C:\Windows\SysWOW64\OLEAUT32.dll 00:00.190: ModLoad: 754b0000 754d5000 C:\Windows\SysWOW64\IMM32.DLL 00:00.204: ModLoad: 76120000 76185000 C:\Windows\SysWOW64\bcryptPrimitives.dll 00:00.207: (c68.2610): Unknown exception - code 04242420 (first chance) 00:00.209: ModLoad: 752c0000 752d2000 C:\Windows\SysWOW64\kernel.appcore.dll 00:00.213: ModLoad: 68a80000 6995f000 D:\a\_work\1\s\.dotnet-test\x86\shared\Microsoft.NETCore.App\10.0.0-rtm.25476.104\System.Private.CoreLib.dll 00:00.240: ModLoad: 27170000 27178000 D:\a\_work\1\s\artifacts\bin\FindRootsOlderGeneration\Release\net10.0\FindRootsOlderGeneration.dll 00:00.241: ModLoad: 27170000 27178000 D:\a\_work\1\s\artifacts\bin\FindRootsOlderGeneration\Release\net10.0\FindRootsOlderGeneration.dll 00:00.241: ModLoad: 26fb0000 26fbe000 D:\a\_work\1\s\.dotnet-test\x86\shared\Microsoft.NETCore.App\10.0.0-rtm.25476.104\System.Runtime.dll 00:00.242: ModLoad: 26fb0000 26fbe000 D:\a\_work\1\s\.dotnet-test\x86\shared\Microsoft.NETCore.App\10.0.0-rtm.25476.104\System.Runtime.dll 00:00.242: ModLoad: 6f480000 6f63b000 D:\a\_work\1\s\.dotnet-test\x86\shared\Microsoft.NETCore.App\10.0.0-rtm.25476.104\clrjit.dll 00:00.243: ModLoad: 6f6b0000 6f6d4000 D:\a\_work\1\s\.dotnet-test\x86\shared\Microsoft.NETCore.App\10.0.0-rtm.25476.104\System.Console.dll 00:00.244: (c68.2610): Break instruction exception - code 80000003 (first chance) 00:00.251: eax=00000001 ebx=0337efb4 ecx=00000008 edx=03719638 esi=03766038 edi=0337efb4 00:00.251: eip=75b87f12 esp=0337ee70 ebp=0337eea0 iopl=0 nv up ei pl nz na po nc 00:00.251: cs=0023 ss=002b ds=002b es=002b fs=0053 gs=002b efl=00000202 00:00.251: KERNELBASE!DebugBreak+0x2: 00:00.251: 75b87f12 cc int 3 00:00.251: 00:00.251: 0:000> STDIN: 00:00.251: !runcommand .unload sos 00:00.251: No extension named 'sos' in chain 00:00.251: 00:00.251: 0:000> STDIN: 00:00.251: !runcommand .load D:\a\_work\1\s\artifacts\bin\Windows_NT.x86.Release\sos.dll 00:00.252: 00:00.252: 0:000> STDIN: 00:00.252: !runcommand .reload 00:00.252: Reloading current modules 00:00.253: ............................. 00:00.265: 00:00.265: ************* Symbol Loading Error Summary ************** 00:00.265: Module name Error 00:00.265: System.Private.CoreLib The system cannot find the file specified 00:00.265: KERNELBASE The system cannot find the file specified 00:00.265: ntdll The system cannot find the file specified 00:00.265: 00:00.265: You can troubleshoot most symbol related issues by turning on symbol loading diagnostics (!sym noisy) and repeating the command that caused symbols to be loaded. 00:00.265: You should also verify that your symbol search path (.sympath) is correct. 00:00.265: 00:00.265: 0:000> STDIN: 00:00.265: !runcommand .chain 00:00.266: Extension DLL search Path: 00:00.266: D:\a\_work\1\s\artifacts\bin\Windows_NT.x86.Release 00:00.266: Extension DLL chain: 00:00.266: D:\a\_work\1\s\artifacts\bin\Windows_NT.x86.Release\sos.dll: image 9,0,13,603 @Commit: f40e210b5da69e3c7585917137322cac01f0dffc, API 2.0.0, built Mon Oct 6 21:02:28 2025 00:00.266: [path: D:\a\_work\1\s\artifacts\bin\Windows_NT.x86.Release\sos.dll] 00:00.266: D:\a\_work\1\s\artifacts\bin\Windows_NT.x86.Release\runcommand.dll: API 1.0.0, built Mon Oct 6 21:02:23 2025 00:00.266: [path: D:\a\_work\1\s\artifacts\bin\Windows_NT.x86.Release\runcommand.dll] 00:00.266: dbghelp: image 10.0.26100.1, API 10.0.6, 00:00.266: [path: D:\a\_work\1\s\.packages\cdb-sos\10.0.26100.1\runtimes\win-x86\native\dbghelp.dll] 00:00.266: 00:00.266: 0:000> STDIN: 00:00.266: !runcommand !SetHostRuntime D:\a\_work\1\s\.dotnet-test\x86\shared\Microsoft.NETCore.App\10.0.0-rtm.25476.104 00:00.266: Using .NET Core runtime (version 10.0) to host the managed SOS code 00:00.266: Host runtime path: D:\a\_work\1\s\.dotnet-test\x86\shared\Microsoft.NETCore.App\10.0.0-rtm.25476.104 00:00.266: 00:00.266: 0:000> STDIN: 00:00.266: g 00:00.269: ModLoad: 6fa50000 6fa61000 D:\a\_work\1\s\.dotnet-test\x86\shared\Microsoft.NETCore.App\10.0.0-rtm.25476.104\System.Threading.dll 00:00.270: ModLoad: 26fe0000 26fe8000 D:\a\_work\1\s\.dotnet-test\x86\shared\Microsoft.NETCore.App\10.0.0-rtm.25476.104\System.Text.Encoding.Extensions.dll 00:00.270: ModLoad: 26fe0000 26fe8000 D:\a\_work\1\s\.dotnet-test\x86\shared\Microsoft.NETCore.App\10.0.0-rtm.25476.104\System.Text.Encoding.Extensions.dll 00:00.271: ModLoad: 6f640000 6f658000 D:\a\_work\1\s\.dotnet-test\x86\shared\Microsoft.NETCore.App\10.0.0-rtm.25476.104\System.Runtime.InteropServices.dll 00:00.273: Enable CLRN notifications: SXE CLRN 00:00.273: (c68.2610): Break instruction exception - code 80000003 (first chance) 00:00.274: eax=00000001 ebx=0337efb4 ecx=00000008 edx=03719638 esi=03766038 edi=0337efb4 00:00.274: eip=75b87f12 esp=0337ee70 ebp=0337eea0 iopl=0 nv up ei pl nz na po nc 00:00.274: cs=0023 ss=002b ds=002b es=002b fs=0053 gs=002b efl=00000202 00:00.274: KERNELBASE!DebugBreak+0x2: 00:00.274: 75b87f12 cc int 3 00:00.274: 00:00.274: 0:000> STDIN: 00:00.274: !runcommand !FindRoots -gen any 00:00.519: 00:00.519: 0:000> STDIN: 00:00.519: !runcommand sxe CLRN 00:00.519: 00:00.519: 0:000> STDIN: 00:00.519: g 00:00.521: Before GC - Array Gen: 2, Thing Gen: 0 00:00.521: Forcing GC... 00:00.522: (c68.12a4): CLR notification exception - code e0444143 (first chance) 00:00.529: CLR notification: GC - Performing a gen 0 collection. Determined surviving objects... 00:00.529: First chance exceptions are reported before any exception handling. 00:00.529: This exception may be expected and handled. 00:00.530: eax=0577f670 ebx=69cea834 ecx=00000003 edx=00000000 esi=00000003 edi=0577f73c 00:00.530: eip=75b195f2 esp=0577f670 ebp=0577f6c8 iopl=0 nv up ei pl nz ac po nc 00:00.530: cs=0023 ss=002b ds=002b es=002b fs=0053 gs=002b efl=00000212 00:00.530: KERNELBASE!RaiseException+0x62: 00:00.530: 75b195f2 8b4c2454 mov ecx,dword ptr [esp+54h] ss:002b:0577f6c4=323253bd 00:00.530: 00:00.530: 0:007> STDIN: 00:00.530: !runcommand !clrstack -all 00:00.537: OS Thread Id: 0x2740 00:00.545: Child SP IP Call Site 00:00.545: 05ABFB08 77653e8c [DebuggerU2MCatchHandlerFrame: 05abfb08] 00:00.545: OS Thread Id: 0x2610 00:00.545: Child SP IP Call Site 00:00.545: 0337EE84 77653e8c [InlinedCallFrame: 0337ee84] 00:00.546: 0337EE84 68cec380 [InlinedCallFrame: 0337ee84] 00:00.546: 0337EE78 68CEC380 System.GC.Collect(Int32, System.GCCollectionMode, Boolean, Boolean, Boolean) 00:00.559: 0337EED4 68CEC2B2 System.GC.Collect(Int32, System.GCCollectionMode, Boolean) 00:00.560: 0337EEE8 26F7195E FindRootsOlderGeneration.Program.Main() [/_/src/SOS/SOS.UnitTests/Debuggees/FindRootsOlderGeneration/Program.cs @ 36] 00:00.564: OS Thread Id: 0x195c 00:00.564: Child SP IP Call Site 00:00.564: 26F6F880 776541ac [DebuggerU2MCatchHandlerFrame: 26f6f880] 00:00.564: 00:00.564: 0:007> STDIN: 00:00.564: ~0s 00:00.565: eax=00000001 ebx=00000000 ecx=00000000 edx=00000000 esi=00000000 edi=000002a8 00:00.565: eip=77653e8c esp=0337ed30 ebp=0337eda0 iopl=0 nv up ei pl nz ac pe nc 00:00.565: cs=0023 ss=002b ds=002b es=002b fs=0053 gs=002b efl=00000216 00:00.565: ntdll!NtWaitForSingleObject+0xc: 00:00.565: 77653e8c c20c00 ret 0Ch 00:00.565: 00:00.565: 0:000> STDIN: 00:00.565: !runcommand !DumpStackObjects 00:00.632: OS Thread Id: 0x2610 (0) 00:00.637: SP/REG Object Name 00:00.686: 0337eef4 05b5812c System.String 00:00.694: 0337ef00 19ac1020 FindRootsOlderGeneration.Thing[] 00:00.694: 0337ef3c 05b576fc FindRootsOlderGeneration.Thing 00:00.694: 0337ef40 19ac1020 FindRootsOlderGeneration.Thing[] 00:00.695: 0337f264 11acbed0 System.String[] 00:00.695: 0337f2f4 11acbed0 System.String[] 00:00.696: 0337f2f8 11acbee0 System.String[] 00:00.696: 0337f308 11acbed0 System.String[] 00:00.696: 0337f438 11acbee0 System.String[] 00:00.696: 00:00.696: 0:000> STDIN: 00:00.696: !runcommand !FindRoots 05b576fc 00:00.740: Older Generation: 00:00.740: 19ac1020 00:00.745: Caching GC roots, this may take a while. 00:00.745: Subsequent runs of this command will be faster. 00:00.745: 00:00.751: -> 19ac1020 FindRootsOlderGeneration.Thing[] 00:00.751: -> 05b576fc FindRootsOlderGeneration.Thing 00:00.751: 00:00.751: Older Generation: 00:00.751: 19ac1020 00:00.751: -> 19ac1020 FindRootsOlderGeneration.Thing[] 00:00.751: -> 05b576fc FindRootsOlderGeneration.Thing 00:00.751: 00:00.763: Found 2 unique roots. 00:00.763: SOSRunner error at D:\a\_work\1\s\src\SOS\SOS.UnitTests\Scripts\FindRootsOlderGeneration.script:34 Excerpt from D:\a\_work\1\s\src\SOS\SOS.UnitTests\Scripts\FindRootsOlderGeneration.script: 32 33 SOSCOMMAND:FindRoots \w+\s+()\s+(FindRootsOlderGeneration.Thing)(?!\[\]) 34 VERIFY:Found 1 unique roots. 35 36 COMMAND:sxn CLRN 00:00.763: 0:000> STDIN: 00:00.763: !runcommand !SOSStatus System.Exception: Debugger output did not match the expression: Found 1 unique roots. at SOSRunner.VerifyOutput(String verifyLine, Boolean match) in /_/src/SOS/SOS.UnitTests/SOSRunner.cs:line 1252 at SOSRunner.RunScript(String scriptRelativePath) in /_/src/SOS/SOS.UnitTests/SOSRunner.cs:line 905 at SOSRunner.RunScript(String scriptRelativePath) in /_/src/SOS/SOS.UnitTests/SOSRunner.cs:line 942 Killing process 9104: 00:00.773 - Kill() was called } ``` --- .../GCRootCommand.cs | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/Microsoft.Diagnostics.ExtensionCommands/GCRootCommand.cs b/src/Microsoft.Diagnostics.ExtensionCommands/GCRootCommand.cs index 115a4d1132..bae2b22109 100644 --- a/src/Microsoft.Diagnostics.ExtensionCommands/GCRootCommand.cs +++ b/src/Microsoft.Diagnostics.ExtensionCommands/GCRootCommand.cs @@ -4,6 +4,7 @@ using System; using System.IO; using System.Text; +using System.Collections.Generic; using Microsoft.Diagnostics.DebugServices; using Microsoft.Diagnostics.ExtensionCommands.Output; using Microsoft.Diagnostics.Runtime; @@ -138,6 +139,8 @@ private int PrintOlderGenerationRoots(GCRoot gcroot, int gen, int limit) int count = 0; bool noInternalRootData = true; + HashSet uniqueRoots = new(); + foreach (ClrSubHeap subheap in Runtime.Heap.SubHeaps) { MemoryRange internalRootArray = subheap.InternalRootArray; @@ -159,7 +162,7 @@ private int PrintOlderGenerationRoots(GCRoot gcroot, int gen, int limit) Console.CancellationToken.ThrowIfCancellationRequested(); - if (Memory.ReadPointer(address, out ulong objAddress)) + if (Memory.ReadPointer(address, out ulong objAddress) && !uniqueRoots.Contains(objAddress)) { ClrObject obj = Runtime.Heap.GetObject(objAddress); if (obj.IsValid) @@ -177,6 +180,7 @@ private int PrintOlderGenerationRoots(GCRoot gcroot, int gen, int limit) PrintPath(Console, RootCache, StaticVariables, Runtime.Heap, path); Console.WriteLine(); + uniqueRoots.Add(objAddress); count++; } } From 38fa25e10932fbde6c434a570e9b3cbe67fde400 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alexander=20K=C3=B6plinger?= Date: Wed, 15 Oct 2025 09:02:54 +0200 Subject: [PATCH 02/44] Remove auditSources from NuGet.config (#5601) The api.nuget.org source will clash with the CFSClean network isolation policy and the same data is provided by AzDO now. --- NuGet.config | 4 ---- 1 file changed, 4 deletions(-) diff --git a/NuGet.config b/NuGet.config index d060e04ff3..6d46687773 100644 --- a/NuGet.config +++ b/NuGet.config @@ -23,9 +23,5 @@ - - - - From 05321bc8e158478204d312c9de45dbb9eeddf0a2 Mon Sep 17 00:00:00 2001 From: Max Charlamb <44248479+max-charlamb@users.noreply.github.com> Date: Wed, 15 Oct 2025 13:34:21 -0400 Subject: [PATCH 03/44] Use SlnGen to generate solution from Traversal project (#5600) Updates repository to use `Microsoft.Build.Traversal` `.proj` files to drive which projects are built. Previously the arcade build infrastructure would build the solution files found in the root directly. This approach gives us more fine-grained control over projects to build, as well as allow us to automatically generate a solution file using `slngen`. I have checked in the generated `build.sln` which can be loaded with `VS` or `VSCode`. This version includes the `vcxproj` files which improve the native debug experience in VS. There is an option to generate `build.sln` without these files as they can cause warnings on non-Windows platforms (same behavior as today). For convienence I have added two new scripts: * `eng/generate-sln.ps1` * `eng/generate-sln.sh` both of these automatically invoke the proper commands to regenerate the `build.sln` file. I updated the instruction docs to reference `build.sln` and explain how to regenerate it. Edit: * I have reverted from using `slnx -> sln` as the conversion process causes some problems with the vcxproj Ids. Given that these are now auto-generated, using the `sln` format seems acceptable as it has broader support. --- build.proj | 8 + build.sln | 1527 +++++++++++++++++ debuggees.slnx | 93 - diagnostics.slnx | 468 ----- documentation/building/linux-instructions.md | 9 + documentation/building/osx-instructions.md | 10 + .../building/windows-instructions.md | 10 + eng/Build.props | 8 +- eng/generate-sln.ps1 | 70 + eng/generate-sln.sh | 91 + global.json | 1 + .../Debuggees/SymbolTestApp/SymbolTestApp.sln | 50 + .../SymbolTestApp/SymbolTestApp.slnx | 9 - .../SymbolTestApp/SymbolTestApp.csproj | 2 +- .../TaskNestedException.sln | 50 + .../TaskNestedException.slnx | 9 - src/dirs.proj | 30 + .../SimpleDebuggee/SimpleDebuggee.cs | 10 +- src/tests/dirs.proj | 20 + start-vs.cmd | 2 +- 20 files changed, 1890 insertions(+), 587 deletions(-) create mode 100644 build.proj create mode 100644 build.sln delete mode 100644 debuggees.slnx delete mode 100644 diagnostics.slnx create mode 100644 eng/generate-sln.ps1 create mode 100644 eng/generate-sln.sh create mode 100644 src/SOS/SOS.UnitTests/Debuggees/SymbolTestApp/SymbolTestApp.sln delete mode 100644 src/SOS/SOS.UnitTests/Debuggees/SymbolTestApp/SymbolTestApp.slnx create mode 100644 src/SOS/SOS.UnitTests/Debuggees/TaskNestedException/TaskNestedException.sln delete mode 100644 src/SOS/SOS.UnitTests/Debuggees/TaskNestedException/TaskNestedException.slnx create mode 100644 src/dirs.proj create mode 100644 src/tests/dirs.proj diff --git a/build.proj b/build.proj new file mode 100644 index 0000000000..642962000e --- /dev/null +++ b/build.proj @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/build.sln b/build.sln new file mode 100644 index 0000000000..77f4a34698 --- /dev/null +++ b/build.sln @@ -0,0 +1,1527 @@ +Microsoft Visual Studio Solution File, Format Version 12.00 +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "build", "build.proj", "{8AEC426C-BB15-4924-9E39-9C2A4C11D602}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "dbgshim", "src\dbgshim\dbgshim.vcxproj", "{BD779298-8631-3F5D-AA59-82897E5454A7}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Diagnostics.DebugServices.Implementation", "src\Microsoft.Diagnostics.DebugServices.Implementation\Microsoft.Diagnostics.DebugServices.Implementation.csproj", "{B0E21A12-2374-44F1-8506-83A15B628546}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Diagnostics.DebugServices", "src\Microsoft.Diagnostics.DebugServices\Microsoft.Diagnostics.DebugServices.csproj", "{5C66B7B3-090E-41A7-8071-ACC56AD07D11}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Diagnostics.ExtensionCommands", "src\Microsoft.Diagnostics.ExtensionCommands\Microsoft.Diagnostics.ExtensionCommands.csproj", "{AD8C76B0-7619-4E15-A7C1-D0F9F2D5B533}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Diagnostics.Monitoring.EventPipe", "src\Microsoft.Diagnostics.Monitoring.EventPipe\Microsoft.Diagnostics.Monitoring.EventPipe.csproj", "{3D94BDA0-5FAC-42BD-A422-67CB1F61F5C1}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Diagnostics.Monitoring", "src\Microsoft.Diagnostics.Monitoring\Microsoft.Diagnostics.Monitoring.csproj", "{E5CCCC14-91A5-4AB1-A34A-5D2259DD897B}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Diagnostics.NETCore.Client", "src\Microsoft.Diagnostics.NETCore.Client\Microsoft.Diagnostics.NETCore.Client.csproj", "{3E683795-56AF-4073-9B59-996B09FFEE6A}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Diagnostics.Repl", "src\Microsoft.Diagnostics.Repl\Microsoft.Diagnostics.Repl.csproj", "{0DFA2E76-13E8-44DA-B186-E3D20CE07E47}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Diagnostics.TestHelpers", "src\Microsoft.Diagnostics.TestHelpers\Microsoft.Diagnostics.TestHelpers.csproj", "{885D1F3B-D204-49F6-B953-F284EA451AFD}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Diagnostics.WebSocketServer", "src\Microsoft.Diagnostics.WebSocketServer\Microsoft.Diagnostics.WebSocketServer.csproj", "{EBE9CD5C-C44D-4B56-81AB-1EB7C2B8C6D1}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.FileFormats", "src\Microsoft.FileFormats\Microsoft.FileFormats.csproj", "{94F1B6F2-82E0-41F0-A523-730C0FFACA15}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.SymbolManifestGenerator", "src\Microsoft.SymbolManifestGenerator\Microsoft.SymbolManifestGenerator.csproj", "{6157D6AA-3ECB-44AC-9956-D628E29A591C}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.SymbolStore", "src\Microsoft.SymbolStore\Microsoft.SymbolStore.csproj", "{030A401B-157B-473F-98AC-74462FD76A59}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "dbgutil", "src\shared\debug\dbgutil\dbgutil.vcxproj", "{A9A7C879-C320-3327-BB84-16E1322E17AE}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "gcdump", "src\shared\gcdump\gcdump.vcxproj", "{20EBC3C4-917C-402D-B778-9A6E3742BF5A}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "utilcode", "src\shared\utilcode\utilcode.vcxproj", "{8C35FEF8-1101-38F6-ACD0-462A1EA53A7D}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "extensions", "src\SOS\extensions\extensions.vcxproj", "{EEC90A42-CDCD-4EE3-B47D-C109D604E7E2}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "lldbplugin", "src\SOS\lldbplugin\lldbplugin.vcxproj", "{D52C65C4-2C7D-45E6-9F5C-6F3A96796018}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SOS.Extensions", "src\SOS\SOS.Extensions\SOS.Extensions.csproj", "{0F848647-AF41-464F-BC7E-B363DCC4A54A}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SOS.Hosting", "src\SOS\SOS.Hosting\SOS.Hosting.csproj", "{E77CB5ED-5F99-4148-8115-38E45E648F08}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SOS.InstallHelper", "src\SOS\SOS.InstallHelper\SOS.InstallHelper.csproj", "{88686BB2-7A8A-4019-986C-9ED5045844E9}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SOS.Package", "src\SOS\SOS.Package\SOS.Package.csproj", "{7E252D99-B616-4234-9A63-26A00208AB27}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SOS.Symbol.Package", "src\SOS\SOS.Package\SOS.Symbol.Package.csproj", "{02D40854-2429-4EF7-8405-04C87565853A}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DivZero", "src\SOS\SOS.UnitTests\Debuggees\DivZero\DivZero.csproj", "{193E7716-8469-4A72-A689-27C5E828772C}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DotnetDumpCommands", "src\SOS\SOS.UnitTests\Debuggees\DotnetDumpCommands\DotnetDumpCommands.csproj", "{87E9BB01-B579-4891-BA1C-BB600AC9829A}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DumpGCData", "src\SOS\SOS.UnitTests\Debuggees\DumpGCData\DumpGCData.csproj", "{8F7085F1-DA86-4AA1-9801-2A9A2498E7BB}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DynamicMethod", "src\SOS\SOS.UnitTests\Debuggees\DynamicMethod\DynamicMethod.csproj", "{F682A9D8-9523-406A-9357-E48B463A8303}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "FindRootsOlderGeneration", "src\SOS\SOS.UnitTests\Debuggees\FindRootsOlderGeneration\FindRootsOlderGeneration.csproj", "{981A8ECD-2821-44F5-B617-BF0E7E9382C6}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "GCPOH", "src\SOS\SOS.UnitTests\Debuggees\GCPOH\GCPOH.csproj", "{3F0A4CCD-6944-40A9-B42C-4D120148E2A9}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "GCWhere", "src\SOS\SOS.UnitTests\Debuggees\GCWhere\GCWhere.csproj", "{761CC2CC-85A1-413D-AD6B-CD000420E378}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LineNums", "src\SOS\SOS.UnitTests\Debuggees\LineNums\LineNums.csproj", "{62BB9630-E6F3-4CB7-A781-5C4E963ADCEB}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "NestedExceptionTest", "src\SOS\SOS.UnitTests\Debuggees\NestedExceptionTest\NestedExceptionTest.csproj", "{C20C7B5B-9D29-4AB3-AA84-36137CE44DB9}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Overflow", "src\SOS\SOS.UnitTests\Debuggees\Overflow\Overflow.csproj", "{B37F4A90-69E4-449D-AB84-ED2441E38E5F}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ReflectionTest", "src\SOS\SOS.UnitTests\Debuggees\ReflectionTest\ReflectionTest.csproj", "{AD59F28F-06D6-4743-9E0F-9EAB2617601A}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SimpleThrow", "src\SOS\SOS.UnitTests\Debuggees\SimpleThrow\SimpleThrow.csproj", "{794DB744-5F00-4187-8AB6-A99B19ABAAB2}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SymbolTestApp", "src\SOS\SOS.UnitTests\Debuggees\SymbolTestApp\SymbolTestApp\SymbolTestApp.csproj", "{A698EB04-2139-4A63-819B-0BC686478568}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SymbolTestDll", "src\SOS\SOS.UnitTests\Debuggees\SymbolTestApp\SymbolTestDll\SymbolTestDll.csproj", "{A29C9F3E-1093-48F1-8CF4-21515EDB301A}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "RandomUserLibrary", "src\SOS\SOS.UnitTests\Debuggees\TaskNestedException\RandomUserLibrary\RandomUserLibrary.csproj", "{6D83F8E9-A84C-42AE-B91E-D342623D7783}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "TaskNestedException", "src\SOS\SOS.UnitTests\Debuggees\TaskNestedException\TaskNestedException\TaskNestedException.csproj", "{C40AB24F-39F3-4BEF-98E4-DAD9804EE7E2}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "VarargPInvokeInteropMD", "src\SOS\SOS.UnitTests\Debuggees\VarargPInvokeInteropMD\VarargPInvokeInteropMD.csproj", "{F9E1B91C-3AE6-4894-A91A-EE6824D31E48}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WebApp3", "src\SOS\SOS.UnitTests\Debuggees\WebApp3\WebApp3.csproj", "{D2810F09-0CCD-4779-B21B-322081E84E87}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SOS.UnitTests", "src\SOS\SOS.UnitTests\SOS.UnitTests.csproj", "{5933AB07-5CBD-4AF3-9BCE-0B765363D27D}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Strike", "src\SOS\Strike\Strike.vcxproj", "{41F59D85-FC36-3015-861B-F177863252BC}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "CommonTestRunner", "src\tests\CommonTestRunner\CommonTestRunner.csproj", "{DE21994B-542A-437E-8405-F62A5A3F41D4}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DbgShim.UnitTests", "src\tests\DbgShim.UnitTests\DbgShim.UnitTests.csproj", "{B580256B-3E8A-4EBB-8ED0-B751622A1BDE}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SimpleDebuggee", "src\tests\DbgShim.UnitTests\Debuggees\SimpleDebuggee\SimpleDebuggee.csproj", "{ED806ECA-3F5A-4E89-9F10-A8A58D7CE2D5}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DotnetCounters.UnitTests", "src\tests\dotnet-counters\DotnetCounters.UnitTests.csproj", "{CEDB87DB-22B9-4466-B79F-AA2A40BE6AA9}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DotnetTrace.UnitTests", "src\tests\dotnet-trace\DotnetTrace.UnitTests.csproj", "{38E7B98A-541C-4D53-B07A-4039E88CDDA0}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "EventPipe.UnitTests", "src\tests\eventpipe\EventPipe.UnitTests.csproj", "{7A8C135E-A694-4110-B724-E71521986ACD}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "EventPipeTracee", "src\tests\EventPipeTracee\EventPipeTracee.csproj", "{612753EE-C926-4E45-AC1E-A174AE25D91B}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ExitCodeTracee", "src\tests\ExitCodeTracee\ExitCodeTracee.csproj", "{EAD22B68-3099-47DF-9356-A1B3E5ADD7CB}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Diagnostics.DebugServices.UnitTests", "src\tests\Microsoft.Diagnostics.DebugServices.UnitTests\Microsoft.Diagnostics.DebugServices.UnitTests.csproj", "{DD0C14D2-D7B0-47E2-8D75-498956C7B0C9}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Diagnostics.Monitoring.EventPipe.UnitTests", "src\tests\Microsoft.Diagnostics.Monitoring.EventPipe\Microsoft.Diagnostics.Monitoring.EventPipe.UnitTests.csproj", "{9E162337-F39B-461F-90D1-294ED529FDBF}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Diagnostics.Monitoring.UnitTests", "src\tests\Microsoft.Diagnostics.Monitoring\Microsoft.Diagnostics.Monitoring.UnitTests.csproj", "{B7D8475F-0577-4B53-BD7F-9FFE4FA6320A}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Diagnostics.NETCore.Client.UnitTests", "src\tests\Microsoft.Diagnostics.NETCore.Client\Microsoft.Diagnostics.NETCore.Client.UnitTests.csproj", "{490D2993-80D2-494E-B9EF-BBC9F6D7B12F}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.FileFormats.UnitTests", "src\tests\Microsoft.FileFormats.UnitTests\Microsoft.FileFormats.UnitTests.csproj", "{1F7E837F-0E68-43CF-8071-994CE2904901}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.SymbolStore.UnitTests", "src\tests\Microsoft.SymbolStore.UnitTests\Microsoft.SymbolStore.UnitTests.csproj", "{AB277B63-4D5F-4269-824B-91A675B92F5B}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "StackTracee", "src\tests\StackTracee\StackTracee.csproj", "{614E442A-A8FD-4E14-9C3E-1F312864D9E0}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "TestExtension", "src\tests\TestExtension\TestExtension.csproj", "{B5378BE2-284A-4614-9415-7FB6A7B9D452}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "TestHelpers", "src\tests\TestHelpers\TestHelpers.csproj", "{7E7BB06B-2756-4172-B906-D1744688AC54}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Tracee", "src\tests\Tracee\Tracee.csproj", "{A43C3CFE-6EE9-4A9C-8160-E3432ECB0A11}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "dotnet-counters", "src\Tools\dotnet-counters\dotnet-counters.csproj", "{776831C1-2727-44D0-AF1C-4F54A0807D56}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "dotnet-dsrouter", "src\Tools\dotnet-dsrouter\dotnet-dsrouter.csproj", "{93BB0132-1608-4946-B933-5719E29B3033}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "dotnet-dump", "src\Tools\dotnet-dump\dotnet-dump.csproj", "{7A63A786-F30D-4473-9666-9EBE71C21A8E}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "dotnet-gcdump", "src\Tools\dotnet-gcdump\dotnet-gcdump.csproj", "{9FDC5AEB-C47D-40FD-B151-BBD3DCDDD4E7}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "dotnet-sos", "src\Tools\dotnet-sos\dotnet-sos.csproj", "{F546FC16-79F7-491D-87FC-F32849AD8377}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "dotnet-stack", "src\Tools\dotnet-stack\dotnet-stack.csproj", "{380F8ECB-B4C7-41DD-BE76-74A1C7E4A307}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "dotnet-symbol", "src\Tools\dotnet-symbol\dotnet-symbol.csproj", "{791EF9D8-210A-4A15-BFC9-94CD4E5EDFE2}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "dotnet-trace", "src\Tools\dotnet-trace\dotnet-trace.csproj", "{C6B35C75-931F-473E-BED7-8BA626A6DA2D}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "debug", "src\shared\debug", "{AC7761AD-78A4-48B6-9056-8A92740F17AD}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "shared", "src\shared", "{2E28B2DB-3805-457D-8B52-E35F60A55E90}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "SOS.Package", "src\SOS\SOS.Package", "{BE481BCB-9C28-4CF3-A92C-2CBC49F49710}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "SymbolTestApp", "src\SOS\SOS.UnitTests\Debuggees\SymbolTestApp", "{A652E56D-8614-4338-9098-6B252270A1BB}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "TaskNestedException", "src\SOS\SOS.UnitTests\Debuggees\TaskNestedException", "{44F59FE3-F8DB-4E3E-B6F7-E3AB9C05F416}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Debuggees", "src\SOS\SOS.UnitTests\Debuggees", "{D09612C8-B493-42BE-9F3F-28B315F9751A}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "SOS.UnitTests", "src\SOS\SOS.UnitTests", "{67BF6867-0EA6-4853-B14B-8A0A9091A255}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "SOS", "src\SOS", "{C12FE574-60EF-4CF0-A879-68F3D093651C}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Debuggees", "src\tests\DbgShim.UnitTests\Debuggees", "{D166FD15-A4F1-47B9-881B-D3965B5DCF7D}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "DbgShim.UnitTests", "src\tests\DbgShim.UnitTests", "{C9BD4CB1-E9A7-4A35-B8F8-8B7984A8A950}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "tests", "src\tests", "{59E97F80-3F6D-4E83-9962-236C98411375}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Tools", "src\Tools", "{71E34955-D0A4-4242-BE24-F0AADA3A877E}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Debug|x64 = Debug|x64 + Debug|x86 = Debug|x86 + Release|Any CPU = Release|Any CPU + Release|x64 = Release|x64 + Release|x86 = Release|x86 + Checked|Any CPU = Checked|Any CPU + Checked|x64 = Checked|x64 + Checked|x86 = Checked|x86 + RelWithDebInfo|Any CPU = RelWithDebInfo|Any CPU + RelWithDebInfo|x64 = RelWithDebInfo|x64 + RelWithDebInfo|x86 = RelWithDebInfo|x86 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {8AEC426C-BB15-4924-9E39-9C2A4C11D602}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {8AEC426C-BB15-4924-9E39-9C2A4C11D602}.Debug|Any CPU.Build.0 = Debug|Any CPU + {8AEC426C-BB15-4924-9E39-9C2A4C11D602}.Debug|x64.ActiveCfg = Debug|Any CPU + {8AEC426C-BB15-4924-9E39-9C2A4C11D602}.Debug|x64.Build.0 = Debug|Any CPU + {8AEC426C-BB15-4924-9E39-9C2A4C11D602}.Debug|x86.ActiveCfg = Debug|Any CPU + {8AEC426C-BB15-4924-9E39-9C2A4C11D602}.Debug|x86.Build.0 = Debug|Any CPU + {8AEC426C-BB15-4924-9E39-9C2A4C11D602}.Release|Any CPU.ActiveCfg = Release|Any CPU + {8AEC426C-BB15-4924-9E39-9C2A4C11D602}.Release|Any CPU.Build.0 = Release|Any CPU + {8AEC426C-BB15-4924-9E39-9C2A4C11D602}.Release|x64.ActiveCfg = Release|Any CPU + {8AEC426C-BB15-4924-9E39-9C2A4C11D602}.Release|x64.Build.0 = Release|Any CPU + {8AEC426C-BB15-4924-9E39-9C2A4C11D602}.Release|x86.ActiveCfg = Release|Any CPU + {8AEC426C-BB15-4924-9E39-9C2A4C11D602}.Release|x86.Build.0 = Release|Any CPU + {8AEC426C-BB15-4924-9E39-9C2A4C11D602}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {8AEC426C-BB15-4924-9E39-9C2A4C11D602}.Checked|x64.ActiveCfg = Debug|Any CPU + {8AEC426C-BB15-4924-9E39-9C2A4C11D602}.Checked|x86.ActiveCfg = Debug|Any CPU + {8AEC426C-BB15-4924-9E39-9C2A4C11D602}.RelWithDebInfo|Any CPU.ActiveCfg = Debug|Any CPU + {8AEC426C-BB15-4924-9E39-9C2A4C11D602}.RelWithDebInfo|x64.ActiveCfg = Debug|Any CPU + {8AEC426C-BB15-4924-9E39-9C2A4C11D602}.RelWithDebInfo|x86.ActiveCfg = Debug|Any CPU + {BD779298-8631-3F5D-AA59-82897E5454A7}.Debug|Any CPU.ActiveCfg = Debug|x64 + {BD779298-8631-3F5D-AA59-82897E5454A7}.Debug|Any CPU.Build.0 = Debug|x64 + {BD779298-8631-3F5D-AA59-82897E5454A7}.Debug|x64.ActiveCfg = Debug|x64 + {BD779298-8631-3F5D-AA59-82897E5454A7}.Debug|x64.Build.0 = Debug|x64 + {BD779298-8631-3F5D-AA59-82897E5454A7}.Debug|x86.ActiveCfg = Debug|x64 + {BD779298-8631-3F5D-AA59-82897E5454A7}.Release|Any CPU.ActiveCfg = Release|x64 + {BD779298-8631-3F5D-AA59-82897E5454A7}.Release|Any CPU.Build.0 = Release|x64 + {BD779298-8631-3F5D-AA59-82897E5454A7}.Release|x64.ActiveCfg = Release|x64 + {BD779298-8631-3F5D-AA59-82897E5454A7}.Release|x64.Build.0 = Release|x64 + {BD779298-8631-3F5D-AA59-82897E5454A7}.Release|x86.ActiveCfg = Release|x64 + {BD779298-8631-3F5D-AA59-82897E5454A7}.Checked|Any CPU.ActiveCfg = Checked|x64 + {BD779298-8631-3F5D-AA59-82897E5454A7}.Checked|Any CPU.Build.0 = Checked|x64 + {BD779298-8631-3F5D-AA59-82897E5454A7}.Checked|x64.ActiveCfg = Checked|x64 + {BD779298-8631-3F5D-AA59-82897E5454A7}.Checked|x64.Build.0 = Checked|x64 + {BD779298-8631-3F5D-AA59-82897E5454A7}.Checked|x86.ActiveCfg = Checked|x64 + {BD779298-8631-3F5D-AA59-82897E5454A7}.RelWithDebInfo|Any CPU.ActiveCfg = RelWithDebInfo|x64 + {BD779298-8631-3F5D-AA59-82897E5454A7}.RelWithDebInfo|Any CPU.Build.0 = RelWithDebInfo|x64 + {BD779298-8631-3F5D-AA59-82897E5454A7}.RelWithDebInfo|x64.ActiveCfg = RelWithDebInfo|x64 + {BD779298-8631-3F5D-AA59-82897E5454A7}.RelWithDebInfo|x64.Build.0 = RelWithDebInfo|x64 + {BD779298-8631-3F5D-AA59-82897E5454A7}.RelWithDebInfo|x86.ActiveCfg = RelWithDebInfo|x64 + {B0E21A12-2374-44F1-8506-83A15B628546}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {B0E21A12-2374-44F1-8506-83A15B628546}.Debug|Any CPU.Build.0 = Debug|Any CPU + {B0E21A12-2374-44F1-8506-83A15B628546}.Debug|x64.ActiveCfg = Debug|Any CPU + {B0E21A12-2374-44F1-8506-83A15B628546}.Debug|x64.Build.0 = Debug|Any CPU + {B0E21A12-2374-44F1-8506-83A15B628546}.Debug|x86.ActiveCfg = Debug|Any CPU + {B0E21A12-2374-44F1-8506-83A15B628546}.Debug|x86.Build.0 = Debug|Any CPU + {B0E21A12-2374-44F1-8506-83A15B628546}.Release|Any CPU.ActiveCfg = Release|Any CPU + {B0E21A12-2374-44F1-8506-83A15B628546}.Release|Any CPU.Build.0 = Release|Any CPU + {B0E21A12-2374-44F1-8506-83A15B628546}.Release|x64.ActiveCfg = Release|Any CPU + {B0E21A12-2374-44F1-8506-83A15B628546}.Release|x64.Build.0 = Release|Any CPU + {B0E21A12-2374-44F1-8506-83A15B628546}.Release|x86.ActiveCfg = Release|Any CPU + {B0E21A12-2374-44F1-8506-83A15B628546}.Release|x86.Build.0 = Release|Any CPU + {B0E21A12-2374-44F1-8506-83A15B628546}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {B0E21A12-2374-44F1-8506-83A15B628546}.Checked|x64.ActiveCfg = Debug|Any CPU + {B0E21A12-2374-44F1-8506-83A15B628546}.Checked|x86.ActiveCfg = Debug|Any CPU + {B0E21A12-2374-44F1-8506-83A15B628546}.RelWithDebInfo|Any CPU.ActiveCfg = Debug|Any CPU + {B0E21A12-2374-44F1-8506-83A15B628546}.RelWithDebInfo|x64.ActiveCfg = Debug|Any CPU + {B0E21A12-2374-44F1-8506-83A15B628546}.RelWithDebInfo|x86.ActiveCfg = Debug|Any CPU + {5C66B7B3-090E-41A7-8071-ACC56AD07D11}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {5C66B7B3-090E-41A7-8071-ACC56AD07D11}.Debug|Any CPU.Build.0 = Debug|Any CPU + {5C66B7B3-090E-41A7-8071-ACC56AD07D11}.Debug|x64.ActiveCfg = Debug|Any CPU + {5C66B7B3-090E-41A7-8071-ACC56AD07D11}.Debug|x64.Build.0 = Debug|Any CPU + {5C66B7B3-090E-41A7-8071-ACC56AD07D11}.Debug|x86.ActiveCfg = Debug|Any CPU + {5C66B7B3-090E-41A7-8071-ACC56AD07D11}.Debug|x86.Build.0 = Debug|Any CPU + {5C66B7B3-090E-41A7-8071-ACC56AD07D11}.Release|Any CPU.ActiveCfg = Release|Any CPU + {5C66B7B3-090E-41A7-8071-ACC56AD07D11}.Release|Any CPU.Build.0 = Release|Any CPU + {5C66B7B3-090E-41A7-8071-ACC56AD07D11}.Release|x64.ActiveCfg = Release|Any CPU + {5C66B7B3-090E-41A7-8071-ACC56AD07D11}.Release|x64.Build.0 = Release|Any CPU + {5C66B7B3-090E-41A7-8071-ACC56AD07D11}.Release|x86.ActiveCfg = Release|Any CPU + {5C66B7B3-090E-41A7-8071-ACC56AD07D11}.Release|x86.Build.0 = Release|Any CPU + {5C66B7B3-090E-41A7-8071-ACC56AD07D11}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {5C66B7B3-090E-41A7-8071-ACC56AD07D11}.Checked|x64.ActiveCfg = Debug|Any CPU + {5C66B7B3-090E-41A7-8071-ACC56AD07D11}.Checked|x86.ActiveCfg = Debug|Any CPU + {5C66B7B3-090E-41A7-8071-ACC56AD07D11}.RelWithDebInfo|Any CPU.ActiveCfg = Debug|Any CPU + {5C66B7B3-090E-41A7-8071-ACC56AD07D11}.RelWithDebInfo|x64.ActiveCfg = Debug|Any CPU + {5C66B7B3-090E-41A7-8071-ACC56AD07D11}.RelWithDebInfo|x86.ActiveCfg = Debug|Any CPU + {AD8C76B0-7619-4E15-A7C1-D0F9F2D5B533}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {AD8C76B0-7619-4E15-A7C1-D0F9F2D5B533}.Debug|Any CPU.Build.0 = Debug|Any CPU + {AD8C76B0-7619-4E15-A7C1-D0F9F2D5B533}.Debug|x64.ActiveCfg = Debug|Any CPU + {AD8C76B0-7619-4E15-A7C1-D0F9F2D5B533}.Debug|x64.Build.0 = Debug|Any CPU + {AD8C76B0-7619-4E15-A7C1-D0F9F2D5B533}.Debug|x86.ActiveCfg = Debug|Any CPU + {AD8C76B0-7619-4E15-A7C1-D0F9F2D5B533}.Debug|x86.Build.0 = Debug|Any CPU + {AD8C76B0-7619-4E15-A7C1-D0F9F2D5B533}.Release|Any CPU.ActiveCfg = Release|Any CPU + {AD8C76B0-7619-4E15-A7C1-D0F9F2D5B533}.Release|Any CPU.Build.0 = Release|Any CPU + {AD8C76B0-7619-4E15-A7C1-D0F9F2D5B533}.Release|x64.ActiveCfg = Release|Any CPU + {AD8C76B0-7619-4E15-A7C1-D0F9F2D5B533}.Release|x64.Build.0 = Release|Any CPU + {AD8C76B0-7619-4E15-A7C1-D0F9F2D5B533}.Release|x86.ActiveCfg = Release|Any CPU + {AD8C76B0-7619-4E15-A7C1-D0F9F2D5B533}.Release|x86.Build.0 = Release|Any CPU + {AD8C76B0-7619-4E15-A7C1-D0F9F2D5B533}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {AD8C76B0-7619-4E15-A7C1-D0F9F2D5B533}.Checked|x64.ActiveCfg = Debug|Any CPU + {AD8C76B0-7619-4E15-A7C1-D0F9F2D5B533}.Checked|x86.ActiveCfg = Debug|Any CPU + {AD8C76B0-7619-4E15-A7C1-D0F9F2D5B533}.RelWithDebInfo|Any CPU.ActiveCfg = Debug|Any CPU + {AD8C76B0-7619-4E15-A7C1-D0F9F2D5B533}.RelWithDebInfo|x64.ActiveCfg = Debug|Any CPU + {AD8C76B0-7619-4E15-A7C1-D0F9F2D5B533}.RelWithDebInfo|x86.ActiveCfg = Debug|Any CPU + {3D94BDA0-5FAC-42BD-A422-67CB1F61F5C1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {3D94BDA0-5FAC-42BD-A422-67CB1F61F5C1}.Debug|Any CPU.Build.0 = Debug|Any CPU + {3D94BDA0-5FAC-42BD-A422-67CB1F61F5C1}.Debug|x64.ActiveCfg = Debug|Any CPU + {3D94BDA0-5FAC-42BD-A422-67CB1F61F5C1}.Debug|x64.Build.0 = Debug|Any CPU + {3D94BDA0-5FAC-42BD-A422-67CB1F61F5C1}.Debug|x86.ActiveCfg = Debug|Any CPU + {3D94BDA0-5FAC-42BD-A422-67CB1F61F5C1}.Debug|x86.Build.0 = Debug|Any CPU + {3D94BDA0-5FAC-42BD-A422-67CB1F61F5C1}.Release|Any CPU.ActiveCfg = Release|Any CPU + {3D94BDA0-5FAC-42BD-A422-67CB1F61F5C1}.Release|Any CPU.Build.0 = Release|Any CPU + {3D94BDA0-5FAC-42BD-A422-67CB1F61F5C1}.Release|x64.ActiveCfg = Release|Any CPU + {3D94BDA0-5FAC-42BD-A422-67CB1F61F5C1}.Release|x64.Build.0 = Release|Any CPU + {3D94BDA0-5FAC-42BD-A422-67CB1F61F5C1}.Release|x86.ActiveCfg = Release|Any CPU + {3D94BDA0-5FAC-42BD-A422-67CB1F61F5C1}.Release|x86.Build.0 = Release|Any CPU + {3D94BDA0-5FAC-42BD-A422-67CB1F61F5C1}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {3D94BDA0-5FAC-42BD-A422-67CB1F61F5C1}.Checked|x64.ActiveCfg = Debug|Any CPU + {3D94BDA0-5FAC-42BD-A422-67CB1F61F5C1}.Checked|x86.ActiveCfg = Debug|Any CPU + {3D94BDA0-5FAC-42BD-A422-67CB1F61F5C1}.RelWithDebInfo|Any CPU.ActiveCfg = Debug|Any CPU + {3D94BDA0-5FAC-42BD-A422-67CB1F61F5C1}.RelWithDebInfo|x64.ActiveCfg = Debug|Any CPU + {3D94BDA0-5FAC-42BD-A422-67CB1F61F5C1}.RelWithDebInfo|x86.ActiveCfg = Debug|Any CPU + {E5CCCC14-91A5-4AB1-A34A-5D2259DD897B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {E5CCCC14-91A5-4AB1-A34A-5D2259DD897B}.Debug|Any CPU.Build.0 = Debug|Any CPU + {E5CCCC14-91A5-4AB1-A34A-5D2259DD897B}.Debug|x64.ActiveCfg = Debug|Any CPU + {E5CCCC14-91A5-4AB1-A34A-5D2259DD897B}.Debug|x64.Build.0 = Debug|Any CPU + {E5CCCC14-91A5-4AB1-A34A-5D2259DD897B}.Debug|x86.ActiveCfg = Debug|Any CPU + {E5CCCC14-91A5-4AB1-A34A-5D2259DD897B}.Debug|x86.Build.0 = Debug|Any CPU + {E5CCCC14-91A5-4AB1-A34A-5D2259DD897B}.Release|Any CPU.ActiveCfg = Release|Any CPU + {E5CCCC14-91A5-4AB1-A34A-5D2259DD897B}.Release|Any CPU.Build.0 = Release|Any CPU + {E5CCCC14-91A5-4AB1-A34A-5D2259DD897B}.Release|x64.ActiveCfg = Release|Any CPU + {E5CCCC14-91A5-4AB1-A34A-5D2259DD897B}.Release|x64.Build.0 = Release|Any CPU + {E5CCCC14-91A5-4AB1-A34A-5D2259DD897B}.Release|x86.ActiveCfg = Release|Any CPU + {E5CCCC14-91A5-4AB1-A34A-5D2259DD897B}.Release|x86.Build.0 = Release|Any CPU + {E5CCCC14-91A5-4AB1-A34A-5D2259DD897B}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {E5CCCC14-91A5-4AB1-A34A-5D2259DD897B}.Checked|x64.ActiveCfg = Debug|Any CPU + {E5CCCC14-91A5-4AB1-A34A-5D2259DD897B}.Checked|x86.ActiveCfg = Debug|Any CPU + {E5CCCC14-91A5-4AB1-A34A-5D2259DD897B}.RelWithDebInfo|Any CPU.ActiveCfg = Debug|Any CPU + {E5CCCC14-91A5-4AB1-A34A-5D2259DD897B}.RelWithDebInfo|x64.ActiveCfg = Debug|Any CPU + {E5CCCC14-91A5-4AB1-A34A-5D2259DD897B}.RelWithDebInfo|x86.ActiveCfg = Debug|Any CPU + {3E683795-56AF-4073-9B59-996B09FFEE6A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {3E683795-56AF-4073-9B59-996B09FFEE6A}.Debug|Any CPU.Build.0 = Debug|Any CPU + {3E683795-56AF-4073-9B59-996B09FFEE6A}.Debug|x64.ActiveCfg = Debug|Any CPU + {3E683795-56AF-4073-9B59-996B09FFEE6A}.Debug|x64.Build.0 = Debug|Any CPU + {3E683795-56AF-4073-9B59-996B09FFEE6A}.Debug|x86.ActiveCfg = Debug|Any CPU + {3E683795-56AF-4073-9B59-996B09FFEE6A}.Debug|x86.Build.0 = Debug|Any CPU + {3E683795-56AF-4073-9B59-996B09FFEE6A}.Release|Any CPU.ActiveCfg = Release|Any CPU + {3E683795-56AF-4073-9B59-996B09FFEE6A}.Release|Any CPU.Build.0 = Release|Any CPU + {3E683795-56AF-4073-9B59-996B09FFEE6A}.Release|x64.ActiveCfg = Release|Any CPU + {3E683795-56AF-4073-9B59-996B09FFEE6A}.Release|x64.Build.0 = Release|Any CPU + {3E683795-56AF-4073-9B59-996B09FFEE6A}.Release|x86.ActiveCfg = Release|Any CPU + {3E683795-56AF-4073-9B59-996B09FFEE6A}.Release|x86.Build.0 = Release|Any CPU + {3E683795-56AF-4073-9B59-996B09FFEE6A}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {3E683795-56AF-4073-9B59-996B09FFEE6A}.Checked|x64.ActiveCfg = Debug|Any CPU + {3E683795-56AF-4073-9B59-996B09FFEE6A}.Checked|x86.ActiveCfg = Debug|Any CPU + {3E683795-56AF-4073-9B59-996B09FFEE6A}.RelWithDebInfo|Any CPU.ActiveCfg = Debug|Any CPU + {3E683795-56AF-4073-9B59-996B09FFEE6A}.RelWithDebInfo|x64.ActiveCfg = Debug|Any CPU + {3E683795-56AF-4073-9B59-996B09FFEE6A}.RelWithDebInfo|x86.ActiveCfg = Debug|Any CPU + {0DFA2E76-13E8-44DA-B186-E3D20CE07E47}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {0DFA2E76-13E8-44DA-B186-E3D20CE07E47}.Debug|Any CPU.Build.0 = Debug|Any CPU + {0DFA2E76-13E8-44DA-B186-E3D20CE07E47}.Debug|x64.ActiveCfg = Debug|Any CPU + {0DFA2E76-13E8-44DA-B186-E3D20CE07E47}.Debug|x64.Build.0 = Debug|Any CPU + {0DFA2E76-13E8-44DA-B186-E3D20CE07E47}.Debug|x86.ActiveCfg = Debug|Any CPU + {0DFA2E76-13E8-44DA-B186-E3D20CE07E47}.Debug|x86.Build.0 = Debug|Any CPU + {0DFA2E76-13E8-44DA-B186-E3D20CE07E47}.Release|Any CPU.ActiveCfg = Release|Any CPU + {0DFA2E76-13E8-44DA-B186-E3D20CE07E47}.Release|Any CPU.Build.0 = Release|Any CPU + {0DFA2E76-13E8-44DA-B186-E3D20CE07E47}.Release|x64.ActiveCfg = Release|Any CPU + {0DFA2E76-13E8-44DA-B186-E3D20CE07E47}.Release|x64.Build.0 = Release|Any CPU + {0DFA2E76-13E8-44DA-B186-E3D20CE07E47}.Release|x86.ActiveCfg = Release|Any CPU + {0DFA2E76-13E8-44DA-B186-E3D20CE07E47}.Release|x86.Build.0 = Release|Any CPU + {0DFA2E76-13E8-44DA-B186-E3D20CE07E47}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {0DFA2E76-13E8-44DA-B186-E3D20CE07E47}.Checked|x64.ActiveCfg = Debug|Any CPU + {0DFA2E76-13E8-44DA-B186-E3D20CE07E47}.Checked|x86.ActiveCfg = Debug|Any CPU + {0DFA2E76-13E8-44DA-B186-E3D20CE07E47}.RelWithDebInfo|Any CPU.ActiveCfg = Debug|Any CPU + {0DFA2E76-13E8-44DA-B186-E3D20CE07E47}.RelWithDebInfo|x64.ActiveCfg = Debug|Any CPU + {0DFA2E76-13E8-44DA-B186-E3D20CE07E47}.RelWithDebInfo|x86.ActiveCfg = Debug|Any CPU + {885D1F3B-D204-49F6-B953-F284EA451AFD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {885D1F3B-D204-49F6-B953-F284EA451AFD}.Debug|Any CPU.Build.0 = Debug|Any CPU + {885D1F3B-D204-49F6-B953-F284EA451AFD}.Debug|x64.ActiveCfg = Debug|Any CPU + {885D1F3B-D204-49F6-B953-F284EA451AFD}.Debug|x64.Build.0 = Debug|Any CPU + {885D1F3B-D204-49F6-B953-F284EA451AFD}.Debug|x86.ActiveCfg = Debug|Any CPU + {885D1F3B-D204-49F6-B953-F284EA451AFD}.Debug|x86.Build.0 = Debug|Any CPU + {885D1F3B-D204-49F6-B953-F284EA451AFD}.Release|Any CPU.ActiveCfg = Release|Any CPU + {885D1F3B-D204-49F6-B953-F284EA451AFD}.Release|Any CPU.Build.0 = Release|Any CPU + {885D1F3B-D204-49F6-B953-F284EA451AFD}.Release|x64.ActiveCfg = Release|Any CPU + {885D1F3B-D204-49F6-B953-F284EA451AFD}.Release|x64.Build.0 = Release|Any CPU + {885D1F3B-D204-49F6-B953-F284EA451AFD}.Release|x86.ActiveCfg = Release|Any CPU + {885D1F3B-D204-49F6-B953-F284EA451AFD}.Release|x86.Build.0 = Release|Any CPU + {885D1F3B-D204-49F6-B953-F284EA451AFD}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {885D1F3B-D204-49F6-B953-F284EA451AFD}.Checked|x64.ActiveCfg = Debug|Any CPU + {885D1F3B-D204-49F6-B953-F284EA451AFD}.Checked|x86.ActiveCfg = Debug|Any CPU + {885D1F3B-D204-49F6-B953-F284EA451AFD}.RelWithDebInfo|Any CPU.ActiveCfg = Debug|Any CPU + {885D1F3B-D204-49F6-B953-F284EA451AFD}.RelWithDebInfo|x64.ActiveCfg = Debug|Any CPU + {885D1F3B-D204-49F6-B953-F284EA451AFD}.RelWithDebInfo|x86.ActiveCfg = Debug|Any CPU + {EBE9CD5C-C44D-4B56-81AB-1EB7C2B8C6D1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {EBE9CD5C-C44D-4B56-81AB-1EB7C2B8C6D1}.Debug|Any CPU.Build.0 = Debug|Any CPU + {EBE9CD5C-C44D-4B56-81AB-1EB7C2B8C6D1}.Debug|x64.ActiveCfg = Debug|Any CPU + {EBE9CD5C-C44D-4B56-81AB-1EB7C2B8C6D1}.Debug|x64.Build.0 = Debug|Any CPU + {EBE9CD5C-C44D-4B56-81AB-1EB7C2B8C6D1}.Debug|x86.ActiveCfg = Debug|Any CPU + {EBE9CD5C-C44D-4B56-81AB-1EB7C2B8C6D1}.Debug|x86.Build.0 = Debug|Any CPU + {EBE9CD5C-C44D-4B56-81AB-1EB7C2B8C6D1}.Release|Any CPU.ActiveCfg = Release|Any CPU + {EBE9CD5C-C44D-4B56-81AB-1EB7C2B8C6D1}.Release|Any CPU.Build.0 = Release|Any CPU + {EBE9CD5C-C44D-4B56-81AB-1EB7C2B8C6D1}.Release|x64.ActiveCfg = Release|Any CPU + {EBE9CD5C-C44D-4B56-81AB-1EB7C2B8C6D1}.Release|x64.Build.0 = Release|Any CPU + {EBE9CD5C-C44D-4B56-81AB-1EB7C2B8C6D1}.Release|x86.ActiveCfg = Release|Any CPU + {EBE9CD5C-C44D-4B56-81AB-1EB7C2B8C6D1}.Release|x86.Build.0 = Release|Any CPU + {EBE9CD5C-C44D-4B56-81AB-1EB7C2B8C6D1}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {EBE9CD5C-C44D-4B56-81AB-1EB7C2B8C6D1}.Checked|x64.ActiveCfg = Debug|Any CPU + {EBE9CD5C-C44D-4B56-81AB-1EB7C2B8C6D1}.Checked|x86.ActiveCfg = Debug|Any CPU + {EBE9CD5C-C44D-4B56-81AB-1EB7C2B8C6D1}.RelWithDebInfo|Any CPU.ActiveCfg = Debug|Any CPU + {EBE9CD5C-C44D-4B56-81AB-1EB7C2B8C6D1}.RelWithDebInfo|x64.ActiveCfg = Debug|Any CPU + {EBE9CD5C-C44D-4B56-81AB-1EB7C2B8C6D1}.RelWithDebInfo|x86.ActiveCfg = Debug|Any CPU + {94F1B6F2-82E0-41F0-A523-730C0FFACA15}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {94F1B6F2-82E0-41F0-A523-730C0FFACA15}.Debug|Any CPU.Build.0 = Debug|Any CPU + {94F1B6F2-82E0-41F0-A523-730C0FFACA15}.Debug|x64.ActiveCfg = Debug|Any CPU + {94F1B6F2-82E0-41F0-A523-730C0FFACA15}.Debug|x64.Build.0 = Debug|Any CPU + {94F1B6F2-82E0-41F0-A523-730C0FFACA15}.Debug|x86.ActiveCfg = Debug|Any CPU + {94F1B6F2-82E0-41F0-A523-730C0FFACA15}.Debug|x86.Build.0 = Debug|Any CPU + {94F1B6F2-82E0-41F0-A523-730C0FFACA15}.Release|Any CPU.ActiveCfg = Release|Any CPU + {94F1B6F2-82E0-41F0-A523-730C0FFACA15}.Release|Any CPU.Build.0 = Release|Any CPU + {94F1B6F2-82E0-41F0-A523-730C0FFACA15}.Release|x64.ActiveCfg = Release|Any CPU + {94F1B6F2-82E0-41F0-A523-730C0FFACA15}.Release|x64.Build.0 = Release|Any CPU + {94F1B6F2-82E0-41F0-A523-730C0FFACA15}.Release|x86.ActiveCfg = Release|Any CPU + {94F1B6F2-82E0-41F0-A523-730C0FFACA15}.Release|x86.Build.0 = Release|Any CPU + {94F1B6F2-82E0-41F0-A523-730C0FFACA15}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {94F1B6F2-82E0-41F0-A523-730C0FFACA15}.Checked|x64.ActiveCfg = Debug|Any CPU + {94F1B6F2-82E0-41F0-A523-730C0FFACA15}.Checked|x86.ActiveCfg = Debug|Any CPU + {94F1B6F2-82E0-41F0-A523-730C0FFACA15}.RelWithDebInfo|Any CPU.ActiveCfg = Debug|Any CPU + {94F1B6F2-82E0-41F0-A523-730C0FFACA15}.RelWithDebInfo|x64.ActiveCfg = Debug|Any CPU + {94F1B6F2-82E0-41F0-A523-730C0FFACA15}.RelWithDebInfo|x86.ActiveCfg = Debug|Any CPU + {6157D6AA-3ECB-44AC-9956-D628E29A591C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {6157D6AA-3ECB-44AC-9956-D628E29A591C}.Debug|Any CPU.Build.0 = Debug|Any CPU + {6157D6AA-3ECB-44AC-9956-D628E29A591C}.Debug|x64.ActiveCfg = Debug|Any CPU + {6157D6AA-3ECB-44AC-9956-D628E29A591C}.Debug|x64.Build.0 = Debug|Any CPU + {6157D6AA-3ECB-44AC-9956-D628E29A591C}.Debug|x86.ActiveCfg = Debug|Any CPU + {6157D6AA-3ECB-44AC-9956-D628E29A591C}.Debug|x86.Build.0 = Debug|Any CPU + {6157D6AA-3ECB-44AC-9956-D628E29A591C}.Release|Any CPU.ActiveCfg = Release|Any CPU + {6157D6AA-3ECB-44AC-9956-D628E29A591C}.Release|Any CPU.Build.0 = Release|Any CPU + {6157D6AA-3ECB-44AC-9956-D628E29A591C}.Release|x64.ActiveCfg = Release|Any CPU + {6157D6AA-3ECB-44AC-9956-D628E29A591C}.Release|x64.Build.0 = Release|Any CPU + {6157D6AA-3ECB-44AC-9956-D628E29A591C}.Release|x86.ActiveCfg = Release|Any CPU + {6157D6AA-3ECB-44AC-9956-D628E29A591C}.Release|x86.Build.0 = Release|Any CPU + {6157D6AA-3ECB-44AC-9956-D628E29A591C}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {6157D6AA-3ECB-44AC-9956-D628E29A591C}.Checked|x64.ActiveCfg = Debug|Any CPU + {6157D6AA-3ECB-44AC-9956-D628E29A591C}.Checked|x86.ActiveCfg = Debug|Any CPU + {6157D6AA-3ECB-44AC-9956-D628E29A591C}.RelWithDebInfo|Any CPU.ActiveCfg = Debug|Any CPU + {6157D6AA-3ECB-44AC-9956-D628E29A591C}.RelWithDebInfo|x64.ActiveCfg = Debug|Any CPU + {6157D6AA-3ECB-44AC-9956-D628E29A591C}.RelWithDebInfo|x86.ActiveCfg = Debug|Any CPU + {030A401B-157B-473F-98AC-74462FD76A59}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {030A401B-157B-473F-98AC-74462FD76A59}.Debug|Any CPU.Build.0 = Debug|Any CPU + {030A401B-157B-473F-98AC-74462FD76A59}.Debug|x64.ActiveCfg = Debug|Any CPU + {030A401B-157B-473F-98AC-74462FD76A59}.Debug|x64.Build.0 = Debug|Any CPU + {030A401B-157B-473F-98AC-74462FD76A59}.Debug|x86.ActiveCfg = Debug|Any CPU + {030A401B-157B-473F-98AC-74462FD76A59}.Debug|x86.Build.0 = Debug|Any CPU + {030A401B-157B-473F-98AC-74462FD76A59}.Release|Any CPU.ActiveCfg = Release|Any CPU + {030A401B-157B-473F-98AC-74462FD76A59}.Release|Any CPU.Build.0 = Release|Any CPU + {030A401B-157B-473F-98AC-74462FD76A59}.Release|x64.ActiveCfg = Release|Any CPU + {030A401B-157B-473F-98AC-74462FD76A59}.Release|x64.Build.0 = Release|Any CPU + {030A401B-157B-473F-98AC-74462FD76A59}.Release|x86.ActiveCfg = Release|Any CPU + {030A401B-157B-473F-98AC-74462FD76A59}.Release|x86.Build.0 = Release|Any CPU + {030A401B-157B-473F-98AC-74462FD76A59}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {030A401B-157B-473F-98AC-74462FD76A59}.Checked|x64.ActiveCfg = Debug|Any CPU + {030A401B-157B-473F-98AC-74462FD76A59}.Checked|x86.ActiveCfg = Debug|Any CPU + {030A401B-157B-473F-98AC-74462FD76A59}.RelWithDebInfo|Any CPU.ActiveCfg = Debug|Any CPU + {030A401B-157B-473F-98AC-74462FD76A59}.RelWithDebInfo|x64.ActiveCfg = Debug|Any CPU + {030A401B-157B-473F-98AC-74462FD76A59}.RelWithDebInfo|x86.ActiveCfg = Debug|Any CPU + {A9A7C879-C320-3327-BB84-16E1322E17AE}.Debug|Any CPU.ActiveCfg = Debug|x64 + {A9A7C879-C320-3327-BB84-16E1322E17AE}.Debug|Any CPU.Build.0 = Debug|x64 + {A9A7C879-C320-3327-BB84-16E1322E17AE}.Debug|x64.ActiveCfg = Debug|x64 + {A9A7C879-C320-3327-BB84-16E1322E17AE}.Debug|x64.Build.0 = Debug|x64 + {A9A7C879-C320-3327-BB84-16E1322E17AE}.Debug|x86.ActiveCfg = Debug|x64 + {A9A7C879-C320-3327-BB84-16E1322E17AE}.Release|Any CPU.ActiveCfg = Release|x64 + {A9A7C879-C320-3327-BB84-16E1322E17AE}.Release|Any CPU.Build.0 = Release|x64 + {A9A7C879-C320-3327-BB84-16E1322E17AE}.Release|x64.ActiveCfg = Release|x64 + {A9A7C879-C320-3327-BB84-16E1322E17AE}.Release|x64.Build.0 = Release|x64 + {A9A7C879-C320-3327-BB84-16E1322E17AE}.Release|x86.ActiveCfg = Release|x64 + {A9A7C879-C320-3327-BB84-16E1322E17AE}.Checked|Any CPU.ActiveCfg = Checked|x64 + {A9A7C879-C320-3327-BB84-16E1322E17AE}.Checked|Any CPU.Build.0 = Checked|x64 + {A9A7C879-C320-3327-BB84-16E1322E17AE}.Checked|x64.ActiveCfg = Checked|x64 + {A9A7C879-C320-3327-BB84-16E1322E17AE}.Checked|x64.Build.0 = Checked|x64 + {A9A7C879-C320-3327-BB84-16E1322E17AE}.Checked|x86.ActiveCfg = Checked|x64 + {A9A7C879-C320-3327-BB84-16E1322E17AE}.RelWithDebInfo|Any CPU.ActiveCfg = RelWithDebInfo|x64 + {A9A7C879-C320-3327-BB84-16E1322E17AE}.RelWithDebInfo|Any CPU.Build.0 = RelWithDebInfo|x64 + {A9A7C879-C320-3327-BB84-16E1322E17AE}.RelWithDebInfo|x64.ActiveCfg = RelWithDebInfo|x64 + {A9A7C879-C320-3327-BB84-16E1322E17AE}.RelWithDebInfo|x64.Build.0 = RelWithDebInfo|x64 + {A9A7C879-C320-3327-BB84-16E1322E17AE}.RelWithDebInfo|x86.ActiveCfg = RelWithDebInfo|x64 + {20EBC3C4-917C-402D-B778-9A6E3742BF5A}.Debug|Any CPU.ActiveCfg = Debug|x64 + {20EBC3C4-917C-402D-B778-9A6E3742BF5A}.Debug|Any CPU.Build.0 = Debug|x64 + {20EBC3C4-917C-402D-B778-9A6E3742BF5A}.Debug|x64.ActiveCfg = Debug|x64 + {20EBC3C4-917C-402D-B778-9A6E3742BF5A}.Debug|x64.Build.0 = Debug|x64 + {20EBC3C4-917C-402D-B778-9A6E3742BF5A}.Debug|x86.ActiveCfg = Debug|x64 + {20EBC3C4-917C-402D-B778-9A6E3742BF5A}.Release|Any CPU.ActiveCfg = Release|x64 + {20EBC3C4-917C-402D-B778-9A6E3742BF5A}.Release|Any CPU.Build.0 = Release|x64 + {20EBC3C4-917C-402D-B778-9A6E3742BF5A}.Release|x64.ActiveCfg = Release|x64 + {20EBC3C4-917C-402D-B778-9A6E3742BF5A}.Release|x64.Build.0 = Release|x64 + {20EBC3C4-917C-402D-B778-9A6E3742BF5A}.Release|x86.ActiveCfg = Release|x64 + {20EBC3C4-917C-402D-B778-9A6E3742BF5A}.Checked|Any CPU.ActiveCfg = Checked|x64 + {20EBC3C4-917C-402D-B778-9A6E3742BF5A}.Checked|Any CPU.Build.0 = Checked|x64 + {20EBC3C4-917C-402D-B778-9A6E3742BF5A}.Checked|x64.ActiveCfg = Checked|x64 + {20EBC3C4-917C-402D-B778-9A6E3742BF5A}.Checked|x64.Build.0 = Checked|x64 + {20EBC3C4-917C-402D-B778-9A6E3742BF5A}.Checked|x86.ActiveCfg = Checked|x64 + {20EBC3C4-917C-402D-B778-9A6E3742BF5A}.RelWithDebInfo|Any CPU.ActiveCfg = RelWithDebInfo|x64 + {20EBC3C4-917C-402D-B778-9A6E3742BF5A}.RelWithDebInfo|Any CPU.Build.0 = RelWithDebInfo|x64 + {20EBC3C4-917C-402D-B778-9A6E3742BF5A}.RelWithDebInfo|x64.ActiveCfg = RelWithDebInfo|x64 + {20EBC3C4-917C-402D-B778-9A6E3742BF5A}.RelWithDebInfo|x64.Build.0 = RelWithDebInfo|x64 + {20EBC3C4-917C-402D-B778-9A6E3742BF5A}.RelWithDebInfo|x86.ActiveCfg = RelWithDebInfo|x64 + {8C35FEF8-1101-38F6-ACD0-462A1EA53A7D}.Debug|Any CPU.ActiveCfg = Debug|x64 + {8C35FEF8-1101-38F6-ACD0-462A1EA53A7D}.Debug|Any CPU.Build.0 = Debug|x64 + {8C35FEF8-1101-38F6-ACD0-462A1EA53A7D}.Debug|x64.ActiveCfg = Debug|x64 + {8C35FEF8-1101-38F6-ACD0-462A1EA53A7D}.Debug|x64.Build.0 = Debug|x64 + {8C35FEF8-1101-38F6-ACD0-462A1EA53A7D}.Debug|x86.ActiveCfg = Debug|x64 + {8C35FEF8-1101-38F6-ACD0-462A1EA53A7D}.Release|Any CPU.ActiveCfg = Release|x64 + {8C35FEF8-1101-38F6-ACD0-462A1EA53A7D}.Release|Any CPU.Build.0 = Release|x64 + {8C35FEF8-1101-38F6-ACD0-462A1EA53A7D}.Release|x64.ActiveCfg = Release|x64 + {8C35FEF8-1101-38F6-ACD0-462A1EA53A7D}.Release|x64.Build.0 = Release|x64 + {8C35FEF8-1101-38F6-ACD0-462A1EA53A7D}.Release|x86.ActiveCfg = Release|x64 + {8C35FEF8-1101-38F6-ACD0-462A1EA53A7D}.Checked|Any CPU.ActiveCfg = Checked|x64 + {8C35FEF8-1101-38F6-ACD0-462A1EA53A7D}.Checked|Any CPU.Build.0 = Checked|x64 + {8C35FEF8-1101-38F6-ACD0-462A1EA53A7D}.Checked|x64.ActiveCfg = Checked|x64 + {8C35FEF8-1101-38F6-ACD0-462A1EA53A7D}.Checked|x64.Build.0 = Checked|x64 + {8C35FEF8-1101-38F6-ACD0-462A1EA53A7D}.Checked|x86.ActiveCfg = Checked|x64 + {8C35FEF8-1101-38F6-ACD0-462A1EA53A7D}.RelWithDebInfo|Any CPU.ActiveCfg = RelWithDebInfo|x64 + {8C35FEF8-1101-38F6-ACD0-462A1EA53A7D}.RelWithDebInfo|Any CPU.Build.0 = RelWithDebInfo|x64 + {8C35FEF8-1101-38F6-ACD0-462A1EA53A7D}.RelWithDebInfo|x64.ActiveCfg = RelWithDebInfo|x64 + {8C35FEF8-1101-38F6-ACD0-462A1EA53A7D}.RelWithDebInfo|x64.Build.0 = RelWithDebInfo|x64 + {8C35FEF8-1101-38F6-ACD0-462A1EA53A7D}.RelWithDebInfo|x86.ActiveCfg = RelWithDebInfo|x64 + {EEC90A42-CDCD-4EE3-B47D-C109D604E7E2}.Debug|Any CPU.ActiveCfg = Debug|x64 + {EEC90A42-CDCD-4EE3-B47D-C109D604E7E2}.Debug|Any CPU.Build.0 = Debug|x64 + {EEC90A42-CDCD-4EE3-B47D-C109D604E7E2}.Debug|x64.ActiveCfg = Debug|x64 + {EEC90A42-CDCD-4EE3-B47D-C109D604E7E2}.Debug|x64.Build.0 = Debug|x64 + {EEC90A42-CDCD-4EE3-B47D-C109D604E7E2}.Debug|x86.ActiveCfg = Debug|x64 + {EEC90A42-CDCD-4EE3-B47D-C109D604E7E2}.Release|Any CPU.ActiveCfg = Release|x64 + {EEC90A42-CDCD-4EE3-B47D-C109D604E7E2}.Release|Any CPU.Build.0 = Release|x64 + {EEC90A42-CDCD-4EE3-B47D-C109D604E7E2}.Release|x64.ActiveCfg = Release|x64 + {EEC90A42-CDCD-4EE3-B47D-C109D604E7E2}.Release|x64.Build.0 = Release|x64 + {EEC90A42-CDCD-4EE3-B47D-C109D604E7E2}.Release|x86.ActiveCfg = Release|x64 + {EEC90A42-CDCD-4EE3-B47D-C109D604E7E2}.Checked|Any CPU.ActiveCfg = Checked|x64 + {EEC90A42-CDCD-4EE3-B47D-C109D604E7E2}.Checked|Any CPU.Build.0 = Checked|x64 + {EEC90A42-CDCD-4EE3-B47D-C109D604E7E2}.Checked|x64.ActiveCfg = Checked|x64 + {EEC90A42-CDCD-4EE3-B47D-C109D604E7E2}.Checked|x64.Build.0 = Checked|x64 + {EEC90A42-CDCD-4EE3-B47D-C109D604E7E2}.Checked|x86.ActiveCfg = Checked|x64 + {EEC90A42-CDCD-4EE3-B47D-C109D604E7E2}.RelWithDebInfo|Any CPU.ActiveCfg = RelWithDebInfo|x64 + {EEC90A42-CDCD-4EE3-B47D-C109D604E7E2}.RelWithDebInfo|Any CPU.Build.0 = RelWithDebInfo|x64 + {EEC90A42-CDCD-4EE3-B47D-C109D604E7E2}.RelWithDebInfo|x64.ActiveCfg = RelWithDebInfo|x64 + {EEC90A42-CDCD-4EE3-B47D-C109D604E7E2}.RelWithDebInfo|x64.Build.0 = RelWithDebInfo|x64 + {EEC90A42-CDCD-4EE3-B47D-C109D604E7E2}.RelWithDebInfo|x86.ActiveCfg = RelWithDebInfo|x64 + {D52C65C4-2C7D-45E6-9F5C-6F3A96796018}.Debug|Any CPU.ActiveCfg = Debug|x64 + {D52C65C4-2C7D-45E6-9F5C-6F3A96796018}.Debug|Any CPU.Build.0 = Debug|x64 + {D52C65C4-2C7D-45E6-9F5C-6F3A96796018}.Debug|x64.ActiveCfg = Debug|x64 + {D52C65C4-2C7D-45E6-9F5C-6F3A96796018}.Debug|x64.Build.0 = Debug|x64 + {D52C65C4-2C7D-45E6-9F5C-6F3A96796018}.Debug|x86.ActiveCfg = Debug|x86 + {D52C65C4-2C7D-45E6-9F5C-6F3A96796018}.Debug|x86.Build.0 = Debug|x86 + {D52C65C4-2C7D-45E6-9F5C-6F3A96796018}.Release|Any CPU.ActiveCfg = Release|x64 + {D52C65C4-2C7D-45E6-9F5C-6F3A96796018}.Release|Any CPU.Build.0 = Release|x64 + {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}.Checked|Any CPU.ActiveCfg = Debug|x64 + {D52C65C4-2C7D-45E6-9F5C-6F3A96796018}.Checked|x64.ActiveCfg = Debug|x64 + {D52C65C4-2C7D-45E6-9F5C-6F3A96796018}.Checked|x86.ActiveCfg = Debug|x86 + {D52C65C4-2C7D-45E6-9F5C-6F3A96796018}.RelWithDebInfo|Any CPU.ActiveCfg = Debug|x64 + {D52C65C4-2C7D-45E6-9F5C-6F3A96796018}.RelWithDebInfo|x64.ActiveCfg = Debug|x64 + {D52C65C4-2C7D-45E6-9F5C-6F3A96796018}.RelWithDebInfo|x86.ActiveCfg = Debug|x86 + {0F848647-AF41-464F-BC7E-B363DCC4A54A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {0F848647-AF41-464F-BC7E-B363DCC4A54A}.Debug|Any CPU.Build.0 = Debug|Any CPU + {0F848647-AF41-464F-BC7E-B363DCC4A54A}.Debug|x64.ActiveCfg = Debug|Any CPU + {0F848647-AF41-464F-BC7E-B363DCC4A54A}.Debug|x64.Build.0 = Debug|Any CPU + {0F848647-AF41-464F-BC7E-B363DCC4A54A}.Debug|x86.ActiveCfg = Debug|Any CPU + {0F848647-AF41-464F-BC7E-B363DCC4A54A}.Debug|x86.Build.0 = Debug|Any CPU + {0F848647-AF41-464F-BC7E-B363DCC4A54A}.Release|Any CPU.ActiveCfg = Release|Any CPU + {0F848647-AF41-464F-BC7E-B363DCC4A54A}.Release|Any CPU.Build.0 = Release|Any CPU + {0F848647-AF41-464F-BC7E-B363DCC4A54A}.Release|x64.ActiveCfg = Release|Any CPU + {0F848647-AF41-464F-BC7E-B363DCC4A54A}.Release|x64.Build.0 = Release|Any CPU + {0F848647-AF41-464F-BC7E-B363DCC4A54A}.Release|x86.ActiveCfg = Release|Any CPU + {0F848647-AF41-464F-BC7E-B363DCC4A54A}.Release|x86.Build.0 = Release|Any CPU + {0F848647-AF41-464F-BC7E-B363DCC4A54A}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {0F848647-AF41-464F-BC7E-B363DCC4A54A}.Checked|x64.ActiveCfg = Debug|Any CPU + {0F848647-AF41-464F-BC7E-B363DCC4A54A}.Checked|x86.ActiveCfg = Debug|Any CPU + {0F848647-AF41-464F-BC7E-B363DCC4A54A}.RelWithDebInfo|Any CPU.ActiveCfg = Debug|Any CPU + {0F848647-AF41-464F-BC7E-B363DCC4A54A}.RelWithDebInfo|x64.ActiveCfg = Debug|Any CPU + {0F848647-AF41-464F-BC7E-B363DCC4A54A}.RelWithDebInfo|x86.ActiveCfg = Debug|Any CPU + {E77CB5ED-5F99-4148-8115-38E45E648F08}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {E77CB5ED-5F99-4148-8115-38E45E648F08}.Debug|Any CPU.Build.0 = Debug|Any CPU + {E77CB5ED-5F99-4148-8115-38E45E648F08}.Debug|x64.ActiveCfg = Debug|Any CPU + {E77CB5ED-5F99-4148-8115-38E45E648F08}.Debug|x64.Build.0 = Debug|Any CPU + {E77CB5ED-5F99-4148-8115-38E45E648F08}.Debug|x86.ActiveCfg = Debug|Any CPU + {E77CB5ED-5F99-4148-8115-38E45E648F08}.Debug|x86.Build.0 = Debug|Any CPU + {E77CB5ED-5F99-4148-8115-38E45E648F08}.Release|Any CPU.ActiveCfg = Release|Any CPU + {E77CB5ED-5F99-4148-8115-38E45E648F08}.Release|Any CPU.Build.0 = Release|Any CPU + {E77CB5ED-5F99-4148-8115-38E45E648F08}.Release|x64.ActiveCfg = Release|Any CPU + {E77CB5ED-5F99-4148-8115-38E45E648F08}.Release|x64.Build.0 = Release|Any CPU + {E77CB5ED-5F99-4148-8115-38E45E648F08}.Release|x86.ActiveCfg = Release|Any CPU + {E77CB5ED-5F99-4148-8115-38E45E648F08}.Release|x86.Build.0 = Release|Any CPU + {E77CB5ED-5F99-4148-8115-38E45E648F08}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {E77CB5ED-5F99-4148-8115-38E45E648F08}.Checked|x64.ActiveCfg = Debug|Any CPU + {E77CB5ED-5F99-4148-8115-38E45E648F08}.Checked|x86.ActiveCfg = Debug|Any CPU + {E77CB5ED-5F99-4148-8115-38E45E648F08}.RelWithDebInfo|Any CPU.ActiveCfg = Debug|Any CPU + {E77CB5ED-5F99-4148-8115-38E45E648F08}.RelWithDebInfo|x64.ActiveCfg = Debug|Any CPU + {E77CB5ED-5F99-4148-8115-38E45E648F08}.RelWithDebInfo|x86.ActiveCfg = Debug|Any CPU + {88686BB2-7A8A-4019-986C-9ED5045844E9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {88686BB2-7A8A-4019-986C-9ED5045844E9}.Debug|Any CPU.Build.0 = Debug|Any CPU + {88686BB2-7A8A-4019-986C-9ED5045844E9}.Debug|x64.ActiveCfg = Debug|Any CPU + {88686BB2-7A8A-4019-986C-9ED5045844E9}.Debug|x64.Build.0 = Debug|Any CPU + {88686BB2-7A8A-4019-986C-9ED5045844E9}.Debug|x86.ActiveCfg = Debug|Any CPU + {88686BB2-7A8A-4019-986C-9ED5045844E9}.Debug|x86.Build.0 = Debug|Any CPU + {88686BB2-7A8A-4019-986C-9ED5045844E9}.Release|Any CPU.ActiveCfg = Release|Any CPU + {88686BB2-7A8A-4019-986C-9ED5045844E9}.Release|Any CPU.Build.0 = Release|Any CPU + {88686BB2-7A8A-4019-986C-9ED5045844E9}.Release|x64.ActiveCfg = Release|Any CPU + {88686BB2-7A8A-4019-986C-9ED5045844E9}.Release|x64.Build.0 = Release|Any CPU + {88686BB2-7A8A-4019-986C-9ED5045844E9}.Release|x86.ActiveCfg = Release|Any CPU + {88686BB2-7A8A-4019-986C-9ED5045844E9}.Release|x86.Build.0 = Release|Any CPU + {88686BB2-7A8A-4019-986C-9ED5045844E9}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {88686BB2-7A8A-4019-986C-9ED5045844E9}.Checked|x64.ActiveCfg = Debug|Any CPU + {88686BB2-7A8A-4019-986C-9ED5045844E9}.Checked|x86.ActiveCfg = Debug|Any CPU + {88686BB2-7A8A-4019-986C-9ED5045844E9}.RelWithDebInfo|Any CPU.ActiveCfg = Debug|Any CPU + {88686BB2-7A8A-4019-986C-9ED5045844E9}.RelWithDebInfo|x64.ActiveCfg = Debug|Any CPU + {88686BB2-7A8A-4019-986C-9ED5045844E9}.RelWithDebInfo|x86.ActiveCfg = Debug|Any CPU + {7E252D99-B616-4234-9A63-26A00208AB27}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {7E252D99-B616-4234-9A63-26A00208AB27}.Debug|Any CPU.Build.0 = Debug|Any CPU + {7E252D99-B616-4234-9A63-26A00208AB27}.Debug|x64.ActiveCfg = Debug|Any CPU + {7E252D99-B616-4234-9A63-26A00208AB27}.Debug|x64.Build.0 = Debug|Any CPU + {7E252D99-B616-4234-9A63-26A00208AB27}.Debug|x86.ActiveCfg = Debug|Any CPU + {7E252D99-B616-4234-9A63-26A00208AB27}.Debug|x86.Build.0 = Debug|Any CPU + {7E252D99-B616-4234-9A63-26A00208AB27}.Release|Any CPU.ActiveCfg = Release|Any CPU + {7E252D99-B616-4234-9A63-26A00208AB27}.Release|Any CPU.Build.0 = Release|Any CPU + {7E252D99-B616-4234-9A63-26A00208AB27}.Release|x64.ActiveCfg = Release|Any CPU + {7E252D99-B616-4234-9A63-26A00208AB27}.Release|x64.Build.0 = Release|Any CPU + {7E252D99-B616-4234-9A63-26A00208AB27}.Release|x86.ActiveCfg = Release|Any CPU + {7E252D99-B616-4234-9A63-26A00208AB27}.Release|x86.Build.0 = Release|Any CPU + {7E252D99-B616-4234-9A63-26A00208AB27}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {7E252D99-B616-4234-9A63-26A00208AB27}.Checked|x64.ActiveCfg = Debug|Any CPU + {7E252D99-B616-4234-9A63-26A00208AB27}.Checked|x86.ActiveCfg = Debug|Any CPU + {7E252D99-B616-4234-9A63-26A00208AB27}.RelWithDebInfo|Any CPU.ActiveCfg = Debug|Any CPU + {7E252D99-B616-4234-9A63-26A00208AB27}.RelWithDebInfo|x64.ActiveCfg = Debug|Any CPU + {7E252D99-B616-4234-9A63-26A00208AB27}.RelWithDebInfo|x86.ActiveCfg = Debug|Any CPU + {02D40854-2429-4EF7-8405-04C87565853A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {02D40854-2429-4EF7-8405-04C87565853A}.Debug|Any CPU.Build.0 = Debug|Any CPU + {02D40854-2429-4EF7-8405-04C87565853A}.Debug|x64.ActiveCfg = Debug|Any CPU + {02D40854-2429-4EF7-8405-04C87565853A}.Debug|x64.Build.0 = Debug|Any CPU + {02D40854-2429-4EF7-8405-04C87565853A}.Debug|x86.ActiveCfg = Debug|Any CPU + {02D40854-2429-4EF7-8405-04C87565853A}.Debug|x86.Build.0 = Debug|Any CPU + {02D40854-2429-4EF7-8405-04C87565853A}.Release|Any CPU.ActiveCfg = Release|Any CPU + {02D40854-2429-4EF7-8405-04C87565853A}.Release|Any CPU.Build.0 = Release|Any CPU + {02D40854-2429-4EF7-8405-04C87565853A}.Release|x64.ActiveCfg = Release|Any CPU + {02D40854-2429-4EF7-8405-04C87565853A}.Release|x64.Build.0 = Release|Any CPU + {02D40854-2429-4EF7-8405-04C87565853A}.Release|x86.ActiveCfg = Release|Any CPU + {02D40854-2429-4EF7-8405-04C87565853A}.Release|x86.Build.0 = Release|Any CPU + {02D40854-2429-4EF7-8405-04C87565853A}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {02D40854-2429-4EF7-8405-04C87565853A}.Checked|x64.ActiveCfg = Debug|Any CPU + {02D40854-2429-4EF7-8405-04C87565853A}.Checked|x86.ActiveCfg = Debug|Any CPU + {02D40854-2429-4EF7-8405-04C87565853A}.RelWithDebInfo|Any CPU.ActiveCfg = Debug|Any CPU + {02D40854-2429-4EF7-8405-04C87565853A}.RelWithDebInfo|x64.ActiveCfg = Debug|Any CPU + {02D40854-2429-4EF7-8405-04C87565853A}.RelWithDebInfo|x86.ActiveCfg = Debug|Any CPU + {193E7716-8469-4A72-A689-27C5E828772C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {193E7716-8469-4A72-A689-27C5E828772C}.Debug|Any CPU.Build.0 = Debug|Any CPU + {193E7716-8469-4A72-A689-27C5E828772C}.Debug|x64.ActiveCfg = Debug|Any CPU + {193E7716-8469-4A72-A689-27C5E828772C}.Debug|x64.Build.0 = Debug|Any CPU + {193E7716-8469-4A72-A689-27C5E828772C}.Debug|x86.ActiveCfg = Debug|Any CPU + {193E7716-8469-4A72-A689-27C5E828772C}.Debug|x86.Build.0 = Debug|Any CPU + {193E7716-8469-4A72-A689-27C5E828772C}.Release|Any CPU.ActiveCfg = Release|Any CPU + {193E7716-8469-4A72-A689-27C5E828772C}.Release|Any CPU.Build.0 = Release|Any CPU + {193E7716-8469-4A72-A689-27C5E828772C}.Release|x64.ActiveCfg = Release|Any CPU + {193E7716-8469-4A72-A689-27C5E828772C}.Release|x64.Build.0 = Release|Any CPU + {193E7716-8469-4A72-A689-27C5E828772C}.Release|x86.ActiveCfg = Release|Any CPU + {193E7716-8469-4A72-A689-27C5E828772C}.Release|x86.Build.0 = Release|Any CPU + {193E7716-8469-4A72-A689-27C5E828772C}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {193E7716-8469-4A72-A689-27C5E828772C}.Checked|x64.ActiveCfg = Debug|Any CPU + {193E7716-8469-4A72-A689-27C5E828772C}.Checked|x86.ActiveCfg = Debug|Any CPU + {193E7716-8469-4A72-A689-27C5E828772C}.RelWithDebInfo|Any CPU.ActiveCfg = Debug|Any CPU + {193E7716-8469-4A72-A689-27C5E828772C}.RelWithDebInfo|x64.ActiveCfg = Debug|Any CPU + {193E7716-8469-4A72-A689-27C5E828772C}.RelWithDebInfo|x86.ActiveCfg = Debug|Any CPU + {87E9BB01-B579-4891-BA1C-BB600AC9829A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {87E9BB01-B579-4891-BA1C-BB600AC9829A}.Debug|Any CPU.Build.0 = Debug|Any CPU + {87E9BB01-B579-4891-BA1C-BB600AC9829A}.Debug|x64.ActiveCfg = Debug|Any CPU + {87E9BB01-B579-4891-BA1C-BB600AC9829A}.Debug|x64.Build.0 = Debug|Any CPU + {87E9BB01-B579-4891-BA1C-BB600AC9829A}.Debug|x86.ActiveCfg = Debug|Any CPU + {87E9BB01-B579-4891-BA1C-BB600AC9829A}.Debug|x86.Build.0 = Debug|Any CPU + {87E9BB01-B579-4891-BA1C-BB600AC9829A}.Release|Any CPU.ActiveCfg = Release|Any CPU + {87E9BB01-B579-4891-BA1C-BB600AC9829A}.Release|Any CPU.Build.0 = Release|Any CPU + {87E9BB01-B579-4891-BA1C-BB600AC9829A}.Release|x64.ActiveCfg = Release|Any CPU + {87E9BB01-B579-4891-BA1C-BB600AC9829A}.Release|x64.Build.0 = Release|Any CPU + {87E9BB01-B579-4891-BA1C-BB600AC9829A}.Release|x86.ActiveCfg = Release|Any CPU + {87E9BB01-B579-4891-BA1C-BB600AC9829A}.Release|x86.Build.0 = Release|Any CPU + {87E9BB01-B579-4891-BA1C-BB600AC9829A}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {87E9BB01-B579-4891-BA1C-BB600AC9829A}.Checked|x64.ActiveCfg = Debug|Any CPU + {87E9BB01-B579-4891-BA1C-BB600AC9829A}.Checked|x86.ActiveCfg = Debug|Any CPU + {87E9BB01-B579-4891-BA1C-BB600AC9829A}.RelWithDebInfo|Any CPU.ActiveCfg = Debug|Any CPU + {87E9BB01-B579-4891-BA1C-BB600AC9829A}.RelWithDebInfo|x64.ActiveCfg = Debug|Any CPU + {87E9BB01-B579-4891-BA1C-BB600AC9829A}.RelWithDebInfo|x86.ActiveCfg = Debug|Any CPU + {8F7085F1-DA86-4AA1-9801-2A9A2498E7BB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {8F7085F1-DA86-4AA1-9801-2A9A2498E7BB}.Debug|Any CPU.Build.0 = Debug|Any CPU + {8F7085F1-DA86-4AA1-9801-2A9A2498E7BB}.Debug|x64.ActiveCfg = Debug|Any CPU + {8F7085F1-DA86-4AA1-9801-2A9A2498E7BB}.Debug|x64.Build.0 = Debug|Any CPU + {8F7085F1-DA86-4AA1-9801-2A9A2498E7BB}.Debug|x86.ActiveCfg = Debug|Any CPU + {8F7085F1-DA86-4AA1-9801-2A9A2498E7BB}.Debug|x86.Build.0 = Debug|Any CPU + {8F7085F1-DA86-4AA1-9801-2A9A2498E7BB}.Release|Any CPU.ActiveCfg = Release|Any CPU + {8F7085F1-DA86-4AA1-9801-2A9A2498E7BB}.Release|Any CPU.Build.0 = Release|Any CPU + {8F7085F1-DA86-4AA1-9801-2A9A2498E7BB}.Release|x64.ActiveCfg = Release|Any CPU + {8F7085F1-DA86-4AA1-9801-2A9A2498E7BB}.Release|x64.Build.0 = Release|Any CPU + {8F7085F1-DA86-4AA1-9801-2A9A2498E7BB}.Release|x86.ActiveCfg = Release|Any CPU + {8F7085F1-DA86-4AA1-9801-2A9A2498E7BB}.Release|x86.Build.0 = Release|Any CPU + {8F7085F1-DA86-4AA1-9801-2A9A2498E7BB}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {8F7085F1-DA86-4AA1-9801-2A9A2498E7BB}.Checked|x64.ActiveCfg = Debug|Any CPU + {8F7085F1-DA86-4AA1-9801-2A9A2498E7BB}.Checked|x86.ActiveCfg = Debug|Any CPU + {8F7085F1-DA86-4AA1-9801-2A9A2498E7BB}.RelWithDebInfo|Any CPU.ActiveCfg = Debug|Any CPU + {8F7085F1-DA86-4AA1-9801-2A9A2498E7BB}.RelWithDebInfo|x64.ActiveCfg = Debug|Any CPU + {8F7085F1-DA86-4AA1-9801-2A9A2498E7BB}.RelWithDebInfo|x86.ActiveCfg = Debug|Any CPU + {F682A9D8-9523-406A-9357-E48B463A8303}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {F682A9D8-9523-406A-9357-E48B463A8303}.Debug|Any CPU.Build.0 = Debug|Any CPU + {F682A9D8-9523-406A-9357-E48B463A8303}.Debug|x64.ActiveCfg = Debug|Any CPU + {F682A9D8-9523-406A-9357-E48B463A8303}.Debug|x64.Build.0 = Debug|Any CPU + {F682A9D8-9523-406A-9357-E48B463A8303}.Debug|x86.ActiveCfg = Debug|Any CPU + {F682A9D8-9523-406A-9357-E48B463A8303}.Debug|x86.Build.0 = Debug|Any CPU + {F682A9D8-9523-406A-9357-E48B463A8303}.Release|Any CPU.ActiveCfg = Release|Any CPU + {F682A9D8-9523-406A-9357-E48B463A8303}.Release|Any CPU.Build.0 = Release|Any CPU + {F682A9D8-9523-406A-9357-E48B463A8303}.Release|x64.ActiveCfg = Release|Any CPU + {F682A9D8-9523-406A-9357-E48B463A8303}.Release|x64.Build.0 = Release|Any CPU + {F682A9D8-9523-406A-9357-E48B463A8303}.Release|x86.ActiveCfg = Release|Any CPU + {F682A9D8-9523-406A-9357-E48B463A8303}.Release|x86.Build.0 = Release|Any CPU + {F682A9D8-9523-406A-9357-E48B463A8303}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {F682A9D8-9523-406A-9357-E48B463A8303}.Checked|x64.ActiveCfg = Debug|Any CPU + {F682A9D8-9523-406A-9357-E48B463A8303}.Checked|x86.ActiveCfg = Debug|Any CPU + {F682A9D8-9523-406A-9357-E48B463A8303}.RelWithDebInfo|Any CPU.ActiveCfg = Debug|Any CPU + {F682A9D8-9523-406A-9357-E48B463A8303}.RelWithDebInfo|x64.ActiveCfg = Debug|Any CPU + {F682A9D8-9523-406A-9357-E48B463A8303}.RelWithDebInfo|x86.ActiveCfg = Debug|Any CPU + {981A8ECD-2821-44F5-B617-BF0E7E9382C6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {981A8ECD-2821-44F5-B617-BF0E7E9382C6}.Debug|Any CPU.Build.0 = Debug|Any CPU + {981A8ECD-2821-44F5-B617-BF0E7E9382C6}.Debug|x64.ActiveCfg = Debug|Any CPU + {981A8ECD-2821-44F5-B617-BF0E7E9382C6}.Debug|x64.Build.0 = Debug|Any CPU + {981A8ECD-2821-44F5-B617-BF0E7E9382C6}.Debug|x86.ActiveCfg = Debug|Any CPU + {981A8ECD-2821-44F5-B617-BF0E7E9382C6}.Debug|x86.Build.0 = Debug|Any CPU + {981A8ECD-2821-44F5-B617-BF0E7E9382C6}.Release|Any CPU.ActiveCfg = Release|Any CPU + {981A8ECD-2821-44F5-B617-BF0E7E9382C6}.Release|Any CPU.Build.0 = Release|Any CPU + {981A8ECD-2821-44F5-B617-BF0E7E9382C6}.Release|x64.ActiveCfg = Release|Any CPU + {981A8ECD-2821-44F5-B617-BF0E7E9382C6}.Release|x64.Build.0 = Release|Any CPU + {981A8ECD-2821-44F5-B617-BF0E7E9382C6}.Release|x86.ActiveCfg = Release|Any CPU + {981A8ECD-2821-44F5-B617-BF0E7E9382C6}.Release|x86.Build.0 = Release|Any CPU + {981A8ECD-2821-44F5-B617-BF0E7E9382C6}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {981A8ECD-2821-44F5-B617-BF0E7E9382C6}.Checked|x64.ActiveCfg = Debug|Any CPU + {981A8ECD-2821-44F5-B617-BF0E7E9382C6}.Checked|x86.ActiveCfg = Debug|Any CPU + {981A8ECD-2821-44F5-B617-BF0E7E9382C6}.RelWithDebInfo|Any CPU.ActiveCfg = Debug|Any CPU + {981A8ECD-2821-44F5-B617-BF0E7E9382C6}.RelWithDebInfo|x64.ActiveCfg = Debug|Any CPU + {981A8ECD-2821-44F5-B617-BF0E7E9382C6}.RelWithDebInfo|x86.ActiveCfg = Debug|Any CPU + {3F0A4CCD-6944-40A9-B42C-4D120148E2A9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {3F0A4CCD-6944-40A9-B42C-4D120148E2A9}.Debug|Any CPU.Build.0 = Debug|Any CPU + {3F0A4CCD-6944-40A9-B42C-4D120148E2A9}.Debug|x64.ActiveCfg = Debug|Any CPU + {3F0A4CCD-6944-40A9-B42C-4D120148E2A9}.Debug|x64.Build.0 = Debug|Any CPU + {3F0A4CCD-6944-40A9-B42C-4D120148E2A9}.Debug|x86.ActiveCfg = Debug|Any CPU + {3F0A4CCD-6944-40A9-B42C-4D120148E2A9}.Debug|x86.Build.0 = Debug|Any CPU + {3F0A4CCD-6944-40A9-B42C-4D120148E2A9}.Release|Any CPU.ActiveCfg = Release|Any CPU + {3F0A4CCD-6944-40A9-B42C-4D120148E2A9}.Release|Any CPU.Build.0 = Release|Any CPU + {3F0A4CCD-6944-40A9-B42C-4D120148E2A9}.Release|x64.ActiveCfg = Release|Any CPU + {3F0A4CCD-6944-40A9-B42C-4D120148E2A9}.Release|x64.Build.0 = Release|Any CPU + {3F0A4CCD-6944-40A9-B42C-4D120148E2A9}.Release|x86.ActiveCfg = Release|Any CPU + {3F0A4CCD-6944-40A9-B42C-4D120148E2A9}.Release|x86.Build.0 = Release|Any CPU + {3F0A4CCD-6944-40A9-B42C-4D120148E2A9}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {3F0A4CCD-6944-40A9-B42C-4D120148E2A9}.Checked|x64.ActiveCfg = Debug|Any CPU + {3F0A4CCD-6944-40A9-B42C-4D120148E2A9}.Checked|x86.ActiveCfg = Debug|Any CPU + {3F0A4CCD-6944-40A9-B42C-4D120148E2A9}.RelWithDebInfo|Any CPU.ActiveCfg = Debug|Any CPU + {3F0A4CCD-6944-40A9-B42C-4D120148E2A9}.RelWithDebInfo|x64.ActiveCfg = Debug|Any CPU + {3F0A4CCD-6944-40A9-B42C-4D120148E2A9}.RelWithDebInfo|x86.ActiveCfg = Debug|Any CPU + {761CC2CC-85A1-413D-AD6B-CD000420E378}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {761CC2CC-85A1-413D-AD6B-CD000420E378}.Debug|Any CPU.Build.0 = Debug|Any CPU + {761CC2CC-85A1-413D-AD6B-CD000420E378}.Debug|x64.ActiveCfg = Debug|Any CPU + {761CC2CC-85A1-413D-AD6B-CD000420E378}.Debug|x64.Build.0 = Debug|Any CPU + {761CC2CC-85A1-413D-AD6B-CD000420E378}.Debug|x86.ActiveCfg = Debug|Any CPU + {761CC2CC-85A1-413D-AD6B-CD000420E378}.Debug|x86.Build.0 = Debug|Any CPU + {761CC2CC-85A1-413D-AD6B-CD000420E378}.Release|Any CPU.ActiveCfg = Release|Any CPU + {761CC2CC-85A1-413D-AD6B-CD000420E378}.Release|Any CPU.Build.0 = Release|Any CPU + {761CC2CC-85A1-413D-AD6B-CD000420E378}.Release|x64.ActiveCfg = Release|Any CPU + {761CC2CC-85A1-413D-AD6B-CD000420E378}.Release|x64.Build.0 = Release|Any CPU + {761CC2CC-85A1-413D-AD6B-CD000420E378}.Release|x86.ActiveCfg = Release|Any CPU + {761CC2CC-85A1-413D-AD6B-CD000420E378}.Release|x86.Build.0 = Release|Any CPU + {761CC2CC-85A1-413D-AD6B-CD000420E378}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {761CC2CC-85A1-413D-AD6B-CD000420E378}.Checked|x64.ActiveCfg = Debug|Any CPU + {761CC2CC-85A1-413D-AD6B-CD000420E378}.Checked|x86.ActiveCfg = Debug|Any CPU + {761CC2CC-85A1-413D-AD6B-CD000420E378}.RelWithDebInfo|Any CPU.ActiveCfg = Debug|Any CPU + {761CC2CC-85A1-413D-AD6B-CD000420E378}.RelWithDebInfo|x64.ActiveCfg = Debug|Any CPU + {761CC2CC-85A1-413D-AD6B-CD000420E378}.RelWithDebInfo|x86.ActiveCfg = Debug|Any CPU + {62BB9630-E6F3-4CB7-A781-5C4E963ADCEB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {62BB9630-E6F3-4CB7-A781-5C4E963ADCEB}.Debug|Any CPU.Build.0 = Debug|Any CPU + {62BB9630-E6F3-4CB7-A781-5C4E963ADCEB}.Debug|x64.ActiveCfg = Debug|Any CPU + {62BB9630-E6F3-4CB7-A781-5C4E963ADCEB}.Debug|x64.Build.0 = Debug|Any CPU + {62BB9630-E6F3-4CB7-A781-5C4E963ADCEB}.Debug|x86.ActiveCfg = Debug|Any CPU + {62BB9630-E6F3-4CB7-A781-5C4E963ADCEB}.Debug|x86.Build.0 = Debug|Any CPU + {62BB9630-E6F3-4CB7-A781-5C4E963ADCEB}.Release|Any CPU.ActiveCfg = Release|Any CPU + {62BB9630-E6F3-4CB7-A781-5C4E963ADCEB}.Release|Any CPU.Build.0 = Release|Any CPU + {62BB9630-E6F3-4CB7-A781-5C4E963ADCEB}.Release|x64.ActiveCfg = Release|Any CPU + {62BB9630-E6F3-4CB7-A781-5C4E963ADCEB}.Release|x64.Build.0 = Release|Any CPU + {62BB9630-E6F3-4CB7-A781-5C4E963ADCEB}.Release|x86.ActiveCfg = Release|Any CPU + {62BB9630-E6F3-4CB7-A781-5C4E963ADCEB}.Release|x86.Build.0 = Release|Any CPU + {62BB9630-E6F3-4CB7-A781-5C4E963ADCEB}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {62BB9630-E6F3-4CB7-A781-5C4E963ADCEB}.Checked|x64.ActiveCfg = Debug|Any CPU + {62BB9630-E6F3-4CB7-A781-5C4E963ADCEB}.Checked|x86.ActiveCfg = Debug|Any CPU + {62BB9630-E6F3-4CB7-A781-5C4E963ADCEB}.RelWithDebInfo|Any CPU.ActiveCfg = Debug|Any CPU + {62BB9630-E6F3-4CB7-A781-5C4E963ADCEB}.RelWithDebInfo|x64.ActiveCfg = Debug|Any CPU + {62BB9630-E6F3-4CB7-A781-5C4E963ADCEB}.RelWithDebInfo|x86.ActiveCfg = Debug|Any CPU + {C20C7B5B-9D29-4AB3-AA84-36137CE44DB9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {C20C7B5B-9D29-4AB3-AA84-36137CE44DB9}.Debug|Any CPU.Build.0 = Debug|Any CPU + {C20C7B5B-9D29-4AB3-AA84-36137CE44DB9}.Debug|x64.ActiveCfg = Debug|Any CPU + {C20C7B5B-9D29-4AB3-AA84-36137CE44DB9}.Debug|x64.Build.0 = Debug|Any CPU + {C20C7B5B-9D29-4AB3-AA84-36137CE44DB9}.Debug|x86.ActiveCfg = Debug|Any CPU + {C20C7B5B-9D29-4AB3-AA84-36137CE44DB9}.Debug|x86.Build.0 = Debug|Any CPU + {C20C7B5B-9D29-4AB3-AA84-36137CE44DB9}.Release|Any CPU.ActiveCfg = Release|Any CPU + {C20C7B5B-9D29-4AB3-AA84-36137CE44DB9}.Release|Any CPU.Build.0 = Release|Any CPU + {C20C7B5B-9D29-4AB3-AA84-36137CE44DB9}.Release|x64.ActiveCfg = Release|Any CPU + {C20C7B5B-9D29-4AB3-AA84-36137CE44DB9}.Release|x64.Build.0 = Release|Any CPU + {C20C7B5B-9D29-4AB3-AA84-36137CE44DB9}.Release|x86.ActiveCfg = Release|Any CPU + {C20C7B5B-9D29-4AB3-AA84-36137CE44DB9}.Release|x86.Build.0 = Release|Any CPU + {C20C7B5B-9D29-4AB3-AA84-36137CE44DB9}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {C20C7B5B-9D29-4AB3-AA84-36137CE44DB9}.Checked|x64.ActiveCfg = Debug|Any CPU + {C20C7B5B-9D29-4AB3-AA84-36137CE44DB9}.Checked|x86.ActiveCfg = Debug|Any CPU + {C20C7B5B-9D29-4AB3-AA84-36137CE44DB9}.RelWithDebInfo|Any CPU.ActiveCfg = Debug|Any CPU + {C20C7B5B-9D29-4AB3-AA84-36137CE44DB9}.RelWithDebInfo|x64.ActiveCfg = Debug|Any CPU + {C20C7B5B-9D29-4AB3-AA84-36137CE44DB9}.RelWithDebInfo|x86.ActiveCfg = Debug|Any CPU + {B37F4A90-69E4-449D-AB84-ED2441E38E5F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {B37F4A90-69E4-449D-AB84-ED2441E38E5F}.Debug|Any CPU.Build.0 = Debug|Any CPU + {B37F4A90-69E4-449D-AB84-ED2441E38E5F}.Debug|x64.ActiveCfg = Debug|Any CPU + {B37F4A90-69E4-449D-AB84-ED2441E38E5F}.Debug|x64.Build.0 = Debug|Any CPU + {B37F4A90-69E4-449D-AB84-ED2441E38E5F}.Debug|x86.ActiveCfg = Debug|Any CPU + {B37F4A90-69E4-449D-AB84-ED2441E38E5F}.Debug|x86.Build.0 = Debug|Any CPU + {B37F4A90-69E4-449D-AB84-ED2441E38E5F}.Release|Any CPU.ActiveCfg = Release|Any CPU + {B37F4A90-69E4-449D-AB84-ED2441E38E5F}.Release|Any CPU.Build.0 = Release|Any CPU + {B37F4A90-69E4-449D-AB84-ED2441E38E5F}.Release|x64.ActiveCfg = Release|Any CPU + {B37F4A90-69E4-449D-AB84-ED2441E38E5F}.Release|x64.Build.0 = Release|Any CPU + {B37F4A90-69E4-449D-AB84-ED2441E38E5F}.Release|x86.ActiveCfg = Release|Any CPU + {B37F4A90-69E4-449D-AB84-ED2441E38E5F}.Release|x86.Build.0 = Release|Any CPU + {B37F4A90-69E4-449D-AB84-ED2441E38E5F}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {B37F4A90-69E4-449D-AB84-ED2441E38E5F}.Checked|x64.ActiveCfg = Debug|Any CPU + {B37F4A90-69E4-449D-AB84-ED2441E38E5F}.Checked|x86.ActiveCfg = Debug|Any CPU + {B37F4A90-69E4-449D-AB84-ED2441E38E5F}.RelWithDebInfo|Any CPU.ActiveCfg = Debug|Any CPU + {B37F4A90-69E4-449D-AB84-ED2441E38E5F}.RelWithDebInfo|x64.ActiveCfg = Debug|Any CPU + {B37F4A90-69E4-449D-AB84-ED2441E38E5F}.RelWithDebInfo|x86.ActiveCfg = Debug|Any CPU + {AD59F28F-06D6-4743-9E0F-9EAB2617601A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {AD59F28F-06D6-4743-9E0F-9EAB2617601A}.Debug|Any CPU.Build.0 = Debug|Any CPU + {AD59F28F-06D6-4743-9E0F-9EAB2617601A}.Debug|x64.ActiveCfg = Debug|Any CPU + {AD59F28F-06D6-4743-9E0F-9EAB2617601A}.Debug|x64.Build.0 = Debug|Any CPU + {AD59F28F-06D6-4743-9E0F-9EAB2617601A}.Debug|x86.ActiveCfg = Debug|Any CPU + {AD59F28F-06D6-4743-9E0F-9EAB2617601A}.Debug|x86.Build.0 = Debug|Any CPU + {AD59F28F-06D6-4743-9E0F-9EAB2617601A}.Release|Any CPU.ActiveCfg = Release|Any CPU + {AD59F28F-06D6-4743-9E0F-9EAB2617601A}.Release|Any CPU.Build.0 = Release|Any CPU + {AD59F28F-06D6-4743-9E0F-9EAB2617601A}.Release|x64.ActiveCfg = Release|Any CPU + {AD59F28F-06D6-4743-9E0F-9EAB2617601A}.Release|x64.Build.0 = Release|Any CPU + {AD59F28F-06D6-4743-9E0F-9EAB2617601A}.Release|x86.ActiveCfg = Release|Any CPU + {AD59F28F-06D6-4743-9E0F-9EAB2617601A}.Release|x86.Build.0 = Release|Any CPU + {AD59F28F-06D6-4743-9E0F-9EAB2617601A}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {AD59F28F-06D6-4743-9E0F-9EAB2617601A}.Checked|x64.ActiveCfg = Debug|Any CPU + {AD59F28F-06D6-4743-9E0F-9EAB2617601A}.Checked|x86.ActiveCfg = Debug|Any CPU + {AD59F28F-06D6-4743-9E0F-9EAB2617601A}.RelWithDebInfo|Any CPU.ActiveCfg = Debug|Any CPU + {AD59F28F-06D6-4743-9E0F-9EAB2617601A}.RelWithDebInfo|x64.ActiveCfg = Debug|Any CPU + {AD59F28F-06D6-4743-9E0F-9EAB2617601A}.RelWithDebInfo|x86.ActiveCfg = Debug|Any CPU + {794DB744-5F00-4187-8AB6-A99B19ABAAB2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {794DB744-5F00-4187-8AB6-A99B19ABAAB2}.Debug|Any CPU.Build.0 = Debug|Any CPU + {794DB744-5F00-4187-8AB6-A99B19ABAAB2}.Debug|x64.ActiveCfg = Debug|Any CPU + {794DB744-5F00-4187-8AB6-A99B19ABAAB2}.Debug|x64.Build.0 = Debug|Any CPU + {794DB744-5F00-4187-8AB6-A99B19ABAAB2}.Debug|x86.ActiveCfg = Debug|Any CPU + {794DB744-5F00-4187-8AB6-A99B19ABAAB2}.Debug|x86.Build.0 = Debug|Any CPU + {794DB744-5F00-4187-8AB6-A99B19ABAAB2}.Release|Any CPU.ActiveCfg = Release|Any CPU + {794DB744-5F00-4187-8AB6-A99B19ABAAB2}.Release|Any CPU.Build.0 = Release|Any CPU + {794DB744-5F00-4187-8AB6-A99B19ABAAB2}.Release|x64.ActiveCfg = Release|Any CPU + {794DB744-5F00-4187-8AB6-A99B19ABAAB2}.Release|x64.Build.0 = Release|Any CPU + {794DB744-5F00-4187-8AB6-A99B19ABAAB2}.Release|x86.ActiveCfg = Release|Any CPU + {794DB744-5F00-4187-8AB6-A99B19ABAAB2}.Release|x86.Build.0 = Release|Any CPU + {794DB744-5F00-4187-8AB6-A99B19ABAAB2}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {794DB744-5F00-4187-8AB6-A99B19ABAAB2}.Checked|x64.ActiveCfg = Debug|Any CPU + {794DB744-5F00-4187-8AB6-A99B19ABAAB2}.Checked|x86.ActiveCfg = Debug|Any CPU + {794DB744-5F00-4187-8AB6-A99B19ABAAB2}.RelWithDebInfo|Any CPU.ActiveCfg = Debug|Any CPU + {794DB744-5F00-4187-8AB6-A99B19ABAAB2}.RelWithDebInfo|x64.ActiveCfg = Debug|Any CPU + {794DB744-5F00-4187-8AB6-A99B19ABAAB2}.RelWithDebInfo|x86.ActiveCfg = Debug|Any CPU + {A698EB04-2139-4A63-819B-0BC686478568}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {A698EB04-2139-4A63-819B-0BC686478568}.Debug|Any CPU.Build.0 = Debug|Any CPU + {A698EB04-2139-4A63-819B-0BC686478568}.Debug|x64.ActiveCfg = Debug|Any CPU + {A698EB04-2139-4A63-819B-0BC686478568}.Debug|x64.Build.0 = Debug|Any CPU + {A698EB04-2139-4A63-819B-0BC686478568}.Debug|x86.ActiveCfg = Debug|Any CPU + {A698EB04-2139-4A63-819B-0BC686478568}.Debug|x86.Build.0 = Debug|Any CPU + {A698EB04-2139-4A63-819B-0BC686478568}.Release|Any CPU.ActiveCfg = Release|Any CPU + {A698EB04-2139-4A63-819B-0BC686478568}.Release|Any CPU.Build.0 = Release|Any CPU + {A698EB04-2139-4A63-819B-0BC686478568}.Release|x64.ActiveCfg = Release|Any CPU + {A698EB04-2139-4A63-819B-0BC686478568}.Release|x64.Build.0 = Release|Any CPU + {A698EB04-2139-4A63-819B-0BC686478568}.Release|x86.ActiveCfg = Release|Any CPU + {A698EB04-2139-4A63-819B-0BC686478568}.Release|x86.Build.0 = Release|Any CPU + {A698EB04-2139-4A63-819B-0BC686478568}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {A698EB04-2139-4A63-819B-0BC686478568}.Checked|x64.ActiveCfg = Debug|Any CPU + {A698EB04-2139-4A63-819B-0BC686478568}.Checked|x86.ActiveCfg = Debug|Any CPU + {A698EB04-2139-4A63-819B-0BC686478568}.RelWithDebInfo|Any CPU.ActiveCfg = Debug|Any CPU + {A698EB04-2139-4A63-819B-0BC686478568}.RelWithDebInfo|x64.ActiveCfg = Debug|Any CPU + {A698EB04-2139-4A63-819B-0BC686478568}.RelWithDebInfo|x86.ActiveCfg = Debug|Any CPU + {A29C9F3E-1093-48F1-8CF4-21515EDB301A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {A29C9F3E-1093-48F1-8CF4-21515EDB301A}.Debug|Any CPU.Build.0 = Debug|Any CPU + {A29C9F3E-1093-48F1-8CF4-21515EDB301A}.Debug|x64.ActiveCfg = Debug|Any CPU + {A29C9F3E-1093-48F1-8CF4-21515EDB301A}.Debug|x64.Build.0 = Debug|Any CPU + {A29C9F3E-1093-48F1-8CF4-21515EDB301A}.Debug|x86.ActiveCfg = Debug|Any CPU + {A29C9F3E-1093-48F1-8CF4-21515EDB301A}.Debug|x86.Build.0 = Debug|Any CPU + {A29C9F3E-1093-48F1-8CF4-21515EDB301A}.Release|Any CPU.ActiveCfg = Release|Any CPU + {A29C9F3E-1093-48F1-8CF4-21515EDB301A}.Release|Any CPU.Build.0 = Release|Any CPU + {A29C9F3E-1093-48F1-8CF4-21515EDB301A}.Release|x64.ActiveCfg = Release|Any CPU + {A29C9F3E-1093-48F1-8CF4-21515EDB301A}.Release|x64.Build.0 = Release|Any CPU + {A29C9F3E-1093-48F1-8CF4-21515EDB301A}.Release|x86.ActiveCfg = Release|Any CPU + {A29C9F3E-1093-48F1-8CF4-21515EDB301A}.Release|x86.Build.0 = Release|Any CPU + {A29C9F3E-1093-48F1-8CF4-21515EDB301A}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {A29C9F3E-1093-48F1-8CF4-21515EDB301A}.Checked|x64.ActiveCfg = Debug|Any CPU + {A29C9F3E-1093-48F1-8CF4-21515EDB301A}.Checked|x86.ActiveCfg = Debug|Any CPU + {A29C9F3E-1093-48F1-8CF4-21515EDB301A}.RelWithDebInfo|Any CPU.ActiveCfg = Debug|Any CPU + {A29C9F3E-1093-48F1-8CF4-21515EDB301A}.RelWithDebInfo|x64.ActiveCfg = Debug|Any CPU + {A29C9F3E-1093-48F1-8CF4-21515EDB301A}.RelWithDebInfo|x86.ActiveCfg = Debug|Any CPU + {6D83F8E9-A84C-42AE-B91E-D342623D7783}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {6D83F8E9-A84C-42AE-B91E-D342623D7783}.Debug|Any CPU.Build.0 = Debug|Any CPU + {6D83F8E9-A84C-42AE-B91E-D342623D7783}.Debug|x64.ActiveCfg = Debug|Any CPU + {6D83F8E9-A84C-42AE-B91E-D342623D7783}.Debug|x64.Build.0 = Debug|Any CPU + {6D83F8E9-A84C-42AE-B91E-D342623D7783}.Debug|x86.ActiveCfg = Debug|Any CPU + {6D83F8E9-A84C-42AE-B91E-D342623D7783}.Debug|x86.Build.0 = Debug|Any CPU + {6D83F8E9-A84C-42AE-B91E-D342623D7783}.Release|Any CPU.ActiveCfg = Release|Any CPU + {6D83F8E9-A84C-42AE-B91E-D342623D7783}.Release|Any CPU.Build.0 = Release|Any CPU + {6D83F8E9-A84C-42AE-B91E-D342623D7783}.Release|x64.ActiveCfg = Release|Any CPU + {6D83F8E9-A84C-42AE-B91E-D342623D7783}.Release|x64.Build.0 = Release|Any CPU + {6D83F8E9-A84C-42AE-B91E-D342623D7783}.Release|x86.ActiveCfg = Release|Any CPU + {6D83F8E9-A84C-42AE-B91E-D342623D7783}.Release|x86.Build.0 = Release|Any CPU + {6D83F8E9-A84C-42AE-B91E-D342623D7783}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {6D83F8E9-A84C-42AE-B91E-D342623D7783}.Checked|x64.ActiveCfg = Debug|Any CPU + {6D83F8E9-A84C-42AE-B91E-D342623D7783}.Checked|x86.ActiveCfg = Debug|Any CPU + {6D83F8E9-A84C-42AE-B91E-D342623D7783}.RelWithDebInfo|Any CPU.ActiveCfg = Debug|Any CPU + {6D83F8E9-A84C-42AE-B91E-D342623D7783}.RelWithDebInfo|x64.ActiveCfg = Debug|Any CPU + {6D83F8E9-A84C-42AE-B91E-D342623D7783}.RelWithDebInfo|x86.ActiveCfg = Debug|Any CPU + {C40AB24F-39F3-4BEF-98E4-DAD9804EE7E2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {C40AB24F-39F3-4BEF-98E4-DAD9804EE7E2}.Debug|Any CPU.Build.0 = Debug|Any CPU + {C40AB24F-39F3-4BEF-98E4-DAD9804EE7E2}.Debug|x64.ActiveCfg = Debug|Any CPU + {C40AB24F-39F3-4BEF-98E4-DAD9804EE7E2}.Debug|x64.Build.0 = Debug|Any CPU + {C40AB24F-39F3-4BEF-98E4-DAD9804EE7E2}.Debug|x86.ActiveCfg = Debug|Any CPU + {C40AB24F-39F3-4BEF-98E4-DAD9804EE7E2}.Debug|x86.Build.0 = Debug|Any CPU + {C40AB24F-39F3-4BEF-98E4-DAD9804EE7E2}.Release|Any CPU.ActiveCfg = Release|Any CPU + {C40AB24F-39F3-4BEF-98E4-DAD9804EE7E2}.Release|Any CPU.Build.0 = Release|Any CPU + {C40AB24F-39F3-4BEF-98E4-DAD9804EE7E2}.Release|x64.ActiveCfg = Release|Any CPU + {C40AB24F-39F3-4BEF-98E4-DAD9804EE7E2}.Release|x64.Build.0 = Release|Any CPU + {C40AB24F-39F3-4BEF-98E4-DAD9804EE7E2}.Release|x86.ActiveCfg = Release|Any CPU + {C40AB24F-39F3-4BEF-98E4-DAD9804EE7E2}.Release|x86.Build.0 = Release|Any CPU + {C40AB24F-39F3-4BEF-98E4-DAD9804EE7E2}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {C40AB24F-39F3-4BEF-98E4-DAD9804EE7E2}.Checked|x64.ActiveCfg = Debug|Any CPU + {C40AB24F-39F3-4BEF-98E4-DAD9804EE7E2}.Checked|x86.ActiveCfg = Debug|Any CPU + {C40AB24F-39F3-4BEF-98E4-DAD9804EE7E2}.RelWithDebInfo|Any CPU.ActiveCfg = Debug|Any CPU + {C40AB24F-39F3-4BEF-98E4-DAD9804EE7E2}.RelWithDebInfo|x64.ActiveCfg = Debug|Any CPU + {C40AB24F-39F3-4BEF-98E4-DAD9804EE7E2}.RelWithDebInfo|x86.ActiveCfg = Debug|Any CPU + {F9E1B91C-3AE6-4894-A91A-EE6824D31E48}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {F9E1B91C-3AE6-4894-A91A-EE6824D31E48}.Debug|Any CPU.Build.0 = Debug|Any CPU + {F9E1B91C-3AE6-4894-A91A-EE6824D31E48}.Debug|x64.ActiveCfg = Debug|Any CPU + {F9E1B91C-3AE6-4894-A91A-EE6824D31E48}.Debug|x64.Build.0 = Debug|Any CPU + {F9E1B91C-3AE6-4894-A91A-EE6824D31E48}.Debug|x86.ActiveCfg = Debug|Any CPU + {F9E1B91C-3AE6-4894-A91A-EE6824D31E48}.Debug|x86.Build.0 = Debug|Any CPU + {F9E1B91C-3AE6-4894-A91A-EE6824D31E48}.Release|Any CPU.ActiveCfg = Release|Any CPU + {F9E1B91C-3AE6-4894-A91A-EE6824D31E48}.Release|Any CPU.Build.0 = Release|Any CPU + {F9E1B91C-3AE6-4894-A91A-EE6824D31E48}.Release|x64.ActiveCfg = Release|Any CPU + {F9E1B91C-3AE6-4894-A91A-EE6824D31E48}.Release|x64.Build.0 = Release|Any CPU + {F9E1B91C-3AE6-4894-A91A-EE6824D31E48}.Release|x86.ActiveCfg = Release|Any CPU + {F9E1B91C-3AE6-4894-A91A-EE6824D31E48}.Release|x86.Build.0 = Release|Any CPU + {F9E1B91C-3AE6-4894-A91A-EE6824D31E48}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {F9E1B91C-3AE6-4894-A91A-EE6824D31E48}.Checked|x64.ActiveCfg = Debug|Any CPU + {F9E1B91C-3AE6-4894-A91A-EE6824D31E48}.Checked|x86.ActiveCfg = Debug|Any CPU + {F9E1B91C-3AE6-4894-A91A-EE6824D31E48}.RelWithDebInfo|Any CPU.ActiveCfg = Debug|Any CPU + {F9E1B91C-3AE6-4894-A91A-EE6824D31E48}.RelWithDebInfo|x64.ActiveCfg = Debug|Any CPU + {F9E1B91C-3AE6-4894-A91A-EE6824D31E48}.RelWithDebInfo|x86.ActiveCfg = Debug|Any CPU + {D2810F09-0CCD-4779-B21B-322081E84E87}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {D2810F09-0CCD-4779-B21B-322081E84E87}.Debug|Any CPU.Build.0 = Debug|Any CPU + {D2810F09-0CCD-4779-B21B-322081E84E87}.Debug|x64.ActiveCfg = Debug|Any CPU + {D2810F09-0CCD-4779-B21B-322081E84E87}.Debug|x64.Build.0 = Debug|Any CPU + {D2810F09-0CCD-4779-B21B-322081E84E87}.Debug|x86.ActiveCfg = Debug|Any CPU + {D2810F09-0CCD-4779-B21B-322081E84E87}.Debug|x86.Build.0 = Debug|Any CPU + {D2810F09-0CCD-4779-B21B-322081E84E87}.Release|Any CPU.ActiveCfg = Release|Any CPU + {D2810F09-0CCD-4779-B21B-322081E84E87}.Release|Any CPU.Build.0 = Release|Any CPU + {D2810F09-0CCD-4779-B21B-322081E84E87}.Release|x64.ActiveCfg = Release|Any CPU + {D2810F09-0CCD-4779-B21B-322081E84E87}.Release|x64.Build.0 = Release|Any CPU + {D2810F09-0CCD-4779-B21B-322081E84E87}.Release|x86.ActiveCfg = Release|Any CPU + {D2810F09-0CCD-4779-B21B-322081E84E87}.Release|x86.Build.0 = Release|Any CPU + {D2810F09-0CCD-4779-B21B-322081E84E87}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {D2810F09-0CCD-4779-B21B-322081E84E87}.Checked|x64.ActiveCfg = Debug|Any CPU + {D2810F09-0CCD-4779-B21B-322081E84E87}.Checked|x86.ActiveCfg = Debug|Any CPU + {D2810F09-0CCD-4779-B21B-322081E84E87}.RelWithDebInfo|Any CPU.ActiveCfg = Debug|Any CPU + {D2810F09-0CCD-4779-B21B-322081E84E87}.RelWithDebInfo|x64.ActiveCfg = Debug|Any CPU + {D2810F09-0CCD-4779-B21B-322081E84E87}.RelWithDebInfo|x86.ActiveCfg = Debug|Any CPU + {5933AB07-5CBD-4AF3-9BCE-0B765363D27D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {5933AB07-5CBD-4AF3-9BCE-0B765363D27D}.Debug|Any CPU.Build.0 = Debug|Any CPU + {5933AB07-5CBD-4AF3-9BCE-0B765363D27D}.Debug|x64.ActiveCfg = Debug|Any CPU + {5933AB07-5CBD-4AF3-9BCE-0B765363D27D}.Debug|x64.Build.0 = Debug|Any CPU + {5933AB07-5CBD-4AF3-9BCE-0B765363D27D}.Debug|x86.ActiveCfg = Debug|Any CPU + {5933AB07-5CBD-4AF3-9BCE-0B765363D27D}.Debug|x86.Build.0 = Debug|Any CPU + {5933AB07-5CBD-4AF3-9BCE-0B765363D27D}.Release|Any CPU.ActiveCfg = Release|Any CPU + {5933AB07-5CBD-4AF3-9BCE-0B765363D27D}.Release|Any CPU.Build.0 = Release|Any CPU + {5933AB07-5CBD-4AF3-9BCE-0B765363D27D}.Release|x64.ActiveCfg = Release|Any CPU + {5933AB07-5CBD-4AF3-9BCE-0B765363D27D}.Release|x64.Build.0 = Release|Any CPU + {5933AB07-5CBD-4AF3-9BCE-0B765363D27D}.Release|x86.ActiveCfg = Release|Any CPU + {5933AB07-5CBD-4AF3-9BCE-0B765363D27D}.Release|x86.Build.0 = Release|Any CPU + {5933AB07-5CBD-4AF3-9BCE-0B765363D27D}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {5933AB07-5CBD-4AF3-9BCE-0B765363D27D}.Checked|x64.ActiveCfg = Debug|Any CPU + {5933AB07-5CBD-4AF3-9BCE-0B765363D27D}.Checked|x86.ActiveCfg = Debug|Any CPU + {5933AB07-5CBD-4AF3-9BCE-0B765363D27D}.RelWithDebInfo|Any CPU.ActiveCfg = Debug|Any CPU + {5933AB07-5CBD-4AF3-9BCE-0B765363D27D}.RelWithDebInfo|x64.ActiveCfg = Debug|Any CPU + {5933AB07-5CBD-4AF3-9BCE-0B765363D27D}.RelWithDebInfo|x86.ActiveCfg = Debug|Any CPU + {41F59D85-FC36-3015-861B-F177863252BC}.Debug|Any CPU.ActiveCfg = Debug|x64 + {41F59D85-FC36-3015-861B-F177863252BC}.Debug|Any CPU.Build.0 = Debug|x64 + {41F59D85-FC36-3015-861B-F177863252BC}.Debug|x64.ActiveCfg = Debug|x64 + {41F59D85-FC36-3015-861B-F177863252BC}.Debug|x64.Build.0 = Debug|x64 + {41F59D85-FC36-3015-861B-F177863252BC}.Debug|x86.ActiveCfg = Debug|x64 + {41F59D85-FC36-3015-861B-F177863252BC}.Release|Any CPU.ActiveCfg = Release|x64 + {41F59D85-FC36-3015-861B-F177863252BC}.Release|Any CPU.Build.0 = Release|x64 + {41F59D85-FC36-3015-861B-F177863252BC}.Release|x64.ActiveCfg = Release|x64 + {41F59D85-FC36-3015-861B-F177863252BC}.Release|x64.Build.0 = Release|x64 + {41F59D85-FC36-3015-861B-F177863252BC}.Release|x86.ActiveCfg = Release|x64 + {41F59D85-FC36-3015-861B-F177863252BC}.Checked|Any CPU.ActiveCfg = Checked|x64 + {41F59D85-FC36-3015-861B-F177863252BC}.Checked|Any CPU.Build.0 = Checked|x64 + {41F59D85-FC36-3015-861B-F177863252BC}.Checked|x64.ActiveCfg = Checked|x64 + {41F59D85-FC36-3015-861B-F177863252BC}.Checked|x64.Build.0 = Checked|x64 + {41F59D85-FC36-3015-861B-F177863252BC}.Checked|x86.ActiveCfg = Checked|x64 + {41F59D85-FC36-3015-861B-F177863252BC}.RelWithDebInfo|Any CPU.ActiveCfg = RelWithDebInfo|x64 + {41F59D85-FC36-3015-861B-F177863252BC}.RelWithDebInfo|Any CPU.Build.0 = RelWithDebInfo|x64 + {41F59D85-FC36-3015-861B-F177863252BC}.RelWithDebInfo|x64.ActiveCfg = RelWithDebInfo|x64 + {41F59D85-FC36-3015-861B-F177863252BC}.RelWithDebInfo|x64.Build.0 = RelWithDebInfo|x64 + {41F59D85-FC36-3015-861B-F177863252BC}.RelWithDebInfo|x86.ActiveCfg = RelWithDebInfo|x64 + {DE21994B-542A-437E-8405-F62A5A3F41D4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {DE21994B-542A-437E-8405-F62A5A3F41D4}.Debug|Any CPU.Build.0 = Debug|Any CPU + {DE21994B-542A-437E-8405-F62A5A3F41D4}.Debug|x64.ActiveCfg = Debug|Any CPU + {DE21994B-542A-437E-8405-F62A5A3F41D4}.Debug|x64.Build.0 = Debug|Any CPU + {DE21994B-542A-437E-8405-F62A5A3F41D4}.Debug|x86.ActiveCfg = Debug|Any CPU + {DE21994B-542A-437E-8405-F62A5A3F41D4}.Debug|x86.Build.0 = Debug|Any CPU + {DE21994B-542A-437E-8405-F62A5A3F41D4}.Release|Any CPU.ActiveCfg = Release|Any CPU + {DE21994B-542A-437E-8405-F62A5A3F41D4}.Release|Any CPU.Build.0 = Release|Any CPU + {DE21994B-542A-437E-8405-F62A5A3F41D4}.Release|x64.ActiveCfg = Release|Any CPU + {DE21994B-542A-437E-8405-F62A5A3F41D4}.Release|x64.Build.0 = Release|Any CPU + {DE21994B-542A-437E-8405-F62A5A3F41D4}.Release|x86.ActiveCfg = Release|Any CPU + {DE21994B-542A-437E-8405-F62A5A3F41D4}.Release|x86.Build.0 = Release|Any CPU + {DE21994B-542A-437E-8405-F62A5A3F41D4}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {DE21994B-542A-437E-8405-F62A5A3F41D4}.Checked|x64.ActiveCfg = Debug|Any CPU + {DE21994B-542A-437E-8405-F62A5A3F41D4}.Checked|x86.ActiveCfg = Debug|Any CPU + {DE21994B-542A-437E-8405-F62A5A3F41D4}.RelWithDebInfo|Any CPU.ActiveCfg = Debug|Any CPU + {DE21994B-542A-437E-8405-F62A5A3F41D4}.RelWithDebInfo|x64.ActiveCfg = Debug|Any CPU + {DE21994B-542A-437E-8405-F62A5A3F41D4}.RelWithDebInfo|x86.ActiveCfg = Debug|Any CPU + {B580256B-3E8A-4EBB-8ED0-B751622A1BDE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {B580256B-3E8A-4EBB-8ED0-B751622A1BDE}.Debug|Any CPU.Build.0 = Debug|Any CPU + {B580256B-3E8A-4EBB-8ED0-B751622A1BDE}.Debug|x64.ActiveCfg = Debug|Any CPU + {B580256B-3E8A-4EBB-8ED0-B751622A1BDE}.Debug|x64.Build.0 = Debug|Any CPU + {B580256B-3E8A-4EBB-8ED0-B751622A1BDE}.Debug|x86.ActiveCfg = Debug|Any CPU + {B580256B-3E8A-4EBB-8ED0-B751622A1BDE}.Debug|x86.Build.0 = Debug|Any CPU + {B580256B-3E8A-4EBB-8ED0-B751622A1BDE}.Release|Any CPU.ActiveCfg = Release|Any CPU + {B580256B-3E8A-4EBB-8ED0-B751622A1BDE}.Release|Any CPU.Build.0 = Release|Any CPU + {B580256B-3E8A-4EBB-8ED0-B751622A1BDE}.Release|x64.ActiveCfg = Release|Any CPU + {B580256B-3E8A-4EBB-8ED0-B751622A1BDE}.Release|x64.Build.0 = Release|Any CPU + {B580256B-3E8A-4EBB-8ED0-B751622A1BDE}.Release|x86.ActiveCfg = Release|Any CPU + {B580256B-3E8A-4EBB-8ED0-B751622A1BDE}.Release|x86.Build.0 = Release|Any CPU + {B580256B-3E8A-4EBB-8ED0-B751622A1BDE}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {B580256B-3E8A-4EBB-8ED0-B751622A1BDE}.Checked|x64.ActiveCfg = Debug|Any CPU + {B580256B-3E8A-4EBB-8ED0-B751622A1BDE}.Checked|x86.ActiveCfg = Debug|Any CPU + {B580256B-3E8A-4EBB-8ED0-B751622A1BDE}.RelWithDebInfo|Any CPU.ActiveCfg = Debug|Any CPU + {B580256B-3E8A-4EBB-8ED0-B751622A1BDE}.RelWithDebInfo|x64.ActiveCfg = Debug|Any CPU + {B580256B-3E8A-4EBB-8ED0-B751622A1BDE}.RelWithDebInfo|x86.ActiveCfg = Debug|Any CPU + {ED806ECA-3F5A-4E89-9F10-A8A58D7CE2D5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {ED806ECA-3F5A-4E89-9F10-A8A58D7CE2D5}.Debug|Any CPU.Build.0 = Debug|Any CPU + {ED806ECA-3F5A-4E89-9F10-A8A58D7CE2D5}.Debug|x64.ActiveCfg = Debug|Any CPU + {ED806ECA-3F5A-4E89-9F10-A8A58D7CE2D5}.Debug|x64.Build.0 = Debug|Any CPU + {ED806ECA-3F5A-4E89-9F10-A8A58D7CE2D5}.Debug|x86.ActiveCfg = Debug|Any CPU + {ED806ECA-3F5A-4E89-9F10-A8A58D7CE2D5}.Debug|x86.Build.0 = Debug|Any CPU + {ED806ECA-3F5A-4E89-9F10-A8A58D7CE2D5}.Release|Any CPU.ActiveCfg = Release|Any CPU + {ED806ECA-3F5A-4E89-9F10-A8A58D7CE2D5}.Release|Any CPU.Build.0 = Release|Any CPU + {ED806ECA-3F5A-4E89-9F10-A8A58D7CE2D5}.Release|x64.ActiveCfg = Release|Any CPU + {ED806ECA-3F5A-4E89-9F10-A8A58D7CE2D5}.Release|x64.Build.0 = Release|Any CPU + {ED806ECA-3F5A-4E89-9F10-A8A58D7CE2D5}.Release|x86.ActiveCfg = Release|Any CPU + {ED806ECA-3F5A-4E89-9F10-A8A58D7CE2D5}.Release|x86.Build.0 = Release|Any CPU + {ED806ECA-3F5A-4E89-9F10-A8A58D7CE2D5}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {ED806ECA-3F5A-4E89-9F10-A8A58D7CE2D5}.Checked|x64.ActiveCfg = Debug|Any CPU + {ED806ECA-3F5A-4E89-9F10-A8A58D7CE2D5}.Checked|x86.ActiveCfg = Debug|Any CPU + {ED806ECA-3F5A-4E89-9F10-A8A58D7CE2D5}.RelWithDebInfo|Any CPU.ActiveCfg = Debug|Any CPU + {ED806ECA-3F5A-4E89-9F10-A8A58D7CE2D5}.RelWithDebInfo|x64.ActiveCfg = Debug|Any CPU + {ED806ECA-3F5A-4E89-9F10-A8A58D7CE2D5}.RelWithDebInfo|x86.ActiveCfg = Debug|Any CPU + {CEDB87DB-22B9-4466-B79F-AA2A40BE6AA9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {CEDB87DB-22B9-4466-B79F-AA2A40BE6AA9}.Debug|Any CPU.Build.0 = Debug|Any CPU + {CEDB87DB-22B9-4466-B79F-AA2A40BE6AA9}.Debug|x64.ActiveCfg = Debug|Any CPU + {CEDB87DB-22B9-4466-B79F-AA2A40BE6AA9}.Debug|x64.Build.0 = Debug|Any CPU + {CEDB87DB-22B9-4466-B79F-AA2A40BE6AA9}.Debug|x86.ActiveCfg = Debug|Any CPU + {CEDB87DB-22B9-4466-B79F-AA2A40BE6AA9}.Debug|x86.Build.0 = Debug|Any CPU + {CEDB87DB-22B9-4466-B79F-AA2A40BE6AA9}.Release|Any CPU.ActiveCfg = Release|Any CPU + {CEDB87DB-22B9-4466-B79F-AA2A40BE6AA9}.Release|Any CPU.Build.0 = Release|Any CPU + {CEDB87DB-22B9-4466-B79F-AA2A40BE6AA9}.Release|x64.ActiveCfg = Release|Any CPU + {CEDB87DB-22B9-4466-B79F-AA2A40BE6AA9}.Release|x64.Build.0 = Release|Any CPU + {CEDB87DB-22B9-4466-B79F-AA2A40BE6AA9}.Release|x86.ActiveCfg = Release|Any CPU + {CEDB87DB-22B9-4466-B79F-AA2A40BE6AA9}.Release|x86.Build.0 = Release|Any CPU + {CEDB87DB-22B9-4466-B79F-AA2A40BE6AA9}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {CEDB87DB-22B9-4466-B79F-AA2A40BE6AA9}.Checked|x64.ActiveCfg = Debug|Any CPU + {CEDB87DB-22B9-4466-B79F-AA2A40BE6AA9}.Checked|x86.ActiveCfg = Debug|Any CPU + {CEDB87DB-22B9-4466-B79F-AA2A40BE6AA9}.RelWithDebInfo|Any CPU.ActiveCfg = Debug|Any CPU + {CEDB87DB-22B9-4466-B79F-AA2A40BE6AA9}.RelWithDebInfo|x64.ActiveCfg = Debug|Any CPU + {CEDB87DB-22B9-4466-B79F-AA2A40BE6AA9}.RelWithDebInfo|x86.ActiveCfg = Debug|Any CPU + {38E7B98A-541C-4D53-B07A-4039E88CDDA0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {38E7B98A-541C-4D53-B07A-4039E88CDDA0}.Debug|Any CPU.Build.0 = Debug|Any CPU + {38E7B98A-541C-4D53-B07A-4039E88CDDA0}.Debug|x64.ActiveCfg = Debug|Any CPU + {38E7B98A-541C-4D53-B07A-4039E88CDDA0}.Debug|x64.Build.0 = Debug|Any CPU + {38E7B98A-541C-4D53-B07A-4039E88CDDA0}.Debug|x86.ActiveCfg = Debug|Any CPU + {38E7B98A-541C-4D53-B07A-4039E88CDDA0}.Debug|x86.Build.0 = Debug|Any CPU + {38E7B98A-541C-4D53-B07A-4039E88CDDA0}.Release|Any CPU.ActiveCfg = Release|Any CPU + {38E7B98A-541C-4D53-B07A-4039E88CDDA0}.Release|Any CPU.Build.0 = Release|Any CPU + {38E7B98A-541C-4D53-B07A-4039E88CDDA0}.Release|x64.ActiveCfg = Release|Any CPU + {38E7B98A-541C-4D53-B07A-4039E88CDDA0}.Release|x64.Build.0 = Release|Any CPU + {38E7B98A-541C-4D53-B07A-4039E88CDDA0}.Release|x86.ActiveCfg = Release|Any CPU + {38E7B98A-541C-4D53-B07A-4039E88CDDA0}.Release|x86.Build.0 = Release|Any CPU + {38E7B98A-541C-4D53-B07A-4039E88CDDA0}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {38E7B98A-541C-4D53-B07A-4039E88CDDA0}.Checked|x64.ActiveCfg = Debug|Any CPU + {38E7B98A-541C-4D53-B07A-4039E88CDDA0}.Checked|x86.ActiveCfg = Debug|Any CPU + {38E7B98A-541C-4D53-B07A-4039E88CDDA0}.RelWithDebInfo|Any CPU.ActiveCfg = Debug|Any CPU + {38E7B98A-541C-4D53-B07A-4039E88CDDA0}.RelWithDebInfo|x64.ActiveCfg = Debug|Any CPU + {38E7B98A-541C-4D53-B07A-4039E88CDDA0}.RelWithDebInfo|x86.ActiveCfg = Debug|Any CPU + {7A8C135E-A694-4110-B724-E71521986ACD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {7A8C135E-A694-4110-B724-E71521986ACD}.Debug|Any CPU.Build.0 = Debug|Any CPU + {7A8C135E-A694-4110-B724-E71521986ACD}.Debug|x64.ActiveCfg = Debug|Any CPU + {7A8C135E-A694-4110-B724-E71521986ACD}.Debug|x64.Build.0 = Debug|Any CPU + {7A8C135E-A694-4110-B724-E71521986ACD}.Debug|x86.ActiveCfg = Debug|Any CPU + {7A8C135E-A694-4110-B724-E71521986ACD}.Debug|x86.Build.0 = Debug|Any CPU + {7A8C135E-A694-4110-B724-E71521986ACD}.Release|Any CPU.ActiveCfg = Release|Any CPU + {7A8C135E-A694-4110-B724-E71521986ACD}.Release|Any CPU.Build.0 = Release|Any CPU + {7A8C135E-A694-4110-B724-E71521986ACD}.Release|x64.ActiveCfg = Release|Any CPU + {7A8C135E-A694-4110-B724-E71521986ACD}.Release|x64.Build.0 = Release|Any CPU + {7A8C135E-A694-4110-B724-E71521986ACD}.Release|x86.ActiveCfg = Release|Any CPU + {7A8C135E-A694-4110-B724-E71521986ACD}.Release|x86.Build.0 = Release|Any CPU + {7A8C135E-A694-4110-B724-E71521986ACD}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {7A8C135E-A694-4110-B724-E71521986ACD}.Checked|x64.ActiveCfg = Debug|Any CPU + {7A8C135E-A694-4110-B724-E71521986ACD}.Checked|x86.ActiveCfg = Debug|Any CPU + {7A8C135E-A694-4110-B724-E71521986ACD}.RelWithDebInfo|Any CPU.ActiveCfg = Debug|Any CPU + {7A8C135E-A694-4110-B724-E71521986ACD}.RelWithDebInfo|x64.ActiveCfg = Debug|Any CPU + {7A8C135E-A694-4110-B724-E71521986ACD}.RelWithDebInfo|x86.ActiveCfg = Debug|Any CPU + {612753EE-C926-4E45-AC1E-A174AE25D91B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {612753EE-C926-4E45-AC1E-A174AE25D91B}.Debug|Any CPU.Build.0 = Debug|Any CPU + {612753EE-C926-4E45-AC1E-A174AE25D91B}.Debug|x64.ActiveCfg = Debug|Any CPU + {612753EE-C926-4E45-AC1E-A174AE25D91B}.Debug|x64.Build.0 = Debug|Any CPU + {612753EE-C926-4E45-AC1E-A174AE25D91B}.Debug|x86.ActiveCfg = Debug|Any CPU + {612753EE-C926-4E45-AC1E-A174AE25D91B}.Debug|x86.Build.0 = Debug|Any CPU + {612753EE-C926-4E45-AC1E-A174AE25D91B}.Release|Any CPU.ActiveCfg = Release|Any CPU + {612753EE-C926-4E45-AC1E-A174AE25D91B}.Release|Any CPU.Build.0 = Release|Any CPU + {612753EE-C926-4E45-AC1E-A174AE25D91B}.Release|x64.ActiveCfg = Release|Any CPU + {612753EE-C926-4E45-AC1E-A174AE25D91B}.Release|x64.Build.0 = Release|Any CPU + {612753EE-C926-4E45-AC1E-A174AE25D91B}.Release|x86.ActiveCfg = Release|Any CPU + {612753EE-C926-4E45-AC1E-A174AE25D91B}.Release|x86.Build.0 = Release|Any CPU + {612753EE-C926-4E45-AC1E-A174AE25D91B}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {612753EE-C926-4E45-AC1E-A174AE25D91B}.Checked|x64.ActiveCfg = Debug|Any CPU + {612753EE-C926-4E45-AC1E-A174AE25D91B}.Checked|x86.ActiveCfg = Debug|Any CPU + {612753EE-C926-4E45-AC1E-A174AE25D91B}.RelWithDebInfo|Any CPU.ActiveCfg = Debug|Any CPU + {612753EE-C926-4E45-AC1E-A174AE25D91B}.RelWithDebInfo|x64.ActiveCfg = Debug|Any CPU + {612753EE-C926-4E45-AC1E-A174AE25D91B}.RelWithDebInfo|x86.ActiveCfg = Debug|Any CPU + {EAD22B68-3099-47DF-9356-A1B3E5ADD7CB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {EAD22B68-3099-47DF-9356-A1B3E5ADD7CB}.Debug|Any CPU.Build.0 = Debug|Any CPU + {EAD22B68-3099-47DF-9356-A1B3E5ADD7CB}.Debug|x64.ActiveCfg = Debug|Any CPU + {EAD22B68-3099-47DF-9356-A1B3E5ADD7CB}.Debug|x64.Build.0 = Debug|Any CPU + {EAD22B68-3099-47DF-9356-A1B3E5ADD7CB}.Debug|x86.ActiveCfg = Debug|Any CPU + {EAD22B68-3099-47DF-9356-A1B3E5ADD7CB}.Debug|x86.Build.0 = Debug|Any CPU + {EAD22B68-3099-47DF-9356-A1B3E5ADD7CB}.Release|Any CPU.ActiveCfg = Release|Any CPU + {EAD22B68-3099-47DF-9356-A1B3E5ADD7CB}.Release|Any CPU.Build.0 = Release|Any CPU + {EAD22B68-3099-47DF-9356-A1B3E5ADD7CB}.Release|x64.ActiveCfg = Release|Any CPU + {EAD22B68-3099-47DF-9356-A1B3E5ADD7CB}.Release|x64.Build.0 = Release|Any CPU + {EAD22B68-3099-47DF-9356-A1B3E5ADD7CB}.Release|x86.ActiveCfg = Release|Any CPU + {EAD22B68-3099-47DF-9356-A1B3E5ADD7CB}.Release|x86.Build.0 = Release|Any CPU + {EAD22B68-3099-47DF-9356-A1B3E5ADD7CB}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {EAD22B68-3099-47DF-9356-A1B3E5ADD7CB}.Checked|x64.ActiveCfg = Debug|Any CPU + {EAD22B68-3099-47DF-9356-A1B3E5ADD7CB}.Checked|x86.ActiveCfg = Debug|Any CPU + {EAD22B68-3099-47DF-9356-A1B3E5ADD7CB}.RelWithDebInfo|Any CPU.ActiveCfg = Debug|Any CPU + {EAD22B68-3099-47DF-9356-A1B3E5ADD7CB}.RelWithDebInfo|x64.ActiveCfg = Debug|Any CPU + {EAD22B68-3099-47DF-9356-A1B3E5ADD7CB}.RelWithDebInfo|x86.ActiveCfg = Debug|Any CPU + {DD0C14D2-D7B0-47E2-8D75-498956C7B0C9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {DD0C14D2-D7B0-47E2-8D75-498956C7B0C9}.Debug|Any CPU.Build.0 = Debug|Any CPU + {DD0C14D2-D7B0-47E2-8D75-498956C7B0C9}.Debug|x64.ActiveCfg = Debug|Any CPU + {DD0C14D2-D7B0-47E2-8D75-498956C7B0C9}.Debug|x64.Build.0 = Debug|Any CPU + {DD0C14D2-D7B0-47E2-8D75-498956C7B0C9}.Debug|x86.ActiveCfg = Debug|Any CPU + {DD0C14D2-D7B0-47E2-8D75-498956C7B0C9}.Debug|x86.Build.0 = Debug|Any CPU + {DD0C14D2-D7B0-47E2-8D75-498956C7B0C9}.Release|Any CPU.ActiveCfg = Release|Any CPU + {DD0C14D2-D7B0-47E2-8D75-498956C7B0C9}.Release|Any CPU.Build.0 = Release|Any CPU + {DD0C14D2-D7B0-47E2-8D75-498956C7B0C9}.Release|x64.ActiveCfg = Release|Any CPU + {DD0C14D2-D7B0-47E2-8D75-498956C7B0C9}.Release|x64.Build.0 = Release|Any CPU + {DD0C14D2-D7B0-47E2-8D75-498956C7B0C9}.Release|x86.ActiveCfg = Release|Any CPU + {DD0C14D2-D7B0-47E2-8D75-498956C7B0C9}.Release|x86.Build.0 = Release|Any CPU + {DD0C14D2-D7B0-47E2-8D75-498956C7B0C9}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {DD0C14D2-D7B0-47E2-8D75-498956C7B0C9}.Checked|x64.ActiveCfg = Debug|Any CPU + {DD0C14D2-D7B0-47E2-8D75-498956C7B0C9}.Checked|x86.ActiveCfg = Debug|Any CPU + {DD0C14D2-D7B0-47E2-8D75-498956C7B0C9}.RelWithDebInfo|Any CPU.ActiveCfg = Debug|Any CPU + {DD0C14D2-D7B0-47E2-8D75-498956C7B0C9}.RelWithDebInfo|x64.ActiveCfg = Debug|Any CPU + {DD0C14D2-D7B0-47E2-8D75-498956C7B0C9}.RelWithDebInfo|x86.ActiveCfg = Debug|Any CPU + {9E162337-F39B-461F-90D1-294ED529FDBF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {9E162337-F39B-461F-90D1-294ED529FDBF}.Debug|Any CPU.Build.0 = Debug|Any CPU + {9E162337-F39B-461F-90D1-294ED529FDBF}.Debug|x64.ActiveCfg = Debug|Any CPU + {9E162337-F39B-461F-90D1-294ED529FDBF}.Debug|x64.Build.0 = Debug|Any CPU + {9E162337-F39B-461F-90D1-294ED529FDBF}.Debug|x86.ActiveCfg = Debug|Any CPU + {9E162337-F39B-461F-90D1-294ED529FDBF}.Debug|x86.Build.0 = Debug|Any CPU + {9E162337-F39B-461F-90D1-294ED529FDBF}.Release|Any CPU.ActiveCfg = Release|Any CPU + {9E162337-F39B-461F-90D1-294ED529FDBF}.Release|Any CPU.Build.0 = Release|Any CPU + {9E162337-F39B-461F-90D1-294ED529FDBF}.Release|x64.ActiveCfg = Release|Any CPU + {9E162337-F39B-461F-90D1-294ED529FDBF}.Release|x64.Build.0 = Release|Any CPU + {9E162337-F39B-461F-90D1-294ED529FDBF}.Release|x86.ActiveCfg = Release|Any CPU + {9E162337-F39B-461F-90D1-294ED529FDBF}.Release|x86.Build.0 = Release|Any CPU + {9E162337-F39B-461F-90D1-294ED529FDBF}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {9E162337-F39B-461F-90D1-294ED529FDBF}.Checked|x64.ActiveCfg = Debug|Any CPU + {9E162337-F39B-461F-90D1-294ED529FDBF}.Checked|x86.ActiveCfg = Debug|Any CPU + {9E162337-F39B-461F-90D1-294ED529FDBF}.RelWithDebInfo|Any CPU.ActiveCfg = Debug|Any CPU + {9E162337-F39B-461F-90D1-294ED529FDBF}.RelWithDebInfo|x64.ActiveCfg = Debug|Any CPU + {9E162337-F39B-461F-90D1-294ED529FDBF}.RelWithDebInfo|x86.ActiveCfg = Debug|Any CPU + {B7D8475F-0577-4B53-BD7F-9FFE4FA6320A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {B7D8475F-0577-4B53-BD7F-9FFE4FA6320A}.Debug|Any CPU.Build.0 = Debug|Any CPU + {B7D8475F-0577-4B53-BD7F-9FFE4FA6320A}.Debug|x64.ActiveCfg = Debug|Any CPU + {B7D8475F-0577-4B53-BD7F-9FFE4FA6320A}.Debug|x64.Build.0 = Debug|Any CPU + {B7D8475F-0577-4B53-BD7F-9FFE4FA6320A}.Debug|x86.ActiveCfg = Debug|Any CPU + {B7D8475F-0577-4B53-BD7F-9FFE4FA6320A}.Debug|x86.Build.0 = Debug|Any CPU + {B7D8475F-0577-4B53-BD7F-9FFE4FA6320A}.Release|Any CPU.ActiveCfg = Release|Any CPU + {B7D8475F-0577-4B53-BD7F-9FFE4FA6320A}.Release|Any CPU.Build.0 = Release|Any CPU + {B7D8475F-0577-4B53-BD7F-9FFE4FA6320A}.Release|x64.ActiveCfg = Release|Any CPU + {B7D8475F-0577-4B53-BD7F-9FFE4FA6320A}.Release|x64.Build.0 = Release|Any CPU + {B7D8475F-0577-4B53-BD7F-9FFE4FA6320A}.Release|x86.ActiveCfg = Release|Any CPU + {B7D8475F-0577-4B53-BD7F-9FFE4FA6320A}.Release|x86.Build.0 = Release|Any CPU + {B7D8475F-0577-4B53-BD7F-9FFE4FA6320A}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {B7D8475F-0577-4B53-BD7F-9FFE4FA6320A}.Checked|x64.ActiveCfg = Debug|Any CPU + {B7D8475F-0577-4B53-BD7F-9FFE4FA6320A}.Checked|x86.ActiveCfg = Debug|Any CPU + {B7D8475F-0577-4B53-BD7F-9FFE4FA6320A}.RelWithDebInfo|Any CPU.ActiveCfg = Debug|Any CPU + {B7D8475F-0577-4B53-BD7F-9FFE4FA6320A}.RelWithDebInfo|x64.ActiveCfg = Debug|Any CPU + {B7D8475F-0577-4B53-BD7F-9FFE4FA6320A}.RelWithDebInfo|x86.ActiveCfg = Debug|Any CPU + {490D2993-80D2-494E-B9EF-BBC9F6D7B12F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {490D2993-80D2-494E-B9EF-BBC9F6D7B12F}.Debug|Any CPU.Build.0 = Debug|Any CPU + {490D2993-80D2-494E-B9EF-BBC9F6D7B12F}.Debug|x64.ActiveCfg = Debug|Any CPU + {490D2993-80D2-494E-B9EF-BBC9F6D7B12F}.Debug|x64.Build.0 = Debug|Any CPU + {490D2993-80D2-494E-B9EF-BBC9F6D7B12F}.Debug|x86.ActiveCfg = Debug|Any CPU + {490D2993-80D2-494E-B9EF-BBC9F6D7B12F}.Debug|x86.Build.0 = Debug|Any CPU + {490D2993-80D2-494E-B9EF-BBC9F6D7B12F}.Release|Any CPU.ActiveCfg = Release|Any CPU + {490D2993-80D2-494E-B9EF-BBC9F6D7B12F}.Release|Any CPU.Build.0 = Release|Any CPU + {490D2993-80D2-494E-B9EF-BBC9F6D7B12F}.Release|x64.ActiveCfg = Release|Any CPU + {490D2993-80D2-494E-B9EF-BBC9F6D7B12F}.Release|x64.Build.0 = Release|Any CPU + {490D2993-80D2-494E-B9EF-BBC9F6D7B12F}.Release|x86.ActiveCfg = Release|Any CPU + {490D2993-80D2-494E-B9EF-BBC9F6D7B12F}.Release|x86.Build.0 = Release|Any CPU + {490D2993-80D2-494E-B9EF-BBC9F6D7B12F}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {490D2993-80D2-494E-B9EF-BBC9F6D7B12F}.Checked|x64.ActiveCfg = Debug|Any CPU + {490D2993-80D2-494E-B9EF-BBC9F6D7B12F}.Checked|x86.ActiveCfg = Debug|Any CPU + {490D2993-80D2-494E-B9EF-BBC9F6D7B12F}.RelWithDebInfo|Any CPU.ActiveCfg = Debug|Any CPU + {490D2993-80D2-494E-B9EF-BBC9F6D7B12F}.RelWithDebInfo|x64.ActiveCfg = Debug|Any CPU + {490D2993-80D2-494E-B9EF-BBC9F6D7B12F}.RelWithDebInfo|x86.ActiveCfg = Debug|Any CPU + {1F7E837F-0E68-43CF-8071-994CE2904901}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {1F7E837F-0E68-43CF-8071-994CE2904901}.Debug|Any CPU.Build.0 = Debug|Any CPU + {1F7E837F-0E68-43CF-8071-994CE2904901}.Debug|x64.ActiveCfg = Debug|Any CPU + {1F7E837F-0E68-43CF-8071-994CE2904901}.Debug|x64.Build.0 = Debug|Any CPU + {1F7E837F-0E68-43CF-8071-994CE2904901}.Debug|x86.ActiveCfg = Debug|Any CPU + {1F7E837F-0E68-43CF-8071-994CE2904901}.Debug|x86.Build.0 = Debug|Any CPU + {1F7E837F-0E68-43CF-8071-994CE2904901}.Release|Any CPU.ActiveCfg = Release|Any CPU + {1F7E837F-0E68-43CF-8071-994CE2904901}.Release|Any CPU.Build.0 = Release|Any CPU + {1F7E837F-0E68-43CF-8071-994CE2904901}.Release|x64.ActiveCfg = Release|Any CPU + {1F7E837F-0E68-43CF-8071-994CE2904901}.Release|x64.Build.0 = Release|Any CPU + {1F7E837F-0E68-43CF-8071-994CE2904901}.Release|x86.ActiveCfg = Release|Any CPU + {1F7E837F-0E68-43CF-8071-994CE2904901}.Release|x86.Build.0 = Release|Any CPU + {1F7E837F-0E68-43CF-8071-994CE2904901}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {1F7E837F-0E68-43CF-8071-994CE2904901}.Checked|x64.ActiveCfg = Debug|Any CPU + {1F7E837F-0E68-43CF-8071-994CE2904901}.Checked|x86.ActiveCfg = Debug|Any CPU + {1F7E837F-0E68-43CF-8071-994CE2904901}.RelWithDebInfo|Any CPU.ActiveCfg = Debug|Any CPU + {1F7E837F-0E68-43CF-8071-994CE2904901}.RelWithDebInfo|x64.ActiveCfg = Debug|Any CPU + {1F7E837F-0E68-43CF-8071-994CE2904901}.RelWithDebInfo|x86.ActiveCfg = Debug|Any CPU + {AB277B63-4D5F-4269-824B-91A675B92F5B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {AB277B63-4D5F-4269-824B-91A675B92F5B}.Debug|Any CPU.Build.0 = Debug|Any CPU + {AB277B63-4D5F-4269-824B-91A675B92F5B}.Debug|x64.ActiveCfg = Debug|Any CPU + {AB277B63-4D5F-4269-824B-91A675B92F5B}.Debug|x64.Build.0 = Debug|Any CPU + {AB277B63-4D5F-4269-824B-91A675B92F5B}.Debug|x86.ActiveCfg = Debug|Any CPU + {AB277B63-4D5F-4269-824B-91A675B92F5B}.Debug|x86.Build.0 = Debug|Any CPU + {AB277B63-4D5F-4269-824B-91A675B92F5B}.Release|Any CPU.ActiveCfg = Release|Any CPU + {AB277B63-4D5F-4269-824B-91A675B92F5B}.Release|Any CPU.Build.0 = Release|Any CPU + {AB277B63-4D5F-4269-824B-91A675B92F5B}.Release|x64.ActiveCfg = Release|Any CPU + {AB277B63-4D5F-4269-824B-91A675B92F5B}.Release|x64.Build.0 = Release|Any CPU + {AB277B63-4D5F-4269-824B-91A675B92F5B}.Release|x86.ActiveCfg = Release|Any CPU + {AB277B63-4D5F-4269-824B-91A675B92F5B}.Release|x86.Build.0 = Release|Any CPU + {AB277B63-4D5F-4269-824B-91A675B92F5B}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {AB277B63-4D5F-4269-824B-91A675B92F5B}.Checked|x64.ActiveCfg = Debug|Any CPU + {AB277B63-4D5F-4269-824B-91A675B92F5B}.Checked|x86.ActiveCfg = Debug|Any CPU + {AB277B63-4D5F-4269-824B-91A675B92F5B}.RelWithDebInfo|Any CPU.ActiveCfg = Debug|Any CPU + {AB277B63-4D5F-4269-824B-91A675B92F5B}.RelWithDebInfo|x64.ActiveCfg = Debug|Any CPU + {AB277B63-4D5F-4269-824B-91A675B92F5B}.RelWithDebInfo|x86.ActiveCfg = Debug|Any CPU + {614E442A-A8FD-4E14-9C3E-1F312864D9E0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {614E442A-A8FD-4E14-9C3E-1F312864D9E0}.Debug|Any CPU.Build.0 = Debug|Any CPU + {614E442A-A8FD-4E14-9C3E-1F312864D9E0}.Debug|x64.ActiveCfg = Debug|Any CPU + {614E442A-A8FD-4E14-9C3E-1F312864D9E0}.Debug|x64.Build.0 = Debug|Any CPU + {614E442A-A8FD-4E14-9C3E-1F312864D9E0}.Debug|x86.ActiveCfg = Debug|Any CPU + {614E442A-A8FD-4E14-9C3E-1F312864D9E0}.Debug|x86.Build.0 = Debug|Any CPU + {614E442A-A8FD-4E14-9C3E-1F312864D9E0}.Release|Any CPU.ActiveCfg = Release|Any CPU + {614E442A-A8FD-4E14-9C3E-1F312864D9E0}.Release|Any CPU.Build.0 = Release|Any CPU + {614E442A-A8FD-4E14-9C3E-1F312864D9E0}.Release|x64.ActiveCfg = Release|Any CPU + {614E442A-A8FD-4E14-9C3E-1F312864D9E0}.Release|x64.Build.0 = Release|Any CPU + {614E442A-A8FD-4E14-9C3E-1F312864D9E0}.Release|x86.ActiveCfg = Release|Any CPU + {614E442A-A8FD-4E14-9C3E-1F312864D9E0}.Release|x86.Build.0 = Release|Any CPU + {614E442A-A8FD-4E14-9C3E-1F312864D9E0}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {614E442A-A8FD-4E14-9C3E-1F312864D9E0}.Checked|x64.ActiveCfg = Debug|Any CPU + {614E442A-A8FD-4E14-9C3E-1F312864D9E0}.Checked|x86.ActiveCfg = Debug|Any CPU + {614E442A-A8FD-4E14-9C3E-1F312864D9E0}.RelWithDebInfo|Any CPU.ActiveCfg = Debug|Any CPU + {614E442A-A8FD-4E14-9C3E-1F312864D9E0}.RelWithDebInfo|x64.ActiveCfg = Debug|Any CPU + {614E442A-A8FD-4E14-9C3E-1F312864D9E0}.RelWithDebInfo|x86.ActiveCfg = Debug|Any CPU + {B5378BE2-284A-4614-9415-7FB6A7B9D452}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {B5378BE2-284A-4614-9415-7FB6A7B9D452}.Debug|Any CPU.Build.0 = Debug|Any CPU + {B5378BE2-284A-4614-9415-7FB6A7B9D452}.Debug|x64.ActiveCfg = Debug|Any CPU + {B5378BE2-284A-4614-9415-7FB6A7B9D452}.Debug|x64.Build.0 = Debug|Any CPU + {B5378BE2-284A-4614-9415-7FB6A7B9D452}.Debug|x86.ActiveCfg = Debug|Any CPU + {B5378BE2-284A-4614-9415-7FB6A7B9D452}.Debug|x86.Build.0 = Debug|Any CPU + {B5378BE2-284A-4614-9415-7FB6A7B9D452}.Release|Any CPU.ActiveCfg = Release|Any CPU + {B5378BE2-284A-4614-9415-7FB6A7B9D452}.Release|Any CPU.Build.0 = Release|Any CPU + {B5378BE2-284A-4614-9415-7FB6A7B9D452}.Release|x64.ActiveCfg = Release|Any CPU + {B5378BE2-284A-4614-9415-7FB6A7B9D452}.Release|x64.Build.0 = Release|Any CPU + {B5378BE2-284A-4614-9415-7FB6A7B9D452}.Release|x86.ActiveCfg = Release|Any CPU + {B5378BE2-284A-4614-9415-7FB6A7B9D452}.Release|x86.Build.0 = Release|Any CPU + {B5378BE2-284A-4614-9415-7FB6A7B9D452}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {B5378BE2-284A-4614-9415-7FB6A7B9D452}.Checked|x64.ActiveCfg = Debug|Any CPU + {B5378BE2-284A-4614-9415-7FB6A7B9D452}.Checked|x86.ActiveCfg = Debug|Any CPU + {B5378BE2-284A-4614-9415-7FB6A7B9D452}.RelWithDebInfo|Any CPU.ActiveCfg = Debug|Any CPU + {B5378BE2-284A-4614-9415-7FB6A7B9D452}.RelWithDebInfo|x64.ActiveCfg = Debug|Any CPU + {B5378BE2-284A-4614-9415-7FB6A7B9D452}.RelWithDebInfo|x86.ActiveCfg = Debug|Any CPU + {7E7BB06B-2756-4172-B906-D1744688AC54}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {7E7BB06B-2756-4172-B906-D1744688AC54}.Debug|Any CPU.Build.0 = Debug|Any CPU + {7E7BB06B-2756-4172-B906-D1744688AC54}.Debug|x64.ActiveCfg = Debug|Any CPU + {7E7BB06B-2756-4172-B906-D1744688AC54}.Debug|x64.Build.0 = Debug|Any CPU + {7E7BB06B-2756-4172-B906-D1744688AC54}.Debug|x86.ActiveCfg = Debug|Any CPU + {7E7BB06B-2756-4172-B906-D1744688AC54}.Debug|x86.Build.0 = Debug|Any CPU + {7E7BB06B-2756-4172-B906-D1744688AC54}.Release|Any CPU.ActiveCfg = Release|Any CPU + {7E7BB06B-2756-4172-B906-D1744688AC54}.Release|Any CPU.Build.0 = Release|Any CPU + {7E7BB06B-2756-4172-B906-D1744688AC54}.Release|x64.ActiveCfg = Release|Any CPU + {7E7BB06B-2756-4172-B906-D1744688AC54}.Release|x64.Build.0 = Release|Any CPU + {7E7BB06B-2756-4172-B906-D1744688AC54}.Release|x86.ActiveCfg = Release|Any CPU + {7E7BB06B-2756-4172-B906-D1744688AC54}.Release|x86.Build.0 = Release|Any CPU + {7E7BB06B-2756-4172-B906-D1744688AC54}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {7E7BB06B-2756-4172-B906-D1744688AC54}.Checked|x64.ActiveCfg = Debug|Any CPU + {7E7BB06B-2756-4172-B906-D1744688AC54}.Checked|x86.ActiveCfg = Debug|Any CPU + {7E7BB06B-2756-4172-B906-D1744688AC54}.RelWithDebInfo|Any CPU.ActiveCfg = Debug|Any CPU + {7E7BB06B-2756-4172-B906-D1744688AC54}.RelWithDebInfo|x64.ActiveCfg = Debug|Any CPU + {7E7BB06B-2756-4172-B906-D1744688AC54}.RelWithDebInfo|x86.ActiveCfg = Debug|Any CPU + {A43C3CFE-6EE9-4A9C-8160-E3432ECB0A11}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {A43C3CFE-6EE9-4A9C-8160-E3432ECB0A11}.Debug|Any CPU.Build.0 = Debug|Any CPU + {A43C3CFE-6EE9-4A9C-8160-E3432ECB0A11}.Debug|x64.ActiveCfg = Debug|Any CPU + {A43C3CFE-6EE9-4A9C-8160-E3432ECB0A11}.Debug|x64.Build.0 = Debug|Any CPU + {A43C3CFE-6EE9-4A9C-8160-E3432ECB0A11}.Debug|x86.ActiveCfg = Debug|Any CPU + {A43C3CFE-6EE9-4A9C-8160-E3432ECB0A11}.Debug|x86.Build.0 = Debug|Any CPU + {A43C3CFE-6EE9-4A9C-8160-E3432ECB0A11}.Release|Any CPU.ActiveCfg = Release|Any CPU + {A43C3CFE-6EE9-4A9C-8160-E3432ECB0A11}.Release|Any CPU.Build.0 = Release|Any CPU + {A43C3CFE-6EE9-4A9C-8160-E3432ECB0A11}.Release|x64.ActiveCfg = Release|Any CPU + {A43C3CFE-6EE9-4A9C-8160-E3432ECB0A11}.Release|x64.Build.0 = Release|Any CPU + {A43C3CFE-6EE9-4A9C-8160-E3432ECB0A11}.Release|x86.ActiveCfg = Release|Any CPU + {A43C3CFE-6EE9-4A9C-8160-E3432ECB0A11}.Release|x86.Build.0 = Release|Any CPU + {A43C3CFE-6EE9-4A9C-8160-E3432ECB0A11}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {A43C3CFE-6EE9-4A9C-8160-E3432ECB0A11}.Checked|x64.ActiveCfg = Debug|Any CPU + {A43C3CFE-6EE9-4A9C-8160-E3432ECB0A11}.Checked|x86.ActiveCfg = Debug|Any CPU + {A43C3CFE-6EE9-4A9C-8160-E3432ECB0A11}.RelWithDebInfo|Any CPU.ActiveCfg = Debug|Any CPU + {A43C3CFE-6EE9-4A9C-8160-E3432ECB0A11}.RelWithDebInfo|x64.ActiveCfg = Debug|Any CPU + {A43C3CFE-6EE9-4A9C-8160-E3432ECB0A11}.RelWithDebInfo|x86.ActiveCfg = Debug|Any CPU + {776831C1-2727-44D0-AF1C-4F54A0807D56}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {776831C1-2727-44D0-AF1C-4F54A0807D56}.Debug|Any CPU.Build.0 = Debug|Any CPU + {776831C1-2727-44D0-AF1C-4F54A0807D56}.Debug|x64.ActiveCfg = Debug|Any CPU + {776831C1-2727-44D0-AF1C-4F54A0807D56}.Debug|x64.Build.0 = Debug|Any CPU + {776831C1-2727-44D0-AF1C-4F54A0807D56}.Debug|x86.ActiveCfg = Debug|Any CPU + {776831C1-2727-44D0-AF1C-4F54A0807D56}.Debug|x86.Build.0 = Debug|Any CPU + {776831C1-2727-44D0-AF1C-4F54A0807D56}.Release|Any CPU.ActiveCfg = Release|Any CPU + {776831C1-2727-44D0-AF1C-4F54A0807D56}.Release|Any CPU.Build.0 = Release|Any CPU + {776831C1-2727-44D0-AF1C-4F54A0807D56}.Release|x64.ActiveCfg = Release|Any CPU + {776831C1-2727-44D0-AF1C-4F54A0807D56}.Release|x64.Build.0 = Release|Any CPU + {776831C1-2727-44D0-AF1C-4F54A0807D56}.Release|x86.ActiveCfg = Release|Any CPU + {776831C1-2727-44D0-AF1C-4F54A0807D56}.Release|x86.Build.0 = Release|Any CPU + {776831C1-2727-44D0-AF1C-4F54A0807D56}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {776831C1-2727-44D0-AF1C-4F54A0807D56}.Checked|x64.ActiveCfg = Debug|Any CPU + {776831C1-2727-44D0-AF1C-4F54A0807D56}.Checked|x86.ActiveCfg = Debug|Any CPU + {776831C1-2727-44D0-AF1C-4F54A0807D56}.RelWithDebInfo|Any CPU.ActiveCfg = Debug|Any CPU + {776831C1-2727-44D0-AF1C-4F54A0807D56}.RelWithDebInfo|x64.ActiveCfg = Debug|Any CPU + {776831C1-2727-44D0-AF1C-4F54A0807D56}.RelWithDebInfo|x86.ActiveCfg = Debug|Any CPU + {93BB0132-1608-4946-B933-5719E29B3033}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {93BB0132-1608-4946-B933-5719E29B3033}.Debug|Any CPU.Build.0 = Debug|Any CPU + {93BB0132-1608-4946-B933-5719E29B3033}.Debug|x64.ActiveCfg = Debug|Any CPU + {93BB0132-1608-4946-B933-5719E29B3033}.Debug|x64.Build.0 = Debug|Any CPU + {93BB0132-1608-4946-B933-5719E29B3033}.Debug|x86.ActiveCfg = Debug|Any CPU + {93BB0132-1608-4946-B933-5719E29B3033}.Debug|x86.Build.0 = Debug|Any CPU + {93BB0132-1608-4946-B933-5719E29B3033}.Release|Any CPU.ActiveCfg = Release|Any CPU + {93BB0132-1608-4946-B933-5719E29B3033}.Release|Any CPU.Build.0 = Release|Any CPU + {93BB0132-1608-4946-B933-5719E29B3033}.Release|x64.ActiveCfg = Release|Any CPU + {93BB0132-1608-4946-B933-5719E29B3033}.Release|x64.Build.0 = Release|Any CPU + {93BB0132-1608-4946-B933-5719E29B3033}.Release|x86.ActiveCfg = Release|Any CPU + {93BB0132-1608-4946-B933-5719E29B3033}.Release|x86.Build.0 = Release|Any CPU + {93BB0132-1608-4946-B933-5719E29B3033}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {93BB0132-1608-4946-B933-5719E29B3033}.Checked|x64.ActiveCfg = Debug|Any CPU + {93BB0132-1608-4946-B933-5719E29B3033}.Checked|x86.ActiveCfg = Debug|Any CPU + {93BB0132-1608-4946-B933-5719E29B3033}.RelWithDebInfo|Any CPU.ActiveCfg = Debug|Any CPU + {93BB0132-1608-4946-B933-5719E29B3033}.RelWithDebInfo|x64.ActiveCfg = Debug|Any CPU + {93BB0132-1608-4946-B933-5719E29B3033}.RelWithDebInfo|x86.ActiveCfg = Debug|Any CPU + {7A63A786-F30D-4473-9666-9EBE71C21A8E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {7A63A786-F30D-4473-9666-9EBE71C21A8E}.Debug|Any CPU.Build.0 = Debug|Any CPU + {7A63A786-F30D-4473-9666-9EBE71C21A8E}.Debug|x64.ActiveCfg = Debug|Any CPU + {7A63A786-F30D-4473-9666-9EBE71C21A8E}.Debug|x64.Build.0 = Debug|Any CPU + {7A63A786-F30D-4473-9666-9EBE71C21A8E}.Debug|x86.ActiveCfg = Debug|Any CPU + {7A63A786-F30D-4473-9666-9EBE71C21A8E}.Debug|x86.Build.0 = Debug|Any CPU + {7A63A786-F30D-4473-9666-9EBE71C21A8E}.Release|Any CPU.ActiveCfg = Release|Any CPU + {7A63A786-F30D-4473-9666-9EBE71C21A8E}.Release|Any CPU.Build.0 = Release|Any CPU + {7A63A786-F30D-4473-9666-9EBE71C21A8E}.Release|x64.ActiveCfg = Release|Any CPU + {7A63A786-F30D-4473-9666-9EBE71C21A8E}.Release|x64.Build.0 = Release|Any CPU + {7A63A786-F30D-4473-9666-9EBE71C21A8E}.Release|x86.ActiveCfg = Release|Any CPU + {7A63A786-F30D-4473-9666-9EBE71C21A8E}.Release|x86.Build.0 = Release|Any CPU + {7A63A786-F30D-4473-9666-9EBE71C21A8E}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {7A63A786-F30D-4473-9666-9EBE71C21A8E}.Checked|x64.ActiveCfg = Debug|Any CPU + {7A63A786-F30D-4473-9666-9EBE71C21A8E}.Checked|x86.ActiveCfg = Debug|Any CPU + {7A63A786-F30D-4473-9666-9EBE71C21A8E}.RelWithDebInfo|Any CPU.ActiveCfg = Debug|Any CPU + {7A63A786-F30D-4473-9666-9EBE71C21A8E}.RelWithDebInfo|x64.ActiveCfg = Debug|Any CPU + {7A63A786-F30D-4473-9666-9EBE71C21A8E}.RelWithDebInfo|x86.ActiveCfg = Debug|Any CPU + {9FDC5AEB-C47D-40FD-B151-BBD3DCDDD4E7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {9FDC5AEB-C47D-40FD-B151-BBD3DCDDD4E7}.Debug|Any CPU.Build.0 = Debug|Any CPU + {9FDC5AEB-C47D-40FD-B151-BBD3DCDDD4E7}.Debug|x64.ActiveCfg = Debug|Any CPU + {9FDC5AEB-C47D-40FD-B151-BBD3DCDDD4E7}.Debug|x64.Build.0 = Debug|Any CPU + {9FDC5AEB-C47D-40FD-B151-BBD3DCDDD4E7}.Debug|x86.ActiveCfg = Debug|Any CPU + {9FDC5AEB-C47D-40FD-B151-BBD3DCDDD4E7}.Debug|x86.Build.0 = Debug|Any CPU + {9FDC5AEB-C47D-40FD-B151-BBD3DCDDD4E7}.Release|Any CPU.ActiveCfg = Release|Any CPU + {9FDC5AEB-C47D-40FD-B151-BBD3DCDDD4E7}.Release|Any CPU.Build.0 = Release|Any CPU + {9FDC5AEB-C47D-40FD-B151-BBD3DCDDD4E7}.Release|x64.ActiveCfg = Release|Any CPU + {9FDC5AEB-C47D-40FD-B151-BBD3DCDDD4E7}.Release|x64.Build.0 = Release|Any CPU + {9FDC5AEB-C47D-40FD-B151-BBD3DCDDD4E7}.Release|x86.ActiveCfg = Release|Any CPU + {9FDC5AEB-C47D-40FD-B151-BBD3DCDDD4E7}.Release|x86.Build.0 = Release|Any CPU + {9FDC5AEB-C47D-40FD-B151-BBD3DCDDD4E7}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {9FDC5AEB-C47D-40FD-B151-BBD3DCDDD4E7}.Checked|x64.ActiveCfg = Debug|Any CPU + {9FDC5AEB-C47D-40FD-B151-BBD3DCDDD4E7}.Checked|x86.ActiveCfg = Debug|Any CPU + {9FDC5AEB-C47D-40FD-B151-BBD3DCDDD4E7}.RelWithDebInfo|Any CPU.ActiveCfg = Debug|Any CPU + {9FDC5AEB-C47D-40FD-B151-BBD3DCDDD4E7}.RelWithDebInfo|x64.ActiveCfg = Debug|Any CPU + {9FDC5AEB-C47D-40FD-B151-BBD3DCDDD4E7}.RelWithDebInfo|x86.ActiveCfg = Debug|Any CPU + {F546FC16-79F7-491D-87FC-F32849AD8377}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {F546FC16-79F7-491D-87FC-F32849AD8377}.Debug|Any CPU.Build.0 = Debug|Any CPU + {F546FC16-79F7-491D-87FC-F32849AD8377}.Debug|x64.ActiveCfg = Debug|Any CPU + {F546FC16-79F7-491D-87FC-F32849AD8377}.Debug|x64.Build.0 = Debug|Any CPU + {F546FC16-79F7-491D-87FC-F32849AD8377}.Debug|x86.ActiveCfg = Debug|Any CPU + {F546FC16-79F7-491D-87FC-F32849AD8377}.Debug|x86.Build.0 = Debug|Any CPU + {F546FC16-79F7-491D-87FC-F32849AD8377}.Release|Any CPU.ActiveCfg = Release|Any CPU + {F546FC16-79F7-491D-87FC-F32849AD8377}.Release|Any CPU.Build.0 = Release|Any CPU + {F546FC16-79F7-491D-87FC-F32849AD8377}.Release|x64.ActiveCfg = Release|Any CPU + {F546FC16-79F7-491D-87FC-F32849AD8377}.Release|x64.Build.0 = Release|Any CPU + {F546FC16-79F7-491D-87FC-F32849AD8377}.Release|x86.ActiveCfg = Release|Any CPU + {F546FC16-79F7-491D-87FC-F32849AD8377}.Release|x86.Build.0 = Release|Any CPU + {F546FC16-79F7-491D-87FC-F32849AD8377}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {F546FC16-79F7-491D-87FC-F32849AD8377}.Checked|x64.ActiveCfg = Debug|Any CPU + {F546FC16-79F7-491D-87FC-F32849AD8377}.Checked|x86.ActiveCfg = Debug|Any CPU + {F546FC16-79F7-491D-87FC-F32849AD8377}.RelWithDebInfo|Any CPU.ActiveCfg = Debug|Any CPU + {F546FC16-79F7-491D-87FC-F32849AD8377}.RelWithDebInfo|x64.ActiveCfg = Debug|Any CPU + {F546FC16-79F7-491D-87FC-F32849AD8377}.RelWithDebInfo|x86.ActiveCfg = Debug|Any CPU + {380F8ECB-B4C7-41DD-BE76-74A1C7E4A307}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {380F8ECB-B4C7-41DD-BE76-74A1C7E4A307}.Debug|Any CPU.Build.0 = Debug|Any CPU + {380F8ECB-B4C7-41DD-BE76-74A1C7E4A307}.Debug|x64.ActiveCfg = Debug|Any CPU + {380F8ECB-B4C7-41DD-BE76-74A1C7E4A307}.Debug|x64.Build.0 = Debug|Any CPU + {380F8ECB-B4C7-41DD-BE76-74A1C7E4A307}.Debug|x86.ActiveCfg = Debug|Any CPU + {380F8ECB-B4C7-41DD-BE76-74A1C7E4A307}.Debug|x86.Build.0 = Debug|Any CPU + {380F8ECB-B4C7-41DD-BE76-74A1C7E4A307}.Release|Any CPU.ActiveCfg = Release|Any CPU + {380F8ECB-B4C7-41DD-BE76-74A1C7E4A307}.Release|Any CPU.Build.0 = Release|Any CPU + {380F8ECB-B4C7-41DD-BE76-74A1C7E4A307}.Release|x64.ActiveCfg = Release|Any CPU + {380F8ECB-B4C7-41DD-BE76-74A1C7E4A307}.Release|x64.Build.0 = Release|Any CPU + {380F8ECB-B4C7-41DD-BE76-74A1C7E4A307}.Release|x86.ActiveCfg = Release|Any CPU + {380F8ECB-B4C7-41DD-BE76-74A1C7E4A307}.Release|x86.Build.0 = Release|Any CPU + {380F8ECB-B4C7-41DD-BE76-74A1C7E4A307}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {380F8ECB-B4C7-41DD-BE76-74A1C7E4A307}.Checked|x64.ActiveCfg = Debug|Any CPU + {380F8ECB-B4C7-41DD-BE76-74A1C7E4A307}.Checked|x86.ActiveCfg = Debug|Any CPU + {380F8ECB-B4C7-41DD-BE76-74A1C7E4A307}.RelWithDebInfo|Any CPU.ActiveCfg = Debug|Any CPU + {380F8ECB-B4C7-41DD-BE76-74A1C7E4A307}.RelWithDebInfo|x64.ActiveCfg = Debug|Any CPU + {380F8ECB-B4C7-41DD-BE76-74A1C7E4A307}.RelWithDebInfo|x86.ActiveCfg = Debug|Any CPU + {791EF9D8-210A-4A15-BFC9-94CD4E5EDFE2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {791EF9D8-210A-4A15-BFC9-94CD4E5EDFE2}.Debug|Any CPU.Build.0 = Debug|Any CPU + {791EF9D8-210A-4A15-BFC9-94CD4E5EDFE2}.Debug|x64.ActiveCfg = Debug|Any CPU + {791EF9D8-210A-4A15-BFC9-94CD4E5EDFE2}.Debug|x64.Build.0 = Debug|Any CPU + {791EF9D8-210A-4A15-BFC9-94CD4E5EDFE2}.Debug|x86.ActiveCfg = Debug|Any CPU + {791EF9D8-210A-4A15-BFC9-94CD4E5EDFE2}.Debug|x86.Build.0 = Debug|Any CPU + {791EF9D8-210A-4A15-BFC9-94CD4E5EDFE2}.Release|Any CPU.ActiveCfg = Release|Any CPU + {791EF9D8-210A-4A15-BFC9-94CD4E5EDFE2}.Release|Any CPU.Build.0 = Release|Any CPU + {791EF9D8-210A-4A15-BFC9-94CD4E5EDFE2}.Release|x64.ActiveCfg = Release|Any CPU + {791EF9D8-210A-4A15-BFC9-94CD4E5EDFE2}.Release|x64.Build.0 = Release|Any CPU + {791EF9D8-210A-4A15-BFC9-94CD4E5EDFE2}.Release|x86.ActiveCfg = Release|Any CPU + {791EF9D8-210A-4A15-BFC9-94CD4E5EDFE2}.Release|x86.Build.0 = Release|Any CPU + {791EF9D8-210A-4A15-BFC9-94CD4E5EDFE2}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {791EF9D8-210A-4A15-BFC9-94CD4E5EDFE2}.Checked|x64.ActiveCfg = Debug|Any CPU + {791EF9D8-210A-4A15-BFC9-94CD4E5EDFE2}.Checked|x86.ActiveCfg = Debug|Any CPU + {791EF9D8-210A-4A15-BFC9-94CD4E5EDFE2}.RelWithDebInfo|Any CPU.ActiveCfg = Debug|Any CPU + {791EF9D8-210A-4A15-BFC9-94CD4E5EDFE2}.RelWithDebInfo|x64.ActiveCfg = Debug|Any CPU + {791EF9D8-210A-4A15-BFC9-94CD4E5EDFE2}.RelWithDebInfo|x86.ActiveCfg = Debug|Any CPU + {C6B35C75-931F-473E-BED7-8BA626A6DA2D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {C6B35C75-931F-473E-BED7-8BA626A6DA2D}.Debug|Any CPU.Build.0 = Debug|Any CPU + {C6B35C75-931F-473E-BED7-8BA626A6DA2D}.Debug|x64.ActiveCfg = Debug|Any CPU + {C6B35C75-931F-473E-BED7-8BA626A6DA2D}.Debug|x64.Build.0 = Debug|Any CPU + {C6B35C75-931F-473E-BED7-8BA626A6DA2D}.Debug|x86.ActiveCfg = Debug|Any CPU + {C6B35C75-931F-473E-BED7-8BA626A6DA2D}.Debug|x86.Build.0 = Debug|Any CPU + {C6B35C75-931F-473E-BED7-8BA626A6DA2D}.Release|Any CPU.ActiveCfg = Release|Any CPU + {C6B35C75-931F-473E-BED7-8BA626A6DA2D}.Release|Any CPU.Build.0 = Release|Any CPU + {C6B35C75-931F-473E-BED7-8BA626A6DA2D}.Release|x64.ActiveCfg = Release|Any CPU + {C6B35C75-931F-473E-BED7-8BA626A6DA2D}.Release|x64.Build.0 = Release|Any CPU + {C6B35C75-931F-473E-BED7-8BA626A6DA2D}.Release|x86.ActiveCfg = Release|Any CPU + {C6B35C75-931F-473E-BED7-8BA626A6DA2D}.Release|x86.Build.0 = Release|Any CPU + {C6B35C75-931F-473E-BED7-8BA626A6DA2D}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {C6B35C75-931F-473E-BED7-8BA626A6DA2D}.Checked|x64.ActiveCfg = Debug|Any CPU + {C6B35C75-931F-473E-BED7-8BA626A6DA2D}.Checked|x86.ActiveCfg = Debug|Any CPU + {C6B35C75-931F-473E-BED7-8BA626A6DA2D}.RelWithDebInfo|Any CPU.ActiveCfg = Debug|Any CPU + {C6B35C75-931F-473E-BED7-8BA626A6DA2D}.RelWithDebInfo|x64.ActiveCfg = Debug|Any CPU + {C6B35C75-931F-473E-BED7-8BA626A6DA2D}.RelWithDebInfo|x86.ActiveCfg = Debug|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(NestedProjects) = preSolution + {A9A7C879-C320-3327-BB84-16E1322E17AE} = {AC7761AD-78A4-48B6-9056-8A92740F17AD} + {AC7761AD-78A4-48B6-9056-8A92740F17AD} = {2E28B2DB-3805-457D-8B52-E35F60A55E90} + {20EBC3C4-917C-402D-B778-9A6E3742BF5A} = {2E28B2DB-3805-457D-8B52-E35F60A55E90} + {8C35FEF8-1101-38F6-ACD0-462A1EA53A7D} = {2E28B2DB-3805-457D-8B52-E35F60A55E90} + {7E252D99-B616-4234-9A63-26A00208AB27} = {BE481BCB-9C28-4CF3-A92C-2CBC49F49710} + {02D40854-2429-4EF7-8405-04C87565853A} = {BE481BCB-9C28-4CF3-A92C-2CBC49F49710} + {BE481BCB-9C28-4CF3-A92C-2CBC49F49710} = {C12FE574-60EF-4CF0-A879-68F3D093651C} + {A698EB04-2139-4A63-819B-0BC686478568} = {A652E56D-8614-4338-9098-6B252270A1BB} + {A29C9F3E-1093-48F1-8CF4-21515EDB301A} = {A652E56D-8614-4338-9098-6B252270A1BB} + {A652E56D-8614-4338-9098-6B252270A1BB} = {D09612C8-B493-42BE-9F3F-28B315F9751A} + {6D83F8E9-A84C-42AE-B91E-D342623D7783} = {44F59FE3-F8DB-4E3E-B6F7-E3AB9C05F416} + {C40AB24F-39F3-4BEF-98E4-DAD9804EE7E2} = {44F59FE3-F8DB-4E3E-B6F7-E3AB9C05F416} + {44F59FE3-F8DB-4E3E-B6F7-E3AB9C05F416} = {D09612C8-B493-42BE-9F3F-28B315F9751A} + {193E7716-8469-4A72-A689-27C5E828772C} = {D09612C8-B493-42BE-9F3F-28B315F9751A} + {87E9BB01-B579-4891-BA1C-BB600AC9829A} = {D09612C8-B493-42BE-9F3F-28B315F9751A} + {8F7085F1-DA86-4AA1-9801-2A9A2498E7BB} = {D09612C8-B493-42BE-9F3F-28B315F9751A} + {F682A9D8-9523-406A-9357-E48B463A8303} = {D09612C8-B493-42BE-9F3F-28B315F9751A} + {981A8ECD-2821-44F5-B617-BF0E7E9382C6} = {D09612C8-B493-42BE-9F3F-28B315F9751A} + {3F0A4CCD-6944-40A9-B42C-4D120148E2A9} = {D09612C8-B493-42BE-9F3F-28B315F9751A} + {761CC2CC-85A1-413D-AD6B-CD000420E378} = {D09612C8-B493-42BE-9F3F-28B315F9751A} + {62BB9630-E6F3-4CB7-A781-5C4E963ADCEB} = {D09612C8-B493-42BE-9F3F-28B315F9751A} + {C20C7B5B-9D29-4AB3-AA84-36137CE44DB9} = {D09612C8-B493-42BE-9F3F-28B315F9751A} + {B37F4A90-69E4-449D-AB84-ED2441E38E5F} = {D09612C8-B493-42BE-9F3F-28B315F9751A} + {AD59F28F-06D6-4743-9E0F-9EAB2617601A} = {D09612C8-B493-42BE-9F3F-28B315F9751A} + {794DB744-5F00-4187-8AB6-A99B19ABAAB2} = {D09612C8-B493-42BE-9F3F-28B315F9751A} + {F9E1B91C-3AE6-4894-A91A-EE6824D31E48} = {D09612C8-B493-42BE-9F3F-28B315F9751A} + {D2810F09-0CCD-4779-B21B-322081E84E87} = {D09612C8-B493-42BE-9F3F-28B315F9751A} + {D09612C8-B493-42BE-9F3F-28B315F9751A} = {67BF6867-0EA6-4853-B14B-8A0A9091A255} + {5933AB07-5CBD-4AF3-9BCE-0B765363D27D} = {67BF6867-0EA6-4853-B14B-8A0A9091A255} + {67BF6867-0EA6-4853-B14B-8A0A9091A255} = {C12FE574-60EF-4CF0-A879-68F3D093651C} + {EEC90A42-CDCD-4EE3-B47D-C109D604E7E2} = {C12FE574-60EF-4CF0-A879-68F3D093651C} + {D52C65C4-2C7D-45E6-9F5C-6F3A96796018} = {C12FE574-60EF-4CF0-A879-68F3D093651C} + {0F848647-AF41-464F-BC7E-B363DCC4A54A} = {C12FE574-60EF-4CF0-A879-68F3D093651C} + {E77CB5ED-5F99-4148-8115-38E45E648F08} = {C12FE574-60EF-4CF0-A879-68F3D093651C} + {88686BB2-7A8A-4019-986C-9ED5045844E9} = {C12FE574-60EF-4CF0-A879-68F3D093651C} + {41F59D85-FC36-3015-861B-F177863252BC} = {C12FE574-60EF-4CF0-A879-68F3D093651C} + {ED806ECA-3F5A-4E89-9F10-A8A58D7CE2D5} = {D166FD15-A4F1-47B9-881B-D3965B5DCF7D} + {D166FD15-A4F1-47B9-881B-D3965B5DCF7D} = {C9BD4CB1-E9A7-4A35-B8F8-8B7984A8A950} + {B580256B-3E8A-4EBB-8ED0-B751622A1BDE} = {C9BD4CB1-E9A7-4A35-B8F8-8B7984A8A950} + {C9BD4CB1-E9A7-4A35-B8F8-8B7984A8A950} = {59E97F80-3F6D-4E83-9962-236C98411375} + {DE21994B-542A-437E-8405-F62A5A3F41D4} = {59E97F80-3F6D-4E83-9962-236C98411375} + {CEDB87DB-22B9-4466-B79F-AA2A40BE6AA9} = {59E97F80-3F6D-4E83-9962-236C98411375} + {38E7B98A-541C-4D53-B07A-4039E88CDDA0} = {59E97F80-3F6D-4E83-9962-236C98411375} + {7A8C135E-A694-4110-B724-E71521986ACD} = {59E97F80-3F6D-4E83-9962-236C98411375} + {612753EE-C926-4E45-AC1E-A174AE25D91B} = {59E97F80-3F6D-4E83-9962-236C98411375} + {EAD22B68-3099-47DF-9356-A1B3E5ADD7CB} = {59E97F80-3F6D-4E83-9962-236C98411375} + {DD0C14D2-D7B0-47E2-8D75-498956C7B0C9} = {59E97F80-3F6D-4E83-9962-236C98411375} + {9E162337-F39B-461F-90D1-294ED529FDBF} = {59E97F80-3F6D-4E83-9962-236C98411375} + {B7D8475F-0577-4B53-BD7F-9FFE4FA6320A} = {59E97F80-3F6D-4E83-9962-236C98411375} + {490D2993-80D2-494E-B9EF-BBC9F6D7B12F} = {59E97F80-3F6D-4E83-9962-236C98411375} + {1F7E837F-0E68-43CF-8071-994CE2904901} = {59E97F80-3F6D-4E83-9962-236C98411375} + {AB277B63-4D5F-4269-824B-91A675B92F5B} = {59E97F80-3F6D-4E83-9962-236C98411375} + {614E442A-A8FD-4E14-9C3E-1F312864D9E0} = {59E97F80-3F6D-4E83-9962-236C98411375} + {B5378BE2-284A-4614-9415-7FB6A7B9D452} = {59E97F80-3F6D-4E83-9962-236C98411375} + {7E7BB06B-2756-4172-B906-D1744688AC54} = {59E97F80-3F6D-4E83-9962-236C98411375} + {A43C3CFE-6EE9-4A9C-8160-E3432ECB0A11} = {59E97F80-3F6D-4E83-9962-236C98411375} + {776831C1-2727-44D0-AF1C-4F54A0807D56} = {71E34955-D0A4-4242-BE24-F0AADA3A877E} + {93BB0132-1608-4946-B933-5719E29B3033} = {71E34955-D0A4-4242-BE24-F0AADA3A877E} + {7A63A786-F30D-4473-9666-9EBE71C21A8E} = {71E34955-D0A4-4242-BE24-F0AADA3A877E} + {9FDC5AEB-C47D-40FD-B151-BBD3DCDDD4E7} = {71E34955-D0A4-4242-BE24-F0AADA3A877E} + {F546FC16-79F7-491D-87FC-F32849AD8377} = {71E34955-D0A4-4242-BE24-F0AADA3A877E} + {380F8ECB-B4C7-41DD-BE76-74A1C7E4A307} = {71E34955-D0A4-4242-BE24-F0AADA3A877E} + {791EF9D8-210A-4A15-BFC9-94CD4E5EDFE2} = {71E34955-D0A4-4242-BE24-F0AADA3A877E} + {C6B35C75-931F-473E-BED7-8BA626A6DA2D} = {71E34955-D0A4-4242-BE24-F0AADA3A877E} + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {7E599CA6-744E-44A6-A146-335FC397A595} + EndGlobalSection +EndGlobal diff --git a/debuggees.slnx b/debuggees.slnx deleted file mode 100644 index 4c7e2688af..0000000000 --- a/debuggees.slnx +++ /dev/null @@ -1,93 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/diagnostics.slnx b/diagnostics.slnx deleted file mode 100644 index 7ff2a2aee8..0000000000 --- a/diagnostics.slnx +++ /dev/null @@ -1,468 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/documentation/building/linux-instructions.md b/documentation/building/linux-instructions.md index 31e987c01f..3f0e797ac6 100644 --- a/documentation/building/linux-instructions.md +++ b/documentation/building/linux-instructions.md @@ -208,3 +208,12 @@ You now have all the required components. To clone, build and test the repo: cd diagnostics ./build.sh ./test.sh + +Loading solution file +--------------------- + +For a better dev inner loop experience, load `build.sln` at the root of the repository into VSCode. + +This file is generated from the `build.proj` traversal project and can be regenerated/updated using: + + ./eng/generate-sln.sh diff --git a/documentation/building/osx-instructions.md b/documentation/building/osx-instructions.md index 0bd70b3afa..29453c5885 100644 --- a/documentation/building/osx-instructions.md +++ b/documentation/building/osx-instructions.md @@ -42,3 +42,13 @@ This will build SOS, the tests and the SOS plugin (libsosplugin.dylib) for the X For later versions of macOS/Xcode/lldb is TBD. +Loading solution file +--------------------- + +For a better dev inner loop experience, load `build.sln` at the root of the repository into VSCode. + +This file is generated from the `build.proj` traversal project and can be regenerated/updated using: + +```sh +./eng/generate-sln.sh +``` diff --git a/documentation/building/windows-instructions.md b/documentation/building/windows-instructions.md index 09587a36e3..7ba560b536 100644 --- a/documentation/building/windows-instructions.md +++ b/documentation/building/windows-instructions.md @@ -108,3 +108,13 @@ To test the resulting SOS: ```bat test.cmd ``` + +## Loading solution file + +For a better dev inner loop experience, load `build.sln` at the root of the repository into either VS or VSCode. + +This file is generated from the `build.proj` traversal project and can be regenerated/updated using: + +```pwsh +./eng/generate-sln.ps1 +``` diff --git a/eng/Build.props b/eng/Build.props index 61f52242a2..5046cae3ab 100644 --- a/eng/Build.props +++ b/eng/Build.props @@ -1,12 +1,14 @@ + + + - + - - \ No newline at end of file + diff --git a/eng/generate-sln.ps1 b/eng/generate-sln.ps1 new file mode 100644 index 0000000000..1473f9c7c2 --- /dev/null +++ b/eng/generate-sln.ps1 @@ -0,0 +1,70 @@ +#!/usr/bin/env pwsh + +<# +.SYNOPSIS + Generates and migrates Visual Studio solution files for the diagnostics repository. + +.DESCRIPTION + This script generates solution files using SlnGen tool. + +.EXAMPLE + .\generate-sln.ps1 +#> + +[CmdletBinding()] +param() + +Set-StrictMode -Version Latest +$ErrorActionPreference = "Stop" + +# Determine script location and repo root +$scriptRoot = Split-Path -Parent $MyInvocation.MyCommand.Path +$repoRoot = Split-Path -Parent $scriptRoot +$dotnet = Join-Path $repoRoot "dotnet.cmd" + +function Write-Success { + param([string]$Message) + Write-Host "[SUCCESS] $Message" -ForegroundColor Green +} + +function Write-Warning { + param([string]$Message) + Write-Host "[WARNING] $Message" -ForegroundColor Yellow +} + +function Write-ErrorMessage { + param([string]$Message) + Write-Host "[ERROR] $Message" -ForegroundColor Red +} + +try { + Write-Host "Diagnostics Solution Generator" -ForegroundColor Magenta + Write-Host "==============================" -ForegroundColor Magenta + + # Change to repo root directory to ensure all operations work correctly + $originalLocation = Get-Location + Set-Location $repoRoot + + # Generate solution files with SlnGen + Write-Host "Generating solution files with SlnGen..." -ForegroundColor Cyan + # Use local dotnet to execute SlnGen tool + & $dotnet tool exec Microsoft.VisualStudio.SlnGen.Tool --collapsefolders true --folders true --launch false + $slngenExit = $LASTEXITCODE + if ($slngenExit -ne 0) { + throw "SlnGen tool exited with non-zero exit code $slngenExit" + } + + Write-Host "" + Write-Success "Solution generation completed successfully!" + Write-Host "You can now open the generated build.sln file in Visual Studio." -ForegroundColor Gray +} +catch { + Write-ErrorMessage "Failed to generate solution files with SlnGen" + Write-Host "Error details: $($_.Exception.Message)" -ForegroundColor Red + exit 1 +} +finally { + # Restore original location + Set-Location $originalLocation +} + diff --git a/eng/generate-sln.sh b/eng/generate-sln.sh new file mode 100644 index 0000000000..a7121babc7 --- /dev/null +++ b/eng/generate-sln.sh @@ -0,0 +1,91 @@ +#!/bin/bash + +# Diagnostics Solution Generator for Unix/macOS +# +# SYNOPSIS: +# Generates Visual Studio solution files for the diagnostics repository. +# +# DESCRIPTION: +# This script generates solution files using SlnGen tool +# +# USAGE: +# ./generate-sln.sh + +set -euo pipefail + +# Get script directory and repository root +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +REPO_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)" +DOTNET="$REPO_ROOT/dotnet.sh" + +# Color codes for output +RED='\033[0;31m' +GREEN='\033[0;32m' +YELLOW='\033[1;33m' +CYAN='\033[0;36m' +MAGENTA='\033[0;35m' +GRAY='\033[0;37m' +NC='\033[0m' # No Color + +# Logging functions +write_step() { + echo -e "${CYAN}==> $1${NC}" +} + +write_success() { + echo -e "${GREEN}[SUCCESS] $1${NC}" +} + +write_warning() { + echo -e "${YELLOW}[WARNING] $1${NC}" +} + +write_error() { + echo -e "${RED}[ERROR] $1${NC}" +} + +# Cleanup function for error handling +cleanup() { + local exit_code=$? + if [ $exit_code -ne 0 ]; then + write_error "Script execution failed with exit code $exit_code" + fi + exit $exit_code +} + +# Set up error handling +trap cleanup EXIT ERR + +main() { + echo -e "${MAGENTA}Diagnostics Solution Generator${NC}" + echo -e "${MAGENTA}==============================${NC}" + + # Change to repository root + if ! cd "$REPO_ROOT"; then + write_error "Failed to change to repository root directory: $REPO_ROOT" + exit 1 + fi + + # Check if dotnet script exists + if [ ! -f "$DOTNET" ]; then + write_error "Local dotnet script not found at: $DOTNET" + echo "Make sure the dotnet.sh script exists in the repository root." + exit 1 + fi + + # Generate solution files with SlnGen in .sln format + write_step "Generating solution files with SlnGen..." + if "$DOTNET" tool exec Microsoft.VisualStudio.SlnGen.Tool --collapsefolders true --folders true --launch false; then + echo "" + write_success "Solution generation completed successfully!" + echo -e "${GRAY}You can now open the generated .sln files in Visual Studio, VS Code, or any compatible IDE.${NC}" + else + write_error "Failed to generate solution files with SlnGen" + echo "Make sure the SlnGen tool is installed:" + echo " $DOTNET tool install --global Microsoft.VisualStudio.SlnGen.Tool" + exit 1 + fi +} + +# Run main function +main "$@" diff --git a/global.json b/global.json index 8662fee20c..3cf65e2ca3 100644 --- a/global.json +++ b/global.json @@ -17,6 +17,7 @@ }, "msbuild-sdks": { "Microsoft.Build.NoTargets": "3.5.0", + "Microsoft.Build.Traversal": "3.4.0", "Microsoft.DotNet.Arcade.Sdk": "10.0.0-beta.25476.104" } } diff --git a/src/SOS/SOS.UnitTests/Debuggees/SymbolTestApp/SymbolTestApp.sln b/src/SOS/SOS.UnitTests/Debuggees/SymbolTestApp/SymbolTestApp.sln new file mode 100644 index 0000000000..7fe0b31211 --- /dev/null +++ b/src/SOS/SOS.UnitTests/Debuggees/SymbolTestApp/SymbolTestApp.sln @@ -0,0 +1,50 @@ +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 16 +VisualStudioVersion = 16.0.29613.14 +MinimumVisualStudioVersion = 15.0.26124.0 +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SymbolTestApp", "SymbolTestApp\SymbolTestApp.csproj", "{EB291C94-C60E-4AE6-AEA0-B7EEF86F00AD}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SymbolTestDll", "SymbolTestDll\SymbolTestDll.csproj", "{53E66227-71BB-4300-9BE9-56CE570B28F8}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Debug|x64 = Debug|x64 + Debug|x86 = Debug|x86 + Release|Any CPU = Release|Any CPU + Release|x64 = Release|x64 + Release|x86 = Release|x86 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {EB291C94-C60E-4AE6-AEA0-B7EEF86F00AD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {EB291C94-C60E-4AE6-AEA0-B7EEF86F00AD}.Debug|Any CPU.Build.0 = Debug|Any CPU + {EB291C94-C60E-4AE6-AEA0-B7EEF86F00AD}.Debug|x64.ActiveCfg = Debug|Any CPU + {EB291C94-C60E-4AE6-AEA0-B7EEF86F00AD}.Debug|x64.Build.0 = Debug|Any CPU + {EB291C94-C60E-4AE6-AEA0-B7EEF86F00AD}.Debug|x86.ActiveCfg = Debug|Any CPU + {EB291C94-C60E-4AE6-AEA0-B7EEF86F00AD}.Debug|x86.Build.0 = Debug|Any CPU + {EB291C94-C60E-4AE6-AEA0-B7EEF86F00AD}.Release|Any CPU.ActiveCfg = Release|Any CPU + {EB291C94-C60E-4AE6-AEA0-B7EEF86F00AD}.Release|Any CPU.Build.0 = Release|Any CPU + {EB291C94-C60E-4AE6-AEA0-B7EEF86F00AD}.Release|x64.ActiveCfg = Release|Any CPU + {EB291C94-C60E-4AE6-AEA0-B7EEF86F00AD}.Release|x64.Build.0 = Release|Any CPU + {EB291C94-C60E-4AE6-AEA0-B7EEF86F00AD}.Release|x86.ActiveCfg = Release|Any CPU + {EB291C94-C60E-4AE6-AEA0-B7EEF86F00AD}.Release|x86.Build.0 = Release|Any CPU + {53E66227-71BB-4300-9BE9-56CE570B28F8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {53E66227-71BB-4300-9BE9-56CE570B28F8}.Debug|Any CPU.Build.0 = Debug|Any CPU + {53E66227-71BB-4300-9BE9-56CE570B28F8}.Debug|x64.ActiveCfg = Debug|Any CPU + {53E66227-71BB-4300-9BE9-56CE570B28F8}.Debug|x64.Build.0 = Debug|Any CPU + {53E66227-71BB-4300-9BE9-56CE570B28F8}.Debug|x86.ActiveCfg = Debug|Any CPU + {53E66227-71BB-4300-9BE9-56CE570B28F8}.Debug|x86.Build.0 = Debug|Any CPU + {53E66227-71BB-4300-9BE9-56CE570B28F8}.Release|Any CPU.ActiveCfg = Release|Any CPU + {53E66227-71BB-4300-9BE9-56CE570B28F8}.Release|Any CPU.Build.0 = Release|Any CPU + {53E66227-71BB-4300-9BE9-56CE570B28F8}.Release|x64.ActiveCfg = Release|Any CPU + {53E66227-71BB-4300-9BE9-56CE570B28F8}.Release|x64.Build.0 = Release|Any CPU + {53E66227-71BB-4300-9BE9-56CE570B28F8}.Release|x86.ActiveCfg = Release|Any CPU + {53E66227-71BB-4300-9BE9-56CE570B28F8}.Release|x86.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {42F03860-BFB4-49ED-900B-0C32D06E0B53} + EndGlobalSection +EndGlobal diff --git a/src/SOS/SOS.UnitTests/Debuggees/SymbolTestApp/SymbolTestApp.slnx b/src/SOS/SOS.UnitTests/Debuggees/SymbolTestApp/SymbolTestApp.slnx deleted file mode 100644 index 07e088a690..0000000000 --- a/src/SOS/SOS.UnitTests/Debuggees/SymbolTestApp/SymbolTestApp.slnx +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/src/SOS/SOS.UnitTests/Debuggees/SymbolTestApp/SymbolTestApp/SymbolTestApp.csproj b/src/SOS/SOS.UnitTests/Debuggees/SymbolTestApp/SymbolTestApp/SymbolTestApp.csproj index 4a460a797e..f783e9c2ef 100644 --- a/src/SOS/SOS.UnitTests/Debuggees/SymbolTestApp/SymbolTestApp/SymbolTestApp.csproj +++ b/src/SOS/SOS.UnitTests/Debuggees/SymbolTestApp/SymbolTestApp/SymbolTestApp.csproj @@ -7,7 +7,7 @@ - + diff --git a/src/SOS/SOS.UnitTests/Debuggees/TaskNestedException/TaskNestedException.sln b/src/SOS/SOS.UnitTests/Debuggees/TaskNestedException/TaskNestedException.sln new file mode 100644 index 0000000000..ecca0ea023 --- /dev/null +++ b/src/SOS/SOS.UnitTests/Debuggees/TaskNestedException/TaskNestedException.sln @@ -0,0 +1,50 @@ +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 16 +VisualStudioVersion = 16.0.29613.14 +MinimumVisualStudioVersion = 15.0.26124.0 +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "TaskNestedException", "TaskNestedException\TaskNestedException.csproj", "{B9B58649-CEA6-4EF5-A25E-916AE8E77917}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "RandomUserLibrary", "RandomUserLibrary\RandomUserLibrary.csproj", "{FADE7D7D-107F-42B0-ABD5-36A101CD8675}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Debug|x64 = Debug|x64 + Debug|x86 = Debug|x86 + Release|Any CPU = Release|Any CPU + Release|x64 = Release|x64 + Release|x86 = Release|x86 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {B9B58649-CEA6-4EF5-A25E-916AE8E77917}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {B9B58649-CEA6-4EF5-A25E-916AE8E77917}.Debug|Any CPU.Build.0 = Debug|Any CPU + {B9B58649-CEA6-4EF5-A25E-916AE8E77917}.Debug|x64.ActiveCfg = Debug|Any CPU + {B9B58649-CEA6-4EF5-A25E-916AE8E77917}.Debug|x64.Build.0 = Debug|Any CPU + {B9B58649-CEA6-4EF5-A25E-916AE8E77917}.Debug|x86.ActiveCfg = Debug|Any CPU + {B9B58649-CEA6-4EF5-A25E-916AE8E77917}.Debug|x86.Build.0 = Debug|Any CPU + {B9B58649-CEA6-4EF5-A25E-916AE8E77917}.Release|Any CPU.ActiveCfg = Release|Any CPU + {B9B58649-CEA6-4EF5-A25E-916AE8E77917}.Release|Any CPU.Build.0 = Release|Any CPU + {B9B58649-CEA6-4EF5-A25E-916AE8E77917}.Release|x64.ActiveCfg = Release|Any CPU + {B9B58649-CEA6-4EF5-A25E-916AE8E77917}.Release|x64.Build.0 = Release|Any CPU + {B9B58649-CEA6-4EF5-A25E-916AE8E77917}.Release|x86.ActiveCfg = Release|Any CPU + {B9B58649-CEA6-4EF5-A25E-916AE8E77917}.Release|x86.Build.0 = Release|Any CPU + {FADE7D7D-107F-42B0-ABD5-36A101CD8675}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {FADE7D7D-107F-42B0-ABD5-36A101CD8675}.Debug|Any CPU.Build.0 = Debug|Any CPU + {FADE7D7D-107F-42B0-ABD5-36A101CD8675}.Debug|x64.ActiveCfg = Debug|Any CPU + {FADE7D7D-107F-42B0-ABD5-36A101CD8675}.Debug|x64.Build.0 = Debug|Any CPU + {FADE7D7D-107F-42B0-ABD5-36A101CD8675}.Debug|x86.ActiveCfg = Debug|Any CPU + {FADE7D7D-107F-42B0-ABD5-36A101CD8675}.Debug|x86.Build.0 = Debug|Any CPU + {FADE7D7D-107F-42B0-ABD5-36A101CD8675}.Release|Any CPU.ActiveCfg = Release|Any CPU + {FADE7D7D-107F-42B0-ABD5-36A101CD8675}.Release|Any CPU.Build.0 = Release|Any CPU + {FADE7D7D-107F-42B0-ABD5-36A101CD8675}.Release|x64.ActiveCfg = Release|Any CPU + {FADE7D7D-107F-42B0-ABD5-36A101CD8675}.Release|x64.Build.0 = Release|Any CPU + {FADE7D7D-107F-42B0-ABD5-36A101CD8675}.Release|x86.ActiveCfg = Release|Any CPU + {FADE7D7D-107F-42B0-ABD5-36A101CD8675}.Release|x86.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {53DA7C95-F7D2-4F8F-AD21-15CB94158C77} + EndGlobalSection +EndGlobal diff --git a/src/SOS/SOS.UnitTests/Debuggees/TaskNestedException/TaskNestedException.slnx b/src/SOS/SOS.UnitTests/Debuggees/TaskNestedException/TaskNestedException.slnx deleted file mode 100644 index badfcb13d2..0000000000 --- a/src/SOS/SOS.UnitTests/Debuggees/TaskNestedException/TaskNestedException.slnx +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/src/dirs.proj b/src/dirs.proj new file mode 100644 index 0000000000..79328cb2ae --- /dev/null +++ b/src/dirs.proj @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/tests/DbgShim.UnitTests/Debuggees/SimpleDebuggee/SimpleDebuggee.cs b/src/tests/DbgShim.UnitTests/Debuggees/SimpleDebuggee/SimpleDebuggee.cs index 8be1fbab04..1ee9672337 100644 --- a/src/tests/DbgShim.UnitTests/Debuggees/SimpleDebuggee/SimpleDebuggee.cs +++ b/src/tests/DbgShim.UnitTests/Debuggees/SimpleDebuggee/SimpleDebuggee.cs @@ -1,9 +1,13 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + using System; using System.Diagnostics; using System.IO.Pipes; -using System.Threading; -class Simple +namespace SimpleDebuggee; + +public class Simple { public static int Main(string[] args) { @@ -16,7 +20,7 @@ public static int Main(string[] args) { try { - using var pipeStream = new NamedPipeClientStream(pipeServerName); + using NamedPipeClientStream pipeStream = new(pipeServerName); Console.WriteLine("{0} SimpleDebuggee: connecting to pipe", pid); Console.Out.Flush(); diff --git a/src/tests/dirs.proj b/src/tests/dirs.proj new file mode 100644 index 0000000000..81a6b1efc7 --- /dev/null +++ b/src/tests/dirs.proj @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/start-vs.cmd b/start-vs.cmd index cd08940d0e..2f5584d7af 100644 --- a/start-vs.cmd +++ b/start-vs.cmd @@ -4,7 +4,7 @@ setlocal enabledelayedexpansion set "SDK_LOC=%~dp0.dotnet" if "%1" == "" ( - set "SLN_OR_PROJ=%~dp0diagnostics.slnx" + set "SLN_OR_PROJ=%~dp0build.sln" ) else ( set "SLN_OR_PROJ=%1" ) From 297a926f29a461b9015f401f7e9b98edfa09b922 Mon Sep 17 00:00:00 2001 From: Max Charlamb <44248479+max-charlamb@users.noreply.github.com> Date: Fri, 17 Oct 2025 16:29:59 -0400 Subject: [PATCH 04/44] Move dotnet-test into the artifacts folder (#5602) * moved the dotnet install from root to `/artifacts/dotnet-test` which can be packaged and sent up to helix --- Directory.Build.props | 5 +++ eng/InstallRuntimes.proj | 6 ++- .../Unix/Debugger.Tests.Config.txt | 33 ++++++++------- .../Windows/Debugger.Tests.Config.txt | 40 +++++++++---------- src/SOS/SOS.UnitTests/SOS.UnitTests.csproj | 1 + .../CommonTestRunner/CommonTestRunner.csproj | 1 + .../Unix/Debugger.Tests.Config.txt | 13 +++--- .../Windows/Debugger.Tests.Config.txt | 12 +++--- .../Unix/Debugger.Tests.Config.txt | 29 +++++++------- .../Windows/Debugger.Tests.Config.txt | 26 ++++++------ .../DbgShim.UnitTests.csproj | 2 + 11 files changed, 85 insertions(+), 83 deletions(-) diff --git a/Directory.Build.props b/Directory.Build.props index 10415c69c4..b225f2f659 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -29,8 +29,13 @@ $(TargetRid) - the runtime identifier (rid) to against (win-x64, linux-arm64, linux-musl-x64, etc). $(Configuration) - configuration to test (Debug, Release). Defaults to Debug. $(ArtifactsBinDir) - artifacts\bin directory + $(ArtifactsDotnetTestDir) - artifacts\dotnet-test directory --> + + $([MSBuild]::NormalizeDirectory('$(ArtifactsDir)', 'dotnet-test')) + + linux Windows_NT diff --git a/eng/InstallRuntimes.proj b/eng/InstallRuntimes.proj index d817ad01f9..b52bfcc415 100644 --- a/eng/InstallRuntimes.proj +++ b/eng/InstallRuntimes.proj @@ -16,19 +16,21 @@ $(RepoRoot) - the root of the diagnostics repo $(RepositoryEngineeringDir) - the "eng" directory $(VersionsPropsPath) - path of Versions.props + + From Directory.Build.props: + $(ArtifactsDotnetTestDir) - artifacts\dotnet-test directory --> $([MSBuild]::NormalizePath('$(LiveRuntimeDir)')) + $(ArtifactsDotnetTestDir) - $(RepoRoot).dotnet-test\ HKEY_LOCAL_MACHINE\SOFTWARE - $(RepoRoot).dotnet-test\x86\ HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node 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 336715b0ff..698895147d 100644 --- a/src/SOS/SOS.UnitTests/ConfigFiles/Unix/Debugger.Tests.Config.txt +++ b/src/SOS/SOS.UnitTests/ConfigFiles/Unix/Debugger.Tests.Config.txt @@ -9,15 +9,14 @@ - $(RepoRootDir)/.dotnet-test + $(ArtifactsDir)/dotnet-test ProjectK $(RepoRootDir)/src/SOS/SOS.UnitTests/Scripts - $(RepoRootDir)/artifacts - $(RootBinDir)/bin/$(OS).$(TargetArchitecture).$(TargetConfiguration) - $(RootBinDir)/TestResults/$(TargetConfiguration)/sos.unittests_$(Timestamp) - $(RootBinDir)/tmp/$(TargetConfiguration)\dumps + $(ArtifactsDir)/bin/$(OS).$(TargetArchitecture).$(TargetConfiguration) + $(ArtifactsDir)/TestResults/$(TargetConfiguration)/sos.unittests_$(Timestamp) + $(ArtifactsDir)/tmp/$(TargetConfiguration)\dumps true true @@ -31,7 +30,7 @@ $(RepoRootDir)/src/SOS/SOS.UnitTests/Debuggees $(RepoRootDir)/eng/AuxMsbuildFiles sdk.prebuilt - $(RootBinDir) + $(ArtifactsDir) $(DotNetRoot)/dotnet @@ -43,7 +42,7 @@ ]]> diff --git a/src/tests/CommonTestRunner/CommonTestRunner.csproj b/src/tests/CommonTestRunner/CommonTestRunner.csproj index 6d70ad1ad7..5c7edce292 100644 --- a/src/tests/CommonTestRunner/CommonTestRunner.csproj +++ b/src/tests/CommonTestRunner/CommonTestRunner.csproj @@ -31,6 +31,7 @@ $(Configuration) $(RepoRoot) + $(ArtifactsDir) $(NetCoreAppMinTargetFramework) ]]> diff --git a/src/tests/CommonTestRunner/ConfigFiles/Unix/Debugger.Tests.Config.txt b/src/tests/CommonTestRunner/ConfigFiles/Unix/Debugger.Tests.Config.txt index e168348f44..d396c30244 100644 --- a/src/tests/CommonTestRunner/ConfigFiles/Unix/Debugger.Tests.Config.txt +++ b/src/tests/CommonTestRunner/ConfigFiles/Unix/Debugger.Tests.Config.txt @@ -1,18 +1,17 @@ - $(RepoRootDir)/.dotnet-test + $(ArtifactsDir)/dotnet-test - $(RepoRootDir)/artifacts - $(RootBinDir)/bin/$(OS).$(TargetArchitecture).$(TargetConfiguration) - $(RootBinDir)/TestResults/$(TargetConfiguration)/common.unittests_$(Timestamp) - + $(ArtifactsDir)/bin/$(OS).$(TargetArchitecture).$(TargetConfiguration) + $(ArtifactsDir)/TestResults/$(TargetConfiguration)/common.unittests_$(Timestamp) + ProjectK $(RepoRootDir)/src/tests $(RepoRootDir)/eng/AuxMsbuildFiles cli sdk.prebuilt - $(RootBinDir) + $(ArtifactsDir) $(DotNetRoot)/dotnet @@ -43,5 +42,5 @@ --fx-version $(RuntimeFrameworkVersion) $(DotNetRoot)/dotnet - $(RootBinDir)/bin/dotnet-trace/$(TargetConfiguration)/$(NetCoreAppMinTargetFramework)/dotnet-trace.dll + $(ArtifactsDir)/bin/dotnet-trace/$(TargetConfiguration)/$(NetCoreAppMinTargetFramework)/dotnet-trace.dll diff --git a/src/tests/CommonTestRunner/ConfigFiles/Windows/Debugger.Tests.Config.txt b/src/tests/CommonTestRunner/ConfigFiles/Windows/Debugger.Tests.Config.txt index e3a408fbbf..8d6532920c 100644 --- a/src/tests/CommonTestRunner/ConfigFiles/Windows/Debugger.Tests.Config.txt +++ b/src/tests/CommonTestRunner/ConfigFiles/Windows/Debugger.Tests.Config.txt @@ -1,18 +1,16 @@ - $(RepoRootDir)\.dotnet-test - $(RepoRootDir)\.dotnet-test\x86 + $(ArtifactsDir)\dotnet-test - $(RepoRootDir)\artifacts - $(RootBinDir)\bin\Windows_NT.$(TargetArchitecture).$(TargetConfiguration) - $(RootBinDir)\TestResults\$(TargetConfiguration)\common.unittests_$(Timestamp) + $(ArtifactsDir)\bin\Windows_NT.$(TargetArchitecture).$(TargetConfiguration) + $(ArtifactsDir)\TestResults\$(TargetConfiguration)\common.unittests_$(Timestamp) ProjectK $(RepoRootDir)\src\tests $(RepoRootDir)\eng\AuxMsbuildFiles sdk.prebuilt - $(RootBinDir) + $(ArtifactsDir) $(DotNetRoot)\dotnet.exe @@ -42,5 +40,5 @@ --fx-version $(RuntimeFrameworkVersion) $(DotNetRoot)\dotnet.exe - $(RootBinDir)\bin\dotnet-trace\$(TargetConfiguration)\$(NetCoreAppMinTargetFramework)\dotnet-trace.dll + $(ArtifactsDir)\bin\dotnet-trace\$(TargetConfiguration)\$(NetCoreAppMinTargetFramework)\dotnet-trace.dll diff --git a/src/tests/DbgShim.UnitTests/ConfigFiles/Unix/Debugger.Tests.Config.txt b/src/tests/DbgShim.UnitTests/ConfigFiles/Unix/Debugger.Tests.Config.txt index 283f1082cf..e7ab8eb917 100644 --- a/src/tests/DbgShim.UnitTests/ConfigFiles/Unix/Debugger.Tests.Config.txt +++ b/src/tests/DbgShim.UnitTests/ConfigFiles/Unix/Debugger.Tests.Config.txt @@ -1,26 +1,25 @@ - $(RepoRootDir)/.dotnet-test + $(ArtifactsDir)/dotnet-test - $(RepoRootDir)/artifacts - $(RootBinDir)/bin/$(OS).$(TargetArchitecture).$(TargetConfiguration) - $(RootBinDir)/TestResults/$(TargetConfiguration)/dbgshim.unittests_$(Timestamp) - + $(ArtifactsDir)/bin/$(OS).$(TargetArchitecture).$(TargetConfiguration) + $(ArtifactsDir)/TestResults/$(TargetConfiguration)/dbgshim.unittests_$(Timestamp) + ProjectK $(RepoRootDir)/src/tests/DbgShim.UnitTests/Debuggees $(RepoRootDir)/eng/AuxMsbuildFiles cli SimpleDebuggee - !-- Use the global.json SDK to build and the test SDK/runtime to run --> + $(DotNetRoot)/dotnet false true false - + false true false @@ -61,28 +60,28 @@ + $(SOSPackagePathPrefix)/lib From fee8d6975fa81e7379d62d536b3c74de20b4d24a Mon Sep 17 00:00:00 2001 From: Noah Falk Date: Tue, 21 Oct 2025 09:26:33 -0700 Subject: [PATCH 06/44] Add README.md for SOS.Package usage information (#5605) Fixes #5604 --- src/SOS/SOS.Package/README.md | 1 + 1 file changed, 1 insertion(+) create mode 100644 src/SOS/SOS.Package/README.md diff --git a/src/SOS/SOS.Package/README.md b/src/SOS/SOS.Package/README.md new file mode 100644 index 0000000000..287efd0b9c --- /dev/null +++ b/src/SOS/SOS.Package/README.md @@ -0,0 +1 @@ +We use this manifest with windbg so it knows when to load SOS. You can see some example manifests at https://github.com/microsoft/WinDbg-Samples/blob/master/TargetComposition/TextDump/TextDump_GalleryManifest.xml From fcb028b0c776e72f2cdaa9b4a841dd69e72f6bf0 Mon Sep 17 00:00:00 2001 From: Copilot <198982749+Copilot@users.noreply.github.com> Date: Wed, 22 Oct 2025 12:21:18 -0400 Subject: [PATCH 07/44] Create AGENTS.md with standard guidance for AI agents (#5609) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - [x] Understand the repository structure and context - [x] Create AGENTS.md file with standard guidance for AI agents - [x] Include repository-specific information (build, test, architecture) - [x] Include coding standards and conventions - [x] Include testing guidelines - [x] Verify the file is properly formatted and complete - [x] Update build options to use single dash for consistency - [x] Merge EditorConfig section with C# Code Style section - [x] Add Development Workflow section - [x] Remove .NET Runtime Repository link from Resources - [x] Refine guidance on making changes to balance minimal changes with code clarity
Original prompt > > ---- > > *This section details on the original issue you should resolve* > > Create AGENTS.md > As we use copilot more we won't want to repeat the same general guidance again and again on every PR. Instead we should have an AGENTS.md file that provides this standard information in a reusable form. > > ## Comments on the Issue (you are @copilot in this section) > > > >
Fixes dotnet/diagnostics#5608 --- ✨ Let Copilot coding agent [set things up for you](https://github.com/dotnet/diagnostics/issues/new?title=✨+Set+up+Copilot+instructions&body=Configure%20instructions%20for%20this%20repository%20as%20documented%20in%20%5BBest%20practices%20for%20Copilot%20coding%20agent%20in%20your%20repository%5D%28https://gh.io/copilot-coding-agent-tips%29%2E%0A%0A%3COnboard%20this%20repo%3E&assignees=copilot) — coding agent works faster and does higher quality work when set up for your repo. --------- Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: noahfalk <6243776+noahfalk@users.noreply.github.com> Co-authored-by: hoyosjs <19413848+hoyosjs@users.noreply.github.com> --- .github/workflows/copilot-setup-steps.yml | 36 +++ AGENTS.md | 285 ++++++++++++++++++++++ 2 files changed, 321 insertions(+) create mode 100644 .github/workflows/copilot-setup-steps.yml create mode 100644 AGENTS.md diff --git a/.github/workflows/copilot-setup-steps.yml b/.github/workflows/copilot-setup-steps.yml new file mode 100644 index 0000000000..486e1e1cd9 --- /dev/null +++ b/.github/workflows/copilot-setup-steps.yml @@ -0,0 +1,36 @@ +name: "Copilot Setup Steps" + +# Allow testing of the setup steps from your repository's "Actions" tab. +on: workflow_dispatch + +jobs: + # The job MUST be called `copilot-setup-steps` or it will not be picked up by Copilot. + # See https://docs.github.com/en/copilot/customizing-copilot/customizing-the-development-environment-for-copilot-coding-agent + copilot-setup-steps: + runs-on: 8-core-ubuntu-latest + + permissions: + contents: read + + # You can define any steps you want, and they will run before the agent starts. + # If you do not check out your code, Copilot will do this for you. + steps: + - uses: actions/checkout@v5 + + - name: Install Dependencies + run: | + sudo ./eng/common/native/install-dependencies.sh && \ + sudo apt-get install -qq -y \ + curl + + - name: Restore solution + run: ./build.sh -restore + + - name: Put dotnet on the path + run: echo "PATH=$PWD/.dotnet:$PATH" >> $GITHUB_ENV + + - name: Run dotnet info + run: dotnet --info + + - name: Build clr+libs + run: ./build.sh diff --git a/AGENTS.md b/AGENTS.md new file mode 100644 index 0000000000..dfc68e7e33 --- /dev/null +++ b/AGENTS.md @@ -0,0 +1,285 @@ +# Agent Guidelines for .NET Diagnostics Repository + +This document provides standard guidance for AI agents and automated tools working on the .NET Diagnostics repository. Following these guidelines will help ensure consistency and quality across contributions. + +## Repository Overview + +The .NET Diagnostics repository contains diagnostic tools and libraries for .NET Core, including: + +- **SOS**: The Son of Strike debugger extension +- **dotnet-dump**: Dump collection and analysis utility +- **dotnet-gcdump**: Heap analysis tool +- **dotnet-trace**: Event collection tool +- **dotnet-counters**: Performance counter monitoring tool +- **Diagnostic libraries**: Client libraries and services for diagnostics + +## Build System + +### Building the Repository + +The repository uses a cross-platform build system: + +**Linux/macOS:** +```bash +./build.sh +``` + +**Windows:** +```cmd +Build.cmd +``` + +### Build Scripts Location +- Main build scripts: `build.sh` / `Build.cmd` at repository root +- Actual build logic: `eng/build.sh` / `eng/Build.cmd` +- Build configuration: `build.proj`, `Directory.Build.props`, `Directory.Build.targets` + +### Common Build Options +- `-configuration `: Build configuration (default: Debug) +- `-architecture `: Target architecture +- `-restore`: Restore dependencies before building +- `-build`: Build the repository +- `-rebuild`: Clean and rebuild +- `-test`: Run tests after building + +## Testing + +### Running Tests + +**Linux/macOS:** +```bash +./test.sh +``` + +**Windows:** +```cmd +Test.cmd +``` + +The test script runs all tests in the repository. Test projects are located in the `src/tests` directory. + +### Test Organization +- Unit tests are typically in `*.Tests` projects +- Integration tests may be in separate test projects +- Test helpers are in `Microsoft.Diagnostics.TestHelpers` + +## Project Structure + +``` +/src +├── Microsoft.Diagnostics.DebugServices # Debug service interfaces +├── Microsoft.Diagnostics.DebugServices.Implementation # Debug service implementations +├── Microsoft.Diagnostics.ExtensionCommands # SOS extension commands +├── Microsoft.Diagnostics.Monitoring # Monitoring libraries +├── Microsoft.Diagnostics.NETCore.Client # Diagnostic client library +├── Microsoft.Diagnostics.Repl # REPL infrastructure +├── Microsoft.FileFormats # File format parsers +├── Microsoft.SymbolStore # Symbol store implementation +├── SOS # SOS debugger extension +├── Tools # Command-line tools (dump, trace, counters, gcdump) +├── tests # Test projects +└── shared # Shared native code + +/documentation # Documentation files +/eng # Engineering/build infrastructure +``` + +## Coding Standards + +### C# Code Style + +The repository follows standard .NET coding conventions defined in the `.editorconfig` file at the root. This is a **must** for C# code. Ensure your changes conform to these settings: + +1. **Indentation**: 4 spaces (no tabs) +2. **Line endings**: LF on Linux/macOS, CRLF on Windows +3. **Braces**: Opening braces on new lines for types, methods, properties, control blocks +4. **Naming**: + - PascalCase for types, methods, properties, public fields + - camelCase for local variables, parameters, private fields + - `_camelCase` for private instance fields (with underscore prefix) +5. **File organization**: One type per file, filename matches type name +6. **Additional EditorConfig rules**: + - Trim trailing whitespace + - Insert final newline + - Follow C# new line and indentation preferences + +### Native Code (C/C++) + +Native code follows similar conventions: +- 4 spaces for indentation +- Braces on same line for control structures in C++ +- Use clear, descriptive names +- Follow existing patterns in the codebase + +## Making Changes + +### General Guidelines + +1. **Surgical changes**: Make the smallest possible changes to address the issue. Focus on solving a single problem without addressing unrelated concerns. Balance minimal code changes with preserving overall code clarity and simplicity +2. **Preserve existing behavior**: Don't break working functionality unless explicitly required +3. **Follow existing patterns**: Match the style and structure of surrounding code +4. **Test thoroughly**: Run builds and tests to verify changes +5. **Update documentation**: If making significant changes, update relevant documentation + +### Before Making Changes + +1. Run a clean build to ensure the current state is valid: + ```bash + ./build.sh # or Build.cmd on Windows + ``` + +2. Run tests to understand the baseline: + ```bash + ./test.sh # or Test.cmd on Windows + ``` + +3. Understand the area you're working on: + - Read related source files + - Review existing tests + - Check documentation in `/documentation` + +### After Making Changes + +1. **Build**: Ensure your changes compile without errors or new warnings +2. **Test**: Run relevant tests to verify functionality +3. **Code style**: Verify changes match the repository's coding standards +4. **Documentation**: Update if your changes affect public APIs or behavior + +## Development Workflow + +### Typical Workflow + +1. **Create a branch**: Create a feature branch from `main` with a descriptive name +2. **Make changes**: Implement your changes following the coding standards +3. **Build locally**: Run `./build.sh` (or `Build.cmd` on Windows) to ensure the code compiles +4. **Run tests**: Execute `./test.sh` (or `Test.cmd` on Windows) to verify functionality +5. **Commit changes**: Make small, logical commits with clear commit messages +6. **Push to remote**: Push your branch to the remote repository +7. **Create pull request**: Open a PR with a clear description of your changes +8. **Address feedback**: Respond to review comments and make necessary updates +9. **Merge**: Once approved, the PR will be merged to `main` + +### Iterative Development + +- Make small, incremental changes rather than large, sweeping modifications +- Test frequently to catch issues early +- Commit logical units of work separately +- Keep the build and tests passing at each commit when possible + +### Pull Request Guidelines + +- **Title**: Use a clear, descriptive title that summarizes the change +- **Description**: Explain what changed, why it changed, and how to test it +- **Link issues**: Reference related issues using "Fixes #1234" or "Addresses #1234" +- **Keep focused**: Each PR should address a single concern or feature +- **Respond promptly**: Address review feedback in a timely manner + +## Common Patterns + +### Solution Files + +The main solution file is `build.sln` at the root. This file is generated from `build.proj` and can be regenerated using: +```bash +./eng/generate-sln.sh +``` + +### Dependency Management + +- NuGet packages: `eng/Versions.props` defines package versions +- Project references: Use relative paths in `.csproj` files +- Native dependencies: Handled through CMake + +### Platform-Specific Code + +The repository supports multiple platforms (Windows, Linux, macOS, FreeBSD, NetBSD): +- Use conditional compilation (`#if`, `#ifdef`) for platform-specific code +- Leverage .NET's platform detection APIs +- Keep platform-specific code minimal and isolated + +## Debugging and Diagnostics + +### Loading in IDEs + +**Visual Studio Code:** +- Open the repository root folder +- Load `build.sln` for better IntelliSense +- Use the provided launch configurations in `.vscode` + +**Visual Studio:** +```cmd +start-vs.cmd +``` + +### Common Issues + +1. **Build failures**: Ensure all prerequisites are installed (see documentation/building/) +2. **Test failures**: Some tests may require specific runtime versions or configurations +3. **Native component issues**: Check CMake output for missing dependencies + +## Dependencies and Security + +### Adding Dependencies + +1. **NuGet packages**: Add to `eng/Versions.props` with appropriate version +2. **Security**: Be mindful of security implications when adding dependencies +3. **Licensing**: Ensure new dependencies are compatible with MIT license +4. **Minimize dependencies**: Only add when necessary + +### Security Considerations + +- Never commit secrets or credentials +- Follow secure coding practices (input validation, proper error handling) +- Be cautious with native interop and memory management +- Review security implications of changes + +## Testing Philosophy + +1. **Write tests for new functionality**: New features should include tests +2. **Don't remove existing tests**: Tests verify important functionality +3. **Fix test failures related to your changes**: Don't ignore failing tests +4. **Maintain test quality**: Tests should be clear, focused, and maintainable + +## Documentation + +### When to Update Documentation + +- Adding new tools or features +- Changing public APIs +- Modifying build or test procedures +- Adding new dependencies or requirements + +### Documentation Locations + +- Tool documentation: `/documentation/*-instructions.md` +- Building instructions: `/documentation/building/` +- Design documents: `/documentation/design-docs/` +- README: `/README.md` + +## Git and Version Control + +### Branch Strategy + +- Main development: `main` branch +- Feature branches: Use descriptive names +- Pull requests: Required for all changes + +### Commit Messages + +- First line: Brief summary (50 characters or less) +- Blank line, then detailed description if needed +- Reference issues: "Fixes #1234" or "Addresses #1234" + +## Resources + +- [Building on Linux](documentation/building/linux-instructions.md) +- [Building on Windows](documentation/building/windows-instructions.md) +- [Building on macOS](documentation/building/osx-instructions.md) +- [FAQ](documentation/FAQ.md) + +## Questions and Support + +If you encounter issues or have questions: +1. Check existing documentation in `/documentation` +2. Review closed issues and pull requests for similar problems +3. Consult the [FAQ](documentation/FAQ.md) +4. Ask in the issue or pull request you're working on From d4961a0eaa599e14f815f50985b986148bdabc1b Mon Sep 17 00:00:00 2001 From: Mitchell Hwang <16830051+mdh1418@users.noreply.github.com> Date: Thu, 23 Oct 2025 17:15:24 -0400 Subject: [PATCH 08/44] [dotnet-trace] Add collect-linux verb (#5570) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Implements https://github.com/dotnet/docs/pull/47894 Following the addition of emitting native runtime and custom EventSource events as user_events through https://github.com/dotnet/runtime/pull/115265 and the public release of https://github.com/microsoft/one-collect which supports collecting both .NET user_events and Linux perf events into a single .nettrace file, `dotnet-trace` will support a new verb, `collect-linux`, that wraps around `record-trace`. This PR does the following: - Adds `collect-linux` verb and serializes a subset of `dotnet-trace collect` options in addition to a `collect-linux` specific `--perf-events` option into `record-trace` args. (see https://github.com/dotnet/docs/pull/47894 for overarching details) - Adds record-trace dynamic library to `dotnet-trace` - Updates existing profiles (`cpu-sampling` -> `dotnet-common` + `dotnet-sampled-thread-time`) and adds `collect-linux` specific profiles - Updates `list-profiles` verb with revamped profiles + multiline description formatting - Refactors `EventPipeProvider` composition logic (`MergeProfileAndProviders` + `ToProviders` -> `ComputeProviderConfig`) and rename `Extensions.cs` -> `ProviderUtils.cs` - Revamp EventPipeProvider composition tests (`ProviderParsing.cs` -> `ProviderCompositionTests.cs`) - Various cleanup: Update CLREventKeywords + Update logging + refactor `collect` logic + expand `dotnet-trace` common options ## Testing ### dotnet-trace collect-linux On Linux
collect-linux
collect-linux --help ```bash $ ./dotnet-trace collect-linux -h Description: Collects diagnostic traces using perf_events, a Linux OS technology. collect-linux requires admin privileges to capture kernel- and user-mode events, and by default, captures events from all processes. This Linux-only command includes the same .NET events as dotnet-trace collect, and it uses the kernel’s user_events mechanism to emit .NET events as perf events, enabling unification of user-space .NET events with kernel-space system events. Usage: dotnet-trace collect-linux [options] Options: --providers A comma delimited list of EventPipe providers to be enabled. This is in the form 'Provider[,Provider]',where Provider is in the form: 'KnownProviderName[:[Flags][:[Level][:[KeyValueArgs]]]]', and KeyValueArgs is in the form: '[key1=value1][;key2=value2]'. Values in KeyValueArgs that contain ';' or '=' characters need to be surrounded by '"', e.g., FilterAndPayloadSpecs="MyProvider/MyEvent:-Prop1=Prop1;Prop2=Prop2.A.B;". Depending on your shell, you may need to escape the '"' characters and/or surround the entire provider specification in quotes, e.g., --providers 'KnownProviderName:0x1:1:FilterSpec=\"KnownProviderName/EventName:-Prop1=Prop1;Prop2=Prop2.A.B;\"'. These providers are in addition to any providers implied by the --profile argument. If there is any discrepancy for a particular provider, the configuration here takes precedence over the implicit configuration from the profile. See documentation for examples. --clreventlevel Verbosity of CLR events to be emitted. --clrevents List of CLR runtime events to emit. --perf-events Comma-separated list of perf events (e.g. syscalls:sys_enter_execve,sched:sched_switch). --profile A named, pre-defined set of provider configurations for common tracing scenarios. You can specify multiple profiles as a comma-separated list. When multiple profiles are specified, the providers and settings are combined (union), and duplicates are ignored. -o, --output The output path for the collected trace data. If not specified it defaults to '__.nettrace', e.g., 'myapp_20210315_111514.nettrace'. [default: default] --duration When specified, will trace for the given timespan and then automatically stop the trace. Provided in the form of dd:hh:mm:ss. -?, -h, --help Show help and usage information ```
`collect-linux` without elevated privileges ```bash $ ./dotnet-trace collect-linux ========================================================================================== The collect-linux verb is in preview. Some usage scenarios may not yet be supported, and some trace parsers may not yet support NetTrace V6. For any bugs or unexpected behaviors, please open an issue at https://github.com/dotnet/diagnostics/issues. ========================================================================================== No providers, profiles, ClrEvents, or PerfEvents were specified, defaulting to trace profiles 'dotnet-common' + 'cpu-sampling'. Provider Name Keywords Level Enabled By Microsoft-Windows-DotNETRuntime 0x000000100003801D Informational(4) --profile Linux Perf Events Enabled By cpu-sampling --profile Output File : /home/mihw/repo/diagnostics/trace_20251022_152234.nettrace Error: Tracefs is not accessible: Permission denied (os error 13) ```
`collect-linux` with elevated privileges ```bash $ sudo ./dotnet-trace collect-linux ========================================================================================== The collect-linux verb is in preview. Some usage scenarios may not yet be supported, and some trace parsers may not yet support NetTrace V6. For any bugs or unexpected behaviors, please open an issue at https://github.com/dotnet/diagnostics/issues. ========================================================================================== No providers, profiles, ClrEvents, or PerfEvents were specified, defaulting to trace profiles 'dotnet-common' + 'cpu-sampling'. Provider Name Keywords Level Enabled By Microsoft-Windows-DotNETRuntime 0x000000100003801D Informational(4) --profile Linux Perf Events Enabled By cpu-sampling --profile Output File : /home/mihw/repo/diagnostics/trace_20251022_152124.nettrace [00:00:00:21] Recording trace. Press or to exit... Recording stopped. Resolving symbols. Finished recording trace. Trace written to /home/mihw/repo/diagnostics/trace_20251022_152124.nettrace ```
On Windows (and I presume other non-Linux OS):
`collect-linux` ```pwsh .\artifacts\bin\dotnet-trace\Debug\net8.0\dotnet-trace.exe collect-linux The collect-linux command is only supported on Linux. ```
### dotnet-trace list-profiles
`list-profiles` ```bash dotnet-trace profiles: dotnet-common - Lightweight .NET runtime diagnostics designed to stay low overhead. Includes GC, AssemblyLoader, Loader, JIT, Exceptions, Threading, JittedMethodILToNativeMap, and Compilation events Equivalent to --providers "Microsoft-Windows-DotNETRuntime:0x100003801D:4". dotnet-sampled-thread-time (collect) - Samples .NET thread stacks (~100 Hz) toestimate how much wall clock time code is using. gc-verbose - Tracks GC collections and samples object allocations. gc-collect - Tracks GC collections only at very low overhead. database - Captures ADO.NET and Entity Framework database commands cpu-sampling (collect-linux) - Kernel CPU sampling events for measuring CPU usage. thread-time (collect-linux) - Kernel thread context switch events for measuring CPU usage and wall clock time ```
Screenshot 2025-09-19 142848 Screenshot 2025-09-19 142945 Screenshot 2025-09-19 142858 --- src/Tools/Common/Commands/Utils.cs | 1 + .../dotnet-counters/dotnet-counters.csproj | 1 - .../CommandLine/Commands/CollectCommand.cs | 170 +++------ .../Commands/CollectLinuxCommand.cs | 326 +++++++++++++++++ .../CommandLine/Commands/ConvertCommand.cs | 4 +- .../Commands/ListProfilesCommandHandler.cs | 82 ++++- .../CommandLine/Options/CommonOptions.cs | 60 ++- src/Tools/dotnet-trace/Profile.cs | 33 +- src/Tools/dotnet-trace/Program.cs | 1 + .../{Extensions.cs => ProviderUtils.cs} | 186 +++++++--- .../dotnet-trace/TraceFileFormatConverter.cs | 4 +- src/Tools/dotnet-trace/dotnet-trace.csproj | 6 + src/tests/dotnet-trace/CLRProviderParsing.cs | 10 +- .../CollectCommandFunctionalTests.cs | 106 ++++-- .../CollectLinuxCommandFunctionalTests.cs | 300 +++++++++++++++ .../dotnet-trace/ProfileProviderMerging.cs | 44 --- .../dotnet-trace/ProviderCompositionTests.cs | 336 +++++++++++++++++ src/tests/dotnet-trace/ProviderParsing.cs | 341 ------------------ 18 files changed, 1370 insertions(+), 641 deletions(-) create mode 100644 src/Tools/dotnet-trace/CommandLine/Commands/CollectLinuxCommand.cs rename src/Tools/dotnet-trace/{Extensions.cs => ProviderUtils.cs} (52%) create mode 100644 src/tests/dotnet-trace/CollectLinuxCommandFunctionalTests.cs delete mode 100644 src/tests/dotnet-trace/ProfileProviderMerging.cs create mode 100644 src/tests/dotnet-trace/ProviderCompositionTests.cs delete mode 100644 src/tests/dotnet-trace/ProviderParsing.cs diff --git a/src/Tools/Common/Commands/Utils.cs b/src/Tools/Common/Commands/Utils.cs index 68d2f8241e..e6b303c49d 100644 --- a/src/Tools/Common/Commands/Utils.cs +++ b/src/Tools/Common/Commands/Utils.cs @@ -217,6 +217,7 @@ internal enum ReturnCode SessionCreationError, TracingError, ArgumentError, + PlatformNotSupportedError, UnknownError } } diff --git a/src/Tools/dotnet-counters/dotnet-counters.csproj b/src/Tools/dotnet-counters/dotnet-counters.csproj index 1702d0213c..2ac31e5434 100644 --- a/src/Tools/dotnet-counters/dotnet-counters.csproj +++ b/src/Tools/dotnet-counters/dotnet-counters.csproj @@ -12,7 +12,6 @@ - diff --git a/src/Tools/dotnet-trace/CommandLine/Commands/CollectCommand.cs b/src/Tools/dotnet-trace/CommandLine/Commands/CollectCommand.cs index 7376b72ca0..c9d4124f78 100644 --- a/src/Tools/dotnet-trace/CommandLine/Commands/CollectCommand.cs +++ b/src/Tools/dotnet-trace/CommandLine/Commands/CollectCommand.cs @@ -63,7 +63,7 @@ private void ConsoleWriteLine(string str = "") /// A string, parsed as [payload_field_name]:[payload_field_value] pairs separated by commas, that will stop the trace upon hitting an event with a matching payload. Requires `--stopping-event-provider-name` and `--stopping-event-event-name` to be set. /// Collect rundown events. /// - internal async Task Collect(CancellationToken ct, CommandLineConfiguration cliConfig, int processId, FileInfo output, uint buffersize, string providers, string profile, TraceFileFormat format, TimeSpan duration, string clrevents, string clreventlevel, string name, string diagnosticPort, bool showchildio, bool resumeRuntime, string stoppingEventProviderName, string stoppingEventEventName, string stoppingEventPayloadFilter, bool? rundown, string dsrouter) + internal async Task Collect(CancellationToken ct, CommandLineConfiguration cliConfig, int processId, FileInfo output, uint buffersize, string[] providers, string[] profile, TraceFileFormat format, TimeSpan duration, string clrevents, string clreventlevel, string name, string diagnosticPort, bool showchildio, bool resumeRuntime, string stoppingEventProviderName, string stoppingEventEventName, string stoppingEventPayloadFilter, bool? rundown, string dsrouter) { bool collectionStopped = false; bool cancelOnEnter = true; @@ -119,37 +119,35 @@ internal async Task Collect(CancellationToken ct, CommandLineConfiguration if (profile.Length == 0 && providers.Length == 0 && clrevents.Length == 0) { - ConsoleWriteLine("No profile or providers specified, defaulting to trace profile 'cpu-sampling'"); - profile = "cpu-sampling"; + ConsoleWriteLine("No profile or providers specified, defaulting to trace profiles 'dotnet-common' + 'dotnet-sampled-thread-time'."); + profile = new[] { "dotnet-common", "dotnet-sampled-thread-time" }; } - Dictionary enabledBy = new(); - - List providerCollection = Extensions.ToProviders(providers); - foreach (EventPipeProvider providerCollectionProvider in providerCollection) + List providerCollection = ProviderUtils.ComputeProviderConfig(providers, clrevents, clreventlevel, profile, !IsQuiet, "collect", Console); + if (providerCollection.Count <= 0) { - enabledBy[providerCollectionProvider.Name] = "--providers "; + Console.Error.WriteLine("No providers were specified to start a trace."); + return (int)ReturnCode.ArgumentError; } - long rundownKeyword = EventPipeSession.DefaultRundownKeyword; + long rundownKeyword = 0; RetryStrategy retryStrategy = RetryStrategy.NothingToRetry; - - if (profile.Length != 0) + foreach (string prof in profile) { - Profile selectedProfile = ListProfilesCommandHandler.DotNETRuntimeProfiles - .FirstOrDefault(p => p.Name.Equals(profile, StringComparison.OrdinalIgnoreCase)); - if (selectedProfile == null) + // Profiles are already validated in ComputeProviderConfig + Profile selectedProfile = ListProfilesCommandHandler.TraceProfiles + .FirstOrDefault(p => p.Name.Equals(prof, StringComparison.OrdinalIgnoreCase)); + + rundownKeyword |= selectedProfile.RundownKeyword; + if (selectedProfile.RetryStrategy > retryStrategy) { - Console.Error.WriteLine($"Invalid profile name: {profile}"); - return (int)ReturnCode.ArgumentError; + retryStrategy = selectedProfile.RetryStrategy; } - - rundownKeyword = selectedProfile.RundownKeyword; - retryStrategy = selectedProfile.RetryStrategy; - - Profile.MergeProfileAndProviders(selectedProfile, providerCollection, enabledBy); } - + if (rundownKeyword == 0) + { + rundownKeyword = EventPipeSession.DefaultRundownKeyword; + } if (rundown.HasValue) { if (rundown.Value) @@ -164,31 +162,6 @@ internal async Task Collect(CancellationToken ct, CommandLineConfiguration } } - // Parse --clrevents parameter - if (clrevents.Length != 0) - { - // Ignore --clrevents if CLR event provider was already specified via --profile or --providers command. - if (enabledBy.ContainsKey(Extensions.CLREventProviderName)) - { - ConsoleWriteLine($"The argument --clrevents {clrevents} will be ignored because the CLR provider was configured via either --profile or --providers command."); - } - else - { - EventPipeProvider clrProvider = Extensions.ToCLREventPipeProvider(clrevents, clreventlevel); - providerCollection.Add(clrProvider); - enabledBy[Extensions.CLREventProviderName] = "--clrevents"; - } - } - - - if (providerCollection.Count <= 0) - { - Console.Error.WriteLine("No providers were specified to start a trace."); - return (int)ReturnCode.ArgumentError; - } - - PrintProviders(providerCollection, enabledBy); - // Validate and parse stoppingEvent parameters: stoppingEventProviderName, stoppingEventEventName, stoppingEventPayloadFilter bool hasStoppingEventProviderName = !string.IsNullOrEmpty(stoppingEventProviderName); @@ -272,7 +245,7 @@ internal async Task Collect(CancellationToken ct, CommandLineConfiguration } - if (string.Equals(output.Name, DefaultTraceName, StringComparison.OrdinalIgnoreCase)) + if (string.Equals(output.Name, CommonOptions.DefaultTraceName, StringComparison.OrdinalIgnoreCase)) { DateTime now = DateTime.Now; FileInfo processMainModuleFileInfo = new(processMainModuleFileName); @@ -374,8 +347,6 @@ internal async Task Collect(CancellationToken ct, CommandLineConfiguration { ConsoleWriteLine($"Trace Duration : {duration:dd\\:hh\\:mm\\:ss}"); } - - ConsoleWriteLine(); ConsoleWriteLine(); EventMonitor eventMonitor = null; @@ -418,10 +389,19 @@ internal async Task Collect(CancellationToken ct, CommandLineConfiguration } FileInfo fileInfo = new(output.FullName); + bool wroteStatus = false; Action printStatus = () => { if (printStatusOverTime && rewriter.IsRewriteConsoleLineSupported) { - rewriter?.RewriteConsoleLine(); + if (wroteStatus) + { + rewriter?.RewriteConsoleLine(); + } + else + { + // First time writing status, so don't rewrite console yet. + wroteStatus = true; + } fileInfo.Refresh(); ConsoleWriteLine($"[{stopwatch.Elapsed:dd\\:hh\\:mm\\:ss}]\tRecording trace {GetSize(fileInfo.Length)}"); ConsoleWriteLine("Press or to exit..."); @@ -536,20 +516,6 @@ internal async Task Collect(CancellationToken ct, CommandLineConfiguration return ret; } - private void PrintProviders(IReadOnlyList providers, Dictionary enabledBy) - { - ConsoleWriteLine(""); - ConsoleWriteLine(string.Format("{0, -40}", "Provider Name") + string.Format("{0, -20}", "Keywords") + - string.Format("{0, -20}", "Level") + "Enabled By"); // +4 is for the tab - foreach (EventPipeProvider provider in providers) - { - ConsoleWriteLine(string.Format("{0, -80}", $"{GetProviderDisplayString(provider)}") + $"{enabledBy[provider.Name]}"); - } - ConsoleWriteLine(""); - } - private static string GetProviderDisplayString(EventPipeProvider provider) => - string.Format("{0, -40}", provider.Name) + string.Format("0x{0, -18}", $"{provider.Keywords:X16}") + string.Format("{0, -8}", provider.EventLevel.ToString() + $"({(int)provider.EventLevel})"); - private static string GetSize(long length) { if (length > 1e9) @@ -577,13 +543,13 @@ public static Command CollectCommand() // Options CommonOptions.ProcessIdOption, CircularBufferOption, - OutputPathOption, - ProvidersOption, - ProfileOption, + CommonOptions.OutputPathOption, + CommonOptions.ProvidersOption, + CommonOptions.ProfileOption, CommonOptions.FormatOption, - DurationOption, - CLREventsOption, - CLREventLevelOption, + CommonOptions.DurationOption, + CommonOptions.CLREventsOption, + CommonOptions.CLREventLevelOption, CommonOptions.NameOption, DiagnosticPortOption, ShowChildIOOption, @@ -600,17 +566,20 @@ public static Command CollectCommand() collectCommand.SetAction((parseResult, ct) => { CollectCommandHandler handler = new(); + string providersValue = parseResult.GetValue(CommonOptions.ProvidersOption) ?? string.Empty; + string profileValue = parseResult.GetValue(CommonOptions.ProfileOption) ?? string.Empty; + return handler.Collect(ct, cliConfig: parseResult.Configuration, processId: parseResult.GetValue(CommonOptions.ProcessIdOption), - output: parseResult.GetValue(OutputPathOption), + output: parseResult.GetValue(CommonOptions.OutputPathOption), buffersize: parseResult.GetValue(CircularBufferOption), - providers: parseResult.GetValue(ProvidersOption) ?? string.Empty, - profile: parseResult.GetValue(ProfileOption) ?? string.Empty, + providers: providersValue.Split(',', StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries), + profile: profileValue.Split(',', StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries), format: parseResult.GetValue(CommonOptions.FormatOption), - duration: parseResult.GetValue(DurationOption), - clrevents: parseResult.GetValue(CLREventsOption) ?? string.Empty, - clreventlevel: parseResult.GetValue(CLREventLevelOption) ?? string.Empty, + duration: parseResult.GetValue(CommonOptions.DurationOption), + clrevents: parseResult.GetValue(CommonOptions.CLREventsOption) ?? string.Empty, + clreventlevel: parseResult.GetValue(CommonOptions.CLREventLevelOption) ?? string.Empty, name: parseResult.GetValue(CommonOptions.NameOption), diagnosticPort: parseResult.GetValue(DiagnosticPortOption) ?? string.Empty, showchildio: parseResult.GetValue(ShowChildIOOption), @@ -634,53 +603,6 @@ public static Command CollectCommand() DefaultValueFactory = _ => DefaultCircularBufferSizeInMB, }; - public static string DefaultTraceName => "default"; - - private static readonly Option OutputPathOption = - new("--output", "-o") - { - Description = $"The output path for the collected trace data. If not specified it defaults to '__.nettrace', e.g., 'myapp_20210315_111514.nettrace'.", - DefaultValueFactory = _ => new FileInfo(DefaultTraceName) - }; - - private static readonly Option ProvidersOption = - new("--providers") - { - Description = @"A comma delimitted list of EventPipe providers to be enabled. This is in the form 'Provider[,Provider]'," + - @"where Provider is in the form: 'KnownProviderName[:[Flags][:[Level][:[KeyValueArgs]]]]', and KeyValueArgs is in the form: " + - @"'[key1=value1][;key2=value2]'. Values in KeyValueArgs that contain ';' or '=' characters need to be surrounded by '""', " + - @"e.g., FilterAndPayloadSpecs=""MyProvider/MyEvent:-Prop1=Prop1;Prop2=Prop2.A.B;"". Depending on your shell, you may need to " + - @"escape the '""' characters and/or surround the entire provider specification in quotes, e.g., " + - @"--providers 'KnownProviderName:0x1:1:FilterSpec=\""KnownProviderName/EventName:-Prop1=Prop1;Prop2=Prop2.A.B;\""'. These providers are in " + - @"addition to any providers implied by the --profile argument. If there is any discrepancy for a particular provider, the " + - @"configuration here takes precedence over the implicit configuration from the profile. See documentation for examples." - // TODO: Can we specify an actual type? - }; - - private static readonly Option ProfileOption = - new("--profile") - { - Description = @"A named pre-defined set of provider configurations that allows common tracing scenarios to be specified succinctly." - }; - - private static readonly Option DurationOption = - new("--duration") - { - Description = @"When specified, will trace for the given timespan and then automatically stop the trace. Provided in the form of dd:hh:mm:ss." - }; - - private static readonly Option CLREventsOption = - new("--clrevents") - { - Description = @"List of CLR runtime events to emit." - }; - - private static readonly Option CLREventLevelOption = - new("--clreventlevel") - { - Description = @"Verbosity of CLR events to be emitted." - }; - private static readonly Option DiagnosticPortOption = new("--diagnostic-port", "--dport") { diff --git a/src/Tools/dotnet-trace/CommandLine/Commands/CollectLinuxCommand.cs b/src/Tools/dotnet-trace/CommandLine/Commands/CollectLinuxCommand.cs new file mode 100644 index 0000000000..fb548d6793 --- /dev/null +++ b/src/Tools/dotnet-trace/CommandLine/Commands/CollectLinuxCommand.cs @@ -0,0 +1,326 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +using System; +using System.Collections.Generic; +using System.CommandLine; +using System.Diagnostics; +using System.IO; +using System.Linq; +using System.Runtime.InteropServices; +using System.Text; +using System.Threading; +using System.Threading.Tasks; +using Microsoft.Diagnostics.NETCore.Client; +using Microsoft.Diagnostics.Tools.Common; +using Microsoft.Internal.Common.Utils; + +namespace Microsoft.Diagnostics.Tools.Trace +{ + internal partial class CollectLinuxCommandHandler + { + private bool stopTracing; + private Stopwatch stopwatch = new(); + private LineRewriter rewriter; + private bool printingStatus; + + internal sealed record CollectLinuxArgs( + CancellationToken Ct, + string[] Providers, + string ClrEventLevel, + string ClrEvents, + string[] PerfEvents, + string[] Profiles, + FileInfo Output, + TimeSpan Duration); + + public CollectLinuxCommandHandler(IConsole console = null) + { + Console = console ?? new DefaultConsole(false); + rewriter = new LineRewriter(Console); + } + + /// + /// Collects diagnostic traces using perf_events, a Linux OS technology. collect-linux requires admin privileges to capture kernel- and user-mode events, and by default, captures events from all processes. + /// This Linux-only command includes the same .NET events as dotnet-trace collect, and it uses the kernel’s user_events mechanism to emit .NET events as perf events, enabling unification of user-space .NET events with kernel-space system events. + /// + internal int CollectLinux(CollectLinuxArgs args) + { + if (!OperatingSystem.IsLinux()) + { + Console.Error.WriteLine("The collect-linux command is only supported on Linux."); + return (int)ReturnCode.PlatformNotSupportedError; + } + + Console.WriteLine("=========================================================================================="); + Console.WriteLine("The collect-linux verb is a new preview feature and relies on an updated version of the"); + Console.WriteLine(".nettrace file format. The latest PerfView release supports these trace files but other"); + Console.WriteLine("ways of using the trace file may not work yet. For more details, see the docs at"); + Console.WriteLine("https://learn.microsoft.com/dotnet/core/diagnostics/dotnet-trace."); + Console.WriteLine("=========================================================================================="); + + args.Ct.Register(() => stopTracing = true); + int ret = (int)ReturnCode.TracingError; + string scriptPath = null; + try + { + Console.CursorVisible = false; + byte[] command = BuildRecordTraceArgs(args, out scriptPath); + + if (args.Duration != default) + { + System.Timers.Timer durationTimer = new(args.Duration.TotalMilliseconds); + durationTimer.Elapsed += (sender, e) => + { + durationTimer.Stop(); + stopTracing = true; + }; + durationTimer.Start(); + } + stopwatch.Start(); + ret = RecordTraceInvoker(command, (UIntPtr)command.Length, OutputHandler); + } + catch (CommandLineErrorException e) + { + Console.Error.WriteLine($"[ERROR] {e.Message}"); + ret = (int)ReturnCode.TracingError; + } + catch (Exception ex) + { + Console.Error.WriteLine($"[ERROR] {ex}"); + ret = (int)ReturnCode.TracingError; + } + finally + { + if (!string.IsNullOrEmpty(scriptPath)) + { + try + { + if (File.Exists(scriptPath)) + { + File.Delete(scriptPath); + } + } catch { } + } + } + + return ret; + } + + public static Command CollectLinuxCommand() + { + Command collectLinuxCommand = new("collect-linux") + { + CommonOptions.ProvidersOption, + CommonOptions.CLREventLevelOption, + CommonOptions.CLREventsOption, + PerfEventsOption, + CommonOptions.ProfileOption, + CommonOptions.OutputPathOption, + CommonOptions.DurationOption, + }; + collectLinuxCommand.TreatUnmatchedTokensAsErrors = true; // collect-linux currently does not support child process tracing. + collectLinuxCommand.Description = "Collects diagnostic traces using perf_events, a Linux OS technology. collect-linux requires admin privileges to capture kernel- and user-mode events, and by default, captures events from all processes. This Linux-only command includes the same .NET events as dotnet-trace collect, and it uses the kernel’s user_events mechanism to emit .NET events as perf events, enabling unification of user-space .NET events with kernel-space system events."; + + collectLinuxCommand.SetAction((parseResult, ct) => { + string providersValue = parseResult.GetValue(CommonOptions.ProvidersOption) ?? string.Empty; + string perfEventsValue = parseResult.GetValue(PerfEventsOption) ?? string.Empty; + string profilesValue = parseResult.GetValue(CommonOptions.ProfileOption) ?? string.Empty; + CollectLinuxCommandHandler handler = new(); + + int rc = handler.CollectLinux(new CollectLinuxArgs( + Ct: ct, + Providers: providersValue.Split(',', StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries), + ClrEventLevel: parseResult.GetValue(CommonOptions.CLREventLevelOption) ?? string.Empty, + ClrEvents: parseResult.GetValue(CommonOptions.CLREventsOption) ?? string.Empty, + PerfEvents: perfEventsValue.Split(',', StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries), + Profiles: profilesValue.Split(',', StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries), + Output: parseResult.GetValue(CommonOptions.OutputPathOption) ?? new FileInfo(CommonOptions.DefaultTraceName), + Duration: parseResult.GetValue(CommonOptions.DurationOption))); + return Task.FromResult(rc); + }); + + return collectLinuxCommand; + } + + private byte[] BuildRecordTraceArgs(CollectLinuxArgs args, out string scriptPath) + { + scriptPath = null; + List recordTraceArgs = new(); + + string[] profiles = args.Profiles; + if (args.Profiles.Length == 0 && args.Providers.Length == 0 && string.IsNullOrEmpty(args.ClrEvents) && args.PerfEvents.Length == 0) + { + Console.WriteLine("No providers, profiles, ClrEvents, or PerfEvents were specified, defaulting to trace profiles 'dotnet-common' + 'cpu-sampling'."); + profiles = new[] { "dotnet-common", "cpu-sampling" }; + } + + StringBuilder scriptBuilder = new(); + List providerCollection = ProviderUtils.ComputeProviderConfig(args.Providers, args.ClrEvents, args.ClrEventLevel, profiles, true, "collect-linux", Console); + foreach (EventPipeProvider provider in providerCollection) + { + string providerName = provider.Name; + string providerNameSanitized = providerName.Replace('-', '_').Replace('.', '_'); + long keywords = provider.Keywords; + uint eventLevel = (uint)provider.EventLevel; + IDictionary arguments = provider.Arguments; + if (arguments != null && arguments.Count > 0) + { + scriptBuilder.Append($"set_dotnet_filter_args(\n\t\"{providerName}\""); + foreach ((string key, string value) in arguments) + { + scriptBuilder.Append($",\n\t\"{key}={value}\""); + } + scriptBuilder.Append($");\n"); + } + + scriptBuilder.Append($"let {providerNameSanitized}_flags = new_dotnet_provider_flags();\n"); + scriptBuilder.Append($"record_dotnet_provider(\"{providerName}\", 0x{keywords:X}, {eventLevel}, {providerNameSanitized}_flags);\n\n"); + } + + List linuxEventLines = new(); + foreach (string profile in profiles) + { + Profile traceProfile = ListProfilesCommandHandler.TraceProfiles + .FirstOrDefault(p => p.Name.Equals(profile, StringComparison.OrdinalIgnoreCase)); + + if (traceProfile != null && + !string.IsNullOrEmpty(traceProfile.VerbExclusivity) && + traceProfile.VerbExclusivity.Equals("collect-linux", StringComparison.OrdinalIgnoreCase)) + { + recordTraceArgs.Add(traceProfile.CollectLinuxArgs); + linuxEventLines.Add($"{traceProfile.Name,-80}--profile"); + } + } + + foreach (string perfEvent in args.PerfEvents) + { + string[] split = perfEvent.Split(':', 2, StringSplitOptions.TrimEntries); + if (split.Length != 2 || string.IsNullOrEmpty(split[0]) || string.IsNullOrEmpty(split[1])) + { + throw new CommandLineErrorException($"Invalid perf event specification '{perfEvent}'. Expected format 'provider:event'."); + } + + string perfProvider = split[0]; + string perfEventName = split[1]; + linuxEventLines.Add($"{perfEvent,-80}--perf-events"); + scriptBuilder.Append($"let {perfEventName} = event_from_tracefs(\"{perfProvider}\", \"{perfEventName}\");\nrecord_event({perfEventName});\n\n"); + } + + if (linuxEventLines.Count > 0) + { + Console.WriteLine($"{("Linux Perf Events"),-80}Enabled By"); + foreach (string line in linuxEventLines) + { + Console.WriteLine(line); + } + } + else + { + Console.WriteLine("No Linux Perf Events enabled."); + } + Console.WriteLine(); + + FileInfo resolvedOutput = ResolveOutputPath(args.Output); + recordTraceArgs.Add($"--out"); + recordTraceArgs.Add(resolvedOutput.FullName); + Console.WriteLine($"Output File : {resolvedOutput.FullName}"); + Console.WriteLine(); + + string scriptText = scriptBuilder.ToString(); + scriptPath = Path.ChangeExtension(resolvedOutput.FullName, ".script"); + File.WriteAllText(scriptPath, scriptText); + + recordTraceArgs.Add("--script-file"); + recordTraceArgs.Add(scriptPath); + + string options = string.Join(' ', recordTraceArgs); + return Encoding.UTF8.GetBytes(options); + } + + private static FileInfo ResolveOutputPath(FileInfo output) + { + if (!string.Equals(output.Name, CommonOptions.DefaultTraceName, StringComparison.OrdinalIgnoreCase)) + { + return output; + } + + DateTime now = DateTime.Now; + return new FileInfo($"trace_{now:yyyyMMdd}_{now:HHmmss}.nettrace"); + } + + private int OutputHandler(uint type, IntPtr data, UIntPtr dataLen) + { + OutputType ot = (OutputType)type; + if (dataLen != UIntPtr.Zero && (ulong)dataLen <= int.MaxValue) + { + string text = Marshal.PtrToStringUTF8(data, (int)dataLen); + if (!string.IsNullOrEmpty(text) && + !text.StartsWith("Recording started", StringComparison.OrdinalIgnoreCase)) + { + if (ot == OutputType.Error) + { + Console.Error.WriteLine(text); + stopTracing = true; + } + else + { + Console.Out.WriteLine(text); + } + } + } + + if (ot == OutputType.Progress) + { + if (printingStatus) + { + rewriter.RewriteConsoleLine(); + } + else + { + printingStatus = true; + rewriter.LineToClear = Console.CursorTop - 1; + } + Console.Out.WriteLine($"[{stopwatch.Elapsed:dd\\:hh\\:mm\\:ss}]\tRecording trace."); + Console.Out.WriteLine("Press or to exit..."); + + if (Console.KeyAvailable && Console.ReadKey(true).Key == ConsoleKey.Enter) + { + stopTracing = true; + } + } + + return stopTracing ? 1 : 0; + } + + private static readonly Option PerfEventsOption = + new("--perf-events") + { + Description = @"Comma-separated list of perf events (e.g. syscalls:sys_enter_execve,sched:sched_switch)." + }; + + private enum OutputType : uint + { + Normal = 0, + Live = 1, + Error = 2, + Progress = 3, + } + + [UnmanagedFunctionPointer(CallingConvention.Cdecl)] + internal delegate int recordTraceCallback( + [In] uint type, + [In] IntPtr data, + [In] UIntPtr dataLen); + + [LibraryImport("recordtrace", EntryPoint = "RecordTrace")] + private static partial int RunRecordTrace( + byte[] command, + UIntPtr commandLen, + recordTraceCallback callback); + +#region testing seams + internal Func RecordTraceInvoker { get; set; } = RunRecordTrace; + internal IConsole Console { get; set; } +#endregion + } +} diff --git a/src/Tools/dotnet-trace/CommandLine/Commands/ConvertCommand.cs b/src/Tools/dotnet-trace/CommandLine/Commands/ConvertCommand.cs index 055051ae5a..c0288ff100 100644 --- a/src/Tools/dotnet-trace/CommandLine/Commands/ConvertCommand.cs +++ b/src/Tools/dotnet-trace/CommandLine/Commands/ConvertCommand.cs @@ -116,8 +116,8 @@ public static Command ConvertCommand() private static readonly Argument InputFileArgument = new Argument(name: "input-filename") { - Description = $"Input trace file to be converted. Defaults to '{CollectCommandHandler.DefaultTraceName}'.", - DefaultValueFactory = _ => new FileInfo(CollectCommandHandler.DefaultTraceName), + Description = $"Input trace file to be converted. Defaults to '{CommonOptions.DefaultTraceName}'.", + DefaultValueFactory = _ => new FileInfo(CommonOptions.DefaultTraceName), }.AcceptExistingOnly(); private static readonly Option OutputOption = diff --git a/src/Tools/dotnet-trace/CommandLine/Commands/ListProfilesCommandHandler.cs b/src/Tools/dotnet-trace/CommandLine/Commands/ListProfilesCommandHandler.cs index 7e8c2cea56..432e6599ae 100644 --- a/src/Tools/dotnet-trace/CommandLine/Commands/ListProfilesCommandHandler.cs +++ b/src/Tools/dotnet-trace/CommandLine/Commands/ListProfilesCommandHandler.cs @@ -14,13 +14,30 @@ namespace Microsoft.Diagnostics.Tools.Trace { internal sealed class ListProfilesCommandHandler { + private static long defaultKeyword = 0x1 | // GC + 0x4 | // AssemblyLoader + 0x8 | // Loader + 0x10 | // JIT + 0x8000 | // Exceptions + 0x10000 | // Threading + 0x20000 | // JittedMethodILToNativeMap + 0x1000000000; // Compilation + + private static string dotnetCommonDescription = """ + Lightweight .NET runtime diagnostics designed to stay low overhead. + Includes GC, AssemblyLoader, Loader, JIT, Exceptions, Threading, JittedMethodILToNativeMap, and Compilation events + Equivalent to --providers "Microsoft-Windows-DotNETRuntime:0x100003801D:4". + """; + public static int GetProfiles() { try { - foreach (Profile profile in DotNETRuntimeProfiles) + Console.Out.WriteLine("dotnet-trace profiles:"); + int profileNameWidth = ProfileNamesMaxWidth(TraceProfiles); + foreach (Profile profile in TraceProfiles) { - Console.Out.WriteLine($"\t{profile.Name,-16} - {profile.Description}"); + PrintProfile(profile, profileNameWidth); } return 0; @@ -42,14 +59,19 @@ public static Command ListProfilesCommand() return listProfilesCommand; } - internal static IEnumerable DotNETRuntimeProfiles { get; } = new[] { + internal static IEnumerable TraceProfiles { get; } = new[] { new Profile( - "cpu-sampling", + "dotnet-common", + new EventPipeProvider[] { + new("Microsoft-Windows-DotNETRuntime", EventLevel.Informational, defaultKeyword) + }, + dotnetCommonDescription), + new Profile( + "dotnet-sampled-thread-time", new EventPipeProvider[] { new("Microsoft-DotNETCore-SampleProfiler", EventLevel.Informational), - new("Microsoft-Windows-DotNETRuntime", EventLevel.Informational, (long)ClrTraceEventParser.Keywords.Default) }, - "Useful for tracking CPU usage and general .NET runtime information. This is the default option if no profile or providers are specified."), + "Samples .NET thread stacks (~100 Hz) toestimate how much wall clock time code is using.") { VerbExclusivity = "collect" }, new Profile( "gc-verbose", new EventPipeProvider[] { @@ -101,9 +123,55 @@ public static Command ListProfilesCommand() } ) }, - "Captures ADO.NET and Entity Framework database commands") + "Captures ADO.NET and Entity Framework database commands"), + new Profile( + "cpu-sampling", + providers: Array.Empty(), + description: "Kernel CPU sampling events for measuring CPU usage.") { VerbExclusivity = "collect-linux", CollectLinuxArgs = "--on-cpu" }, + new Profile( + "thread-time", + providers: Array.Empty(), + description: "Kernel thread context switch events for measuring CPU usage and wall clock time") { VerbExclusivity = "collect-linux", CollectLinuxArgs = "--off-cpu" }, }; + private static int ProfileNamesMaxWidth(IEnumerable profiles) + { + int maxWidth = 0; + foreach (Profile profile in profiles) + { + int profileNameWidth = profile.Name.Length; + if (!string.IsNullOrEmpty(profile.VerbExclusivity)) + { + profileNameWidth = $"{profile.Name} ({profile.VerbExclusivity})".Length; + } + if (profileNameWidth > maxWidth) + { + maxWidth = profileNameWidth; + } + } + + return maxWidth; + } + + private static void PrintProfile(Profile profile, int nameColumnWidth) + { + string[] descriptionLines = profile.Description.Replace("\r\n", "\n").Split('\n'); + + string profileColumn = $"{profile.Name}"; + if (!string.IsNullOrEmpty(profile.VerbExclusivity)) + { + profileColumn = $"{profile.Name} ({profile.VerbExclusivity})"; + } + + Console.Out.WriteLine($"\t{profileColumn.PadRight(nameColumnWidth)} - {descriptionLines[0]}"); + + string continuationPrefix = $"\t{new string(' ', nameColumnWidth)} "; + for (int i = 1; i < descriptionLines.Length; i++) + { + Console.Out.WriteLine(continuationPrefix + descriptionLines[i]); + } + } + /// /// Keywords for DiagnosticSourceEventSource provider /// diff --git a/src/Tools/dotnet-trace/CommandLine/Options/CommonOptions.cs b/src/Tools/dotnet-trace/CommandLine/Options/CommonOptions.cs index 98be9c055a..013e6e5749 100644 --- a/src/Tools/dotnet-trace/CommandLine/Options/CommonOptions.cs +++ b/src/Tools/dotnet-trace/CommandLine/Options/CommonOptions.cs @@ -1,22 +1,43 @@ // Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. +using System; using System.CommandLine; +using System.IO; namespace Microsoft.Diagnostics.Tools.Trace { internal static class CommonOptions { - public static readonly Option ProcessIdOption = - new("--process-id", "-p") + public static readonly Option ProvidersOption = + new("--providers") { - Description = "The process id to collect the trace." + Description = @"A comma delimited list of EventPipe providers to be enabled. This is in the form 'Provider[,Provider]'," + + @"where Provider is in the form: 'KnownProviderName[:[Flags][:[Level][:[KeyValueArgs]]]]', and KeyValueArgs is in the form: " + + @"'[key1=value1][;key2=value2]'. Values in KeyValueArgs that contain ';' or '=' characters need to be surrounded by '""', " + + @"e.g., FilterAndPayloadSpecs=""MyProvider/MyEvent:-Prop1=Prop1;Prop2=Prop2.A.B;"". Depending on your shell, you may need to " + + @"escape the '""' characters and/or surround the entire provider specification in quotes, e.g., " + + @"--providers 'KnownProviderName:0x1:1:FilterSpec=\""KnownProviderName/EventName:-Prop1=Prop1;Prop2=Prop2.A.B;\""'. These providers are in " + + @"addition to any providers implied by the --profile argument. If there is any discrepancy for a particular provider, the " + + @"configuration here takes precedence over the implicit configuration from the profile. See documentation for examples." }; - public static readonly Option NameOption = - new("--name", "-n") + public static readonly Option CLREventLevelOption = + new("--clreventlevel") { - Description = "The name of the process to collect the trace.", + Description = @"Verbosity of CLR events to be emitted." + }; + + public static readonly Option CLREventsOption = + new("--clrevents") + { + Description = @"List of CLR runtime events to emit." + }; + + public static readonly Option ProfileOption = + new("--profile") + { + Description = @"A named, pre-defined set of provider configurations for common tracing scenarios. You can specify multiple profiles as a comma-separated list. When multiple profiles are specified, the providers and settings are combined (union), and duplicates are ignored." }; public static TraceFileFormat DefaultTraceFileFormat() => TraceFileFormat.NetTrace; @@ -28,6 +49,33 @@ internal static class CommonOptions DefaultValueFactory = _ => DefaultTraceFileFormat() }; + public static string DefaultTraceName => "default"; + + public static readonly Option OutputPathOption = + new("--output", "-o") + { + Description = $"The output path for the collected trace data. If not specified it defaults to '__.nettrace', e.g., 'myapp_20210315_111514.nettrace'.", + DefaultValueFactory = _ => new FileInfo(DefaultTraceName) + }; + + public static readonly Option DurationOption = + new("--duration") + { + Description = @"When specified, will trace for the given timespan and then automatically stop the trace. Provided in the form of dd:hh:mm:ss." + }; + + public static readonly Option NameOption = + new("--name", "-n") + { + Description = "The name of the process to collect the trace.", + }; + + public static readonly Option ProcessIdOption = + new("--process-id", "-p") + { + Description = "The process id to collect the trace." + }; + public static readonly Option ConvertFormatOption = new("--format") { diff --git a/src/Tools/dotnet-trace/Profile.cs b/src/Tools/dotnet-trace/Profile.cs index 2114ff0540..4ba36b2445 100644 --- a/src/Tools/dotnet-trace/Profile.cs +++ b/src/Tools/dotnet-trace/Profile.cs @@ -26,35 +26,8 @@ public Profile(string name, IEnumerable providers, string des public RetryStrategy RetryStrategy { get; set; } = RetryStrategy.NothingToRetry; - public static void MergeProfileAndProviders(Profile selectedProfile, List providerCollection, Dictionary enabledBy) - { - List profileProviders = new(); - // If user defined a different key/level on the same provider via --providers option that was specified via --profile option, - // --providers option takes precedence. Go through the list of providers specified and only add it if it wasn't specified - // via --providers options. - if (selectedProfile.Providers != null) - { - foreach (EventPipeProvider selectedProfileProvider in selectedProfile.Providers) - { - bool shouldAdd = true; - - foreach (EventPipeProvider providerCollectionProvider in providerCollection) - { - if (providerCollectionProvider.Name.Equals(selectedProfileProvider.Name)) - { - shouldAdd = false; - break; - } - } - - if (shouldAdd) - { - enabledBy[selectedProfileProvider.Name] = "--profile "; - profileProviders.Add(selectedProfileProvider); - } - } - } - providerCollection.AddRange(profileProviders); - } + public string VerbExclusivity { get; set; } = string.Empty; + + public string CollectLinuxArgs { get; set; } = string.Empty; } } diff --git a/src/Tools/dotnet-trace/Program.cs b/src/Tools/dotnet-trace/Program.cs index 69c3cff0be..c1821471ff 100644 --- a/src/Tools/dotnet-trace/Program.cs +++ b/src/Tools/dotnet-trace/Program.cs @@ -18,6 +18,7 @@ public static Task Main(string[] args) RootCommand rootCommand = new() { CollectCommandHandler.CollectCommand(), + CollectLinuxCommandHandler.CollectLinuxCommand(), ProcessStatusCommandHandler.ProcessStatusCommand("Lists the dotnet processes that traces can be collected from."), ListProfilesCommandHandler.ListProfilesCommand(), ConvertCommandHandler.ConvertCommand(), diff --git a/src/Tools/dotnet-trace/Extensions.cs b/src/Tools/dotnet-trace/ProviderUtils.cs similarity index 52% rename from src/Tools/dotnet-trace/Extensions.cs rename to src/Tools/dotnet-trace/ProviderUtils.cs index b9bd829c70..0adffe6450 100644 --- a/src/Tools/dotnet-trace/Extensions.cs +++ b/src/Tools/dotnet-trace/ProviderUtils.cs @@ -3,14 +3,18 @@ using System; using System.Collections.Generic; +using System.Diagnostics; using System.Diagnostics.Tracing; +using System.IO; using System.Linq; using System.Text.RegularExpressions; using Microsoft.Diagnostics.NETCore.Client; +using Microsoft.Diagnostics.Tools; +using Microsoft.Diagnostics.Tools.Common; namespace Microsoft.Diagnostics.Tools.Trace { - internal static class Extensions + internal static class ProviderUtils { public static string CLREventProviderName = "Microsoft-Windows-DotNETRuntime"; @@ -23,6 +27,7 @@ internal static class Extensions { "gc", 0x1 }, { "gchandle", 0x2 }, { "fusion", 0x4 }, + { "assemblyloader", 0x4 }, { "loader", 0x8 }, { "jit", 0x10 }, { "ngen", 0x20 }, @@ -42,6 +47,7 @@ internal static class Extensions { "gcsampledobjectallocationhigh", 0x200000 }, { "gcheapsurvivalandmovement", 0x400000 }, { "gcheapcollect", 0x800000 }, + { "managedheadcollect", 0x800000 }, { "gcheapandtypenames", 0x1000000 }, { "gcsampledobjectallocationlow", 0x2000000 }, { "perftrack", 0x20000000 }, @@ -55,57 +61,145 @@ internal static class Extensions { "compilationdiagnostic", 0x2000000000 }, { "methoddiagnostic", 0x4000000000 }, { "typediagnostic", 0x8000000000 }, + { "jitinstrumentationdata", 0x10000000000 }, + { "profiler", 0x20000000000 }, { "waithandle", 0x40000000000 }, + { "allocationsampling", 0x80000000000 }, }; - public static List ToProviders(string providersRawInput) + private enum ProviderSource { - if (providersRawInput == null) + ProvidersArg = 1, + CLREventsArg = 2, + ProfileArg = 4, + } + + public static List ComputeProviderConfig(string[] providersArg, string clreventsArg, string clreventlevel, string[] profiles, bool shouldPrintProviders = false, string verbExclusivity = null, IConsole console = null) + { + console ??= new DefaultConsole(false); + Dictionary merged = new(StringComparer.OrdinalIgnoreCase); + Dictionary providerSources = new(StringComparer.OrdinalIgnoreCase); + + foreach (string providerArg in providersArg) + { + EventPipeProvider provider = ToProvider(providerArg, console); + if (!merged.TryGetValue(provider.Name, out EventPipeProvider existing)) + { + merged[provider.Name] = provider; + providerSources[provider.Name] = (int)ProviderSource.ProvidersArg; + } + else + { + merged[provider.Name] = MergeProviderConfigs(existing, provider); + } + } + + foreach (string profile in profiles) + { + Profile traceProfile = ListProfilesCommandHandler.TraceProfiles + .FirstOrDefault(p => p.Name.Equals(profile, StringComparison.OrdinalIgnoreCase)); + + if (traceProfile == null) + { + throw new CommandLineErrorException($"Invalid profile name: {profile}"); + } + + if (!string.IsNullOrEmpty(verbExclusivity) && + !string.IsNullOrEmpty(traceProfile.VerbExclusivity) && + !string.Equals(traceProfile.VerbExclusivity, verbExclusivity, StringComparison.OrdinalIgnoreCase)) + { + throw new CommandLineErrorException($"The specified profile '{traceProfile.Name}' does not apply to `dotnet-trace {verbExclusivity}`."); + } + + IEnumerable profileProviders = traceProfile.Providers; + foreach (EventPipeProvider provider in profileProviders) + { + if (merged.TryAdd(provider.Name, provider)) + { + providerSources[provider.Name] = (int)ProviderSource.ProfileArg; + } + // Prefer providers set through --providers over implicit profile configuration + } + } + + if (!string.IsNullOrEmpty(clreventsArg)) + { + EventPipeProvider provider = ToCLREventPipeProvider(clreventsArg, clreventlevel); + if (provider is not null) + { + if (!merged.TryGetValue(provider.Name, out EventPipeProvider existing)) + { + merged[provider.Name] = provider; + providerSources[provider.Name] = (int)ProviderSource.CLREventsArg; + } + else if (shouldPrintProviders) + { + console.WriteLine($"Warning: The CLR provider was already specified through --providers or --profile. Ignoring --clrevents."); + } + } + } + + List unifiedProviders = merged.Values.ToList(); + if (shouldPrintProviders) + { + PrintProviders(unifiedProviders, providerSources, console); + } + + return unifiedProviders; + } + + private static EventPipeProvider MergeProviderConfigs(EventPipeProvider providerConfigA, EventPipeProvider providerConfigB) + { + Debug.Assert(string.Equals(providerConfigA.Name, providerConfigB.Name, StringComparison.OrdinalIgnoreCase)); + + EventLevel level = (providerConfigA.EventLevel == EventLevel.LogAlways || providerConfigB.EventLevel == EventLevel.LogAlways) ? + EventLevel.LogAlways : + (providerConfigA.EventLevel > providerConfigB.EventLevel ? providerConfigA.EventLevel : providerConfigB.EventLevel); + + if (providerConfigA.Arguments != null && providerConfigB.Arguments != null) { - throw new ArgumentNullException(nameof(providersRawInput)); + throw new CommandLineErrorException($"Provider \"{providerConfigA.Name}\" is declared multiple times with filter arguments."); } - if (string.IsNullOrWhiteSpace(providersRawInput)) + return new EventPipeProvider(providerConfigA.Name, level, providerConfigA.Keywords | providerConfigB.Keywords, providerConfigA.Arguments ?? providerConfigB.Arguments); + } + + private static void PrintProviders(IReadOnlyList providers, Dictionary enabledBy, IConsole console) + { + if (providers.Count == 0) { - return new List(); + console.WriteLine("No .NET providers were configured."); + console.WriteLine(""); + return; } - IEnumerable providers = providersRawInput.Split(',').Select(ToProvider).ToList(); - - // Dedupe the entries - providers = providers.GroupBy(p => p.Name) - .Select(p => { - string providerName = p.Key; - EventLevel providerLevel = EventLevel.Critical; - long providerKeywords = 0; - IDictionary providerFilterArgs = null; - - foreach (EventPipeProvider currentProvider in p) - { - providerKeywords |= currentProvider.Keywords; - - if ((currentProvider.EventLevel == EventLevel.LogAlways) - || (providerLevel != EventLevel.LogAlways && currentProvider.EventLevel > providerLevel)) - { - providerLevel = currentProvider.EventLevel; - } - - if (currentProvider.Arguments != null) - { - if (providerFilterArgs != null) - { - throw new ArgumentException($"Provider \"{providerName}\" is declared multiple times with filter arguments."); - } - - providerFilterArgs = currentProvider.Arguments; - } - } - - return new EventPipeProvider(providerName, providerLevel, providerKeywords, providerFilterArgs); - }); - - return providers.ToList(); + console.WriteLine(""); + console.WriteLine(string.Format("{0, -40}", "Provider Name") + string.Format("{0, -20}", "Keywords") + + string.Format("{0, -20}", "Level") + "Enabled By"); // +4 is for the tab + foreach (EventPipeProvider provider in providers) + { + List providerSources = new(); + if (enabledBy.TryGetValue(provider.Name, out int source)) + { + if ((source & (int)ProviderSource.ProvidersArg) == (int)ProviderSource.ProvidersArg) + { + providerSources.Add("--providers"); + } + if ((source & (int)ProviderSource.CLREventsArg) == (int)ProviderSource.CLREventsArg) + { + providerSources.Add("--clrevents"); + } + if ((source & (int)ProviderSource.ProfileArg) == (int)ProviderSource.ProfileArg) + { + providerSources.Add("--profile"); + } + } + console.WriteLine(string.Format("{0, -80}", $"{GetProviderDisplayString(provider)}") + string.Join(", ", providerSources)); + } + console.WriteLine(""); } + private static string GetProviderDisplayString(EventPipeProvider provider) => + string.Format("{0, -40}", provider.Name) + string.Format("0x{0, -18}", $"{provider.Keywords:X16}") + string.Format("{0, -8}", provider.EventLevel.ToString() + $"({(int)provider.EventLevel})"); public static EventPipeProvider ToCLREventPipeProvider(string clreventslist, string clreventlevel) { @@ -124,7 +218,7 @@ public static EventPipeProvider ToCLREventPipeProvider(string clreventslist, str } else { - throw new ArgumentException($"{clrevents[i]} is not a valid CLR event keyword"); + throw new CommandLineErrorException($"{clrevents[i]} is not a valid CLR event keyword"); } } @@ -162,12 +256,12 @@ private static EventLevel GetEventLevel(string token) case "warning": return EventLevel.Warning; default: - throw new ArgumentException($"Unknown EventLevel: {token}"); + throw new CommandLineErrorException($"Unknown EventLevel: {token}"); } } } - private static EventPipeProvider ToProvider(string provider) + private static EventPipeProvider ToProvider(string provider, IConsole console) { if (string.IsNullOrWhiteSpace(provider)) { @@ -182,12 +276,12 @@ private static EventPipeProvider ToProvider(string provider) // Check if the supplied provider is a GUID and not a name. if (Guid.TryParse(providerName, out _)) { - Console.WriteLine($"Warning: --provider argument {providerName} appears to be a GUID which is not supported by dotnet-trace. Providers need to be referenced by their textual name."); + console.WriteLine($"Warning: --provider argument {providerName} appears to be a GUID which is not supported by dotnet-trace. Providers need to be referenced by their textual name."); } if (string.IsNullOrWhiteSpace(providerName)) { - throw new ArgumentException("Provider name was not specified."); + throw new CommandLineErrorException("Provider name was not specified."); } // Keywords diff --git a/src/Tools/dotnet-trace/TraceFileFormatConverter.cs b/src/Tools/dotnet-trace/TraceFileFormatConverter.cs index d72b4c7d4a..61e4c4c1b8 100644 --- a/src/Tools/dotnet-trace/TraceFileFormatConverter.cs +++ b/src/Tools/dotnet-trace/TraceFileFormatConverter.cs @@ -62,7 +62,7 @@ internal static void ConvertToFormat(TextWriter stdOut, TextWriter stdError, Tra break; default: // Validation happened way before this, so we shoud never reach this... - throw new ArgumentException($"Invalid TraceFileFormat \"{format}\""); + throw new CommandLineErrorException($"Invalid TraceFileFormat \"{format}\""); } stdOut.WriteLine("Conversion complete"); } @@ -94,7 +94,7 @@ private static void Convert(TraceFileFormat format, string fileToConvert, string break; default: // we should never get here - throw new ArgumentException($"Invalid TraceFileFormat \"{format}\""); + throw new CommandLineErrorException($"Invalid TraceFileFormat \"{format}\""); } } diff --git a/src/Tools/dotnet-trace/dotnet-trace.csproj b/src/Tools/dotnet-trace/dotnet-trace.csproj index 71b6aacb2e..d523a23ff0 100644 --- a/src/Tools/dotnet-trace/dotnet-trace.csproj +++ b/src/Tools/dotnet-trace/dotnet-trace.csproj @@ -14,6 +14,8 @@ + @@ -29,4 +31,8 @@ + + + diff --git a/src/tests/dotnet-trace/CLRProviderParsing.cs b/src/tests/dotnet-trace/CLRProviderParsing.cs index 01d7b4607c..3b3f80a35e 100644 --- a/src/tests/dotnet-trace/CLRProviderParsing.cs +++ b/src/tests/dotnet-trace/CLRProviderParsing.cs @@ -16,7 +16,7 @@ public class CLRProviderParsingTests [InlineData("GC")] public void ValidSingleCLREvent(string providerToParse) { - NETCore.Client.EventPipeProvider provider = Extensions.ToCLREventPipeProvider(providerToParse, "4"); + NETCore.Client.EventPipeProvider provider = ProviderUtils.ToCLREventPipeProvider(providerToParse, "4"); Assert.True(provider.Name == CLRProviderName); Assert.True(provider.Keywords == 1); Assert.True(provider.EventLevel == System.Diagnostics.Tracing.EventLevel.Informational); @@ -29,7 +29,7 @@ public void ValidSingleCLREvent(string providerToParse) [InlineData("haha")] public void InValidSingleCLREvent(string providerToParse) { - Assert.Throws(() => Extensions.ToCLREventPipeProvider(providerToParse, "4")); + Assert.Throws(() => ProviderUtils.ToCLREventPipeProvider(providerToParse, "4")); } [Theory] @@ -38,7 +38,7 @@ public void InValidSingleCLREvent(string providerToParse) [InlineData("GC+GCHandle")] public void ValidManyCLREvents(string providerToParse) { - NETCore.Client.EventPipeProvider provider = Extensions.ToCLREventPipeProvider(providerToParse, "5"); + NETCore.Client.EventPipeProvider provider = ProviderUtils.ToCLREventPipeProvider(providerToParse, "5"); Assert.True(provider.Name == CLRProviderName); Assert.True(provider.Keywords == 3); Assert.True(provider.EventLevel == System.Diagnostics.Tracing.EventLevel.Verbose); @@ -52,7 +52,7 @@ public void ValidManyCLREvents(string providerToParse) [InlineData("InFORMationAL")] public void ValidCLREventLevel(string clreventlevel) { - NETCore.Client.EventPipeProvider provider = Extensions.ToCLREventPipeProvider("gc", clreventlevel); + NETCore.Client.EventPipeProvider provider = ProviderUtils.ToCLREventPipeProvider("gc", clreventlevel); Assert.True(provider.Name == CLRProviderName); Assert.True(provider.Keywords == 1); Assert.True(provider.EventLevel == System.Diagnostics.Tracing.EventLevel.Informational); @@ -64,7 +64,7 @@ public void ValidCLREventLevel(string clreventlevel) [InlineData("hello")] public void InvalidCLREventLevel(string clreventlevel) { - Assert.Throws(() => Extensions.ToCLREventPipeProvider("gc", clreventlevel)); + Assert.Throws(() => ProviderUtils.ToCLREventPipeProvider("gc", clreventlevel)); } } } diff --git a/src/tests/dotnet-trace/CollectCommandFunctionalTests.cs b/src/tests/dotnet-trace/CollectCommandFunctionalTests.cs index f6de43dfed..ec6d537f3f 100644 --- a/src/tests/dotnet-trace/CollectCommandFunctionalTests.cs +++ b/src/tests/dotnet-trace/CollectCommandFunctionalTests.cs @@ -10,6 +10,7 @@ using System.Threading.Tasks; using Microsoft.Diagnostics.Tests.Common; using Microsoft.Diagnostics.Tools.Trace; +using Microsoft.Internal.Common.Utils; using Xunit; namespace Microsoft.Diagnostics.Tools.Trace @@ -23,8 +24,8 @@ public sealed record CollectArgs( CommandLineConfiguration cliConfig = null, int processId = -1, uint buffersize = 1, - string providers = "", - string profile = "", + string[] providers = null, + string[] profile = null, int formatValue = (int)TraceFileFormat.NetTrace, TimeSpan duration = default, string clrevents = "", @@ -51,14 +52,25 @@ public sealed record CollectArgs( public async Task CollectCommandProviderConfigurationConsolidation(CollectArgs args, string[] expectedSubset) { MockConsole console = new(200, 30); - string[] rawLines = await RunAsync(args, console).ConfigureAwait(true); + int exitCode = await RunAsync(args, console).ConfigureAwait(true); + Assert.Equal((int)ReturnCode.Ok, exitCode); console.AssertSanitizedLinesEqual(CollectSanitizer, expectedSubset); byte[] expected = Encoding.UTF8.GetBytes(ExpectedPayload); Assert.Equal(expected, args.EventStream.ToArray()); } - private static async Task RunAsync(CollectArgs config, MockConsole console) + [Theory] + [MemberData(nameof(InvalidProviders))] + public async Task CollectCommandInvalidProviderConfiguration_Throws(CollectArgs args, string[] expectedException) + { + MockConsole console = new(200, 30); + int exitCode = await RunAsync(args, console).ConfigureAwait(true); + Assert.Equal((int)ReturnCode.TracingError, exitCode); + console.AssertSanitizedLinesEqual(CollectSanitizer, expectedException); + } + + private static async Task RunAsync(CollectArgs config, MockConsole console) { var handler = new CollectCommandHandler(); handler.StartTraceSessionAsync = (client, cfg, ct) => Task.FromResult(new TestCollectSession()); @@ -66,14 +78,14 @@ private static async Task RunAsync(CollectArgs config, MockConsole con handler.CollectSessionEventStream = (name) => config.EventStream; handler.Console = console; - int exit = await handler.Collect( + return await handler.Collect( config.ct, config.cliConfig, config.ProcessId, config.Output, config.buffersize, - config.providers, - config.profile, + config.providers ?? Array.Empty(), + config.profile ?? Array.Empty(), config.Format, config.duration, config.clrevents, @@ -87,12 +99,7 @@ private static async Task RunAsync(CollectArgs config, MockConsole con config.stoppingEventPayloadFilter, config.rundown, config.dsrouter - ).ConfigureAwait(true); - if (exit != 0) - { - throw new InvalidOperationException($"Collect exited with return code {exit}."); - } - return console.Lines; + ).ConfigureAwait(false); } private static string[] CollectSanitizer(string[] lines) @@ -123,29 +130,28 @@ public void Stop() {} public static IEnumerable BasicCases() { - FileInfo fi = new("trace.nettrace"); yield return new object[] { new CollectArgs(), ExpectProvidersWithMessages( new[] { - "No profile or providers specified, defaulting to trace profile 'cpu-sampling'" + "No profile or providers specified, defaulting to trace profiles 'dotnet-common' + 'dotnet-sampled-thread-time'." }, - FormatProvider("Microsoft-DotNETCore-SampleProfiler", "0000F00000000000", "Informational", 4, "--profile"), - FormatProvider("Microsoft-Windows-DotNETRuntime", "00000014C14FCCBD", "Informational", 4, "--profile")) + FormatProvider("Microsoft-Windows-DotNETRuntime", "000000100003801D", "Informational", 4, "--profile"), + FormatProvider("Microsoft-DotNETCore-SampleProfiler", "0000F00000000000", "Informational", 4, "--profile")) }; yield return new object[] { - new CollectArgs(providers: "Foo:0x1:4"), + new CollectArgs(providers: new[] { "Foo:0x1:4" }), ExpectProviders( FormatProvider("Foo", "0000000000000001", "Informational", 4, "--providers")) }; yield return new object[] { - new CollectArgs(providers: "Foo:0x1:4,Bar:0x2:4"), + new CollectArgs(providers: new[] { "Foo:0x1:4", "Bar:0x2:4" }), ExpectProviders( FormatProvider("Foo", "0000000000000001", "Informational", 4, "--providers"), FormatProvider("Bar", "0000000000000002", "Informational", 4, "--providers")) @@ -153,36 +159,36 @@ public static IEnumerable BasicCases() yield return new object[] { - new CollectArgs(profile: "cpu-sampling"), + new CollectArgs(profile: new[] { "dotnet-common", "dotnet-sampled-thread-time" }), ExpectProviders( - FormatProvider("Microsoft-DotNETCore-SampleProfiler", "0000F00000000000", "Informational", 4, "--profile"), - FormatProvider("Microsoft-Windows-DotNETRuntime", "00000014C14FCCBD", "Informational", 4, "--profile")) + FormatProvider("Microsoft-Windows-DotNETRuntime", "000000100003801D", "Informational", 4, "--profile"), + FormatProvider("Microsoft-DotNETCore-SampleProfiler", "0000F00000000000", "Informational", 4, "--profile")) }; yield return new object[] { - new CollectArgs(profile: "cpu-sampling", providers: "Foo:0x1:4"), + new CollectArgs(profile: new[] { "dotnet-common", "dotnet-sampled-thread-time" }, providers: new[] { "Foo:0x1:4" }), ExpectProviders( FormatProvider("Foo", "0000000000000001", "Informational", 4, "--providers"), - FormatProvider("Microsoft-DotNETCore-SampleProfiler", "0000F00000000000", "Informational", 4, "--profile"), - FormatProvider("Microsoft-Windows-DotNETRuntime", "00000014C14FCCBD", "Informational", 4, "--profile")) + FormatProvider("Microsoft-Windows-DotNETRuntime", "000000100003801D", "Informational", 4, "--profile"), + FormatProvider("Microsoft-DotNETCore-SampleProfiler", "0000F00000000000", "Informational", 4, "--profile")) }; yield return new object[] { - new CollectArgs(profile: "cpu-sampling", clrevents: "gc"), + new CollectArgs(profile: new[] { "dotnet-common", "dotnet-sampled-thread-time" }, clrevents: "gc"), ExpectProvidersWithMessages( new[] { - "The argument --clrevents gc will be ignored because the CLR provider was configured via either --profile or --providers command." + "Warning: The CLR provider was already specified through --providers or --profile. Ignoring --clrevents." }, - FormatProvider("Microsoft-DotNETCore-SampleProfiler", "0000F00000000000", "Informational", 4, "--profile"), - FormatProvider("Microsoft-Windows-DotNETRuntime", "00000014C14FCCBD", "Informational", 4, "--profile")) + FormatProvider("Microsoft-Windows-DotNETRuntime", "000000100003801D", "Informational", 4, "--profile"), + FormatProvider("Microsoft-DotNETCore-SampleProfiler", "0000F00000000000", "Informational", 4, "--profile")) }; yield return new object[] { - new CollectArgs(profile: "cpu-sampling", providers: "Microsoft-Windows-DotNETRuntime:0x1:4"), + new CollectArgs(profile: new[] { "dotnet-common", "dotnet-sampled-thread-time" }, providers: new[] { "Microsoft-Windows-DotNETRuntime:0x1:4" }), ExpectProviders( FormatProvider("Microsoft-Windows-DotNETRuntime", "0000000000000001", "Informational", 4, "--providers"), FormatProvider("Microsoft-DotNETCore-SampleProfiler", "0000F00000000000", "Informational", 4, "--profile")) @@ -190,11 +196,11 @@ public static IEnumerable BasicCases() yield return new object[] { - new CollectArgs(providers: "Microsoft-Windows-DotNETRuntime:0x1:4", clrevents: "gc"), + new CollectArgs(providers: new[] { "Microsoft-Windows-DotNETRuntime:0x1:4" }, clrevents: "gc"), ExpectProvidersWithMessages( new[] { - "The argument --clrevents gc will be ignored because the CLR provider was configured via either --profile or --providers command." + "Warning: The CLR provider was already specified through --providers or --profile. Ignoring --clrevents." }, FormatProvider("Microsoft-Windows-DotNETRuntime", "0000000000000001", "Informational", 4, "--providers")) }; @@ -214,6 +220,39 @@ public static IEnumerable BasicCases() }; } + public static IEnumerable InvalidProviders() + { + yield return new object[] + { + new CollectArgs(profile: new[] { "cpu-sampling" }), + new [] { FormatException("The specified profile 'cpu-sampling' does not apply to `dotnet-trace collect`.") } + }; + + yield return new object[] + { + new CollectArgs(profile: new[] { "unknown" }), + new [] { FormatException("Invalid profile name: unknown") } + }; + + yield return new object[] + { + new CollectArgs(providers: new[] { "Foo:::Bar=0", "Foo:::Bar=1" }), + new [] { FormatException($"Provider \"Foo\" is declared multiple times with filter arguments.") } + }; + + yield return new object[] + { + new CollectArgs(clrevents: "unknown"), + new [] { FormatException("unknown is not a valid CLR event keyword") } + }; + + yield return new object[] + { + new CollectArgs(clrevents: "gc", clreventlevel: "unknown"), + new [] { FormatException("Unknown EventLevel: unknown") } + }; + } + private static string outputFile = $"Output File : {Directory.GetCurrentDirectory() + Path.DirectorySeparatorChar}trace.nettrace"; private const string ProviderHeader = "Provider Name Keywords Level Enabled By"; private static readonly string[] CommonTail = [ @@ -221,7 +260,6 @@ public static IEnumerable BasicCases() outputFile, "", "", - "", "Trace completed." ]; @@ -238,5 +276,7 @@ private static string FormatProvider(string name, string keywordsHex, string lev string.Format("{0, -8}", $"{levelName}({levelValue})"); return string.Format("{0, -80}", display) + enabledBy; } + + private static string FormatException(string message) => $"[ERROR] {message}"; } } diff --git a/src/tests/dotnet-trace/CollectLinuxCommandFunctionalTests.cs b/src/tests/dotnet-trace/CollectLinuxCommandFunctionalTests.cs new file mode 100644 index 0000000000..6b1eb3ad33 --- /dev/null +++ b/src/tests/dotnet-trace/CollectLinuxCommandFunctionalTests.cs @@ -0,0 +1,300 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +using System; +using System.Collections.Generic; +using System.CommandLine; +using System.IO; +using System.Text; +using System.Threading; +using System.Threading.Tasks; +using System.Linq; +using Microsoft.Diagnostics.Tests.Common; +using Microsoft.Diagnostics.Tools.Trace; +using Microsoft.Internal.Common.Utils; +using Xunit; + +namespace Microsoft.Diagnostics.Tools.Trace +{ + public class CollectLinuxCommandFunctionalTests + { + private static CollectLinuxCommandHandler.CollectLinuxArgs TestArgs( + CancellationToken ct = default, + string[] providers = null, + string clrEventLevel = "", + string clrEvents = "", + string[] perfEvents = null, + string[] profile = null, + FileInfo output = null, + TimeSpan duration = default) + { + return new CollectLinuxCommandHandler.CollectLinuxArgs(ct, + providers ?? Array.Empty(), + clrEventLevel, + clrEvents, + perfEvents ?? Array.Empty(), + profile ?? Array.Empty(), + output ?? new FileInfo("trace.nettrace"), + duration); + } + + [Theory] + [MemberData(nameof(BasicCases))] + public void CollectLinuxCommandProviderConfigurationConsolidation(object testArgs, string[] expectedLines) + { + MockConsole console = new(200, 30); + int exitCode = Run(testArgs, console); + if (OperatingSystem.IsLinux()) + { + Assert.Equal((int)ReturnCode.Ok, exitCode); + console.AssertSanitizedLinesEqual(CollectLinuxSanitizer, expectedLines); + } + else + { + Assert.Equal((int)ReturnCode.PlatformNotSupportedError, exitCode); + console.AssertSanitizedLinesEqual(null, new string[] { + "The collect-linux command is only supported on Linux.", + }); + } + } + + [Theory] + [MemberData(nameof(InvalidProviders))] + public void CollectLinuxCommandProviderConfigurationConsolidation_Throws(object testArgs, string[] expectedException) + { + MockConsole console = new(200, 30); + int exitCode = Run(testArgs, console); + if (OperatingSystem.IsLinux()) + { + Assert.Equal((int)ReturnCode.TracingError, exitCode); + console.AssertSanitizedLinesEqual(null, expectedException); + } + else + { + Assert.Equal((int)ReturnCode.PlatformNotSupportedError, exitCode); + console.AssertSanitizedLinesEqual(null, new string[] { + "The collect-linux command is only supported on Linux.", + }); + } + } + + private static int Run(object args, MockConsole console) + { + var handler = new CollectLinuxCommandHandler(console); + handler.RecordTraceInvoker = (cmd, len, cb) => { + cb(3, IntPtr.Zero, UIntPtr.Zero); + return 0; + }; + return handler.CollectLinux((CollectLinuxCommandHandler.CollectLinuxArgs)args); + } + + private static string[] CollectLinuxSanitizer(string[] lines) + { + List result = new(); + foreach (string line in lines) + { + if (line.Contains("Recording trace.", StringComparison.OrdinalIgnoreCase)) + { + result.Add("[dd:hh:mm:ss]\tRecording trace."); + } + else + { + result.Add(line); + } + } + return result.ToArray(); + } + + public static IEnumerable BasicCases() + { + yield return new object[] { + TestArgs(), + ExpectProvidersAndLinuxWithMessages( + new[]{"No providers, profiles, ClrEvents, or PerfEvents were specified, defaulting to trace profiles 'dotnet-common' + 'cpu-sampling'."}, + new[]{FormatProvider("Microsoft-Windows-DotNETRuntime","000000100003801D","Informational",4,"--profile")}, + new[]{LinuxProfile("cpu-sampling")}) + }; + + yield return new object[] { + TestArgs(providers: new[]{"Foo:0x1:4"}), + ExpectProvidersAndLinux( + new[]{FormatProvider("Foo","0000000000000001","Informational",4,"--providers")}, + Array.Empty()) + }; + + yield return new object[] { + TestArgs(providers: new[]{"Foo:0x1:4","Bar:0x2:4"}), + ExpectProvidersAndLinux( + new[]{ + FormatProvider("Foo","0000000000000001","Informational",4,"--providers"), + FormatProvider("Bar","0000000000000002","Informational",4,"--providers") + }, + Array.Empty()) + }; + + yield return new object[] { + TestArgs(profile: new[]{"cpu-sampling"}), + ExpectProvidersAndLinuxWithMessages( + new[]{"No .NET providers were configured."}, + Array.Empty(), + new[]{LinuxProfile("cpu-sampling")}) + }; + + yield return new object[] { + TestArgs(providers: new[]{"Foo:0x1:4"}, profile: new[]{"cpu-sampling"}), + ExpectProvidersAndLinux( + new[]{FormatProvider("Foo","0000000000000001","Informational",4,"--providers")}, + new[]{LinuxProfile("cpu-sampling")}) + }; + + yield return new object[] { + TestArgs(clrEvents: "gc", profile: new[]{"cpu-sampling"}), + ExpectProvidersAndLinux( + new[]{FormatProvider("Microsoft-Windows-DotNETRuntime","0000000000000001","Informational",4,"--clrevents")}, + new[]{LinuxProfile("cpu-sampling")}) + }; + + yield return new object[] { + TestArgs(providers: new[]{"Microsoft-Windows-DotNETRuntime:0x1:4"}, profile: new[]{"cpu-sampling"}), + ExpectProvidersAndLinux( + new[]{FormatProvider("Microsoft-Windows-DotNETRuntime","0000000000000001","Informational",4,"--providers")}, + new[]{LinuxProfile("cpu-sampling")}) + }; + + yield return new object[] { + TestArgs(providers: new[]{"Microsoft-Windows-DotNETRuntime:0x1:4"}, clrEvents: "gc"), + ExpectProvidersAndLinuxWithMessages( + new[]{"Warning: The CLR provider was already specified through --providers or --profile. Ignoring --clrevents."}, + new[]{FormatProvider("Microsoft-Windows-DotNETRuntime","0000000000000001","Informational",4,"--providers")}, + Array.Empty()) + }; + + yield return new object[] { + TestArgs(clrEvents: "gc+jit"), + ExpectProvidersAndLinux( + new[]{FormatProvider("Microsoft-Windows-DotNETRuntime","0000000000000011","Informational",4,"--clrevents")}, + Array.Empty()) + }; + + yield return new object[] { + TestArgs(clrEvents: "gc+jit", clrEventLevel: "5"), + ExpectProvidersAndLinux( + new[]{FormatProvider("Microsoft-Windows-DotNETRuntime","0000000000000011","Verbose",5,"--clrevents")}, + Array.Empty()) + }; + + yield return new object[] { + TestArgs(perfEvents: new[]{"sched:sched_switch"}), + ExpectProvidersAndLinuxWithMessages( + new[]{"No .NET providers were configured."}, + Array.Empty(), + new[]{LinuxPerfEvent("sched:sched_switch")}) + }; + } + + public static IEnumerable InvalidProviders() + { + yield return new object[] + { + TestArgs(profile: new[] { "dotnet-sampled-thread-time" }), + FormatException("The specified profile 'dotnet-sampled-thread-time' does not apply to `dotnet-trace collect-linux`.") + }; + + yield return new object[] + { + TestArgs(profile: new[] { "unknown" }), + FormatException("Invalid profile name: unknown") + }; + + yield return new object[] + { + TestArgs(providers: new[] { "Foo:::Bar=0", "Foo:::Bar=1" }), + FormatException($"Provider \"Foo\" is declared multiple times with filter arguments.") + }; + + yield return new object[] + { + TestArgs(clrEvents: "unknown"), + FormatException("unknown is not a valid CLR event keyword") + }; + + yield return new object[] + { + TestArgs(clrEvents: "gc", clrEventLevel: "unknown"), + FormatException("Unknown EventLevel: unknown") + }; + } + + private const string ProviderHeader = "Provider Name Keywords Level Enabled By"; + private static string LinuxHeader => $"{"Linux Perf Events",-80}Enabled By"; + private static string LinuxProfile(string name) => $"{name,-80}--profile"; + private static string LinuxPerfEvent(string spec) => $"{spec,-80}--perf-events"; + private static string FormatProvider(string name, string keywordsHex, string levelName, int levelValue, string enabledBy) + { + string display = string.Format("{0, -40}", name) + + string.Format("0x{0, -18}", keywordsHex) + + string.Format("{0, -8}", $"{levelName}({levelValue})"); + return string.Format("{0, -80}", display) + enabledBy; + } + private static string[] FormatException(string message) + { + List result = new(); + result.AddRange(PreviewMessages); + result.Add($"[ERROR] {message}"); + return result.ToArray(); + } + private static string DefaultOutputFile => $"Output File : {Directory.GetCurrentDirectory() + Path.DirectorySeparatorChar}trace.nettrace"; + private static readonly string[] CommonTail = [ + DefaultOutputFile, + "", + "[dd:hh:mm:ss]\tRecording trace.", + "Press or to exit...", + ]; + private static string[] PreviewMessages = [ + "==========================================================================================", + "The collect-linux verb is a new preview feature and relies on an updated version of the", + ".nettrace file format. The latest PerfView release supports these trace files but other", + "ways of using the trace file may not work yet. For more details, see the docs at", + "https://learn.microsoft.com/dotnet/core/diagnostics/dotnet-trace.", + "==========================================================================================" + ]; + + private static string[] ExpectProvidersAndLinux(string[] dotnetProviders, string[] linuxPerfEvents) + => ExpectProvidersAndLinuxWithMessages(Array.Empty(), dotnetProviders, linuxPerfEvents); + + private static string[] ExpectProvidersAndLinuxWithMessages(string[] messages, string[] dotnetProviders, string[] linuxPerfEvents) + { + List result = new(); + + result.AddRange(PreviewMessages); + + if (messages.Length > 0) + { + result.AddRange(messages); + } + result.Add(""); + + if (dotnetProviders.Length > 0) + { + result.Add(ProviderHeader); + result.AddRange(dotnetProviders); + result.Add(""); + } + + if (linuxPerfEvents.Length > 0) + { + result.Add(LinuxHeader); + result.AddRange(linuxPerfEvents); + } + else + { + result.Add("No Linux Perf Events enabled."); + } + result.Add(""); + + result.AddRange(CommonTail); + + return result.ToArray(); + } + } +} diff --git a/src/tests/dotnet-trace/ProfileProviderMerging.cs b/src/tests/dotnet-trace/ProfileProviderMerging.cs deleted file mode 100644 index 606fa24e50..0000000000 --- a/src/tests/dotnet-trace/ProfileProviderMerging.cs +++ /dev/null @@ -1,44 +0,0 @@ -// Licensed to the .NET Foundation under one or more agreements. -// The .NET Foundation licenses this file to you under the MIT license. - -using System; -using System.Collections.Generic; -using System.Diagnostics.Tracing; -using System.Linq; -using Microsoft.Diagnostics.NETCore.Client; -using Xunit; - -namespace Microsoft.Diagnostics.Tools.Trace -{ - public class ProfileProviderMergeTests - { - [Theory] - [InlineData("cpu-sampling", "Microsoft-Windows-DotNETRuntime")] - [InlineData("gc-verbose", "Microsoft-Windows-DotNETRuntime")] - [InlineData("gc-collect", "Microsoft-Windows-DotNETRuntime")] - public void DuplicateProvider_CorrectlyOverrides(string profileName, string providerToParse) - { - Dictionary enabledBy = new(); - - List parsedProviders = Extensions.ToProviders(providerToParse); - - foreach (EventPipeProvider provider in parsedProviders) - { - enabledBy[provider.Name] = "--providers"; - } - - Profile selectedProfile = ListProfilesCommandHandler.DotNETRuntimeProfiles - .FirstOrDefault(p => p.Name.Equals(profileName, StringComparison.OrdinalIgnoreCase)); - Assert.NotNull(selectedProfile); - - Profile.MergeProfileAndProviders(selectedProfile, parsedProviders, enabledBy); - - EventPipeProvider enabledProvider = parsedProviders.SingleOrDefault(p => p.Name == "Microsoft-Windows-DotNETRuntime"); - - // Assert that our specified provider overrides the version in the profile - Assert.Equal((long)(0), enabledProvider.Keywords); - Assert.Equal(EventLevel.Informational, enabledProvider.EventLevel); - Assert.Equal("--providers", enabledBy[enabledProvider.Name]); - } - } -} diff --git a/src/tests/dotnet-trace/ProviderCompositionTests.cs b/src/tests/dotnet-trace/ProviderCompositionTests.cs new file mode 100644 index 0000000000..d7441fbe6c --- /dev/null +++ b/src/tests/dotnet-trace/ProviderCompositionTests.cs @@ -0,0 +1,336 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +using System; +using System.Collections.Generic; +using System.Diagnostics.Tracing; +using System.IO; +using System.Linq; +using Microsoft.Diagnostics.NETCore.Client; +using Xunit; + +namespace Microsoft.Diagnostics.Tools.Trace +{ + public class ProviderCompositionTests + { + private static readonly Dictionary simpleArgs = new() { { "FilterAndPayloadSpecs", "QuotedValue" } }; + private static readonly Dictionary keyValueArgs = new() { { "key", "value" } }; + private static readonly Dictionary complexArgs = new() { { "FilterAndPayloadSpecs", "QuotedValue:-\r\nQuoted/Value" } }; + private static readonly Dictionary complexABCDArgs = new() { { "FilterAndPayloadSpecs", "QuotedValue:-\r\nQuoted/Value:-A=B;C=D;" } }; + + public static IEnumerable ValidProviders() + { + yield return new object[] { "VeryCoolProvider:0x1:5:FilterAndPayloadSpecs=\"QuotedValue\"", new EventPipeProvider("VeryCoolProvider", EventLevel.Verbose, 0x1, simpleArgs) }; + yield return new object[] { "VeryCoolProvider:1:5:FilterAndPayloadSpecs=\"QuotedValue\"", new EventPipeProvider("VeryCoolProvider", EventLevel.Verbose, 0x1, simpleArgs) }; + yield return new object[] { "VeryCoolProvider:0x1:5:FilterAndPayloadSpecs=\"QuotedValue:-\r\nQuoted/Value\"", new EventPipeProvider("VeryCoolProvider", EventLevel.Verbose, 0x1, complexArgs) }; + yield return new object[] { "VeryCoolProvider:0xFFFFFFFFFFFFFFFF:5:FilterAndPayloadSpecs=\"QuotedValue\"", new EventPipeProvider("VeryCoolProvider", EventLevel.Verbose, unchecked((long)0xFFFFFFFFFFFFFFFF), simpleArgs) }; + yield return new object[] { "VeryCoolProvider::4:FilterAndPayloadSpecs=\"QuotedValue\"", new EventPipeProvider("VeryCoolProvider", EventLevel.Informational, 0, simpleArgs) }; + yield return new object[] { "VeryCoolProvider:::FilterAndPayloadSpecs=\"QuotedValue\"", new EventPipeProvider("VeryCoolProvider", EventLevel.Informational, 0, simpleArgs) }; + yield return new object[] { "ProviderOne:0x1:Verbose", new EventPipeProvider("ProviderOne", EventLevel.Verbose, 0x1) }; + yield return new object[] { "ProviderOne:0x1:verbose", new EventPipeProvider("ProviderOne", EventLevel.Verbose, 0x1) }; + yield return new object[] { "ProviderOne:0x1:Informational", new EventPipeProvider("ProviderOne", EventLevel.Informational, 0x1) }; + yield return new object[] { "ProviderOne:0x1:INFORMATIONAL", new EventPipeProvider("ProviderOne", EventLevel.Informational, 0x1) }; + yield return new object[] { "ProviderOne:0x1:LogAlways", new EventPipeProvider("ProviderOne", EventLevel.LogAlways, 0x1) }; + yield return new object[] { "ProviderOne:0x1:LogAlwayS", new EventPipeProvider("ProviderOne", EventLevel.LogAlways, 0x1) }; + yield return new object[] { "ProviderOne:0x1:Error", new EventPipeProvider("ProviderOne", EventLevel.Error, 0x1) }; + yield return new object[] { "ProviderOne:0x1:ERRor", new EventPipeProvider("ProviderOne", EventLevel.Error, 0x1) }; + yield return new object[] { "ProviderOne:0x1:Critical", new EventPipeProvider("ProviderOne", EventLevel.Critical, 0x1) }; + yield return new object[] { "ProviderOne:0x1:CRITICAL", new EventPipeProvider("ProviderOne", EventLevel.Critical, 0x1) }; + yield return new object[] { "ProviderOne:0x1:Warning", new EventPipeProvider("ProviderOne", EventLevel.Warning, 0x1) }; + yield return new object[] { "ProviderOne:0x1:warning", new EventPipeProvider("ProviderOne", EventLevel.Warning, 0x1) }; + yield return new object[] { "MyProvider:::A=B;C=D", new EventPipeProvider("MyProvider", EventLevel.Informational, 0x0, new Dictionary { { "A", "B" }, { "C", "D" } }) }; + } + + public static IEnumerable InvalidProviders() + { + yield return new object[] { ":::", typeof(CommandLineErrorException) }; + yield return new object[] { ":1:1", typeof(CommandLineErrorException) }; + yield return new object[] { "ProviderOne:0x1:UnknownLevel", typeof(CommandLineErrorException) }; + yield return new object[] { "VeryCoolProvider:0x0:-1", typeof(CommandLineErrorException) }; + yield return new object[] { "VeryCoolProvider:0xFFFFFFFFFFFFFFFFF:5:FilterAndPayloadSpecs=\"QuotedValue\"", typeof(OverflowException) }; + yield return new object[] { "VeryCoolProvider:0x10000000000000000::FilterAndPayloadSpecs=\"QuotedValue\"", typeof(OverflowException) }; + yield return new object[] { "VeryCoolProvider:__:5:FilterAndPayloadSpecs=\"QuotedValue\"", typeof(FormatException) }; + yield return new object[] { "VeryCoolProvider:gh::FilterAndPayloadSpecs=\"QuotedValue\"", typeof(FormatException) }; + } + + [Theory] + [MemberData(nameof(ValidProviders))] + public void ProvidersArg_ParsesCorrectly(string providersArg, EventPipeProvider expected) + { + string[] providers = providersArg.Split(',', StringSplitOptions.RemoveEmptyEntries); + List parsedProviders = ProviderUtils.ComputeProviderConfig(providers, string.Empty, string.Empty, Array.Empty()); + EventPipeProvider actual = Assert.Single(parsedProviders); + Assert.Equal(expected, actual); + } + + [Theory] + [MemberData(nameof(InvalidProviders))] + public void InvalidProvidersArg_Throws(string providersArg, Type expectedException) + { + string[] providers = providersArg.Split(',', StringSplitOptions.RemoveEmptyEntries); + Assert.Throws(expectedException, () => ProviderUtils.ComputeProviderConfig(providers, string.Empty, string.Empty, Array.Empty())); + } + + public static IEnumerable MultipleValidProviders() + { + yield return new object[] { + "ProviderOne:0x1:1:FilterAndPayloadSpecs=\"QuotedValue\",ProviderTwo:2:2:key=value,ProviderThree:3:3:key=value", + new[] { + new EventPipeProvider("ProviderOne", EventLevel.Critical, 0x1, simpleArgs), + new EventPipeProvider("ProviderTwo", EventLevel.Error, 0x2, keyValueArgs), + new EventPipeProvider("ProviderThree", EventLevel.Warning, 0x3, keyValueArgs) + } + }; + yield return new object[] { + "ProviderOne:0x1:1:FilterAndPayloadSpecs=\"QuotedValue:-\r\nQuoted/Value:-A=B;C=D;\",ProviderTwo:2:2:FilterAndPayloadSpecs=\"QuotedValue\",ProviderThree:3:3:FilterAndPayloadSpecs=\"QuotedValue:-\r\nQuoted/Value:-A=B;C=D;\"", + new[] { + new EventPipeProvider("ProviderOne", EventLevel.Critical, 0x1, complexABCDArgs), + new EventPipeProvider("ProviderTwo", EventLevel.Error, 0x2, simpleArgs), + new EventPipeProvider("ProviderThree", EventLevel.Warning, 0x3, complexABCDArgs) + } + }; + yield return new object[] { + "MyProvider:::A=B;C=\"D\",MyProvider2:::A=1;B=2;", + new[] { + new EventPipeProvider("MyProvider", EventLevel.Informational, 0x0, new Dictionary { { "A", "B" }, { "C", "D" } }), + new EventPipeProvider("MyProvider2", EventLevel.Informational, 0x0, new Dictionary { { "A", "1" }, { "B", "2" } }) + } + }; + yield return new object[] { + "MyProvider:::A=\"B;C=D\",MyProvider2:::A=\"spaced words\";C=1285;D=Spaced Words 2", + new[] { + new EventPipeProvider("MyProvider", EventLevel.Informational, 0x0, new Dictionary { { "A", "B;C=D" } }), + new EventPipeProvider("MyProvider2", EventLevel.Informational, 0x0, new Dictionary { { "A", "spaced words" }, { "C", "1285" }, { "D", "Spaced Words 2" } }) + } + }; + } + + [Theory] + [MemberData(nameof(MultipleValidProviders))] + public void MultipleProviders_Parse_AsExpected(string providersArg, EventPipeProvider[] expected) + { + string[] providers = providersArg.Split(',', StringSplitOptions.RemoveEmptyEntries); + List parsed = ProviderUtils.ComputeProviderConfig(providers, string.Empty, string.Empty, Array.Empty()); + Assert.Equal(expected.Length, parsed.Count); + for (int i = 0; i < expected.Length; i++) + { + Assert.Equal(expected[i], parsed[i]); + } + } + + public static IEnumerable MultipleInvalidProviders() + { + yield return new object[] { "ProviderOne:0x1:5:FilterAndPayloadSpecs=\"QuotedValue\",:2:2:key=value,ProviderThree:3:3:key=value", typeof(CommandLineErrorException) }; + yield return new object[] { "ProviderOne:0x1:5:FilterAndPayloadSpecs=\"QuotedValue\",ProviderTwo:0xFFFFFFFFFFFFFFFFF:5:FilterAndPayloadSpecs=\"QuotedValue\",ProviderThree:3:3:key=value", typeof(OverflowException) }; + yield return new object[] { "ProviderOne:0x1:5:FilterAndPayloadSpecs=\"QuotedValue\",ProviderTwo:0x10000000000000000:5:FilterAndPayloadSpecs=\"QuotedValue\",ProviderThree:3:3:key=value", typeof(OverflowException) }; + yield return new object[] { "ProviderOne:0x1:5:FilterAndPayloadSpecs=\"QuotedValue\",ProviderTwo:18446744073709551615:5:FilterAndPayloadSpecs=\"QuotedValue\",ProviderThree:3:3:key=value", typeof(OverflowException) }; + yield return new object[] { "ProviderOne:0x1:5:FilterAndPayloadSpecs=\"QuotedValue\",ProviderTwo:__:5:FilterAndPayloadSpecs=\"QuotedValue\",ProviderThree:3:3:key=value", typeof(FormatException) }; + } + + [Theory] + [MemberData(nameof(MultipleInvalidProviders))] + public void MultipleProviders_FailureCases_Throw(string providersArg, Type expectedException) + { + string[] providers = providersArg.Split(',', StringSplitOptions.RemoveEmptyEntries); + Assert.Throws(expectedException, () => ProviderUtils.ComputeProviderConfig(providers, string.Empty, string.Empty, Array.Empty())); + } + + public static IEnumerable DedupeSuccessCases() + { + yield return new object[] { new[]{ "DupeProvider", "DupeProvider:0xF:LogAlways" }, new EventPipeProvider("DupeProvider", EventLevel.LogAlways, 0xF) }; + yield return new object[] { new[]{ "DupeProvider:0xF0:Informational", "DupeProvider:0xF:Verbose" }, new EventPipeProvider("DupeProvider", EventLevel.Verbose, 0xFF) }; + yield return new object[] { new[]{ "MyProvider:0x1:Informational", "MyProvider:0x2:Verbose" }, new EventPipeProvider("MyProvider", EventLevel.Verbose, 0x3) }; + yield return new object[] { new[] { "MyProvider:0x1:5", "MyProvider:0x2:LogAlways" }, new EventPipeProvider("MyProvider", EventLevel.LogAlways, 0x3) }; + yield return new object[] { new[]{ "MyProvider:0x1:Error", "myprovider:0x2:Critical" }, new EventPipeProvider("MyProvider", EventLevel.Error, 0x3) }; + } + + public static IEnumerable DedupeFailureCases() + { + yield return new object[] { new[]{ "MyProvider:::key=value", "MyProvider:::key=value" }, typeof(CommandLineErrorException) }; + } + + [Theory] + [MemberData(nameof(DedupeSuccessCases))] + public void DedupeProviders_Success(string[] providersArg, EventPipeProvider expected) + { + List list = ProviderUtils.ComputeProviderConfig(providersArg, string.Empty, string.Empty, Array.Empty()); + EventPipeProvider actual = Assert.Single(list); + Assert.Equal(expected, actual); + } + + [Theory] + [MemberData(nameof(DedupeFailureCases))] + public void DedupeProviders_Failure(string[] providersArg, Type expectedException) + { + Assert.Throws(expectedException, () => ProviderUtils.ComputeProviderConfig(providersArg, string.Empty, string.Empty, Array.Empty())); + } + + public static IEnumerable PrecedenceCases() + { + yield return new object[] { + Array.Empty(), + "gc+jit", + string.Empty, + Array.Empty(), + new[]{ new EventPipeProvider("Microsoft-Windows-DotNETRuntime", EventLevel.Informational, 0x1 | 0x10) } + }; + + yield return new object[] { + Array.Empty(), + "gc", + "Verbose", + new[]{ "dotnet-common", "dotnet-sampled-thread-time" }, + new[]{ + new EventPipeProvider("Microsoft-Windows-DotNETRuntime", EventLevel.Informational, 0x100003801D), + new EventPipeProvider("Microsoft-DotNETCore-SampleProfiler", EventLevel.Informational, 0xF00000000000) + } + }; + + yield return new object[] { + new[]{ "Microsoft-Windows-DotNETRuntime:0x40000000:Verbose" }, + "gc", + "Informational", + new[]{ "dotnet-common" }, + new[]{ new EventPipeProvider("Microsoft-Windows-DotNETRuntime", EventLevel.Verbose, 0x40000000) } + }; + + yield return new object[] { + Array.Empty(), + string.Empty, + string.Empty, + new[]{ "dotnet-common" }, + new[]{ new EventPipeProvider("Microsoft-Windows-DotNETRuntime", EventLevel.Informational, 0x100003801D) } + }; + + yield return new object[] { + Array.Empty(), + string.Empty, + string.Empty, + new[]{ "dotnet-common", "gc-verbose" }, + new[]{ new EventPipeProvider("Microsoft-Windows-DotNETRuntime", EventLevel.Informational, 0x100003801D) } + }; + + yield return new object[] { + new[]{ "Microsoft-Windows-DotNETRuntime:0x0:Informational" }, + string.Empty, + string.Empty, + new[]{ "dotnet-common" }, + new[]{ new EventPipeProvider("Microsoft-Windows-DotNETRuntime", EventLevel.Informational, 0x0) } + }; + } + + [Theory] + [MemberData(nameof(PrecedenceCases))] + public void ProviderSourcePrecedence(string[] providersArg, string clreventsArg, string clreventLevel, string[] profiles, EventPipeProvider[] expected) + { + List actual = ProviderUtils.ComputeProviderConfig(providersArg, clreventsArg, clreventLevel, profiles); + Assert.Equal(expected.Length, actual.Count); + for (int i = 0; i < expected.Length; i++) + { + Assert.Equal(expected[i], actual[i]); + } + } + + public static IEnumerable InvalidClrEvents() + { + yield return new object[] { Array.Empty(), "gc+bogus", string.Empty, Array.Empty(), typeof(CommandLineErrorException) }; + } + + [Theory] + [MemberData(nameof(InvalidClrEvents))] + public void UnknownClrEvents_Throws(string[] providersArg, string clreventsArg, string clreventLevel, string[] profiles, Type expectedException) + { + Assert.Throws(expectedException, () => ProviderUtils.ComputeProviderConfig(providersArg, clreventsArg, clreventLevel, profiles)); + } + + public record ProviderSourceExpectation(string Name, bool FromProviders, bool FromClrEvents, bool FromProfile); + + public static IEnumerable ProviderSourcePrintCases() + { + yield return new object[] { + new[]{ "MyProvider:0x1:Error" }, + "gc", + "Informational", + new[]{ "dotnet-sampled-thread-time" }, + new[]{ + new ProviderSourceExpectation("MyProvider", true, false, false), + new ProviderSourceExpectation("Microsoft-Windows-DotNETRuntime", false, true, false), + new ProviderSourceExpectation("Microsoft-DotNETCore-SampleProfiler", false, false, true) + } + }; + } + + [Theory] + [MemberData(nameof(ProviderSourcePrintCases))] + public void PrintProviders_Sources(string[] providersArg, string clreventsArg, string clreventLevel, string[] profiles, ProviderSourceExpectation[] expectations) + { + StringWriter capture = new(); + TextWriter original = Console.Out; + try + { + Console.SetOut(capture); + _ = ProviderUtils.ComputeProviderConfig(providersArg, clreventsArg, clreventLevel, profiles, true); + string output = capture.ToString(); + foreach (ProviderSourceExpectation e in expectations) + { + string line = output.WhereLineContains(e.Name); + Assert.Equal(e.FromProviders, line.Contains("--providers", StringComparison.Ordinal)); + Assert.Equal(e.FromClrEvents, line.Contains("--clrevents", StringComparison.Ordinal)); + Assert.Equal(e.FromProfile, line.Contains("--profile", StringComparison.Ordinal)); + } + } + finally + { + Console.SetOut(original); + } + } + + public static IEnumerable MergingCases() + { + yield return new object[] { new[]{ "MyProvider:0x1:5", "MyProvider:0x2:LogAlways" }, string.Empty, string.Empty, Array.Empty(), new EventPipeProvider("MyProvider", EventLevel.LogAlways, 0x3) }; + yield return new object[] { new[]{ "MyProvider:0x1:Error", "myprovider:0x2:Critical" }, string.Empty, string.Empty, Array.Empty(), new EventPipeProvider("MyProvider", EventLevel.Error, 0x3) }; + } + + [Theory] + [MemberData(nameof(MergingCases))] + public void MergeDuplicateProviders(string[] providersArg, string clreventsArg, string clreventLevel, string[] profiles, EventPipeProvider expected) + { + List actual = ProviderUtils.ComputeProviderConfig(providersArg, clreventsArg, clreventLevel, profiles); + EventPipeProvider single = Assert.Single(actual); + Assert.Equal(expected, single); + } + + [Theory] + [InlineData("MyProvider:0x0:9", EventLevel.Verbose)] + public void ProviderEventLevel_Clamps(string providersArg, EventLevel expected) + { + string[] providers = providersArg.Split(',', StringSplitOptions.RemoveEmptyEntries); + EventPipeProvider actual = Assert.Single(ProviderUtils.ComputeProviderConfig(providers, string.Empty, string.Empty, Array.Empty())); + Assert.Equal(expected, actual.EventLevel); + } + + public static IEnumerable ClrEventLevelCases() + { + yield return new object[] { Array.Empty(), "gc+jit", "5", Array.Empty(), new EventPipeProvider("Microsoft-Windows-DotNETRuntime", EventLevel.Verbose, 0x1 | 0x10) }; + } + + [Theory] + [MemberData(nameof(ClrEventLevelCases))] + public void CLREvents_NumericLevel_Parses(string[] providersArg, string clreventsArg, string clreventLevel, string[] profiles, EventPipeProvider expected) + { + List actual = ProviderUtils.ComputeProviderConfig(providersArg, clreventsArg, clreventLevel, profiles); + EventPipeProvider single = Assert.Single(actual, p => p.Name == "Microsoft-Windows-DotNETRuntime"); + Assert.Equal(expected, single); + } + } + + internal static class TestStringExtensions + { + extension(string text) + { + public string WhereLineContains(string search) => string.Join(Environment.NewLine, + text.Split(new[] { "\r\n", "\n" }, StringSplitOptions.None) + .Where(l => l.Contains(search, StringComparison.Ordinal))); + } + } +} diff --git a/src/tests/dotnet-trace/ProviderParsing.cs b/src/tests/dotnet-trace/ProviderParsing.cs deleted file mode 100644 index bab3b6fb0d..0000000000 --- a/src/tests/dotnet-trace/ProviderParsing.cs +++ /dev/null @@ -1,341 +0,0 @@ -// Licensed to the .NET Foundation under one or more agreements. -// The .NET Foundation licenses this file to you under the MIT license. - -using System; -using System.Collections.Generic; -using System.Linq; -using Microsoft.Diagnostics.NETCore.Client; -using Xunit; - -namespace Microsoft.Diagnostics.Tools.Trace -{ - public class ProviderParsingTests - { - [Theory] - [InlineData("VeryCoolProvider:0x1:5:FilterAndPayloadSpecs=\"QuotedValue\"")] - [InlineData("VeryCoolProvider:1:5:FilterAndPayloadSpecs=\"QuotedValue\"")] - public void ValidProvider_CorrectlyParses(string providerToParse) - { - List parsedProviders = Extensions.ToProviders(providerToParse); - Assert.True(parsedProviders.Count == 1); - EventPipeProvider provider = parsedProviders.First(); - Assert.True(provider.Name == "VeryCoolProvider"); - Assert.True(provider.Keywords == 1); - Assert.True(provider.EventLevel == System.Diagnostics.Tracing.EventLevel.Verbose); - Assert.True(provider.Arguments.Count == 1); - Assert.True(provider.Arguments["FilterAndPayloadSpecs"] == "QuotedValue"); - } - - [Theory] - [InlineData("VeryCoolProvider:0x1:5:FilterAndPayloadSpecs=\"QuotedValue:-\r\nQuoted/Value\"")] - public void ValidProviderFilter_CorrectlyParses(string providerToParse) - { - List parsedProviders = Extensions.ToProviders(providerToParse); - Assert.True(parsedProviders.Count == 1); - EventPipeProvider provider = parsedProviders.First(); - Assert.True(provider.Name == "VeryCoolProvider"); - Assert.True(provider.Keywords == 1); - Assert.True(provider.EventLevel == System.Diagnostics.Tracing.EventLevel.Verbose); - Assert.True(provider.Arguments.Count == 1); - Assert.True(provider.Arguments["FilterAndPayloadSpecs"] == "QuotedValue:-\r\nQuoted/Value"); - } - - [Theory] - [InlineData(null)] - [InlineData(",")] - public void EmptyProvider_CorrectlyThrows(string providerToParse) - { - Assert.Throws(() => Extensions.ToProviders(providerToParse)); - } - - [Theory] - [InlineData(":::")] - [InlineData(":1:1")] - public void InvalidProvider_CorrectlyThrows(string providerToParse) - { - Assert.Throws(() => Extensions.ToProviders(providerToParse)); - } - - [Theory] - [InlineData("VeryCoolProvider:0xFFFFFFFFFFFFFFFF:5:FilterAndPayloadSpecs=\"QuotedValue\"")] - public void ValidProviderKeyword_CorrectlyParses(string providerToParse) - { - List parsedProviders = Extensions.ToProviders(providerToParse); - Assert.True(parsedProviders.Count == 1); - EventPipeProvider provider = parsedProviders.First(); - Assert.True(provider.Name == "VeryCoolProvider"); - Assert.True(provider.Keywords == (long)(-1)); - Assert.True(provider.EventLevel == System.Diagnostics.Tracing.EventLevel.Verbose); - Assert.True(provider.Arguments.Count == 1); - Assert.True(provider.Arguments["FilterAndPayloadSpecs"] == "QuotedValue"); - } - - [Theory] - [InlineData("VeryCoolProvider::4:FilterAndPayloadSpecs=\"QuotedValue\"")] - [InlineData("VeryCoolProvider:::FilterAndPayloadSpecs=\"QuotedValue\"")] - public void ValidProviderEventLevel_CorrectlyParses(string providerToParse) - { - List parsedProviders = Extensions.ToProviders(providerToParse); - Assert.Equal(1, parsedProviders.Count); - EventPipeProvider provider = parsedProviders.First(); - Assert.Equal("VeryCoolProvider", provider.Name); - Assert.Equal(0, provider.Keywords); - Assert.Equal(System.Diagnostics.Tracing.EventLevel.Informational, provider.EventLevel); - Assert.Equal(1, provider.Arguments.Count); - Assert.Equal("QuotedValue", provider.Arguments["FilterAndPayloadSpecs"]); - } - - [Theory] - [InlineData("VeryCoolProvider:0xFFFFFFFFFFFFFFFFF:5:FilterAndPayloadSpecs=\"QuotedValue\"")] - [InlineData("VeryCoolProvider:0x10000000000000000::FilterAndPayloadSpecs=\"QuotedValue\"")] - public void OutOfRangekeyword_CorrectlyThrows(string providerToParse) - { - Assert.Throws(() => Extensions.ToProviders(providerToParse)); - } - - [Theory] - [InlineData("VeryCoolProvider:__:5:FilterAndPayloadSpecs=\"QuotedValue\"")] - [InlineData("VeryCoolProvider:gh::FilterAndPayloadSpecs=\"QuotedValue\"")] - public void Invalidkeyword_CorrectlyThrows(string providerToParse) - { - Assert.Throws(() => Extensions.ToProviders(providerToParse)); - } - - [Theory] - [InlineData("ProviderOne:0x1:1:FilterAndPayloadSpecs=\"QuotedValue\",ProviderTwo:2:2:key=value,ProviderThree:3:3:key=value")] - [InlineData("ProviderOne:1:1:FilterAndPayloadSpecs=\"QuotedValue\",ProviderTwo:0x2:2:key=value,ProviderThree:0x3:3:key=value")] - public void MultipleValidProviders_CorrectlyParses(string providersToParse) - { - List parsedProviders = Extensions.ToProviders(providersToParse); - Assert.True(parsedProviders.Count == 3); - EventPipeProvider providerOne = parsedProviders[0]; - EventPipeProvider providerTwo = parsedProviders[1]; - EventPipeProvider providerThree = parsedProviders[2]; - - Assert.True(providerOne.Name == "ProviderOne"); - Assert.True(providerOne.Keywords == 1); - Assert.True(providerOne.EventLevel == System.Diagnostics.Tracing.EventLevel.Critical); - Assert.True(providerOne.Arguments.Count == 1); - Assert.True(providerOne.Arguments["FilterAndPayloadSpecs"] == "QuotedValue"); - - Assert.True(providerTwo.Name == "ProviderTwo"); - Assert.True(providerTwo.Keywords == 2); - Assert.True(providerTwo.EventLevel == System.Diagnostics.Tracing.EventLevel.Error); - Assert.True(providerTwo.Arguments.Count == 1); - Assert.True(providerTwo.Arguments["key"] == "value"); - - Assert.True(providerThree.Name == "ProviderThree"); - Assert.True(providerThree.Keywords == 3); - Assert.True(providerThree.EventLevel == System.Diagnostics.Tracing.EventLevel.Warning); - Assert.True(providerThree.Arguments.Count == 1); - Assert.True(providerThree.Arguments["key"] == "value"); - } - - [Theory] - [InlineData("ProviderOne:0x1:5:FilterAndPayloadSpecs=\"QuotedValue\",:2:2:key=value,ProviderThree:3:3:key=value")] - [InlineData("ProviderOne:0x1:5:FilterAndPayloadSpecs=\"QuotedValue\",ProviderTwo:2:2:key=value,:3:3:key=value")] - [InlineData("ProviderOne:0x1:5:key=value,key=FilterAndPayloadSpecs=\"QuotedValue\",:2:2:key=value,ProviderThree:3:3:key=value")] - public void MultipleValidProvidersWithOneInvalidProvider_CorrectlyThrows(string providersToParse) - { - Assert.Throws(() => Extensions.ToProviders(providersToParse)); - } - - [Theory] - [InlineData("ProviderOne:0x1:5:FilterAndPayloadSpecs=\"QuotedValue\",ProviderTwo:0xFFFFFFFFFFFFFFFFF:5:FilterAndPayloadSpecs=\"QuotedValue\",ProviderThree:3:3:key=value")] - [InlineData("ProviderOne:0x1:5:FilterAndPayloadSpecs=\"QuotedValue\",ProviderTwo:0x10000000000000000:5:FilterAndPayloadSpecs=\"QuotedValue\",ProviderThree:3:3:key=value")] - [InlineData("ProviderOne:0x1:5:FilterAndPayloadSpecs=\"QuotedValue\",ProviderTwo:18446744073709551615:5:FilterAndPayloadSpecs=\"QuotedValue\",ProviderThree:3:3:key=value")] - public void MultipleValidProvidersWithOneOutOfRangeKeyword_CorrectlyThrows(string providersToParse) - { - Assert.Throws(() => Extensions.ToProviders(providersToParse)); - } - - [Theory] - [InlineData("ProviderOne:0x1:5:FilterAndPayloadSpecs=\"QuotedValue\",ProviderTwo:__:5:FilterAndPayloadSpecs=\"QuotedValue\",ProviderThree:3:3:key=value")] - [InlineData("ProviderOne:0x1:5:FilterAndPayloadSpecs=\"QuotedValue\",ProviderTwo:gh:5:FilterAndPayloadSpecs=\"QuotedValue\",ProviderThree:3:3:key=value")] - [InlineData("ProviderOne:0x1:5:FilterAndPayloadSpecs=\"QuotedValue\",ProviderTwo:$:5:FilterAndPayloadSpecs=\"QuotedValue\",ProviderThree:3:3:key=value")] - public void MultipleValidProvidersWithOneInvalidKeyword_CorrectlyThrows(string providersToParse) - { - Assert.Throws(() => Extensions.ToProviders(providersToParse)); - } - - [Theory] - [InlineData("ProviderOne:0x1:1:FilterAndPayloadSpecs=\"QuotedValue:-\r\nQuoted/Value:-A=B;C=D;\",ProviderTwo:2:2:FilterAndPayloadSpecs=\"QuotedValue\",ProviderThree:3:3:FilterAndPayloadSpecs=\"QuotedValue:-\r\nQuoted/Value:-A=B;C=D;\"")] - public void MultipleProvidersWithComplexFilters_CorrectlyParse(string providersToParse) - { - List parsedProviders = Extensions.ToProviders(providersToParse); - Assert.True(parsedProviders.Count == 3); - EventPipeProvider providerOne = parsedProviders[0]; - EventPipeProvider providerTwo = parsedProviders[1]; - EventPipeProvider providerThree = parsedProviders[2]; - - Assert.True(providerOne.Name == "ProviderOne"); - Assert.True(providerOne.Keywords == 1); - Assert.True(providerOne.EventLevel == System.Diagnostics.Tracing.EventLevel.Critical); - Assert.True(providerOne.Arguments.Count == 1); - Assert.True(providerOne.Arguments["FilterAndPayloadSpecs"] == "QuotedValue:-\r\nQuoted/Value:-A=B;C=D;"); - - Assert.True(providerTwo.Name == "ProviderTwo"); - Assert.True(providerTwo.Keywords == 2); - Assert.True(providerTwo.EventLevel == System.Diagnostics.Tracing.EventLevel.Error); - Assert.True(providerTwo.Arguments.Count == 1); - Assert.True(providerTwo.Arguments["FilterAndPayloadSpecs"] == "QuotedValue"); - - Assert.True(providerThree.Name == "ProviderThree"); - Assert.True(providerThree.Keywords == 3); - Assert.True(providerThree.EventLevel == System.Diagnostics.Tracing.EventLevel.Warning); - Assert.True(providerThree.Arguments.Count == 1); - Assert.True(providerThree.Arguments["FilterAndPayloadSpecs"] == "QuotedValue:-\r\nQuoted/Value:-A=B;C=D;"); - } - - [Fact] - public void ProvidersWithComplexFilters_CorrectlyParse() - { - string providersToParse = @"MyProvider:::A=B;C=D"; - List parsedProviders = Extensions.ToProviders(providersToParse); - Assert.Single(parsedProviders); - EventPipeProvider providerOne = parsedProviders[0]; - Assert.Equal("MyProvider", providerOne.Name); - Assert.Equal(2, providerOne.Arguments.Count); - Assert.Equal("B", providerOne.Arguments["A"]); - Assert.Equal("D", providerOne.Arguments["C"]); - - providersToParse = @"MyProvider:::A=B;C=""D"",MyProvider2:::A=1;B=2;"; - parsedProviders = Extensions.ToProviders(providersToParse); - Assert.Equal(2, parsedProviders.Count); - providerOne = parsedProviders[0]; - EventPipeProvider providerTwo = parsedProviders[1]; - Assert.Equal("MyProvider", providerOne.Name); - Assert.Equal("MyProvider2", providerTwo.Name); - Assert.Equal(2, providerOne.Arguments.Count); - Assert.Equal("B", providerOne.Arguments["A"]); - Assert.Equal("D", providerOne.Arguments["C"]); - Assert.Equal(2, providerTwo.Arguments.Count); - Assert.Equal("1", providerTwo.Arguments["A"]); - Assert.Equal("2", providerTwo.Arguments["B"]); - - providersToParse = @"MyProvider:::A=""B;C=D"",MyProvider2:::A=""spaced words"";C=1285;D=Spaced Words 2"; - parsedProviders = Extensions.ToProviders(providersToParse); - Assert.Equal(2, parsedProviders.Count); - providerOne = parsedProviders[0]; - providerTwo = parsedProviders[1]; - Assert.Equal("MyProvider", providerOne.Name); - Assert.Equal("MyProvider2", providerTwo.Name); - Assert.Equal(1, providerOne.Arguments.Count); - Assert.Equal(3, providerTwo.Arguments.Count); - Assert.Equal("B;C=D", providerOne.Arguments["A"]); - Assert.Equal("spaced words", providerTwo.Arguments["A"]); - Assert.Equal("Spaced Words 2", providerTwo.Arguments["D"]); - Assert.Equal("1285", providerTwo.Arguments["C"]); - } - - [Theory] - [InlineData("ProviderOne:0x1:Verbose")] - [InlineData("ProviderOne:0x1:verbose")] - public void TextLevelProviderSpecVerbose_CorrectlyParse(string providerToParse) - { - List parsedProviders = Extensions.ToProviders(providerToParse); - Assert.True(parsedProviders.Count == 1); - Assert.True(parsedProviders[0].Name == "ProviderOne"); - Assert.True(parsedProviders[0].Keywords == 1); - Assert.True(parsedProviders[0].EventLevel == System.Diagnostics.Tracing.EventLevel.Verbose); - } - - [Theory] - [InlineData("ProviderOne:0x1:Informational")] - [InlineData("ProviderOne:0x1:INFORMATIONAL")] - public void TextLevelProviderSpecInformational_CorrectlyParse(string providerToParse) - { - List parsedProviders = Extensions.ToProviders(providerToParse); - Assert.True(parsedProviders.Count == 1); - Assert.True(parsedProviders[0].Name == "ProviderOne"); - Assert.True(parsedProviders[0].Keywords == 1); - Assert.True(parsedProviders[0].EventLevel == System.Diagnostics.Tracing.EventLevel.Informational); - } - - [Theory] - [InlineData("ProviderOne:0x1:LogAlways")] - [InlineData("ProviderOne:0x1:LogAlwayS")] - public void TextLevelProviderSpecLogAlways_CorrectlyParse(string providerToParse) - { - List parsedProviders = Extensions.ToProviders(providerToParse); - Assert.True(parsedProviders.Count == 1); - Assert.True(parsedProviders[0].Name == "ProviderOne"); - Assert.True(parsedProviders[0].Keywords == 1); - Assert.True(parsedProviders[0].EventLevel == System.Diagnostics.Tracing.EventLevel.LogAlways); - } - - [Theory] - [InlineData("ProviderOne:0x1:Error")] - [InlineData("ProviderOne:0x1:ERRor")] - public void TextLevelProviderSpecError_CorrectlyParse(string providerToParse) - { - List parsedProviders = Extensions.ToProviders(providerToParse); - Assert.True(parsedProviders.Count == 1); - Assert.True(parsedProviders[0].Name == "ProviderOne"); - Assert.True(parsedProviders[0].Keywords == 1); - Assert.True(parsedProviders[0].EventLevel == System.Diagnostics.Tracing.EventLevel.Error); - } - - [Theory] - [InlineData("ProviderOne:0x1:Critical")] - [InlineData("ProviderOne:0x1:CRITICAL")] - public void TextLevelProviderSpecCritical_CorrectlyParse(string providerToParse) - { - List parsedProviders = Extensions.ToProviders(providerToParse); - Assert.True(parsedProviders.Count == 1); - Assert.True(parsedProviders[0].Name == "ProviderOne"); - Assert.True(parsedProviders[0].Keywords == 1); - Assert.True(parsedProviders[0].EventLevel == System.Diagnostics.Tracing.EventLevel.Critical); - } - - [Theory] - [InlineData("ProviderOne:0x1:Warning")] - [InlineData("ProviderOne:0x1:warning")] - public void TextLevelProviderSpecWarning_CorrectlyParse(string providerToParse) - { - List parsedProviders = Extensions.ToProviders(providerToParse); - Assert.True(parsedProviders.Count == 1); - Assert.True(parsedProviders[0].Name == "ProviderOne"); - Assert.True(parsedProviders[0].Keywords == 1); - Assert.True(parsedProviders[0].EventLevel == System.Diagnostics.Tracing.EventLevel.Warning); - } - - [Theory] - [InlineData("ProviderOne:0x1:UnknownLevel")] - public void TextLevelProviderSpec_CorrectlyThrows(string providerToParse) - { - Assert.Throws(() => Extensions.ToProviders(providerToParse)); - } - - [Theory] - [InlineData("DupeProvider,DupeProvider:0xF:LogAlways")] - public void DeDupeProviders_DefaultAndSpecified(string providersToParse) - { - List parsedProviders = Extensions.ToProviders(providersToParse); - Assert.Equal("DupeProvider", parsedProviders.First().Name); - Assert.Equal(1, parsedProviders.Count); - Assert.Equal(0xF, parsedProviders.First().Keywords); - Assert.Equal(System.Diagnostics.Tracing.EventLevel.LogAlways, parsedProviders.First().EventLevel); - Assert.Null(parsedProviders.First().Arguments); - } - - [Theory] - [InlineData("DupeProvider:0xF0:Informational,DupeProvider:0xF:Verbose")] - public void DeDupeProviders_BothSpecified(string providersToParse) - { - List parsedProviders = Extensions.ToProviders(providersToParse); - Assert.Equal("DupeProvider", parsedProviders.First().Name); - Assert.Equal(1, parsedProviders.Count); - Assert.Equal(0xFF, parsedProviders.First().Keywords); - Assert.Equal(System.Diagnostics.Tracing.EventLevel.Verbose, parsedProviders.First().EventLevel); - Assert.Null(parsedProviders.First().Arguments); - } - - [Theory] - [InlineData("DupeProvider:::key=value,DupeProvider:::key=value")] - public void DeDupeProviders_FilterDataThrows(string providersToParse) - { - Assert.Throws(() => Extensions.ToProviders(providersToParse)); - } - } -} From 5cc46b7c13c0932059539355b77785988b85a83e Mon Sep 17 00:00:00 2001 From: Juan Hoyos <19413848+hoyosjs@users.noreply.github.com> Date: Fri, 24 Oct 2025 15:52:39 -0700 Subject: [PATCH 09/44] Allow to run diagnostics pipeline in build-only mode (#5613) --- diagnostics.yml | 83 +++++++++++++++++++++++++++---------------------- 1 file changed, 45 insertions(+), 38 deletions(-) diff --git a/diagnostics.yml b/diagnostics.yml index a6c816ae85..389526e741 100644 --- a/diagnostics.yml +++ b/diagnostics.yml @@ -15,6 +15,10 @@ parameters: - default - custom - dotnetclimsrc-sas-token-base64 +- name: buildOnly + displayName: Build only (skip tests) + type: boolean + default: false trigger: none @@ -75,6 +79,7 @@ extends: jobTemplate: ${{ variables.jobTemplate }} name: Windows osGroup: Windows_NT + buildOnly: ${{ parameters.buildOnly }} buildConfigs: - configuration: Debug architecture: x64 @@ -129,6 +134,7 @@ extends: parameters: jobTemplate: ${{ variables.jobTemplate }} osGroup: MacOS + buildOnly: ${{ parameters.buildOnly }} buildConfigs: - configuration: Release architecture: x64 @@ -212,45 +218,13 @@ extends: # # ############################ - - template: /eng/pipelines/build.yml - parameters: - jobTemplate: ${{ variables.jobTemplate }} - name: Ubuntu_22_04 - osGroup: Linux - container: test_ubuntu_22_04 - dependsOn: Linux - testOnly: true - buildConfigs: - - configuration: Release - architecture: x64 - - ${{ if in(variables['Build.Reason'], 'PullRequest') }}: - - configuration: Debug - architecture: x64 - - - template: /eng/pipelines/build.yml - parameters: - jobTemplate: ${{ variables.jobTemplate }} - name: Alpine3_19 - osGroup: Linux - osSuffix: -musl - container: test_linux_musl_x64 - dependsOn: Linux_musl - testOnly: true - disableComponentGovernance: true - buildConfigs: - - configuration: Release - architecture: x64 - - ${{ if in(variables['Build.Reason'], 'PullRequest') }}: - - configuration: Debug - architecture: x64 - - - ${{ if ne(variables['System.TeamProject'], 'public') }}: + - ${{ if ne(parameters.buildOnly, true) }}: - template: /eng/pipelines/build.yml parameters: jobTemplate: ${{ variables.jobTemplate }} - name: Debian_Bullseye + name: Ubuntu_22_04 osGroup: Linux - container: test_debian_11_amd64 + container: test_ubuntu_22_04 dependsOn: Linux testOnly: true buildConfigs: @@ -263,11 +237,13 @@ extends: - template: /eng/pipelines/build.yml parameters: jobTemplate: ${{ variables.jobTemplate }} - name: Fedora_39 + name: Alpine3_19 osGroup: Linux - container: test_fedora - dependsOn: Linux + osSuffix: -musl + container: test_linux_musl_x64 + dependsOn: Linux_musl testOnly: true + disableComponentGovernance: true buildConfigs: - configuration: Release architecture: x64 @@ -275,6 +251,37 @@ extends: - configuration: Debug architecture: x64 + - ${{ if ne(variables['System.TeamProject'], 'public') }}: + - template: /eng/pipelines/build.yml + parameters: + jobTemplate: ${{ variables.jobTemplate }} + name: Debian_Bullseye + osGroup: Linux + container: test_debian_11_amd64 + dependsOn: Linux + testOnly: true + buildConfigs: + - configuration: Release + architecture: x64 + - ${{ if in(variables['Build.Reason'], 'PullRequest') }}: + - configuration: Debug + architecture: x64 + + - template: /eng/pipelines/build.yml + parameters: + jobTemplate: ${{ variables.jobTemplate }} + name: Fedora_39 + osGroup: Linux + container: test_fedora + dependsOn: Linux + testOnly: true + buildConfigs: + - configuration: Release + architecture: x64 + - ${{ if in(variables['Build.Reason'], 'PullRequest') }}: + - configuration: Debug + architecture: x64 + - ${{ if and(ne(variables['System.TeamProject'], 'public'), notin(variables['Build.Reason'], 'PullRequest')) }}: - stage: package displayName: Package, Sign, and Generate BAR Manifests From 73f1fdca8d9fb191297a7e687790b804f4e78ef5 Mon Sep 17 00:00:00 2001 From: Juan Hoyos <19413848+hoyosjs@users.noreply.github.com> Date: Fri, 24 Oct 2025 16:13:55 -0700 Subject: [PATCH 10/44] Fix packaging issues in SOS containing packages (#5611) --- src/Tools/dotnet-dump/dotnet-dump.csproj | 2 - src/Tools/dotnet-sos/dotnet-sos.csproj | 2 - src/sos-packaging.props | 73 +++++++++++++++--------- src/sos-packaging.targets | 14 ----- 4 files changed, 45 insertions(+), 46 deletions(-) delete mode 100644 src/sos-packaging.targets diff --git a/src/Tools/dotnet-dump/dotnet-dump.csproj b/src/Tools/dotnet-dump/dotnet-dump.csproj index 53e283c64d..991a0fadcf 100644 --- a/src/Tools/dotnet-dump/dotnet-dump.csproj +++ b/src/Tools/dotnet-dump/dotnet-dump.csproj @@ -37,6 +37,4 @@ - - diff --git a/src/Tools/dotnet-sos/dotnet-sos.csproj b/src/Tools/dotnet-sos/dotnet-sos.csproj index aed14a432f..e23c0cf963 100644 --- a/src/Tools/dotnet-sos/dotnet-sos.csproj +++ b/src/Tools/dotnet-sos/dotnet-sos.csproj @@ -29,6 +29,4 @@ PreserveNewest
- - diff --git a/src/sos-packaging.props b/src/sos-packaging.props index 9312fea0bb..95e0d090ef 100644 --- a/src/sos-packaging.props +++ b/src/sos-packaging.props @@ -1,16 +1,23 @@ - $(ArtifactsBinDir)\SOS.Extensions\$(Configuration)\netstandard2.0\publish\*.dll + true + + + + + + - + @@ -20,9 +27,9 @@ - - - + + + @@ -32,14 +39,14 @@ - - - - - - - + + + + + + + @@ -51,29 +58,39 @@ - <_SosBinariesToPack Include="@(SosRequiredBinaries)" /> - - - - <_winSosRequiredBinaries Include="$(ArtifactsBinDir)\Windows_NT.x64.$(Configuration)\sos.dll" TargetRid="win-x64" /> - <_winSosRequiredBinaries Include="$(ArtifactsBinDir)\Windows_NT.x64.$(Configuration)\Microsoft.DiaSymReader.Native.amd64.dll" TargetRid="win-x64" /> - <_winSosRequiredBinaries Condition="'$(PackageWithCDac)' == 'true'" Include="$(ArtifactsBinDir)\Windows_NT.x64.$(Configuration)\mscordaccore_universal.dll" TargetRid="win-x64" /> - - - <_SosBinariesToPack Condition="'$(BuildX64Package)' == 'true'" - Include="@(_winSosRequiredBinaries)" /> - - + + $([MSBuild]::ValueOrDefault('%(FullPath)', '').Replace('linux-musl','linux')) + - + false - true + + + + + + + true $(SOSPackagePathPrefix)/%(TargetRid) - %(TargetRid)/%(Filename)%(Extension) PreserveNewest + %(TargetRid)/%(Filename)%(Extension) + %(TargetRid)/%(Filename)%(Extension) + + PreserveNewest + + + + false + false + Never + %(TargetRid)/%(Filename)%(Extension) + PreserveNewest diff --git a/src/sos-packaging.targets b/src/sos-packaging.targets deleted file mode 100644 index 18a2a56952..0000000000 --- a/src/sos-packaging.targets +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - $([MSBuild]::ValueOrDefault('%(FullPath)', '').Replace('linux-musl', 'linux')) - - - - - - \ No newline at end of file From 14fd23087f01a47067cff897974d35f7984735fd Mon Sep 17 00:00:00 2001 From: Aaron R Robinson Date: Mon, 27 Oct 2025 16:21:09 -0700 Subject: [PATCH 11/44] Refine compiler options for signed overflow and aliasing (#5618) Updated comments and compile options for signed overflow and strict aliasing. See related code for dotnet/runtime - https://github.com/dotnet/runtime/pull/120775 --- eng/native/configurecompiler.cmake | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/eng/native/configurecompiler.cmake b/eng/native/configurecompiler.cmake index 312312daa3..5b5d47dcf6 100644 --- a/eng/native/configurecompiler.cmake +++ b/eng/native/configurecompiler.cmake @@ -526,9 +526,14 @@ if (CLR_CMAKE_HOST_UNIX) # Disable frame pointer optimizations so profilers can get better call stacks add_compile_options(-fno-omit-frame-pointer) - # Make signed arithmetic overflow of addition, subtraction, and multiplication wrap around + # Make signed overflow well-defined. Implies the following flags in clang-20 and above. + # -fwrapv - Make signed arithmetic overflow of addition, subtraction, and multiplication wrap around # using twos-complement representation (this is normally undefined according to the C++ spec). - add_compile_options(-fwrapv) + # -fwrapv-pointer - The same as -fwrapv but for pointers. + add_compile_options(-fno-strict-overflow) + + # Suppress C++ strict aliasing rules. This matches our use of MSVC. + add_compile_options(-fno-strict-aliasing) if(CLR_CMAKE_HOST_APPLE) # Clang will by default emit objc_msgSend stubs in Xcode 14, which ld from earlier Xcodes doesn't understand. From cf64ddf3ccb16e00939dbf2ca95627dee986bb3a Mon Sep 17 00:00:00 2001 From: Mitchell Hwang <16830051+mdh1418@users.noreply.github.com> Date: Mon, 27 Oct 2025 21:33:33 -0400 Subject: [PATCH 12/44] [dotnet-trace] Pack librecordtrace (#5619) Fixes librecordtrace.so not being packed into the official build of dotnet-trace. --- src/Tools/dotnet-trace/dotnet-trace.csproj | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/Tools/dotnet-trace/dotnet-trace.csproj b/src/Tools/dotnet-trace/dotnet-trace.csproj index d523a23ff0..d51aa8cee1 100644 --- a/src/Tools/dotnet-trace/dotnet-trace.csproj +++ b/src/Tools/dotnet-trace/dotnet-trace.csproj @@ -32,7 +32,11 @@
- From 35a3ffd2676ad4560d31c6f8413427fcdac7ac4a Mon Sep 17 00:00:00 2001 From: Mitchell Hwang <16830051+mdh1418@users.noreply.github.com> Date: Tue, 28 Oct 2025 10:46:30 -0400 Subject: [PATCH 13/44] [dotnet-trace][collect-linux] Reduce status update frequency (#5620) The RecordTrace FFI callback can be invoked on the magnitude of several thousands of times every second. Updating the progress status is too aggressive, and caused all of the events to be dropped. Instead, updating the progress status every second 1. actually leads to a different elapsed time and 2. allows adequate event throughput. --- .../Commands/CollectLinuxCommand.cs | 27 ++++++++++++------- 1 file changed, 17 insertions(+), 10 deletions(-) diff --git a/src/Tools/dotnet-trace/CommandLine/Commands/CollectLinuxCommand.cs b/src/Tools/dotnet-trace/CommandLine/Commands/CollectLinuxCommand.cs index fb548d6793..aab6d437a8 100644 --- a/src/Tools/dotnet-trace/CommandLine/Commands/CollectLinuxCommand.cs +++ b/src/Tools/dotnet-trace/CommandLine/Commands/CollectLinuxCommand.cs @@ -21,7 +21,7 @@ internal partial class CollectLinuxCommandHandler private bool stopTracing; private Stopwatch stopwatch = new(); private LineRewriter rewriter; - private bool printingStatus; + private long statusUpdateTimestamp; internal sealed record CollectLinuxArgs( CancellationToken Ct, @@ -269,24 +269,31 @@ private int OutputHandler(uint type, IntPtr data, UIntPtr dataLen) } } + if (Console.KeyAvailable && Console.ReadKey(true).Key == ConsoleKey.Enter) + { + stopTracing = true; + } + if (ot == OutputType.Progress) { - if (printingStatus) + long currentTimestamp = Stopwatch.GetTimestamp(); + if (statusUpdateTimestamp != 0 && currentTimestamp < statusUpdateTimestamp) { - rewriter.RewriteConsoleLine(); + return stopTracing ? 1 : 0; } - else + + if (statusUpdateTimestamp == 0) { - printingStatus = true; rewriter.LineToClear = Console.CursorTop - 1; } - Console.Out.WriteLine($"[{stopwatch.Elapsed:dd\\:hh\\:mm\\:ss}]\tRecording trace."); - Console.Out.WriteLine("Press or to exit..."); - - if (Console.KeyAvailable && Console.ReadKey(true).Key == ConsoleKey.Enter) + else { - stopTracing = true; + rewriter.RewriteConsoleLine(); } + + statusUpdateTimestamp = currentTimestamp + Stopwatch.Frequency; + Console.Out.WriteLine($"[{stopwatch.Elapsed:dd\\:hh\\:mm\\:ss}]\tRecording trace."); + Console.Out.WriteLine("Press or to exit..."); } return stopTracing ? 1 : 0; From c0ea514141ba65159bf2ac6f116a8eaf7ff2b97f Mon Sep 17 00:00:00 2001 From: Tom McDonald Date: Tue, 28 Oct 2025 13:52:24 -0400 Subject: [PATCH 14/44] Allow crashinfo to work correctly on dotnet-dump and hide on live attach (#5616) This modifies the `crashinfo` command to only load if the ICrashInfoModuleService loads, which means that the data target is a dump either hosted by a debugger or dotnet-dump. The EntryPoint module on windows might not be the first module loaded, so it will locate the first module that has an EXE file extension. --- .../ModuleServiceFromDataReader.cs | 25 +++++++++++++++++++ .../CrashInfoCommand.cs | 5 +++- 2 files changed, 29 insertions(+), 1 deletion(-) diff --git a/src/Microsoft.Diagnostics.DebugServices.Implementation/ModuleServiceFromDataReader.cs b/src/Microsoft.Diagnostics.DebugServices.Implementation/ModuleServiceFromDataReader.cs index 0c34b32a17..61838f502e 100644 --- a/src/Microsoft.Diagnostics.DebugServices.Implementation/ModuleServiceFromDataReader.cs +++ b/src/Microsoft.Diagnostics.DebugServices.Implementation/ModuleServiceFromDataReader.cs @@ -6,6 +6,7 @@ using System.Collections.Immutable; using System.Diagnostics; using System.Linq; +using System.Runtime.InteropServices; using Microsoft.Diagnostics.Runtime; namespace Microsoft.Diagnostics.DebugServices.Implementation @@ -161,5 +162,29 @@ protected override Dictionary GetModulesInner() } return modules; } + + public override IModule EntryPointModule + { + get + { + foreach (IModule module in ((IModuleService)this).EnumerateModules()) + { + if (Target.OperatingSystem == OSPlatform.Windows) + { + // The entry point module is not necessarily the first module in the sorted list of modules. + if (module.FileName?.EndsWith(".exe", StringComparison.OrdinalIgnoreCase) == true) + { + return module; + } + } + else + { + // On non-Windows, assume the entry point module is the first module. + return module; + } + } + return null; + } + } } } diff --git a/src/Microsoft.Diagnostics.ExtensionCommands/CrashInfoCommand.cs b/src/Microsoft.Diagnostics.ExtensionCommands/CrashInfoCommand.cs index ff2273b71c..ca7701c0b4 100644 --- a/src/Microsoft.Diagnostics.ExtensionCommands/CrashInfoCommand.cs +++ b/src/Microsoft.Diagnostics.ExtensionCommands/CrashInfoCommand.cs @@ -22,9 +22,12 @@ public class CrashInfoCommand : CommandBase [Option(Name = "--moduleEnumerationScheme", Aliases = new string[] { "-e" }, Help = "Enables searching modules for the NativeAOT crashinfo data. Default is None")] public ModuleEnumerationScheme ModuleEnumerationScheme { get; set; } = ModuleEnumerationScheme.None; + [FilterInvoke(Message = "This command is only supported with dumps.")] + public static bool FilterInvoke([ServiceImport(Optional = true)] ICrashInfoModuleService crashInfoFactory) => crashInfoFactory != null; + public override void Invoke() { - ICrashInfoService crashInfo = CrashInfo ?? CrashInfoFactory.Create(ModuleEnumerationScheme); + ICrashInfoService crashInfo = CrashInfo ?? CrashInfoFactory?.Create(ModuleEnumerationScheme); if (crashInfo == null) { throw new DiagnosticsException("No crash info to display"); From 929432b6b897384f7ba15111aa389be96f79f455 Mon Sep 17 00:00:00 2001 From: Copilot <198982749+Copilot@users.noreply.github.com> Date: Wed, 29 Oct 2025 23:36:21 +0000 Subject: [PATCH 15/44] Replace ErrorCodes with ReturnCode (#5624) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit `ErrorCodes` in dotnet-trace and `ReturnCode` in Common are redundant. `ReturnCode` is the established standard across diagnostic tools (dotnet-trace, dotnet-counters) and provides better type safety as an enum. `ErrorCodes` existed only for legacy ConvertCommand usage. ## Changes - **ConvertCommand.cs**: Migrated from `ErrorCodes` to `ReturnCode` - Added `using Microsoft.Internal.Common.Utils` - Replaced `ErrorCodes.ArgumentError` → `(int)ReturnCode.ArgumentError` - Replaced `ErrorCodes.UnknownError` → `(int)ReturnCode.UnknownError` - **ErrorCode.cs**: Removed completely - No longer needed as ConvertCommand now uses ReturnCode directly ```diff - return ErrorCodes.ArgumentError; + return (int)ReturnCode.ArgumentError; ``` This standardizes error code handling across all diagnostic tools. ## Testing - ✅ Build succeeded with 0 warnings, 0 errors - ✅ All 109 dotnet-trace unit tests passed
Original prompt > Can you assess the history of `ErrorCode` in `src/Tools/dotnet-trace/CommandLine/Commands/ErrorCode.cs` and `ReturnCode` in `src/Tools/Common/Commands/Utils.cs`. Can you assess whether they are overlapping in responsibility, and if so, can you deprecate ErrorCode in favor of ReturnCode?
--- ✨ Let Copilot coding agent [set things up for you](https://github.com/dotnet/diagnostics/issues/new?title=✨+Set+up+Copilot+instructions&body=Configure%20instructions%20for%20this%20repository%20as%20documented%20in%20%5BBest%20practices%20for%20Copilot%20coding%20agent%20in%20your%20repository%5D%28https://gh.io/copilot-coding-agent-tips%29%2E%0A%0A%3COnboard%20this%20repo%3E&assignees=copilot) — coding agent works faster and does higher quality work when set up for your repo. --------- Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: mdh1418 <16830051+mdh1418@users.noreply.github.com> --- .../CommandLine/Commands/ConvertCommand.cs | 7 ++++--- .../dotnet-trace/CommandLine/Commands/ErrorCode.cs | 13 ------------- 2 files changed, 4 insertions(+), 16 deletions(-) delete mode 100644 src/Tools/dotnet-trace/CommandLine/Commands/ErrorCode.cs diff --git a/src/Tools/dotnet-trace/CommandLine/Commands/ConvertCommand.cs b/src/Tools/dotnet-trace/CommandLine/Commands/ConvertCommand.cs index c0288ff100..606c195901 100644 --- a/src/Tools/dotnet-trace/CommandLine/Commands/ConvertCommand.cs +++ b/src/Tools/dotnet-trace/CommandLine/Commands/ConvertCommand.cs @@ -8,6 +8,7 @@ using System.Linq; using System.Threading.Tasks; using Microsoft.Internal.Common; +using Microsoft.Internal.Common.Utils; namespace Microsoft.Diagnostics.Tools.Trace { @@ -21,12 +22,12 @@ public static int ConvertFile(TextWriter stdOut, TextWriter stdError, FileInfo i if (!Enum.IsDefined(format)) { stdError.WriteLine($"Please specify a valid option for the --format. Valid options are: {string.Join(", ", Enum.GetNames())}."); - return ErrorCodes.ArgumentError; + return (int)ReturnCode.ArgumentError; } if (!ValidateNetTraceHeader(stdError, inputFilename.FullName)) { - return ErrorCodes.ArgumentError; + return (int)ReturnCode.ArgumentError; } string outputFilename = TraceFileFormatConverter.GetConvertedFilename(inputFilename.FullName, output?.FullName, format); @@ -83,7 +84,7 @@ static int CopyNetTrace(TextWriter stdOut, TextWriter stdError, string inputfile catch (Exception ex) { stdError.WriteLine($"Error copying nettrace to {outputfile}: {ex.Message}"); - return ErrorCodes.UnknownError; + return (int)ReturnCode.UnknownError; } return 0; diff --git a/src/Tools/dotnet-trace/CommandLine/Commands/ErrorCode.cs b/src/Tools/dotnet-trace/CommandLine/Commands/ErrorCode.cs deleted file mode 100644 index 570e29293b..0000000000 --- a/src/Tools/dotnet-trace/CommandLine/Commands/ErrorCode.cs +++ /dev/null @@ -1,13 +0,0 @@ -// Licensed to the .NET Foundation under one or more agreements. -// The .NET Foundation licenses this file to you under the MIT license. - -namespace Microsoft.Diagnostics.Tools.Trace -{ - internal static class ErrorCodes - { - public const int SessionCreationError = 1; - public const int TracingError = 2; - public const int ArgumentError = 3; - public const int UnknownError = 4; - } -} From 38749d8c420e103c43950417c1b55ed337b2ea5c Mon Sep 17 00:00:00 2001 From: Juan Hoyos <19413848+hoyosjs@users.noreply.github.com> Date: Thu, 30 Oct 2025 00:49:28 -0700 Subject: [PATCH 16/44] Return Microsoft.Extension.* packages to latest 8.0 versions (#5627) --- eng/Versions.props | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/eng/Versions.props b/eng/Versions.props index 81a563fb7c..0df380434e 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -30,12 +30,12 @@ 9.0.8 17.10.0-beta1.24272.1 3.1.23 - 9.0.8 - 9.0.8 - 9.0.8 - 9.0.8 - 9.0.8 - 9.0.8 + 8.0.1 + 8.0.3 + 8.0.1 + 8.0.0 + 8.0.1 + 8.0.1 5.0.1 5.0.0 From ace088c7f1707d8858aef417f6a6263d7aef1e41 Mon Sep 17 00:00:00 2001 From: Juan Hoyos <19413848+hoyosjs@users.noreply.github.com> Date: Fri, 31 Oct 2025 00:20:05 -0700 Subject: [PATCH 17/44] Add some more copilot instructions to deal with nuget references (#5626) Co-authored-by: Noah Falk --- .github/workflows/copilot-setup-steps.yml | 10 +- .vscode/mcp.json | 17 ++ AGENTS.md | 179 ++++++++++++++++++---- 3 files changed, 176 insertions(+), 30 deletions(-) create mode 100644 .vscode/mcp.json diff --git a/.github/workflows/copilot-setup-steps.yml b/.github/workflows/copilot-setup-steps.yml index 486e1e1cd9..f8897ed1b3 100644 --- a/.github/workflows/copilot-setup-steps.yml +++ b/.github/workflows/copilot-setup-steps.yml @@ -17,6 +17,11 @@ jobs: steps: - uses: actions/checkout@v5 + # The NuGet MCP requires .NET 10 SDK to be available in PATH. + - name: Setup local dotnet and add it to PATH PATH + run: + echo "$PWD/.dotnet/" >> $GITHUB_PATH + - name: Install Dependencies run: | sudo ./eng/common/native/install-dependencies.sh && \ @@ -26,11 +31,8 @@ jobs: - name: Restore solution run: ./build.sh -restore - - name: Put dotnet on the path - run: echo "PATH=$PWD/.dotnet:$PATH" >> $GITHUB_ENV - - name: Run dotnet info run: dotnet --info - - name: Build clr+libs + - name: Build repo run: ./build.sh diff --git a/.vscode/mcp.json b/.vscode/mcp.json new file mode 100644 index 0000000000..3e14b2647b --- /dev/null +++ b/.vscode/mcp.json @@ -0,0 +1,17 @@ +{ + "servers": { + "github-mcp": { + "type": "http", + "url": "https://api.githubcopilot.com/mcp" + }, + "nuget": { + "type": "stdio", + "command": "dnx", + "args": [ + "NuGet.Mcp.Server", + "--prerelease", + "--yes" + ] + } + }, +} diff --git a/AGENTS.md b/AGENTS.md index dfc68e7e33..f48dcd3802 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -38,13 +38,50 @@ Build.cmd - `-configuration `: Build configuration (default: Debug) - `-architecture `: Target architecture - `-restore`: Restore dependencies before building -- `-build`: Build the repository -- `-rebuild`: Clean and rebuild +- `-build`: Build the repository (incremental, only changed projects) +- `-rebuild`: Clean and rebuild (required after changing .props/.targets files) +- `-bl`: Requests a binlog. - `-test`: Run tests after building +### Build Output Locations + +Understanding where build outputs are placed is essential for verification and debugging: + +- **Managed Build outputs**: `artifacts/bin////` +- **SOS Build outputs**: `artifacts/bin/..` +- **Test results when using global test script**: `artifacts/TestResults/` +- **Build logs**: `artifacts/log/` (including `Build.binlog` for detailed analysis) +- **NuGet packages**: `artifacts/packages//` +- **Temporary files**: `artifacts/tmp/` +- **Intermediate files**: `artifacts/obj/` (such as obj files, generated files, etc.) + +### Quick Build Commands + +After a full build of the repo has been done, some commands can be used to iterate faster on changes: + +### For changes under src/Tools: + +```bash +# Build the relevant tool +dotnet build src/Tools/dotnet-dump/dotnet-dump.csproj + +# Build without restoring (faster if dependencies haven't changed) +dotnet build --no-restore +``` + +### For changes under to native files: + +```bash +# Build the native components to verify compilation works +./build.sh -skipmanaged + +# Do a full test run: +./build -test +``` + ## Testing -### Running Tests +### Running All Tests **Linux/macOS:** ```bash @@ -56,12 +93,27 @@ Build.cmd Test.cmd ``` -The test script runs all tests in the repository. Test projects are located in the `src/tests` directory. +The test script runs all tests in the repository. **Important**: `test.sh` calls `eng/build.sh -test -skipmanaged -skipnative`, which means it only runs tests without rebuilding. Always build first if you've made code changes. ### Test Organization -- Unit tests are typically in `*.Tests` projects -- Integration tests may be in separate test projects -- Test helpers are in `Microsoft.Diagnostics.TestHelpers` + +Test projects are usually located in `src/tests/` with the following structure: + +- **Tool and libraries tests**: `*.UnitTests.csproj` or `*.Tests.csproj` under the appropriate tool's folder in `src/tests`. +- Changes with native dependencies (SOS, DBGShim, dotnet-sos, dotnet-dump) are better tested with the global test script. + +### Running Specific Tests + +```bash +# Run tests for a specific project +dotnet test src/tests/Microsoft.Diagnostics.DebugServices.UnitTests/ + +# Run tests with detailed output +dotnet test --logger "console;verbosity=detailed" + +# Run a specific test by name +dotnet test --filter "FullyQualifiedName~TestMethodName" +``` ## Project Structure @@ -91,17 +143,24 @@ The test script runs all tests in the repository. Test projects are located in t The repository follows standard .NET coding conventions defined in the `.editorconfig` file at the root. This is a **must** for C# code. Ensure your changes conform to these settings: 1. **Indentation**: 4 spaces (no tabs) -2. **Line endings**: LF on Linux/macOS, CRLF on Windows +2. **Line endings**: LF on Linux/macOS, CRLF on Windows (EditorConfig enforces this) 3. **Braces**: Opening braces on new lines for types, methods, properties, control blocks -4. **Naming**: - - PascalCase for types, methods, properties, public fields - - camelCase for local variables, parameters, private fields - - `_camelCase` for private instance fields (with underscore prefix) -5. **File organization**: One type per file, filename matches type name -6. **Additional EditorConfig rules**: +4. **Naming conventions** (strictly enforced): + - PascalCase for types, methods, properties, public fields, constants + - camelCase for local variables and parameters + - `_camelCase` for private/internal instance fields (underscore prefix) + - `s_camelCase` for static private/internal fields (s_ prefix) +5. **File headers**: All C# files must include the MIT license header: + ```csharp + // Licensed to the .NET Foundation under one or more agreements. + // The .NET Foundation licenses this file to you under the MIT license. + ``` +6. **Using directives**: Must be placed **outside** the namespace declaration +7. **Var keyword**: Avoid using `var` - use explicit types (configured as error when type is apparent) +8. **Additional rules**: - Trim trailing whitespace - Insert final newline - - Follow C# new line and indentation preferences + - Prefer braces even for single-line blocks ### Native Code (C/C++) @@ -111,6 +170,14 @@ Native code follows similar conventions: - Use clear, descriptive names - Follow existing patterns in the codebase +### Platform-Specific Line Endings + +**Critical**: Line endings must match the platform to avoid breaking scripts: +- Shell scripts (`.sh`): **LF only** (will break on Linux/macOS if CRLF) +- Batch files (`.cmd`, `.bat`): **CRLF only** +- C# files: LF on Linux/macOS, CRLF on Windows +- The `.editorconfig` file enforces these rules automatically + ## Making Changes ### General Guidelines @@ -141,10 +208,33 @@ Native code follows similar conventions: ### After Making Changes 1. **Build**: Ensure your changes compile without errors or new warnings + ```bash + ./build.sh # or Build.cmd on Windows + ``` 2. **Test**: Run relevant tests to verify functionality + ```bash + ./test.sh # or Test.cmd on Windows + ``` 3. **Code style**: Verify changes match the repository's coding standards + - Check file headers (.NET Foundation header) + - Verify naming conventions (especially field prefixes) + - Ensure using directives are outside namespace + - Confirm line endings are correct for file type 4. **Documentation**: Update if your changes affect public APIs or behavior +### Investigating Build or Test Failures + +When builds or tests fail, follow this diagnostic process: + +1. **Check build logs**: Look at `artifacts/log/Build.binlog` using the Binary Log Viewer +2. **Review terminal output**: MSBuild errors will show the failing project and error code +3. **Check test results**: Detailed test logs are in `artifacts/TestResults/` +4. **For native builds**: Review CMake output for missing dependencies or configuration issues +5. **Clean and rebuild**: Sometimes required after changing build configuration files: + ```bash + ./build.sh -rebuild + ``` + ## Development Workflow ### Typical Workflow @@ -178,16 +268,43 @@ Native code follows similar conventions: ### Solution Files -The main solution file is `build.sln` at the root. This file is generated from `build.proj` and can be regenerated using: -```bash -./eng/generate-sln.sh -``` +The main solution file is `build.sln` at the root. **Important**: This file is auto-generated from `build.proj`. + +- **Do NOT manually edit** `build.sln` +- Regenerate after adding/removing projects: + - Linux/macOS: `./eng/generate-sln.sh` + - Windows: `.\eng\generate-sln.ps1` +- The solution is regenerated automatically during builds when needed ### Dependency Management -- NuGet packages: `eng/Versions.props` defines package versions -- Project references: Use relative paths in `.csproj` files -- Native dependencies: Handled through CMake +**NuGet Package Versions**: + +The repository uses a centralized version management system: + +- **`eng/Versions.props`**: Defines all NuGet package versions for the repo + - **Always update this file** when changing package versions + - Use the `nuget` MCP tool to query and resolve version conflicts +- **`eng/Version.Details.props`**: Auto-generated by Arcade/Darc + - **Never edit directly** - requires modifying Version.Details.xml. +- **`eng/Version.Details.xml`**: Dependency tracking metadata + - **Never edit directly** - requires metadata not available to agents. + +**Package Source Configuration**: + +- Never modify `NuGet.config` to add a source feed unless explicitly requested +- **Never** add `nuget.org` as a source to `NuGet.config` +- Use the `nuget` MCP tool for querying packages and resolving conflicts + +**Project References**: + +- Use relative paths in `.csproj` files when adding dependencies between projects + Example: `` + +**Native Dependencies**: + +- Handled through machine-wide installation or container installation +- See `documentation/building/` for platform-specific prerequisites ### Platform-Specific Code @@ -212,15 +329,24 @@ start-vs.cmd ### Common Issues -1. **Build failures**: Ensure all prerequisites are installed (see documentation/building/) -2. **Test failures**: Some tests may require specific runtime versions or configurations -3. **Native component issues**: Check CMake output for missing dependencies +1. **Build failures**: + - Ensure all prerequisites are installed (see `documentation/building/`) + - Check `artifacts/log/Build.binlog` for detailed error information +2. **Test failures**: + - Some tests require specific runtime versions or configurations + - Check test output in `artifacts/TestResults/` if using global test script + - Verify you built before testing (test scripts don't rebuild) +3. **Native component issues**: + - Check terminal output for cl/clang/cmake error output. +4. **Line ending issues**: + - Shell scripts fail on Linux/macOS: Check for CRLF line endings + - Ensure `.editorconfig` settings are being respected by your editor ## Dependencies and Security ### Adding Dependencies -1. **NuGet packages**: Add to `eng/Versions.props` with appropriate version +1. **NuGet packages**: Add to `eng/Versions.props` with appropriate version and never modify `NuGet.config` to add a source feed unless asked to do so specifically. Particularly, *never* add `nuget.org` as a source to `NuGet.config`. Use the `nuget` MCP as needed to query and solve for assembly version conflicts. 2. **Security**: Be mindful of security implications when adding dependencies 3. **Licensing**: Ensure new dependencies are compatible with MIT license 4. **Minimize dependencies**: Only add when necessary @@ -279,6 +405,7 @@ start-vs.cmd ## Questions and Support If you encounter issues or have questions: + 1. Check existing documentation in `/documentation` 2. Review closed issues and pull requests for similar problems 3. Consult the [FAQ](documentation/FAQ.md) From ff0c8b1c9cbed3dae8f83541f784302ebc366c9e Mon Sep 17 00:00:00 2001 From: Mitchell Hwang <16830051+mdh1418@users.noreply.github.com> Date: Fri, 31 Oct 2025 11:37:17 -0400 Subject: [PATCH 18/44] [dotnet-trace][collect-linux] Reintroduce process specifier (#5623) With https://github.com/microsoft/one-collect/pull/209, we can now allow specifying a particular process to be traced. --- src/Tools/Common/Commands/Utils.cs | 51 +++++++++++++++++++ .../Commands/CollectLinuxCommand.cs | 38 ++++++++++++-- src/Tools/dotnet-trace/dotnet-trace.csproj | 2 +- .../CollectLinuxCommandFunctionalTests.cs | 8 ++- 4 files changed, 91 insertions(+), 8 deletions(-) diff --git a/src/Tools/Common/Commands/Utils.cs b/src/Tools/Common/Commands/Utils.cs index e6b303c49d..d9e87f12e6 100644 --- a/src/Tools/Common/Commands/Utils.cs +++ b/src/Tools/Common/Commands/Utils.cs @@ -72,6 +72,57 @@ public static bool ValidateArgumentsForChildProcess(int processId, string name, return true; } + /// + /// A helper method for validating --process-id, --name options for collect commands and resolving the process ID and name. + /// Only one of these options can be specified, so it checks for duplicate options specified and if there is + /// such duplication, it prints the appropriate error message. + /// + /// process ID + /// name + /// resolvedProcessId + /// resolvedProcessName + /// + public static bool ResolveProcess(int processId, string name, out int resolvedProcessId, out string resolvedProcessName) + { + resolvedProcessId = -1; + resolvedProcessName = name; + if (processId == 0 && string.IsNullOrEmpty(name)) + { + Console.Error.WriteLine("Must specify either --process-id or --name."); + return false; + } + else if (processId < 0) + { + Console.Error.WriteLine($"{processId} is not a valid process ID"); + return false; + } + else if ((processId != 0) && !string.IsNullOrEmpty(name)) + { + Console.Error.WriteLine("Only one of the --name or --process-id options may be specified."); + return false; + } + try + { + if (processId != 0) + { + Process process = Process.GetProcessById(processId); + resolvedProcessId = processId; + resolvedProcessName = process.ProcessName; + } + else + { + resolvedProcessId = FindProcessIdWithName(name); + } + } + catch (ArgumentException) + { + Console.Error.WriteLine($"No process with ID {processId} is currently running."); + return false; + } + + return resolvedProcessId != -1; + } + /// /// A helper method for validating --process-id, --name, --diagnostic-port, --dsrouter options for collect commands and resolving the process ID. /// Only one of these options can be specified, so it checks for duplicate options specified and if there is diff --git a/src/Tools/dotnet-trace/CommandLine/Commands/CollectLinuxCommand.cs b/src/Tools/dotnet-trace/CommandLine/Commands/CollectLinuxCommand.cs index aab6d437a8..476d770993 100644 --- a/src/Tools/dotnet-trace/CommandLine/Commands/CollectLinuxCommand.cs +++ b/src/Tools/dotnet-trace/CommandLine/Commands/CollectLinuxCommand.cs @@ -31,7 +31,9 @@ internal sealed record CollectLinuxArgs( string[] PerfEvents, string[] Profiles, FileInfo Output, - TimeSpan Duration); + TimeSpan Duration, + string Name, + int ProcessId); public CollectLinuxCommandHandler(IConsole console = null) { @@ -51,6 +53,15 @@ internal int CollectLinux(CollectLinuxArgs args) return (int)ReturnCode.PlatformNotSupportedError; } + if (args.ProcessId != 0 || !string.IsNullOrEmpty(args.Name)) + { + if (!CommandUtils.ResolveProcess(args.ProcessId, args.Name, out int resolvedProcessId, out string resolvedProcessName)) + { + return (int)ReturnCode.ArgumentError; + } + args = args with { Name = resolvedProcessName, ProcessId = resolvedProcessId }; + } + Console.WriteLine("=========================================================================================="); Console.WriteLine("The collect-linux verb is a new preview feature and relies on an updated version of the"); Console.WriteLine(".nettrace file format. The latest PerfView release supports these trace files but other"); @@ -117,6 +128,8 @@ public static Command CollectLinuxCommand() CommonOptions.ProfileOption, CommonOptions.OutputPathOption, CommonOptions.DurationOption, + CommonOptions.NameOption, + CommonOptions.ProcessIdOption }; collectLinuxCommand.TreatUnmatchedTokensAsErrors = true; // collect-linux currently does not support child process tracing. collectLinuxCommand.Description = "Collects diagnostic traces using perf_events, a Linux OS technology. collect-linux requires admin privileges to capture kernel- and user-mode events, and by default, captures events from all processes. This Linux-only command includes the same .NET events as dotnet-trace collect, and it uses the kernel’s user_events mechanism to emit .NET events as perf events, enabling unification of user-space .NET events with kernel-space system events."; @@ -135,7 +148,9 @@ public static Command CollectLinuxCommand() PerfEvents: perfEventsValue.Split(',', StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries), Profiles: profilesValue.Split(',', StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries), Output: parseResult.GetValue(CommonOptions.OutputPathOption) ?? new FileInfo(CommonOptions.DefaultTraceName), - Duration: parseResult.GetValue(CommonOptions.DurationOption))); + Duration: parseResult.GetValue(CommonOptions.DurationOption), + Name: parseResult.GetValue(CommonOptions.NameOption) ?? string.Empty, + ProcessId: parseResult.GetValue(CommonOptions.ProcessIdOption))); return Task.FromResult(rc); }); @@ -220,7 +235,14 @@ private byte[] BuildRecordTraceArgs(CollectLinuxArgs args, out string scriptPath } Console.WriteLine(); - FileInfo resolvedOutput = ResolveOutputPath(args.Output); + int pid = args.ProcessId; + if (pid > 0) + { + recordTraceArgs.Add($"--pid"); + recordTraceArgs.Add($"{pid}"); + } + + FileInfo resolvedOutput = ResolveOutputPath(args.Output, args.Name); recordTraceArgs.Add($"--out"); recordTraceArgs.Add(resolvedOutput.FullName); Console.WriteLine($"Output File : {resolvedOutput.FullName}"); @@ -237,15 +259,21 @@ private byte[] BuildRecordTraceArgs(CollectLinuxArgs args, out string scriptPath return Encoding.UTF8.GetBytes(options); } - private static FileInfo ResolveOutputPath(FileInfo output) + private static FileInfo ResolveOutputPath(FileInfo output, string processName) { if (!string.Equals(output.Name, CommonOptions.DefaultTraceName, StringComparison.OrdinalIgnoreCase)) { return output; } + string traceName = "trace"; + if (!string.IsNullOrEmpty(processName)) + { + traceName = processName; + } + DateTime now = DateTime.Now; - return new FileInfo($"trace_{now:yyyyMMdd}_{now:HHmmss}.nettrace"); + return new FileInfo($"{traceName}_{now:yyyyMMdd}_{now:HHmmss}.nettrace"); } private int OutputHandler(uint type, IntPtr data, UIntPtr dataLen) diff --git a/src/Tools/dotnet-trace/dotnet-trace.csproj b/src/Tools/dotnet-trace/dotnet-trace.csproj index d51aa8cee1..e18ab6399e 100644 --- a/src/Tools/dotnet-trace/dotnet-trace.csproj +++ b/src/Tools/dotnet-trace/dotnet-trace.csproj @@ -14,7 +14,7 @@ - diff --git a/src/tests/dotnet-trace/CollectLinuxCommandFunctionalTests.cs b/src/tests/dotnet-trace/CollectLinuxCommandFunctionalTests.cs index 6b1eb3ad33..d6cd486284 100644 --- a/src/tests/dotnet-trace/CollectLinuxCommandFunctionalTests.cs +++ b/src/tests/dotnet-trace/CollectLinuxCommandFunctionalTests.cs @@ -26,7 +26,9 @@ private static CollectLinuxCommandHandler.CollectLinuxArgs TestArgs( string[] perfEvents = null, string[] profile = null, FileInfo output = null, - TimeSpan duration = default) + TimeSpan duration = default, + string name = "", + int processId = 0) { return new CollectLinuxCommandHandler.CollectLinuxArgs(ct, providers ?? Array.Empty(), @@ -35,7 +37,9 @@ private static CollectLinuxCommandHandler.CollectLinuxArgs TestArgs( perfEvents ?? Array.Empty(), profile ?? Array.Empty(), output ?? new FileInfo("trace.nettrace"), - duration); + duration, + name, + processId); } [Theory] From 8d3bda12bfaf93adb81d448bdf078d8039f2b479 Mon Sep 17 00:00:00 2001 From: Mitchell Hwang <16830051+mdh1418@users.noreply.github.com> Date: Tue, 4 Nov 2025 16:34:45 -0500 Subject: [PATCH 19/44] [dotnet-trace] Include librecordtrace.so for local and CI Build (#5631) https://github.com/dotnet/diagnostics/pull/5619 didn't work. This time I tested these changes on the official build pipeline, and the BundledTools + .nupkg both worked on my linux-x64 WSL instance. --------- Co-authored-by: Juan Sebastian Hoyos Ayala --- eng/Versions.props | 1 + src/Tools/dotnet-trace/dotnet-trace.csproj | 23 +++++++++++++--------- 2 files changed, 15 insertions(+), 9 deletions(-) diff --git a/eng/Versions.props b/eng/Versions.props index 0df380434e..499e37ea10 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -36,6 +36,7 @@ 8.0.0 8.0.1 8.0.1 + 0.1.32221 5.0.1 5.0.0 diff --git a/src/Tools/dotnet-trace/dotnet-trace.csproj b/src/Tools/dotnet-trace/dotnet-trace.csproj index e18ab6399e..6b14eef616 100644 --- a/src/Tools/dotnet-trace/dotnet-trace.csproj +++ b/src/Tools/dotnet-trace/dotnet-trace.csproj @@ -14,8 +14,7 @@ - + @@ -31,12 +30,18 @@ - - + + + false + runtimes/linux-x64/native/librecordtrace.so + PreserveNewest + PreserveNewest + + + false + runtimes/linux-arm64/native/librecordtrace.so + PreserveNewest + PreserveNewest + From 7174d3cd9d541dcabdabf98def96a99ae53cf32a Mon Sep 17 00:00:00 2001 From: Mitchell Hwang <16830051+mdh1418@users.noreply.github.com> Date: Thu, 6 Nov 2025 10:56:46 -0500 Subject: [PATCH 20/44] [dotnet-trace][collect-linux] Handle incompatible glibc (#5634) Not all supported RIDs will be compatible with RecordTrace, which currently has a minimum requirement of glibc 2.34. So users running `dotnet-trace collect-linux` in older distros will be unable to p/invoke `librecordtrace.so` even though they are running on Linux x64/arm64. --- .../CommandLine/Commands/CollectLinuxCommand.cs | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/Tools/dotnet-trace/CommandLine/Commands/CollectLinuxCommand.cs b/src/Tools/dotnet-trace/CommandLine/Commands/CollectLinuxCommand.cs index 476d770993..d506d2e462 100644 --- a/src/Tools/dotnet-trace/CommandLine/Commands/CollectLinuxCommand.cs +++ b/src/Tools/dotnet-trace/CommandLine/Commands/CollectLinuxCommand.cs @@ -95,6 +95,12 @@ internal int CollectLinux(CollectLinuxArgs args) Console.Error.WriteLine($"[ERROR] {e.Message}"); ret = (int)ReturnCode.TracingError; } + catch (DllNotFoundException dnfe) + { + Console.Error.WriteLine($"[ERROR] Could not find or load dependencies for collect-linux. For requirements, please visit https://learn.microsoft.com/en-us/dotnet/core/diagnostics/dotnet-trace"); + Console.Error.WriteLine($"[ERROR] {dnfe.Message}"); + ret = (int)ReturnCode.PlatformNotSupportedError; + } catch (Exception ex) { Console.Error.WriteLine($"[ERROR] {ex}"); From 39435e1ab7618f1f3aba61a1ab3c954541b4c3c3 Mon Sep 17 00:00:00 2001 From: Mitchell Hwang <16830051+mdh1418@users.noreply.github.com> Date: Thu, 6 Nov 2025 10:56:52 -0500 Subject: [PATCH 21/44] [dotnet-trace] Improve supported platform messages for musl. (#5633) RecordTrace does not build for musl platforms at this time. --- src/Tools/Common/Commands/Utils.cs | 2 +- .../Commands/CollectLinuxCommand.cs | 22 +++++++++++++++++-- .../CollectLinuxCommandFunctionalTests.cs | 10 +++++---- 3 files changed, 27 insertions(+), 7 deletions(-) diff --git a/src/Tools/Common/Commands/Utils.cs b/src/Tools/Common/Commands/Utils.cs index d9e87f12e6..06b739111b 100644 --- a/src/Tools/Common/Commands/Utils.cs +++ b/src/Tools/Common/Commands/Utils.cs @@ -2,8 +2,8 @@ // The .NET Foundation licenses this file to you under the MIT license. using System; -using System.Diagnostics; using System.Collections.Generic; +using System.Diagnostics; using Microsoft.Diagnostics.NETCore.Client; using Microsoft.Diagnostics.Tools.Common; diff --git a/src/Tools/dotnet-trace/CommandLine/Commands/CollectLinuxCommand.cs b/src/Tools/dotnet-trace/CommandLine/Commands/CollectLinuxCommand.cs index d506d2e462..1129cab856 100644 --- a/src/Tools/dotnet-trace/CommandLine/Commands/CollectLinuxCommand.cs +++ b/src/Tools/dotnet-trace/CommandLine/Commands/CollectLinuxCommand.cs @@ -41,15 +41,33 @@ public CollectLinuxCommandHandler(IConsole console = null) rewriter = new LineRewriter(Console); } + internal static bool IsSupported() + { + bool isSupportedLinuxPlatform = false; + if (OperatingSystem.IsLinux()) + { + isSupportedLinuxPlatform = true; + try + { + string ostype = File.ReadAllText("/etc/os-release"); + isSupportedLinuxPlatform = !ostype.Contains("ID=alpine"); + } + catch (Exception ex) when (ex is FileNotFoundException or DirectoryNotFoundException or IOException) {} + } + + return isSupportedLinuxPlatform; + } + /// /// Collects diagnostic traces using perf_events, a Linux OS technology. collect-linux requires admin privileges to capture kernel- and user-mode events, and by default, captures events from all processes. /// This Linux-only command includes the same .NET events as dotnet-trace collect, and it uses the kernel’s user_events mechanism to emit .NET events as perf events, enabling unification of user-space .NET events with kernel-space system events. /// internal int CollectLinux(CollectLinuxArgs args) { - if (!OperatingSystem.IsLinux()) + if (!IsSupported()) { - Console.Error.WriteLine("The collect-linux command is only supported on Linux."); + Console.Error.WriteLine("The collect-linux command is not supported on this platform."); + Console.Error.WriteLine("For requirements, please visit https://learn.microsoft.com/en-us/dotnet/core/diagnostics/dotnet-trace."); return (int)ReturnCode.PlatformNotSupportedError; } diff --git a/src/tests/dotnet-trace/CollectLinuxCommandFunctionalTests.cs b/src/tests/dotnet-trace/CollectLinuxCommandFunctionalTests.cs index d6cd486284..142872cd41 100644 --- a/src/tests/dotnet-trace/CollectLinuxCommandFunctionalTests.cs +++ b/src/tests/dotnet-trace/CollectLinuxCommandFunctionalTests.cs @@ -48,7 +48,7 @@ public void CollectLinuxCommandProviderConfigurationConsolidation(object testArg { MockConsole console = new(200, 30); int exitCode = Run(testArgs, console); - if (OperatingSystem.IsLinux()) + if (CollectLinuxCommandHandler.IsSupported()) { Assert.Equal((int)ReturnCode.Ok, exitCode); console.AssertSanitizedLinesEqual(CollectLinuxSanitizer, expectedLines); @@ -57,7 +57,8 @@ public void CollectLinuxCommandProviderConfigurationConsolidation(object testArg { Assert.Equal((int)ReturnCode.PlatformNotSupportedError, exitCode); console.AssertSanitizedLinesEqual(null, new string[] { - "The collect-linux command is only supported on Linux.", + $"The collect-linux command is not supported on this platform.", + $"For requirements, please visit https://learn.microsoft.com/en-us/dotnet/core/diagnostics/dotnet-trace." }); } } @@ -68,7 +69,7 @@ public void CollectLinuxCommandProviderConfigurationConsolidation_Throws(object { MockConsole console = new(200, 30); int exitCode = Run(testArgs, console); - if (OperatingSystem.IsLinux()) + if (CollectLinuxCommandHandler.IsSupported()) { Assert.Equal((int)ReturnCode.TracingError, exitCode); console.AssertSanitizedLinesEqual(null, expectedException); @@ -77,7 +78,8 @@ public void CollectLinuxCommandProviderConfigurationConsolidation_Throws(object { Assert.Equal((int)ReturnCode.PlatformNotSupportedError, exitCode); console.AssertSanitizedLinesEqual(null, new string[] { - "The collect-linux command is only supported on Linux.", + $"The collect-linux command is not supported on this platform.", + $"For requirements, please visit https://learn.microsoft.com/en-us/dotnet/core/diagnostics/dotnet-trace." }); } } From 8220dc7df3d092b4ccdb6b45b01d9a4ee6110fb0 Mon Sep 17 00:00:00 2001 From: Mitchell Hwang <16830051+mdh1418@users.noreply.github.com> Date: Thu, 6 Nov 2025 15:54:03 -0500 Subject: [PATCH 22/44] [ToolsCommon] Refactor Utils.cs (#5622) With more tests validating output of diagnostic tools, errors from CommandUtils helpers should be validated as well. In facilitating error checking, `src/Tools/Common/Commands/Utils.cs` has been refactored to break unnecessary dependencies (e.g. using `CommandUtils.FindProcessIdWithName` requires adding `IConsole.cs` to project Compile items because `LineRewriter` depends on `IConsole`, regardless of whether LineRewriter is used) This PR does the following: - Switch CounterMonitor back to using IConsole for output instead of TextWriters (see commit message for more details https://github.com/dotnet/diagnostics/pull/5217 had switched from IConsole to TextWriters) - Rename CommandLineErrorException -> DiagnosticToolException to suggest a more generic invalid usage of diagnostic tools, rather specifically a command line exception. - Update `CommandUtils` helpers to throw DiagnosticToolException to allow callers to decide how to handle the message. - Extend DiagnosticToolException (formerly CommandLineErrorException) to specify ReturnCode - Break ReturnCode + LineRewriter out of Utils.cs to have discrete dependency chains for Project compile items. - Rename Utils.cs -> CommandUtils.cs - Keep `src/Tools/Common/Commands` command-only --- .../DiagnosticsIpc/IpcEndpointConfig.cs | 4 +- .../{Commands/Utils.cs => CommandUtils.cs} | 140 +++--------------- src/Tools/Common/DefaultConsole.cs | 2 +- ...xception.cs => DiagnosticToolException.cs} | 9 +- src/Tools/Common/LineRewriter.cs | 74 +++++++++ src/Tools/Common/ReturnCode.cs | 15 ++ .../ReversedServerHelpers.cs | 11 +- src/Tools/dotnet-counters/CounterMonitor.cs | 42 +++--- src/Tools/dotnet-counters/Program.cs | 4 +- .../dotnet-counters/dotnet-counters.csproj | 7 +- .../dotnet-dsrouter/dotnet-dsrouter.csproj | 3 +- src/Tools/dotnet-dump/Dumper.cs | 15 +- src/Tools/dotnet-dump/dotnet-dump.csproj | 5 +- .../CommandLine/CollectCommandHandler.cs | 34 ++--- .../CommandLine/ReportCommandHandler.cs | 35 +++-- src/Tools/dotnet-gcdump/dotnet-gcdump.csproj | 5 +- src/Tools/dotnet-stack/ReportCommand.cs | 33 +---- src/Tools/dotnet-stack/dotnet-stack.csproj | 5 +- .../CommandLine/Commands/CollectCommand.cs | 24 ++- .../Commands/CollectLinuxCommand.cs | 27 ++-- src/Tools/dotnet-trace/ProviderUtils.cs | 14 +- .../dotnet-trace/TraceFileFormatConverter.cs | 4 +- .../CounterMonitorPayloadTests.cs | 2 +- .../dotnet-counters/CounterMonitorTests.cs | 22 +-- src/tests/dotnet-trace/CLRProviderParsing.cs | 4 +- .../CollectCommandFunctionalTests.cs | 5 +- .../CollectLinuxCommandFunctionalTests.cs | 2 +- .../dotnet-trace/ProviderCompositionTests.cs | 14 +- 28 files changed, 265 insertions(+), 296 deletions(-) rename src/Tools/Common/{Commands/Utils.cs => CommandUtils.cs} (53%) rename src/Tools/Common/{CommandLineErrorException.cs => DiagnosticToolException.cs} (72%) create mode 100644 src/Tools/Common/LineRewriter.cs create mode 100644 src/Tools/Common/ReturnCode.cs diff --git a/src/Microsoft.Diagnostics.NETCore.Client/DiagnosticsIpc/IpcEndpointConfig.cs b/src/Microsoft.Diagnostics.NETCore.Client/DiagnosticsIpc/IpcEndpointConfig.cs index bf63c928b6..77d8429577 100644 --- a/src/Microsoft.Diagnostics.NETCore.Client/DiagnosticsIpc/IpcEndpointConfig.cs +++ b/src/Microsoft.Diagnostics.NETCore.Client/DiagnosticsIpc/IpcEndpointConfig.cs @@ -133,7 +133,7 @@ public static IpcEndpointConfig Parse(string config) string[] parts = config.Split(','); if (parts.Length > 2) { - throw new FormatException($"Unknow IPC endpoint config format, {config}."); + throw new FormatException($"Unknown IPC endpoint config format, {config}."); } if (string.IsNullOrEmpty(parts[0])) @@ -156,7 +156,7 @@ public static IpcEndpointConfig Parse(string config) } else { - throw new FormatException($"Unknow IPC endpoint config keyword, {parts[1]} in {config}."); + throw new FormatException($"Unknown IPC endpoint config keyword, {parts[1]} in {config}."); } } } diff --git a/src/Tools/Common/Commands/Utils.cs b/src/Tools/Common/CommandUtils.cs similarity index 53% rename from src/Tools/Common/Commands/Utils.cs rename to src/Tools/Common/CommandUtils.cs index 06b739111b..5f597f73aa 100644 --- a/src/Tools/Common/Commands/Utils.cs +++ b/src/Tools/Common/CommandUtils.cs @@ -5,7 +5,7 @@ using System.Collections.Generic; using System.Diagnostics; using Microsoft.Diagnostics.NETCore.Client; -using Microsoft.Diagnostics.Tools.Common; +using Microsoft.Diagnostics.Tools; namespace Microsoft.Internal.Common.Utils { @@ -27,15 +27,14 @@ public static int FindProcessIdWithName(string name) { if (commonId != -1) { - Console.WriteLine("There are more than one active processes with the given name: {0}", name); - return -1; + throw new DiagnosticToolException($"There are more than one active processes with the given name: {name}"); } commonId = processesWithMatchingName[i].Id; } } if (commonId == -1) { - Console.WriteLine("There is no active process with the given name: {0}", name); + throw new DiagnosticToolException($"There is no active process with the given name: {name}"); } return commonId; } @@ -61,45 +60,39 @@ public static int LaunchDSRouterProcess(string dsrouterCommand) /// name /// port /// - public static bool ValidateArgumentsForChildProcess(int processId, string name, string port) + public static void ValidateArgumentsForChildProcess(int processId, string name, string port) { if (processId != 0 || name != null || !string.IsNullOrEmpty(port)) { - Console.WriteLine("None of the --name, --process-id, or --diagnostic-port options may be specified when launching a child process."); - return false; + throw new DiagnosticToolException("None of the --name, --process-id, or --diagnostic-port options may be specified when launching a child process."); } - - return true; } /// /// A helper method for validating --process-id, --name options for collect commands and resolving the process ID and name. /// Only one of these options can be specified, so it checks for duplicate options specified and if there is - /// such duplication, it prints the appropriate error message. + /// such duplication, it throws the appropriate DiagnosticToolException error message. /// /// process ID /// name /// resolvedProcessId /// resolvedProcessName /// - public static bool ResolveProcess(int processId, string name, out int resolvedProcessId, out string resolvedProcessName) + public static void ResolveProcess(int processId, string name, out int resolvedProcessId, out string resolvedProcessName) { resolvedProcessId = -1; resolvedProcessName = name; if (processId == 0 && string.IsNullOrEmpty(name)) { - Console.Error.WriteLine("Must specify either --process-id or --name."); - return false; + throw new DiagnosticToolException("Must specify either --process-id or --name."); } else if (processId < 0) { - Console.Error.WriteLine($"{processId} is not a valid process ID"); - return false; + throw new DiagnosticToolException($"{processId} is not a valid process ID"); } else if ((processId != 0) && !string.IsNullOrEmpty(name)) { - Console.Error.WriteLine("Only one of the --name or --process-id options may be specified."); - return false; + throw new DiagnosticToolException("Only one of the --name or --process-id options may be specified."); } try { @@ -116,17 +109,14 @@ public static bool ResolveProcess(int processId, string name, out int resolvedPr } catch (ArgumentException) { - Console.Error.WriteLine($"No process with ID {processId} is currently running."); - return false; + throw new DiagnosticToolException($"No process with ID {processId} is currently running."); } - - return resolvedProcessId != -1; } /// /// A helper method for validating --process-id, --name, --diagnostic-port, --dsrouter options for collect commands and resolving the process ID. /// Only one of these options can be specified, so it checks for duplicate options specified and if there is - /// such duplication, it prints the appropriate error message. + /// such duplication, it throws the appropriate DiagnosticToolException error message. /// /// process ID /// name @@ -134,18 +124,16 @@ public static bool ResolveProcess(int processId, string name, out int resolvedPr /// dsrouter /// resolvedProcessId /// - public static bool ResolveProcessForAttach(int processId, string name, string port, string dsrouter, out int resolvedProcessId) + public static void ResolveProcessForAttach(int processId, string name, string port, string dsrouter, out int resolvedProcessId) { resolvedProcessId = -1; if (processId == 0 && string.IsNullOrEmpty(name) && string.IsNullOrEmpty(port) && string.IsNullOrEmpty(dsrouter)) { - Console.WriteLine("Must specify either --process-id, --name, --diagnostic-port, or --dsrouter."); - return false; + throw new DiagnosticToolException("Must specify either --process-id, --name, --diagnostic-port, or --dsrouter."); } else if (processId < 0) { - Console.WriteLine($"{processId} is not a valid process ID"); - return false; + throw new DiagnosticToolException($"{processId} is not a valid process ID"); } else if ((processId != 0 ? 1 : 0) + (!string.IsNullOrEmpty(name) ? 1 : 0) + @@ -153,122 +141,38 @@ public static bool ResolveProcessForAttach(int processId, string name, string po (!string.IsNullOrEmpty(dsrouter) ? 1 : 0) != 1) { - Console.WriteLine("Only one of the --name, --process-id, --diagnostic-port, or --dsrouter options may be specified."); - return false; + throw new DiagnosticToolException("Only one of the --name, --process-id, --diagnostic-port, or --dsrouter options may be specified."); } // If we got this far it means only one of --name/--diagnostic-port/--process-id/--dsrouter was specified else if (!string.IsNullOrEmpty(port)) { - return true; + return; } // Resolve name option else if (!string.IsNullOrEmpty(name)) { - if ((processId = FindProcessIdWithName(name)) < 0) - { - return false; - } + processId = FindProcessIdWithName(name); } else if (!string.IsNullOrEmpty(dsrouter)) { if (dsrouter != "ios" && dsrouter != "android" && dsrouter != "ios-sim" && dsrouter != "android-emu") { - Console.WriteLine("Invalid value for --dsrouter. Valid values are 'ios', 'ios-sim', 'android' and 'android-emu'."); - return false; + throw new DiagnosticToolException("Invalid value for --dsrouter. Valid values are 'ios', 'ios-sim', 'android' and 'android-emu'."); } if ((processId = LaunchDSRouterProcess(dsrouter)) < 0) { if (processId == -2) { - Console.WriteLine($"Failed to launch dsrouter: {dsrouter}. Make sure that dotnet-dsrouter is not already running. You can connect to an already running dsrouter with -p."); + throw new DiagnosticToolException($"Failed to launch dsrouter: {dsrouter}. Make sure that dotnet-dsrouter is not already running. You can connect to an already running dsrouter with -p.", ReturnCode.TracingError); } else { - Console.WriteLine($"Failed to launch dsrouter: {dsrouter}. Please make sure that dotnet-dsrouter is installed and available in the same directory as dotnet-trace."); - Console.WriteLine("You can install dotnet-dsrouter by running 'dotnet tool install --global dotnet-dsrouter'. More info at https://learn.microsoft.com/en-us/dotnet/core/diagnostics/dotnet-dsrouter"); + throw new DiagnosticToolException($"Failed to launch dsrouter: {dsrouter}. Please make sure that dotnet-dsrouter is installed and available in the same directory as dotnet-trace.\n" + + "You can install dotnet-dsrouter by running 'dotnet tool install --global dotnet-dsrouter'. More info at https://learn.microsoft.com/en-us/dotnet/core/diagnostics/dotnet-dsrouter", ReturnCode.TracingError); } - return false; } } resolvedProcessId = processId; - return true; } } - - internal sealed class LineRewriter - { - public int LineToClear { get; set; } - - private IConsole Console { get; } - - public LineRewriter(IConsole console) - { - Console = console; - } - - // ANSI escape codes: - // [2K => clear current line - // [{LineToClear};0H => move cursor to column 0 of row `LineToClear` - public void RewriteConsoleLine() - { - bool useConsoleFallback = true; - if (!Console.IsInputRedirected) - { - // in case of console input redirection, the control ANSI codes would appear - - // first attempt ANSI Codes - int before = Console.CursorTop; - Console.Out.Write($"\u001b[2K\u001b[{LineToClear};0H"); - int after = Console.CursorTop; - - // Some consoles claim to be VT100 compliant, but don't respect - // all of the ANSI codes, so fallback to the System.Console impl in that case - useConsoleFallback = (before == after); - } - - if (useConsoleFallback) - { - SystemConsoleLineRewriter(); - } - } - - private void SystemConsoleLineRewriter() => Console.SetCursorPosition(0, LineToClear); - - private static bool? _isSetCursorPositionSupported; - public bool IsRewriteConsoleLineSupported - { - get - { - bool isSupported = _isSetCursorPositionSupported ?? EnsureInitialized(); - return isSupported; - - bool EnsureInitialized() - { - try - { - int left = Console.CursorLeft; - int top = Console.CursorTop; - Console.SetCursorPosition(0, LineToClear); - Console.SetCursorPosition(left, top); - _isSetCursorPositionSupported = true; - } - catch - { - _isSetCursorPositionSupported = false; - } - return (bool)_isSetCursorPositionSupported; - } - } - } - } - - internal enum ReturnCode - { - Ok, - SessionCreationError, - TracingError, - ArgumentError, - PlatformNotSupportedError, - UnknownError - } } diff --git a/src/Tools/Common/DefaultConsole.cs b/src/Tools/Common/DefaultConsole.cs index 974c80a21c..41e9556d7f 100644 --- a/src/Tools/Common/DefaultConsole.cs +++ b/src/Tools/Common/DefaultConsole.cs @@ -15,7 +15,7 @@ namespace Microsoft.Diagnostics.Tools.Common internal class DefaultConsole : IConsole { private readonly bool _useAnsi; - public DefaultConsole(bool useAnsi) + public DefaultConsole(bool useAnsi = false) { _useAnsi = useAnsi; } diff --git a/src/Tools/Common/CommandLineErrorException.cs b/src/Tools/Common/DiagnosticToolException.cs similarity index 72% rename from src/Tools/Common/CommandLineErrorException.cs rename to src/Tools/Common/DiagnosticToolException.cs index aa1792e8e9..224582347f 100644 --- a/src/Tools/Common/CommandLineErrorException.cs +++ b/src/Tools/Common/DiagnosticToolException.cs @@ -2,6 +2,7 @@ // The .NET Foundation licenses this file to you under the MIT license. using System; +using Microsoft.Internal.Common.Utils; namespace Microsoft.Diagnostics.Tools { @@ -16,8 +17,12 @@ namespace Microsoft.Diagnostics.Tools // // For any other error conditions that were unanticipated or do not have // contextualized error messages, don't use this type. - internal sealed class CommandLineErrorException : Exception + internal sealed class DiagnosticToolException : Exception { - public CommandLineErrorException(string errorMessage) : base(errorMessage) { } + public ReturnCode ReturnCode { get; } + public DiagnosticToolException(string errorMessage, ReturnCode returnCode = ReturnCode.ArgumentError ) : base(errorMessage) + { + ReturnCode = returnCode; + } } } diff --git a/src/Tools/Common/LineRewriter.cs b/src/Tools/Common/LineRewriter.cs new file mode 100644 index 0000000000..e42e9b4a71 --- /dev/null +++ b/src/Tools/Common/LineRewriter.cs @@ -0,0 +1,74 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +using Microsoft.Diagnostics.Tools.Common; + +namespace Microsoft.Internal.Common.Utils +{ + internal sealed class LineRewriter + { + public int LineToClear { get; set; } + + private IConsole Console { get; } + + public LineRewriter(IConsole console) + { + Console = console; + } + + // ANSI escape codes: + // [2K => clear current line + // [{LineToClear};0H => move cursor to column 0 of row `LineToClear` + public void RewriteConsoleLine() + { + bool useConsoleFallback = true; + if (!Console.IsInputRedirected) + { + // in case of console input redirection, the control ANSI codes would appear + + // first attempt ANSI Codes + int before = Console.CursorTop; + Console.Out.Write($"\u001b[2K\u001b[{LineToClear};0H"); + int after = Console.CursorTop; + + // Some consoles claim to be VT100 compliant, but don't respect + // all of the ANSI codes, so fallback to the System.Console impl in that case + useConsoleFallback = (before == after); + } + + if (useConsoleFallback) + { + SystemConsoleLineRewriter(); + } + } + + private void SystemConsoleLineRewriter() => Console.SetCursorPosition(0, LineToClear); + + private static bool? _isSetCursorPositionSupported; + public bool IsRewriteConsoleLineSupported + { + get + { + bool isSupported = _isSetCursorPositionSupported ?? EnsureInitialized(); + return isSupported; + + bool EnsureInitialized() + { + try + { + int left = Console.CursorLeft; + int top = Console.CursorTop; + Console.SetCursorPosition(0, LineToClear); + Console.SetCursorPosition(left, top); + _isSetCursorPositionSupported = true; + } + catch + { + _isSetCursorPositionSupported = false; + } + return (bool)_isSetCursorPositionSupported; + } + } + } + } +} diff --git a/src/Tools/Common/ReturnCode.cs b/src/Tools/Common/ReturnCode.cs new file mode 100644 index 0000000000..8b3e01e955 --- /dev/null +++ b/src/Tools/Common/ReturnCode.cs @@ -0,0 +1,15 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +namespace Microsoft.Internal.Common.Utils +{ + internal enum ReturnCode + { + Ok, + SessionCreationError, + TracingError, + ArgumentError, + PlatformNotSupportedError, + UnknownError + } +} diff --git a/src/Tools/Common/ReversedServerHelpers/ReversedServerHelpers.cs b/src/Tools/Common/ReversedServerHelpers/ReversedServerHelpers.cs index b51f0cb130..79f8af70b5 100644 --- a/src/Tools/Common/ReversedServerHelpers/ReversedServerHelpers.cs +++ b/src/Tools/Common/ReversedServerHelpers/ReversedServerHelpers.cs @@ -89,7 +89,7 @@ public Process ChildProc return _childProc; } } - public bool Start(string diagnosticTransportName, CancellationToken ct, bool showChildIO, bool printLaunchCommand) + public void Start(string diagnosticTransportName, CancellationToken ct, bool showChildIO, bool printLaunchCommand) { _childProc.StartInfo.UseShellExecute = false; _childProc.StartInfo.RedirectStandardOutput = !showChildIO; @@ -107,15 +107,13 @@ public bool Start(string diagnosticTransportName, CancellationToken ct, bool sho } catch (Exception e) { - throw new CommandLineErrorException($"An error occurred trying to start process '{_childProc.StartInfo.FileName}' with working directory '{System.IO.Directory.GetCurrentDirectory()}'. {e.Message}"); + throw new DiagnosticToolException($"An error occurred trying to start process '{_childProc.StartInfo.FileName}' with working directory '{System.IO.Directory.GetCurrentDirectory()}'. {e.Message}"); } if (!showChildIO) { _stdOutTask = ReadAndIgnoreAllStreamAsync(_childProc.StandardOutput, ct); _stdErrTask = ReadAndIgnoreAllStreamAsync(_childProc.StandardError, ct); } - - return true; } public void Cleanup() @@ -231,10 +229,7 @@ public async Task Build(CancellationToken ct, int proce server.Start(); // Start the child proc - if (!ProcessLauncher.Launcher.Start(diagnosticTransportName, ct, showChildIO, printLaunchCommand)) - { - throw new InvalidOperationException($"Failed to start '{ProcessLauncher.Launcher.ChildProc.StartInfo.FileName} {ProcessLauncher.Launcher.ChildProc.StartInfo.Arguments}'."); - } + ProcessLauncher.Launcher.Start(diagnosticTransportName, ct, showChildIO, printLaunchCommand); IpcEndpointInfo endpointInfo; try { diff --git a/src/Tools/dotnet-counters/CounterMonitor.cs b/src/Tools/dotnet-counters/CounterMonitor.cs index 9235c65a26..230bea4940 100644 --- a/src/Tools/dotnet-counters/CounterMonitor.cs +++ b/src/Tools/dotnet-counters/CounterMonitor.cs @@ -25,8 +25,7 @@ internal class CounterMonitor : ICountersLogger private const int BufferDelaySecs = 1; private const string EventCountersProviderPrefix = "EventCounters\\"; private int _processId; - private TextWriter _stdOutput; - private TextWriter _stdError; + private IConsole _console; private List _counterList; private ICounterRenderer _renderer; private string _output; @@ -43,12 +42,11 @@ private class ProviderEventState private readonly Dictionary _providerEventStates = new(); private readonly Queue _bufferedEvents = new(); - public CounterMonitor(TextWriter stdOutput, TextWriter stdError) + public CounterMonitor(IConsole console = null) { _pauseCmdSet = false; _shouldExit = new TaskCompletionSource(); - _stdOutput = stdOutput; - _stdError = stdError; + _console = console ?? new DefaultConsole(); } private void MeterInstrumentEventObserved(string meterName, DateTime timestamp) @@ -187,9 +185,9 @@ public async Task Monitor( // to it. ValidateNonNegative(maxHistograms, nameof(maxHistograms)); ValidateNonNegative(maxTimeSeries, nameof(maxTimeSeries)); - if (!ProcessLauncher.Launcher.HasChildProc && !CommandUtils.ResolveProcessForAttach(processId, name, diagnosticPort, dsrouter, out _processId)) + if (!ProcessLauncher.Launcher.HasChildProc) { - return ReturnCode.ArgumentError; + CommandUtils.ResolveProcessForAttach(processId, name, diagnosticPort, dsrouter, out _processId); } ct.Register(() => _shouldExit.TrySetResult((int)ReturnCode.Ok)); @@ -238,15 +236,15 @@ public async Task Monitor( { //Cancellation token should automatically stop the session - _stdOutput.WriteLine($"Complete"); + _console.Out.WriteLine($"Complete"); return ReturnCode.Ok; } } } - catch (CommandLineErrorException e) + catch (DiagnosticToolException dte) { - _stdError.WriteLine(e.Message); - return ReturnCode.ArgumentError; + _console.Error.WriteLine(dte.Message); + return dte.ReturnCode; } finally { @@ -276,9 +274,9 @@ public async Task Collect( // to it. ValidateNonNegative(maxHistograms, nameof(maxHistograms)); ValidateNonNegative(maxTimeSeries, nameof(maxTimeSeries)); - if (!ProcessLauncher.Launcher.HasChildProc && !CommandUtils.ResolveProcessForAttach(processId, name, diagnosticPort, dsrouter, out _processId)) + if (!ProcessLauncher.Launcher.HasChildProc) { - return ReturnCode.ArgumentError; + CommandUtils.ResolveProcessForAttach(processId, name, diagnosticPort, dsrouter, out _processId); } ct.Register(() => _shouldExit.TrySetResult((int)ReturnCode.Ok)); @@ -306,7 +304,7 @@ public async Task Collect( _diagnosticsClient = holder.Client; if (_output.Length == 0) { - _stdError.WriteLine("Output cannot be an empty string"); + _console.Error.WriteLine("Output cannot be an empty string"); return ReturnCode.ArgumentError; } if (format == CountersExportFormat.csv) @@ -330,7 +328,7 @@ public async Task Collect( } else { - _stdError.WriteLine($"The output format {format} is not a valid output format."); + _console.Error.WriteLine($"The output format {format} is not a valid output format."); return ReturnCode.ArgumentError; } @@ -350,10 +348,10 @@ public async Task Collect( } } } - catch (CommandLineErrorException e) + catch (DiagnosticToolException dte) { - _stdError.WriteLine(e.Message); - return ReturnCode.ArgumentError; + _console.Error.WriteLine(dte.Message); + return dte.ReturnCode; } finally { @@ -365,7 +363,7 @@ private static void ValidateNonNegative(int value, string argName) { if (value < 0) { - throw new CommandLineErrorException($"Argument --{argName} must be non-negative"); + throw new DiagnosticToolException($"Argument --{argName} must be non-negative"); } } @@ -383,12 +381,12 @@ internal List ConfigureCounters(string commaSeparatedProv { // the FormatException message strings thrown by ParseProviderList are controlled // by us and anticipate being integrated into the command-line error text. - throw new CommandLineErrorException("Error parsing --counters argument: " + e.Message); + throw new DiagnosticToolException("Error parsing --counters argument: " + e.Message); } if (counters.Count == 0) { - _stdOutput.WriteLine($"--counters is unspecified. Monitoring System.Runtime counters by default."); + _console.Out.WriteLine($"--counters is unspecified. Monitoring System.Runtime counters by default."); ParseCounterProvider("System.Runtime", counters); } return counters; @@ -537,7 +535,7 @@ private async Task Start(MetricsPipeline pipeline, CancellationToken } catch (DiagnosticsClientException ex) { - Console.WriteLine($"Failed to start the counter session: {ex}"); + _console.WriteLine($"Failed to start the counter session: {ex}"); } catch (Exception ex) { diff --git a/src/Tools/dotnet-counters/Program.cs b/src/Tools/dotnet-counters/Program.cs index 2be10faea4..e108fa18c9 100644 --- a/src/Tools/dotnet-counters/Program.cs +++ b/src/Tools/dotnet-counters/Program.cs @@ -39,7 +39,7 @@ private static Command MonitorCommand() monitorCommand.TreatUnmatchedTokensAsErrors = false; // see the logic in Main - monitorCommand.SetAction(static (parseResult, ct) => new CounterMonitor(parseResult.Configuration.Output, parseResult.Configuration.Error).Monitor( + monitorCommand.SetAction(static (parseResult, ct) => new CounterMonitor().Monitor( ct, counters: parseResult.GetValue(CounterOption), processId: parseResult.GetValue(ProcessIdOption), @@ -79,7 +79,7 @@ private static Command CollectCommand() collectCommand.TreatUnmatchedTokensAsErrors = false; // see the logic in Main - collectCommand.SetAction((parseResult, ct) => new CounterMonitor(parseResult.Configuration.Output, parseResult.Configuration.Error).Collect( + collectCommand.SetAction((parseResult, ct) => new CounterMonitor().Collect( ct, counters: parseResult.GetValue(CounterOption), processId: parseResult.GetValue(ProcessIdOption), diff --git a/src/Tools/dotnet-counters/dotnet-counters.csproj b/src/Tools/dotnet-counters/dotnet-counters.csproj index 2ac31e5434..1c56c69d0b 100644 --- a/src/Tools/dotnet-counters/dotnet-counters.csproj +++ b/src/Tools/dotnet-counters/dotnet-counters.csproj @@ -16,13 +16,14 @@ - + - + + - + diff --git a/src/Tools/dotnet-dsrouter/dotnet-dsrouter.csproj b/src/Tools/dotnet-dsrouter/dotnet-dsrouter.csproj index ebed4febb6..db3fdb5d81 100644 --- a/src/Tools/dotnet-dsrouter/dotnet-dsrouter.csproj +++ b/src/Tools/dotnet-dsrouter/dotnet-dsrouter.csproj @@ -13,7 +13,8 @@ - + + diff --git a/src/Tools/dotnet-dump/Dumper.cs b/src/Tools/dotnet-dump/Dumper.cs index 65c30d32f3..54d12eafd9 100644 --- a/src/Tools/dotnet-dump/Dumper.cs +++ b/src/Tools/dotnet-dump/Dumper.cs @@ -35,14 +35,8 @@ public int Collect(TextWriter stdOutput, TextWriter stdError, int processId, str { try { - if (CommandUtils.ResolveProcessForAttach(processId, name, diagnosticPort, string.Empty, out int resolvedProcessId)) - { - processId = resolvedProcessId; - } - else - { - return -1; - } + CommandUtils.ResolveProcessForAttach(processId, name, diagnosticPort, string.Empty, out int resolvedProcessId); + processId = resolvedProcessId; if (output == null) { @@ -132,6 +126,11 @@ public int Collect(TextWriter stdOutput, TextWriter stdError, int processId, str client.WriteDump(dumpType, output, flags); } } + catch (DiagnosticToolException dte) + { + stdError.WriteLine($"[ERROR] {dte.Message}"); + return -1; + } catch (Exception ex) { if (diag) diff --git a/src/Tools/dotnet-dump/dotnet-dump.csproj b/src/Tools/dotnet-dump/dotnet-dump.csproj index 991a0fadcf..60705a32d8 100644 --- a/src/Tools/dotnet-dump/dotnet-dump.csproj +++ b/src/Tools/dotnet-dump/dotnet-dump.csproj @@ -19,11 +19,12 @@ - + - + + diff --git a/src/Tools/dotnet-gcdump/CommandLine/CollectCommandHandler.cs b/src/Tools/dotnet-gcdump/CommandLine/CollectCommandHandler.cs index 26af23d866..b5a44b6895 100644 --- a/src/Tools/dotnet-gcdump/CommandLine/CollectCommandHandler.cs +++ b/src/Tools/dotnet-gcdump/CommandLine/CollectCommandHandler.cs @@ -30,16 +30,12 @@ internal static class CollectCommandHandler /// private static async Task Collect(CancellationToken ct, int processId, string output, int timeout, bool verbose, string name, string diagnosticPort, string dsrouter) { - if (!CommandUtils.ResolveProcessForAttach(processId, name, diagnosticPort, dsrouter, out int resolvedProcessId)) + try { - return -1; - } + CommandUtils.ResolveProcessForAttach(processId, name, diagnosticPort, dsrouter, out int resolvedProcessId); + processId = resolvedProcessId; - processId = resolvedProcessId; - - if (!string.IsNullOrEmpty(diagnosticPort)) - { - try + if (!string.IsNullOrEmpty(diagnosticPort)) { IpcEndpointConfig config = IpcEndpointConfig.Parse(diagnosticPort); if (!config.IsConnectConfig) @@ -47,18 +43,10 @@ private static async Task Collect(CancellationToken ct, int processId, stri Console.Error.WriteLine("--diagnostic-port is only supporting connect mode."); return -1; } - } - catch (Exception ex) - { - Console.Error.WriteLine($"--diagnostic-port argument error: {ex.Message}"); - return -1; - } - processId = 0; - } + processId = 0; + } - try - { output = string.IsNullOrEmpty(output) ? $"{DateTime.Now:yyyyMMdd\\_HHmmss}_{processId}.gcdump" : output; @@ -106,6 +94,16 @@ private static async Task Collect(CancellationToken ct, int processId, stri return -1; } } + catch (DiagnosticToolException dte) + { + Console.Error.WriteLine($"[ERROR] {dte.Message}"); + return -1; + } + catch (FormatException fe) + { + Console.Error.WriteLine($"--diagnostic-port argument error: {fe.Message}"); + return -1; + } catch (Exception ex) { Console.Error.WriteLine($"[ERROR] {ex}"); diff --git a/src/Tools/dotnet-gcdump/CommandLine/ReportCommandHandler.cs b/src/Tools/dotnet-gcdump/CommandLine/ReportCommandHandler.cs index c0bab3af39..092a8c592a 100644 --- a/src/Tools/dotnet-gcdump/CommandLine/ReportCommandHandler.cs +++ b/src/Tools/dotnet-gcdump/CommandLine/ReportCommandHandler.cs @@ -91,16 +91,12 @@ private static Task HandleUnknownParam() private static Task ReportFromProcess(int processId, string diagnosticPort, string dsrouter, CancellationToken ct) { - if (!CommandUtils.ResolveProcessForAttach(processId, string.Empty, diagnosticPort, dsrouter, out int resolvedProcessId)) + try { - return Task.FromResult(-1); - } + CommandUtils.ResolveProcessForAttach(processId, string.Empty, diagnosticPort, dsrouter, out int resolvedProcessId); + processId = resolvedProcessId; - processId = resolvedProcessId; - - if (!string.IsNullOrEmpty(diagnosticPort)) - { - try + if (!string.IsNullOrEmpty(diagnosticPort)) { IpcEndpointConfig config = IpcEndpointConfig.Parse(diagnosticPort); if (!config.IsConnectConfig) @@ -108,14 +104,23 @@ private static Task ReportFromProcess(int processId, string diagnosticPort, Console.Error.WriteLine("--diagnostic-port is only supporting connect mode."); return Task.FromResult(-1); } + processId = 0; } - catch (Exception ex) - { - Console.Error.WriteLine($"--diagnostic-port argument error: {ex.Message}"); - return Task.FromResult(-1); - } - - processId = 0; + } + catch (DiagnosticToolException dte) + { + Console.Error.WriteLine($"[ERROR] {dte.Message}"); + return Task.FromResult(-1); + } + catch (FormatException fe) + { + Console.Error.WriteLine($"--diagnostic-port argument error: {fe.Message}"); + return Task.FromResult(-1); + } + catch (Exception ex) + { + Console.Error.WriteLine($"[ERROR] {ex}"); + return Task.FromResult(-1); } if (!CollectCommandHandler diff --git a/src/Tools/dotnet-gcdump/dotnet-gcdump.csproj b/src/Tools/dotnet-gcdump/dotnet-gcdump.csproj index 4586ecfc20..a0b4064b9c 100644 --- a/src/Tools/dotnet-gcdump/dotnet-gcdump.csproj +++ b/src/Tools/dotnet-gcdump/dotnet-gcdump.csproj @@ -23,11 +23,12 @@ - + - + + diff --git a/src/Tools/dotnet-stack/ReportCommand.cs b/src/Tools/dotnet-stack/ReportCommand.cs index c8f2ecc365..21e73f2d7e 100644 --- a/src/Tools/dotnet-stack/ReportCommand.cs +++ b/src/Tools/dotnet-stack/ReportCommand.cs @@ -35,32 +35,8 @@ private static async Task Report(CancellationToken ct, TextWriter stdOutput try { - // Either processName or processId has to be specified. - if (!string.IsNullOrEmpty(name)) - { - if (processId != 0) - { - Console.WriteLine("Can only specify either --name or --process-id option."); - return -1; - } - processId = CommandUtils.FindProcessIdWithName(name); - if (processId < 0) - { - return -1; - } - } - - if (processId < 0) - { - stdError.WriteLine("Process ID should not be negative."); - return -1; - } - else if (processId == 0) - { - stdError.WriteLine("--process-id is required"); - return -1; - } - + CommandUtils.ResolveProcess(processId, name, out int resolvedProcessId, out string _); + processId = resolvedProcessId; DiagnosticsClient client = new(processId); List providers = new() @@ -143,6 +119,11 @@ private static async Task Report(CancellationToken ct, TextWriter stdOutput } } } + catch (DiagnosticToolException dte) + { + stdError.WriteLine($"[ERROR] {dte.Message}"); + return -1; + } catch (OperationCanceledException) { return -1; diff --git a/src/Tools/dotnet-stack/dotnet-stack.csproj b/src/Tools/dotnet-stack/dotnet-stack.csproj index beacb323f4..403ee760d6 100644 --- a/src/Tools/dotnet-stack/dotnet-stack.csproj +++ b/src/Tools/dotnet-stack/dotnet-stack.csproj @@ -22,11 +22,12 @@ - + - + + diff --git a/src/Tools/dotnet-trace/CommandLine/Commands/CollectCommand.cs b/src/Tools/dotnet-trace/CommandLine/Commands/CollectCommand.cs index c9d4124f78..9c6ec43d63 100644 --- a/src/Tools/dotnet-trace/CommandLine/Commands/CollectCommand.cs +++ b/src/Tools/dotnet-trace/CommandLine/Commands/CollectCommand.cs @@ -23,9 +23,9 @@ internal class CollectCommandHandler { internal bool IsQuiet { get; set; } - public CollectCommandHandler() + public CollectCommandHandler(IConsole console = null) { - Console = new DefaultConsole(false); + Console = console ?? new DefaultConsole(); StartTraceSessionAsync = async (client, config, ct) => new CollectSession(await client.StartEventPipeSessionAsync(config, ct).ConfigureAwait(false)); ResumeRuntimeAsync = (client, ct) => client.ResumeRuntimeAsync(ct); CollectSessionEventStream = (name) => new FileStream(name, FileMode.Create, FileAccess.Write); @@ -103,18 +103,12 @@ internal async Task Collect(CancellationToken ct, CommandLineConfiguration Console.WriteLine("--show-child-io must not be specified when attaching to a process"); return (int)ReturnCode.ArgumentError; } - if (CommandUtils.ResolveProcessForAttach(processId, name, diagnosticPort, dsrouter, out int resolvedProcessId)) - { - processId = resolvedProcessId; - } - else - { - return (int)ReturnCode.ArgumentError; - } + CommandUtils.ResolveProcessForAttach(processId, name, diagnosticPort, dsrouter, out int resolvedProcessId); + processId = resolvedProcessId; } - else if (!CommandUtils.ValidateArgumentsForChildProcess(processId, name, diagnosticPort)) + else { - return (int)ReturnCode.ArgumentError; + CommandUtils.ValidateArgumentsForChildProcess(processId, name, diagnosticPort); } if (profile.Length == 0 && providers.Length == 0 && clrevents.Length == 0) @@ -474,11 +468,11 @@ internal async Task Collect(CancellationToken ct, CommandLineConfiguration } } } - catch (CommandLineErrorException e) + catch (DiagnosticToolException dte) { - Console.Error.WriteLine($"[ERROR] {e.Message}"); + Console.Error.WriteLine($"[ERROR] {dte.Message}"); collectionStopped = true; - ret = (int)ReturnCode.TracingError; + ret = (int)dte.ReturnCode; } catch (OperationCanceledException) { diff --git a/src/Tools/dotnet-trace/CommandLine/Commands/CollectLinuxCommand.cs b/src/Tools/dotnet-trace/CommandLine/Commands/CollectLinuxCommand.cs index 1129cab856..63bb18dabb 100644 --- a/src/Tools/dotnet-trace/CommandLine/Commands/CollectLinuxCommand.cs +++ b/src/Tools/dotnet-trace/CommandLine/Commands/CollectLinuxCommand.cs @@ -37,7 +37,7 @@ internal sealed record CollectLinuxArgs( public CollectLinuxCommandHandler(IConsole console = null) { - Console = console ?? new DefaultConsole(false); + Console = console ?? new DefaultConsole(); rewriter = new LineRewriter(Console); } @@ -71,15 +71,6 @@ internal int CollectLinux(CollectLinuxArgs args) return (int)ReturnCode.PlatformNotSupportedError; } - if (args.ProcessId != 0 || !string.IsNullOrEmpty(args.Name)) - { - if (!CommandUtils.ResolveProcess(args.ProcessId, args.Name, out int resolvedProcessId, out string resolvedProcessName)) - { - return (int)ReturnCode.ArgumentError; - } - args = args with { Name = resolvedProcessName, ProcessId = resolvedProcessId }; - } - Console.WriteLine("=========================================================================================="); Console.WriteLine("The collect-linux verb is a new preview feature and relies on an updated version of the"); Console.WriteLine(".nettrace file format. The latest PerfView release supports these trace files but other"); @@ -87,11 +78,17 @@ internal int CollectLinux(CollectLinuxArgs args) Console.WriteLine("https://learn.microsoft.com/dotnet/core/diagnostics/dotnet-trace."); Console.WriteLine("=========================================================================================="); - args.Ct.Register(() => stopTracing = true); int ret = (int)ReturnCode.TracingError; string scriptPath = null; try { + if (args.ProcessId != 0 || !string.IsNullOrEmpty(args.Name)) + { + CommandUtils.ResolveProcess(args.ProcessId, args.Name, out int resolvedProcessId, out string resolvedProcessName); + args = args with { Name = resolvedProcessName, ProcessId = resolvedProcessId }; + } + + args.Ct.Register(() => stopTracing = true); Console.CursorVisible = false; byte[] command = BuildRecordTraceArgs(args, out scriptPath); @@ -108,10 +105,10 @@ internal int CollectLinux(CollectLinuxArgs args) stopwatch.Start(); ret = RecordTraceInvoker(command, (UIntPtr)command.Length, OutputHandler); } - catch (CommandLineErrorException e) + catch (DiagnosticToolException dte) { - Console.Error.WriteLine($"[ERROR] {e.Message}"); - ret = (int)ReturnCode.TracingError; + Console.Error.WriteLine($"[ERROR] {dte.Message}"); + ret = (int)dte.ReturnCode; } catch (DllNotFoundException dnfe) { @@ -236,7 +233,7 @@ private byte[] BuildRecordTraceArgs(CollectLinuxArgs args, out string scriptPath string[] split = perfEvent.Split(':', 2, StringSplitOptions.TrimEntries); if (split.Length != 2 || string.IsNullOrEmpty(split[0]) || string.IsNullOrEmpty(split[1])) { - throw new CommandLineErrorException($"Invalid perf event specification '{perfEvent}'. Expected format 'provider:event'."); + throw new DiagnosticToolException($"Invalid perf event specification '{perfEvent}'. Expected format 'provider:event'."); } string perfProvider = split[0]; diff --git a/src/Tools/dotnet-trace/ProviderUtils.cs b/src/Tools/dotnet-trace/ProviderUtils.cs index 0adffe6450..c8dd83312c 100644 --- a/src/Tools/dotnet-trace/ProviderUtils.cs +++ b/src/Tools/dotnet-trace/ProviderUtils.cs @@ -76,7 +76,7 @@ private enum ProviderSource public static List ComputeProviderConfig(string[] providersArg, string clreventsArg, string clreventlevel, string[] profiles, bool shouldPrintProviders = false, string verbExclusivity = null, IConsole console = null) { - console ??= new DefaultConsole(false); + console ??= new DefaultConsole(); Dictionary merged = new(StringComparer.OrdinalIgnoreCase); Dictionary providerSources = new(StringComparer.OrdinalIgnoreCase); @@ -101,14 +101,14 @@ public static List ComputeProviderConfig(string[] providersAr if (traceProfile == null) { - throw new CommandLineErrorException($"Invalid profile name: {profile}"); + throw new DiagnosticToolException($"Invalid profile name: {profile}"); } if (!string.IsNullOrEmpty(verbExclusivity) && !string.IsNullOrEmpty(traceProfile.VerbExclusivity) && !string.Equals(traceProfile.VerbExclusivity, verbExclusivity, StringComparison.OrdinalIgnoreCase)) { - throw new CommandLineErrorException($"The specified profile '{traceProfile.Name}' does not apply to `dotnet-trace {verbExclusivity}`."); + throw new DiagnosticToolException($"The specified profile '{traceProfile.Name}' does not apply to `dotnet-trace {verbExclusivity}`."); } IEnumerable profileProviders = traceProfile.Providers; @@ -158,7 +158,7 @@ private static EventPipeProvider MergeProviderConfigs(EventPipeProvider provider if (providerConfigA.Arguments != null && providerConfigB.Arguments != null) { - throw new CommandLineErrorException($"Provider \"{providerConfigA.Name}\" is declared multiple times with filter arguments."); + throw new DiagnosticToolException($"Provider \"{providerConfigA.Name}\" is declared multiple times with filter arguments."); } return new EventPipeProvider(providerConfigA.Name, level, providerConfigA.Keywords | providerConfigB.Keywords, providerConfigA.Arguments ?? providerConfigB.Arguments); @@ -218,7 +218,7 @@ public static EventPipeProvider ToCLREventPipeProvider(string clreventslist, str } else { - throw new CommandLineErrorException($"{clrevents[i]} is not a valid CLR event keyword"); + throw new DiagnosticToolException($"{clrevents[i]} is not a valid CLR event keyword"); } } @@ -256,7 +256,7 @@ private static EventLevel GetEventLevel(string token) case "warning": return EventLevel.Warning; default: - throw new CommandLineErrorException($"Unknown EventLevel: {token}"); + throw new DiagnosticToolException($"Unknown EventLevel: {token}"); } } } @@ -281,7 +281,7 @@ private static EventPipeProvider ToProvider(string provider, IConsole console) if (string.IsNullOrWhiteSpace(providerName)) { - throw new CommandLineErrorException("Provider name was not specified."); + throw new DiagnosticToolException("Provider name was not specified."); } // Keywords diff --git a/src/Tools/dotnet-trace/TraceFileFormatConverter.cs b/src/Tools/dotnet-trace/TraceFileFormatConverter.cs index 61e4c4c1b8..a6e08ac74c 100644 --- a/src/Tools/dotnet-trace/TraceFileFormatConverter.cs +++ b/src/Tools/dotnet-trace/TraceFileFormatConverter.cs @@ -62,7 +62,7 @@ internal static void ConvertToFormat(TextWriter stdOut, TextWriter stdError, Tra break; default: // Validation happened way before this, so we shoud never reach this... - throw new CommandLineErrorException($"Invalid TraceFileFormat \"{format}\""); + throw new DiagnosticToolException($"Invalid TraceFileFormat \"{format}\""); } stdOut.WriteLine("Conversion complete"); } @@ -94,7 +94,7 @@ private static void Convert(TraceFileFormat format, string fileToConvert, string break; default: // we should never get here - throw new CommandLineErrorException($"Invalid TraceFileFormat \"{format}\""); + throw new DiagnosticToolException($"Invalid TraceFileFormat \"{format}\""); } } diff --git a/src/tests/dotnet-counters/CounterMonitorPayloadTests.cs b/src/tests/dotnet-counters/CounterMonitorPayloadTests.cs index f1f6b554c0..38bc614706 100644 --- a/src/tests/dotnet-counters/CounterMonitorPayloadTests.cs +++ b/src/tests/dotnet-counters/CounterMonitorPayloadTests.cs @@ -196,7 +196,7 @@ private async Task> GetCounterTrace(TestConfiguration con { try { - CounterMonitor monitor = new CounterMonitor(TextWriter.Null, TextWriter.Null); + CounterMonitor monitor = new CounterMonitor(); using CancellationTokenSource source = new CancellationTokenSource(DefaultTimeout); diff --git a/src/tests/dotnet-counters/CounterMonitorTests.cs b/src/tests/dotnet-counters/CounterMonitorTests.cs index 30e7bbb816..c840d91b83 100644 --- a/src/tests/dotnet-counters/CounterMonitorTests.cs +++ b/src/tests/dotnet-counters/CounterMonitorTests.cs @@ -79,7 +79,7 @@ public void GenerateCounterListTestManyProvidersWithFilter() [Fact] public void GenerateCounterListWithOptionAndArgumentsTest() { - CounterMonitor monitor = new(TextWriter.Null, TextWriter.Null); + CounterMonitor monitor = new(); string countersOptionText = "MyEventSource1,MyEventSource2"; List counters = monitor.ConfigureCounters(countersOptionText); Assert.Contains("MyEventSource1", counters.Select(g => g.ProviderName)); @@ -89,45 +89,45 @@ public void GenerateCounterListWithOptionAndArgumentsTest() [Fact] public void ParseErrorUnbalancedBracketsInCountersArg() { - CounterMonitor monitor = new(TextWriter.Null, TextWriter.Null); + CounterMonitor monitor = new(); string countersOptionText = "System.Runtime[cpu-usage,MyEventSource"; - CommandLineErrorException e = Assert.Throws(() => monitor.ConfigureCounters(countersOptionText)); + DiagnosticToolException e = Assert.Throws(() => monitor.ConfigureCounters(countersOptionText)); Assert.Equal("Error parsing --counters argument: Expected to find closing ']' in counter_provider", e.Message); } [Fact] public void ParseErrorTrailingTextInCountersArg() { - CounterMonitor monitor = new(TextWriter.Null, TextWriter.Null); + CounterMonitor monitor = new(); string countersOptionText = "System.Runtime[cpu-usage]hello,MyEventSource"; - CommandLineErrorException e = Assert.Throws(() => monitor.ConfigureCounters(countersOptionText)); + DiagnosticToolException e = Assert.Throws(() => monitor.ConfigureCounters(countersOptionText)); Assert.Equal("Error parsing --counters argument: Unexpected characters after closing ']' in counter_provider", e.Message); } [Fact] public void ParseErrorEmptyProvider() { - CounterMonitor monitor = new(TextWriter.Null, TextWriter.Null); + CounterMonitor monitor = new(); string countersOptionText = ",MyEventSource"; - CommandLineErrorException e = Assert.Throws(() => monitor.ConfigureCounters(countersOptionText)); + DiagnosticToolException e = Assert.Throws(() => monitor.ConfigureCounters(countersOptionText)); Assert.Equal("Error parsing --counters argument: Expected non-empty counter_provider", e.Message); } [Fact] public void ParseErrorMultipleCounterLists() { - CounterMonitor monitor = new(TextWriter.Null, TextWriter.Null); + CounterMonitor monitor = new(); string countersOptionText = "System.Runtime[cpu-usage][working-set],MyEventSource"; - CommandLineErrorException e = Assert.Throws(() => monitor.ConfigureCounters(countersOptionText)); + DiagnosticToolException e = Assert.Throws(() => monitor.ConfigureCounters(countersOptionText)); Assert.Equal("Error parsing --counters argument: Expected at most one '[' in counter_provider", e.Message); } [Fact] public void ParseErrorMultiplePrefixesOnSameProvider() { - CounterMonitor monitor = new(TextWriter.Null, TextWriter.Null); + CounterMonitor monitor = new(); string countersOptionText = "System.Runtime,MyEventSource,EventCounters\\System.Runtime"; - CommandLineErrorException e = Assert.Throws(() => monitor.ConfigureCounters(countersOptionText)); + DiagnosticToolException e = Assert.Throws(() => monitor.ConfigureCounters(countersOptionText)); Assert.Equal("Error parsing --counters argument: Using the same provider name with and without the EventCounters\\ prefix in the counter list is not supported.", e.Message); } } diff --git a/src/tests/dotnet-trace/CLRProviderParsing.cs b/src/tests/dotnet-trace/CLRProviderParsing.cs index 3b3f80a35e..427a0cfd22 100644 --- a/src/tests/dotnet-trace/CLRProviderParsing.cs +++ b/src/tests/dotnet-trace/CLRProviderParsing.cs @@ -29,7 +29,7 @@ public void ValidSingleCLREvent(string providerToParse) [InlineData("haha")] public void InValidSingleCLREvent(string providerToParse) { - Assert.Throws(() => ProviderUtils.ToCLREventPipeProvider(providerToParse, "4")); + Assert.Throws(() => ProviderUtils.ToCLREventPipeProvider(providerToParse, "4")); } [Theory] @@ -64,7 +64,7 @@ public void ValidCLREventLevel(string clreventlevel) [InlineData("hello")] public void InvalidCLREventLevel(string clreventlevel) { - Assert.Throws(() => ProviderUtils.ToCLREventPipeProvider("gc", clreventlevel)); + Assert.Throws(() => ProviderUtils.ToCLREventPipeProvider("gc", clreventlevel)); } } } diff --git a/src/tests/dotnet-trace/CollectCommandFunctionalTests.cs b/src/tests/dotnet-trace/CollectCommandFunctionalTests.cs index ec6d537f3f..2ca87ace32 100644 --- a/src/tests/dotnet-trace/CollectCommandFunctionalTests.cs +++ b/src/tests/dotnet-trace/CollectCommandFunctionalTests.cs @@ -66,17 +66,16 @@ public async Task CollectCommandInvalidProviderConfiguration_Throws(CollectArgs { MockConsole console = new(200, 30); int exitCode = await RunAsync(args, console).ConfigureAwait(true); - Assert.Equal((int)ReturnCode.TracingError, exitCode); + Assert.Equal((int)ReturnCode.ArgumentError, exitCode); console.AssertSanitizedLinesEqual(CollectSanitizer, expectedException); } private static async Task RunAsync(CollectArgs config, MockConsole console) { - var handler = new CollectCommandHandler(); + var handler = new CollectCommandHandler(console); handler.StartTraceSessionAsync = (client, cfg, ct) => Task.FromResult(new TestCollectSession()); handler.ResumeRuntimeAsync = (client, ct) => Task.CompletedTask; handler.CollectSessionEventStream = (name) => config.EventStream; - handler.Console = console; return await handler.Collect( config.ct, diff --git a/src/tests/dotnet-trace/CollectLinuxCommandFunctionalTests.cs b/src/tests/dotnet-trace/CollectLinuxCommandFunctionalTests.cs index 142872cd41..f9b7616cf5 100644 --- a/src/tests/dotnet-trace/CollectLinuxCommandFunctionalTests.cs +++ b/src/tests/dotnet-trace/CollectLinuxCommandFunctionalTests.cs @@ -71,7 +71,7 @@ public void CollectLinuxCommandProviderConfigurationConsolidation_Throws(object int exitCode = Run(testArgs, console); if (CollectLinuxCommandHandler.IsSupported()) { - Assert.Equal((int)ReturnCode.TracingError, exitCode); + Assert.Equal((int)ReturnCode.ArgumentError, exitCode); console.AssertSanitizedLinesEqual(null, expectedException); } else diff --git a/src/tests/dotnet-trace/ProviderCompositionTests.cs b/src/tests/dotnet-trace/ProviderCompositionTests.cs index d7441fbe6c..c5a9a8c766 100644 --- a/src/tests/dotnet-trace/ProviderCompositionTests.cs +++ b/src/tests/dotnet-trace/ProviderCompositionTests.cs @@ -43,10 +43,10 @@ public static IEnumerable ValidProviders() public static IEnumerable InvalidProviders() { - yield return new object[] { ":::", typeof(CommandLineErrorException) }; - yield return new object[] { ":1:1", typeof(CommandLineErrorException) }; - yield return new object[] { "ProviderOne:0x1:UnknownLevel", typeof(CommandLineErrorException) }; - yield return new object[] { "VeryCoolProvider:0x0:-1", typeof(CommandLineErrorException) }; + yield return new object[] { ":::", typeof(DiagnosticToolException) }; + yield return new object[] { ":1:1", typeof(DiagnosticToolException) }; + yield return new object[] { "ProviderOne:0x1:UnknownLevel", typeof(DiagnosticToolException) }; + yield return new object[] { "VeryCoolProvider:0x0:-1", typeof(DiagnosticToolException) }; yield return new object[] { "VeryCoolProvider:0xFFFFFFFFFFFFFFFFF:5:FilterAndPayloadSpecs=\"QuotedValue\"", typeof(OverflowException) }; yield return new object[] { "VeryCoolProvider:0x10000000000000000::FilterAndPayloadSpecs=\"QuotedValue\"", typeof(OverflowException) }; yield return new object[] { "VeryCoolProvider:__:5:FilterAndPayloadSpecs=\"QuotedValue\"", typeof(FormatException) }; @@ -120,7 +120,7 @@ public void MultipleProviders_Parse_AsExpected(string providersArg, EventPipePro public static IEnumerable MultipleInvalidProviders() { - yield return new object[] { "ProviderOne:0x1:5:FilterAndPayloadSpecs=\"QuotedValue\",:2:2:key=value,ProviderThree:3:3:key=value", typeof(CommandLineErrorException) }; + yield return new object[] { "ProviderOne:0x1:5:FilterAndPayloadSpecs=\"QuotedValue\",:2:2:key=value,ProviderThree:3:3:key=value", typeof(DiagnosticToolException) }; yield return new object[] { "ProviderOne:0x1:5:FilterAndPayloadSpecs=\"QuotedValue\",ProviderTwo:0xFFFFFFFFFFFFFFFFF:5:FilterAndPayloadSpecs=\"QuotedValue\",ProviderThree:3:3:key=value", typeof(OverflowException) }; yield return new object[] { "ProviderOne:0x1:5:FilterAndPayloadSpecs=\"QuotedValue\",ProviderTwo:0x10000000000000000:5:FilterAndPayloadSpecs=\"QuotedValue\",ProviderThree:3:3:key=value", typeof(OverflowException) }; yield return new object[] { "ProviderOne:0x1:5:FilterAndPayloadSpecs=\"QuotedValue\",ProviderTwo:18446744073709551615:5:FilterAndPayloadSpecs=\"QuotedValue\",ProviderThree:3:3:key=value", typeof(OverflowException) }; @@ -146,7 +146,7 @@ public static IEnumerable DedupeSuccessCases() public static IEnumerable DedupeFailureCases() { - yield return new object[] { new[]{ "MyProvider:::key=value", "MyProvider:::key=value" }, typeof(CommandLineErrorException) }; + yield return new object[] { new[]{ "MyProvider:::key=value", "MyProvider:::key=value" }, typeof(DiagnosticToolException) }; } [Theory] @@ -233,7 +233,7 @@ public void ProviderSourcePrecedence(string[] providersArg, string clreventsArg, public static IEnumerable InvalidClrEvents() { - yield return new object[] { Array.Empty(), "gc+bogus", string.Empty, Array.Empty(), typeof(CommandLineErrorException) }; + yield return new object[] { Array.Empty(), "gc+bogus", string.Empty, Array.Empty(), typeof(DiagnosticToolException) }; } [Theory] From 646eca55b4e739f7f534ad3b652f7c35c163d349 Mon Sep 17 00:00:00 2001 From: Juan Hoyos <19413848+hoyosjs@users.noreply.github.com> Date: Fri, 7 Nov 2025 08:13:10 -0800 Subject: [PATCH 23/44] [main] Update parameters for manifest paths (#5635) --- src/SOS/SOS.Package/GenerateManifest/GenerateManifest.cs | 2 +- src/SOS/SOS.Package/SOS.Package.csproj | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/SOS/SOS.Package/GenerateManifest/GenerateManifest.cs b/src/SOS/SOS.Package/GenerateManifest/GenerateManifest.cs index 94e04b6d5b..1d177f5a13 100644 --- a/src/SOS/SOS.Package/GenerateManifest/GenerateManifest.cs +++ b/src/SOS/SOS.Package/GenerateManifest/GenerateManifest.cs @@ -3,7 +3,7 @@ using System.Xml.Linq; using System.Xml.XPath; -const string ExpectedParameters = " "; +const string ExpectedParameters = " "; const string FilesXpathInPackageElement = "Components/BinaryComponent/Files"; const string CompressedGalleryManifestTemplate = """ diff --git a/src/SOS/SOS.Package/SOS.Package.csproj b/src/SOS/SOS.Package/SOS.Package.csproj index b22f4f9101..90c8c85608 100644 --- a/src/SOS/SOS.Package/SOS.Package.csproj +++ b/src/SOS/SOS.Package/SOS.Package.csproj @@ -10,8 +10,8 @@ false tools $(MSBuildThisFileDirectory)ManifestBase.xml - $(IntermediateOutputPath)sos_GalleryManifest.xml - $(IntermediateOutputPath)GalleryManifest.xml + $(IntermediateOutputPath)GalleryManifest.xml + $(IntermediateOutputPath)sos_GalleryManifest.xml GenerateGalleryManifest true false From 1d7d573d13fb7a204868eba0ec5225109b3e0f05 Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" <42748379+dotnet-maestro[bot]@users.noreply.github.com> Date: Fri, 7 Nov 2025 21:40:40 +0000 Subject: [PATCH 24/44] [main] Update dependencies from dotnet/dotnet (#5599) This pull request updates the following dependencies [marker]: <> (Begin:9c7d85bb-274e-4ad6-970a-48ffc448929b) ## From https://github.com/dotnet/dotnet - **Subscription**: [9c7d85bb-274e-4ad6-970a-48ffc448929b](https://maestro.dot.net/subscriptions?search=9c7d85bb-274e-4ad6-970a-48ffc448929b) - **Build**: [20251020.17](https://dev.azure.com/dnceng/internal/_build/results?buildId=2820987) ([287966](https://maestro.dot.net/channel/5173/github:dotnet:dotnet/build/287966)) - **Date Produced**: October 21, 2025 12:07:46 PM UTC - **Commit**: [50d79701f2d748e965fefb4ba42580368598b9cc](https://github.com/dotnet/dotnet/commit/50d79701f2d748e965fefb4ba42580368598b9cc) - **Branch**: [release/10.0.1xx](https://github.com/dotnet/dotnet/tree/release/10.0.1xx) [DependencyUpdate]: <> (Begin) - **Updates**: - From [10.0.0-rtm.25476.104 to 10.0.0-rtm.25520.117][13] - runtime.linux-arm64.Microsoft.DotNet.Cdac.Transport - runtime.linux-x64.Microsoft.DotNet.Cdac.Transport - runtime.osx-arm64.Microsoft.DotNet.Cdac.Transport - runtime.osx-x64.Microsoft.DotNet.Cdac.Transport - runtime.win-arm64.Microsoft.DotNet.Cdac.Transport - Microsoft.AspNetCore.App.Ref.Internal - Microsoft.NETCore.Platforms - runtime.win-x64.Microsoft.DotNet.Cdac.Transport - From [10.0.0-rtm.25476.104 to 10.0.0][13] - Microsoft.AspNetCore.App.Ref - Microsoft.NETCore.App.Ref - From [5.0.0-2.25476.104 to 5.0.0-2.25520.117][13] - Microsoft.CodeAnalysis - Microsoft.CodeAnalysis.Analyzers - Microsoft.CodeAnalysis.CSharp - From [10.0.100-rtm.25476.104 to 10.0.100][13] - Microsoft.CodeAnalysis.NetAnalyzers - From [10.0.0-beta.25476.104 to 10.0.0-beta.25520.117][13] - Microsoft.DotNet.Arcade.Sdk - Microsoft.DotNet.CodeAnalysis - From [10.0.100-rtm.25476.104 to 10.0.100-rtm.25520.117][13] - Microsoft.NET.Sdk [13]: https://github.com/dotnet/dotnet/compare/e1eaf1bbd9...50d79701f2 [DependencyUpdate]: <> (End) - **Updates to .NET SDKs in root:** - Updates sdk.version to 10.0.100-rc.1.25451.107 - Updates tools.dotnet to 10.0.100-rc.1.25451.107 [marker]: <> (End:9c7d85bb-274e-4ad6-970a-48ffc448929b) --------- Co-authored-by: dotnet-maestro[bot] Co-authored-by: Juan Hoyos <19413848+hoyosjs@users.noreply.github.com> --- NuGet.config | 3 + eng/AuxMsbuildFiles/SdkPackOverrides.targets | 26 +++ eng/Version.Details.props | 34 ++-- eng/Version.Details.xml | 68 +++---- eng/Versions.props | 4 +- eng/common/SetupNugetSources.ps1 | 88 ++++---- eng/common/SetupNugetSources.sh | 190 +++++++++++------- .../steps/install-microbuild.yml | 15 +- eng/common/post-build/nuget-verification.ps1 | 2 +- global.json | 2 +- 10 files changed, 260 insertions(+), 172 deletions(-) diff --git a/NuGet.config b/NuGet.config index 6d46687773..1f39c78b51 100644 --- a/NuGet.config +++ b/NuGet.config @@ -6,6 +6,9 @@ + + + diff --git a/eng/AuxMsbuildFiles/SdkPackOverrides.targets b/eng/AuxMsbuildFiles/SdkPackOverrides.targets index a340d8901d..b6ea891c10 100644 --- a/eng/AuxMsbuildFiles/SdkPackOverrides.targets +++ b/eng/AuxMsbuildFiles/SdkPackOverrides.targets @@ -110,6 +110,32 @@ $(AspNetVersion10) + + + $(RuntimeVersion80) + + + $(RuntimeVersion90) + + + $(RuntimeVersion10) + + + + $(RuntimeVersion80) + + + $(RuntimeVersion90) + + + $(RuntimeVersion10) + diff --git a/eng/Version.Details.props b/eng/Version.Details.props index 0278cb4990..85b11c1951 100644 --- a/eng/Version.Details.props +++ b/eng/Version.Details.props @@ -13,23 +13,23 @@ This file should be imported by eng/Versions.props 1.0.105-preview.225 - 10.0.0-rtm.25476.104 - 10.0.0-rtm.25476.104 - 5.0.0-2.25476.104 - 5.0.0-2.25476.104 - 5.0.0-2.25476.104 - 10.0.100-rtm.25476.104 - 10.0.0-beta.25476.104 - 10.0.0-beta.25476.104 - 10.0.100-rtm.25476.104 - 10.0.0-rtm.25476.104 - 10.0.0-rtm.25476.104 - 10.0.0-rtm.25476.104 - 10.0.0-rtm.25476.104 - 10.0.0-rtm.25476.104 - 10.0.0-rtm.25476.104 - 10.0.0-rtm.25476.104 - 10.0.0-rtm.25476.104 + 10.0.1 + 10.0.1-servicing.25555.106 + 5.0.0-2.25555.106 + 5.0.0-2.25555.106 + 5.0.0-2.25555.106 + 10.0.101 + 10.0.0-beta.25555.106 + 10.0.0-beta.25555.106 + 10.0.101-servicing.25555.106 + 10.0.1 + 10.0.1-servicing.25555.106 + 10.0.1-servicing.25555.106 + 10.0.1-servicing.25555.106 + 10.0.1-servicing.25555.106 + 10.0.1-servicing.25555.106 + 10.0.1-servicing.25555.106 + 10.0.1-servicing.25555.106 7.0.0-beta.22316.2 diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index 694524f573..c261c24bf5 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -19,88 +19,88 @@ - + https://github.com/dotnet/dotnet - e1eaf1bbd9702e9b6ee9b10dbc94105732e07896 + e17b0d08def649f30aed9c09cf4a2c5741a3c76c - + https://github.com/dotnet/dotnet - e1eaf1bbd9702e9b6ee9b10dbc94105732e07896 + e17b0d08def649f30aed9c09cf4a2c5741a3c76c https://github.com/dotnet/arcade ccfe6da198c5f05534863bbb1bff66e830e0c6ab - + https://github.com/dotnet/dotnet - e1eaf1bbd9702e9b6ee9b10dbc94105732e07896 + e17b0d08def649f30aed9c09cf4a2c5741a3c76c - + https://github.com/dotnet/dotnet - e1eaf1bbd9702e9b6ee9b10dbc94105732e07896 + e17b0d08def649f30aed9c09cf4a2c5741a3c76c - + https://github.com/dotnet/dotnet - e1eaf1bbd9702e9b6ee9b10dbc94105732e07896 + e17b0d08def649f30aed9c09cf4a2c5741a3c76c - + https://github.com/dotnet/dotnet - e1eaf1bbd9702e9b6ee9b10dbc94105732e07896 + e17b0d08def649f30aed9c09cf4a2c5741a3c76c - + https://github.com/dotnet/dotnet - e1eaf1bbd9702e9b6ee9b10dbc94105732e07896 + e17b0d08def649f30aed9c09cf4a2c5741a3c76c - + https://github.com/dotnet/dotnet - e1eaf1bbd9702e9b6ee9b10dbc94105732e07896 + e17b0d08def649f30aed9c09cf4a2c5741a3c76c - + https://github.com/dotnet/dotnet - e1eaf1bbd9702e9b6ee9b10dbc94105732e07896 + e17b0d08def649f30aed9c09cf4a2c5741a3c76c - + https://github.com/dotnet/dotnet - e1eaf1bbd9702e9b6ee9b10dbc94105732e07896 + e17b0d08def649f30aed9c09cf4a2c5741a3c76c - + https://github.com/dotnet/dotnet - e1eaf1bbd9702e9b6ee9b10dbc94105732e07896 + e17b0d08def649f30aed9c09cf4a2c5741a3c76c - + https://github.com/dotnet/dotnet - e1eaf1bbd9702e9b6ee9b10dbc94105732e07896 + e17b0d08def649f30aed9c09cf4a2c5741a3c76c - + https://github.com/dotnet/dotnet - e1eaf1bbd9702e9b6ee9b10dbc94105732e07896 + e17b0d08def649f30aed9c09cf4a2c5741a3c76c - + https://github.com/dotnet/dotnet - e1eaf1bbd9702e9b6ee9b10dbc94105732e07896 + e17b0d08def649f30aed9c09cf4a2c5741a3c76c - + https://github.com/dotnet/dotnet - e1eaf1bbd9702e9b6ee9b10dbc94105732e07896 + e17b0d08def649f30aed9c09cf4a2c5741a3c76c - + https://github.com/dotnet/dotnet - e1eaf1bbd9702e9b6ee9b10dbc94105732e07896 + e17b0d08def649f30aed9c09cf4a2c5741a3c76c - + https://github.com/dotnet/dotnet - e1eaf1bbd9702e9b6ee9b10dbc94105732e07896 + e17b0d08def649f30aed9c09cf4a2c5741a3c76c diff --git a/eng/Versions.props b/eng/Versions.props index 499e37ea10..13d605ccef 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -87,8 +87,8 @@ --> - 9.0.4 - 8.0.15 + 9.0.10 + 8.0.21 default diff --git a/eng/common/SetupNugetSources.ps1 b/eng/common/SetupNugetSources.ps1 index 9445c31432..65ed3a8ade 100644 --- a/eng/common/SetupNugetSources.ps1 +++ b/eng/common/SetupNugetSources.ps1 @@ -1,13 +1,14 @@ # This script adds internal feeds required to build commits that depend on internal package sources. For instance, -# dotnet6-internal would be added automatically if dotnet6 was found in the nuget.config file. In addition also enables -# disabled internal Maestro (darc-int*) feeds. +# dotnet6-internal would be added automatically if dotnet6 was found in the nuget.config file. Similarly, +# dotnet-eng-internal and dotnet-tools-internal are added if dotnet-eng and dotnet-tools are present. +# In addition, this script also enables disabled internal Maestro (darc-int*) feeds. # # Optionally, this script also adds a credential entry for each of the internal feeds if supplied. # # See example call for this script below. # # - task: PowerShell@2 -# displayName: Setup Private Feeds Credentials +# displayName: Setup internal Feeds Credentials # condition: eq(variables['Agent.OS'], 'Windows_NT') # inputs: # filePath: $(System.DefaultWorkingDirectory)/eng/common/SetupNugetSources.ps1 @@ -34,19 +35,28 @@ Set-StrictMode -Version 2.0 . $PSScriptRoot\tools.ps1 +# Adds or enables the package source with the given name +function AddOrEnablePackageSource($sources, $disabledPackageSources, $SourceName, $SourceEndPoint, $creds, $Username, $pwd) { + if ($disabledPackageSources -eq $null -or -not (EnableInternalPackageSource -DisabledPackageSources $disabledPackageSources -Creds $creds -PackageSourceName $SourceName)) { + AddPackageSource -Sources $sources -SourceName $SourceName -SourceEndPoint $SourceEndPoint -Creds $creds -Username $userName -pwd $Password + } +} + # Add source entry to PackageSources function AddPackageSource($sources, $SourceName, $SourceEndPoint, $creds, $Username, $pwd) { $packageSource = $sources.SelectSingleNode("add[@key='$SourceName']") if ($packageSource -eq $null) { + Write-Host "Adding package source $SourceName" + $packageSource = $doc.CreateElement("add") $packageSource.SetAttribute("key", $SourceName) $packageSource.SetAttribute("value", $SourceEndPoint) $sources.AppendChild($packageSource) | Out-Null } else { - Write-Host "Package source $SourceName already present." + Write-Host "Package source $SourceName already present and enabled." } AddCredential -Creds $creds -Source $SourceName -Username $Username -pwd $pwd @@ -59,6 +69,8 @@ function AddCredential($creds, $source, $username, $pwd) { return; } + Write-Host "Inserting credential for feed: " $source + # Looks for credential configuration for the given SourceName. Create it if none is found. $sourceElement = $creds.SelectSingleNode($Source) if ($sourceElement -eq $null) @@ -91,24 +103,27 @@ function AddCredential($creds, $source, $username, $pwd) { $passwordElement.SetAttribute("value", $pwd) } -function InsertMaestroPrivateFeedCredentials($Sources, $Creds, $Username, $pwd) { - $maestroPrivateSources = $Sources.SelectNodes("add[contains(@key,'darc-int')]") - - Write-Host "Inserting credentials for $($maestroPrivateSources.Count) Maestro's private feeds." - - ForEach ($PackageSource in $maestroPrivateSources) { - Write-Host "`tInserting credential for Maestro's feed:" $PackageSource.Key - AddCredential -Creds $creds -Source $PackageSource.Key -Username $Username -pwd $pwd +# Enable all darc-int package sources. +function EnableMaestroInternalPackageSources($DisabledPackageSources, $Creds) { + $maestroInternalSources = $DisabledPackageSources.SelectNodes("add[contains(@key,'darc-int')]") + ForEach ($DisabledPackageSource in $maestroInternalSources) { + EnableInternalPackageSource -DisabledPackageSources $DisabledPackageSources -Creds $Creds -PackageSourceName $DisabledPackageSource.key } } -function EnablePrivatePackageSources($DisabledPackageSources) { - $maestroPrivateSources = $DisabledPackageSources.SelectNodes("add[contains(@key,'darc-int')]") - ForEach ($DisabledPackageSource in $maestroPrivateSources) { - Write-Host "`tEnsuring private source '$($DisabledPackageSource.key)' is enabled by deleting it from disabledPackageSource" +# Enables an internal package source by name, if found. Returns true if the package source was found and enabled, false otherwise. +function EnableInternalPackageSource($DisabledPackageSources, $Creds, $PackageSourceName) { + $DisabledPackageSource = $DisabledPackageSources.SelectSingleNode("add[@key='$PackageSourceName']") + if ($DisabledPackageSource) { + Write-Host "Enabling internal source '$($DisabledPackageSource.key)'." + # Due to https://github.com/NuGet/Home/issues/10291, we must actually remove the disabled entries $DisabledPackageSources.RemoveChild($DisabledPackageSource) + + AddCredential -Creds $creds -Source $DisabledPackageSource.Key -Username $userName -pwd $Password + return $true } + return $false } if (!(Test-Path $ConfigFile -PathType Leaf)) { @@ -121,15 +136,17 @@ $doc = New-Object System.Xml.XmlDocument $filename = (Get-Item $ConfigFile).FullName $doc.Load($filename) -# Get reference to or create one if none exist already +# Get reference to - fail if none exist $sources = $doc.DocumentElement.SelectSingleNode("packageSources") if ($sources -eq $null) { - $sources = $doc.CreateElement("packageSources") - $doc.DocumentElement.AppendChild($sources) | Out-Null + Write-PipelineTelemetryError -Category 'Build' -Message "Eng/common/SetupNugetSources.ps1 returned a non-zero exit code. NuGet config file must contain a packageSources section: $ConfigFile" + ExitWithExitCode 1 } $creds = $null +$feedSuffix = "v3/index.json" if ($Password) { + $feedSuffix = "v2" # Looks for a node. Create it if none is found. $creds = $doc.DocumentElement.SelectSingleNode("packageSourceCredentials") if ($creds -eq $null) { @@ -138,34 +155,35 @@ if ($Password) { } } +$userName = "dn-bot" + # Check for disabledPackageSources; we'll enable any darc-int ones we find there $disabledSources = $doc.DocumentElement.SelectSingleNode("disabledPackageSources") if ($disabledSources -ne $null) { Write-Host "Checking for any darc-int disabled package sources in the disabledPackageSources node" - EnablePrivatePackageSources -DisabledPackageSources $disabledSources + EnableMaestroInternalPackageSources -DisabledPackageSources $disabledSources -Creds $creds } - -$userName = "dn-bot" - -# Insert credential nodes for Maestro's private feeds -InsertMaestroPrivateFeedCredentials -Sources $sources -Creds $creds -Username $userName -pwd $Password - -# 3.1 uses a different feed url format so it's handled differently here -$dotnet31Source = $sources.SelectSingleNode("add[@key='dotnet3.1']") -if ($dotnet31Source -ne $null) { - AddPackageSource -Sources $sources -SourceName "dotnet3.1-internal" -SourceEndPoint "https://pkgs.dev.azure.com/dnceng/_packaging/dotnet3.1-internal/nuget/v2" -Creds $creds -Username $userName -pwd $Password - AddPackageSource -Sources $sources -SourceName "dotnet3.1-internal-transport" -SourceEndPoint "https://pkgs.dev.azure.com/dnceng/_packaging/dotnet3.1-internal-transport/nuget/v2" -Creds $creds -Username $userName -pwd $Password -} - $dotnetVersions = @('5','6','7','8','9','10') foreach ($dotnetVersion in $dotnetVersions) { $feedPrefix = "dotnet" + $dotnetVersion; $dotnetSource = $sources.SelectSingleNode("add[@key='$feedPrefix']") if ($dotnetSource -ne $null) { - AddPackageSource -Sources $sources -SourceName "$feedPrefix-internal" -SourceEndPoint "https://pkgs.dev.azure.com/dnceng/internal/_packaging/$feedPrefix-internal/nuget/v2" -Creds $creds -Username $userName -pwd $Password - AddPackageSource -Sources $sources -SourceName "$feedPrefix-internal-transport" -SourceEndPoint "https://pkgs.dev.azure.com/dnceng/internal/_packaging/$feedPrefix-internal-transport/nuget/v2" -Creds $creds -Username $userName -pwd $Password + AddOrEnablePackageSource -Sources $sources -DisabledPackageSources $disabledSources -SourceName "$feedPrefix-internal" -SourceEndPoint "https://pkgs.dev.azure.com/dnceng/internal/_packaging/$feedPrefix-internal/nuget/$feedSuffix" -Creds $creds -Username $userName -pwd $Password + AddOrEnablePackageSource -Sources $sources -DisabledPackageSources $disabledSources -SourceName "$feedPrefix-internal-transport" -SourceEndPoint "https://pkgs.dev.azure.com/dnceng/internal/_packaging/$feedPrefix-internal-transport/nuget/$feedSuffix" -Creds $creds -Username $userName -pwd $Password } } +# Check for dotnet-eng and add dotnet-eng-internal if present +$dotnetEngSource = $sources.SelectSingleNode("add[@key='dotnet-eng']") +if ($dotnetEngSource -ne $null) { + AddOrEnablePackageSource -Sources $sources -DisabledPackageSources $disabledSources -SourceName "dotnet-eng-internal" -SourceEndPoint "https://pkgs.dev.azure.com/dnceng/internal/_packaging/dotnet-eng-internal/nuget/$feedSuffix" -Creds $creds -Username $userName -pwd $Password +} + +# Check for dotnet-tools and add dotnet-tools-internal if present +$dotnetToolsSource = $sources.SelectSingleNode("add[@key='dotnet-tools']") +if ($dotnetToolsSource -ne $null) { + AddOrEnablePackageSource -Sources $sources -DisabledPackageSources $disabledSources -SourceName "dotnet-tools-internal" -SourceEndPoint "https://pkgs.dev.azure.com/dnceng/internal/_packaging/dotnet-tools-internal/nuget/$feedSuffix" -Creds $creds -Username $userName -pwd $Password +} + $doc.Save($filename) diff --git a/eng/common/SetupNugetSources.sh b/eng/common/SetupNugetSources.sh index ddf4efc81a..b2163abbe7 100755 --- a/eng/common/SetupNugetSources.sh +++ b/eng/common/SetupNugetSources.sh @@ -1,8 +1,9 @@ #!/usr/bin/env bash # This script adds internal feeds required to build commits that depend on internal package sources. For instance, -# dotnet6-internal would be added automatically if dotnet6 was found in the nuget.config file. In addition also enables -# disabled internal Maestro (darc-int*) feeds. +# dotnet6-internal would be added automatically if dotnet6 was found in the nuget.config file. Similarly, +# dotnet-eng-internal and dotnet-tools-internal are added if dotnet-eng and dotnet-tools are present. +# In addition, this script also enables disabled internal Maestro (darc-int*) feeds. # # Optionally, this script also adds a credential entry for each of the internal feeds if supplied. # @@ -52,81 +53,139 @@ if [[ `uname -s` == "Darwin" ]]; then TB='' fi -# Ensure there is a ... section. -grep -i "" $ConfigFile -if [ "$?" != "0" ]; then - echo "Adding ... section." - ConfigNodeHeader="" - PackageSourcesTemplate="${TB}${NL}${TB}" +# Enables an internal package source by name, if found. Returns 0 if found and enabled, 1 if not found. +EnableInternalPackageSource() { + local PackageSourceName="$1" + + # Check if disabledPackageSources section exists + grep -i "" "$ConfigFile" > /dev/null + if [ "$?" != "0" ]; then + return 1 # No disabled sources section + fi + + # Check if this source name is disabled + grep -i " /dev/null + if [ "$?" == "0" ]; then + echo "Enabling internal source '$PackageSourceName'." + # Remove the disabled entry (including any surrounding comments or whitespace on the same line) + sed -i.bak "//d" "$ConfigFile" + + # Add the source name to PackageSources for credential handling + PackageSources+=("$PackageSourceName") + return 0 # Found and enabled + fi + + return 1 # Not found in disabled sources +} + +# Add source entry to PackageSources +AddPackageSource() { + local SourceName="$1" + local SourceEndPoint="$2" + + # Check if source already exists + grep -i " /dev/null + if [ "$?" == "0" ]; then + echo "Package source $SourceName already present and enabled." + PackageSources+=("$SourceName") + return + fi + + echo "Adding package source $SourceName" + PackageSourcesNodeFooter="" + PackageSourceTemplate="${TB}" + + sed -i.bak "s|$PackageSourcesNodeFooter|$PackageSourceTemplate${NL}$PackageSourcesNodeFooter|" "$ConfigFile" + PackageSources+=("$SourceName") +} + +# Adds or enables the package source with the given name +AddOrEnablePackageSource() { + local SourceName="$1" + local SourceEndPoint="$2" + + # Try to enable if disabled, if not found then add new source + EnableInternalPackageSource "$SourceName" + if [ "$?" != "0" ]; then + AddPackageSource "$SourceName" "$SourceEndPoint" + fi +} - sed -i.bak "s|$ConfigNodeHeader|$ConfigNodeHeader${NL}$PackageSourcesTemplate|" $ConfigFile -fi +# Enable all darc-int package sources +EnableMaestroInternalPackageSources() { + # Check if disabledPackageSources section exists + grep -i "" "$ConfigFile" > /dev/null + if [ "$?" != "0" ]; then + return # No disabled sources section + fi + + # Find all darc-int disabled sources + local DisabledDarcIntSources=() + DisabledDarcIntSources+=$(grep -oh '"darc-int-[^"]*" value="true"' "$ConfigFile" | tr -d '"') + + for DisabledSourceName in ${DisabledDarcIntSources[@]} ; do + if [[ $DisabledSourceName == darc-int* ]]; then + EnableInternalPackageSource "$DisabledSourceName" + fi + done +} -# Ensure there is a ... section. -grep -i "" $ConfigFile +# Ensure there is a ... section. +grep -i "" $ConfigFile if [ "$?" != "0" ]; then - echo "Adding ... section." - - PackageSourcesNodeFooter="" - PackageSourceCredentialsTemplate="${TB}${NL}${TB}" - - sed -i.bak "s|$PackageSourcesNodeFooter|$PackageSourcesNodeFooter${NL}$PackageSourceCredentialsTemplate|" $ConfigFile + Write-PipelineTelemetryError -Category 'Build' "Error: Eng/common/SetupNugetSources.sh returned a non-zero exit code. NuGet config file must contain a packageSources section: $ConfigFile" + ExitWithExitCode 1 fi PackageSources=() -# Ensure dotnet3.1-internal and dotnet3.1-internal-transport are in the packageSources if the public dotnet3.1 feeds are present -grep -i "... section. + grep -i "" $ConfigFile if [ "$?" != "0" ]; then - echo "Adding dotnet3.1-internal to the packageSources." - PackageSourcesNodeFooter="" - PackageSourceTemplate="${TB}" + echo "Adding ... section." - sed -i.bak "s|$PackageSourcesNodeFooter|$PackageSourceTemplate${NL}$PackageSourcesNodeFooter|" $ConfigFile - fi - PackageSources+=('dotnet3.1-internal') - - grep -i "" $ConfigFile - if [ "$?" != "0" ]; then - echo "Adding dotnet3.1-internal-transport to the packageSources." PackageSourcesNodeFooter="" - PackageSourceTemplate="${TB}" + PackageSourceCredentialsTemplate="${TB}${NL}${TB}" - sed -i.bak "s|$PackageSourcesNodeFooter|$PackageSourceTemplate${NL}$PackageSourcesNodeFooter|" $ConfigFile + sed -i.bak "s|$PackageSourcesNodeFooter|$PackageSourcesNodeFooter${NL}$PackageSourceCredentialsTemplate|" $ConfigFile fi - PackageSources+=('dotnet3.1-internal-transport') +fi + +# Check for disabledPackageSources; we'll enable any darc-int ones we find there +grep -i "" $ConfigFile > /dev/null +if [ "$?" == "0" ]; then + echo "Checking for any darc-int disabled package sources in the disabledPackageSources node" + EnableMaestroInternalPackageSources fi DotNetVersions=('5' '6' '7' '8' '9' '10') for DotNetVersion in ${DotNetVersions[@]} ; do FeedPrefix="dotnet${DotNetVersion}"; - grep -i " /dev/null if [ "$?" == "0" ]; then - grep -i "" - - sed -i.bak "s|$PackageSourcesNodeFooter|$PackageSourceTemplate${NL}$PackageSourcesNodeFooter|" $ConfigFile - fi - PackageSources+=("$FeedPrefix-internal") - - grep -i "" $ConfigFile - if [ "$?" != "0" ]; then - echo "Adding $FeedPrefix-internal-transport to the packageSources." - PackageSourcesNodeFooter="" - PackageSourceTemplate="${TB}" - - sed -i.bak "s|$PackageSourcesNodeFooter|$PackageSourceTemplate${NL}$PackageSourcesNodeFooter|" $ConfigFile - fi - PackageSources+=("$FeedPrefix-internal-transport") + AddOrEnablePackageSource "$FeedPrefix-internal" "https://pkgs.dev.azure.com/dnceng/internal/_packaging/$FeedPrefix-internal/nuget/$FeedSuffix" + AddOrEnablePackageSource "$FeedPrefix-internal-transport" "https://pkgs.dev.azure.com/dnceng/internal/_packaging/$FeedPrefix-internal-transport/nuget/$FeedSuffix" fi done +# Check for dotnet-eng and add dotnet-eng-internal if present +grep -i " /dev/null +if [ "$?" == "0" ]; then + AddOrEnablePackageSource "dotnet-eng-internal" "https://pkgs.dev.azure.com/dnceng/internal/_packaging/dotnet-eng-internal/nuget/$FeedSuffix" +fi + +# Check for dotnet-tools and add dotnet-tools-internal if present +grep -i " /dev/null +if [ "$?" == "0" ]; then + AddOrEnablePackageSource "dotnet-tools-internal" "https://pkgs.dev.azure.com/dnceng/internal/_packaging/dotnet-tools-internal/nuget/$FeedSuffix" +fi + # I want things split line by line PrevIFS=$IFS IFS=$'\n' @@ -139,29 +198,12 @@ if [ "$CredToken" ]; then # Check if there is no existing credential for this FeedName grep -i "<$FeedName>" $ConfigFile if [ "$?" != "0" ]; then - echo "Adding credentials for $FeedName." + echo " Inserting credential for feed: $FeedName" PackageSourceCredentialsNodeFooter="" - NewCredential="${TB}${TB}<$FeedName>${NL}${NL}${NL}" + NewCredential="${TB}${TB}<$FeedName>${NL}${TB}${NL}${TB}${TB}${NL}${TB}${TB}" sed -i.bak "s|$PackageSourceCredentialsNodeFooter|$NewCredential${NL}$PackageSourceCredentialsNodeFooter|" $ConfigFile fi done fi - -# Re-enable any entries in disabledPackageSources where the feed name contains darc-int -grep -i "" $ConfigFile -if [ "$?" == "0" ]; then - DisabledDarcIntSources=() - echo "Re-enabling any disabled \"darc-int\" package sources in $ConfigFile" - DisabledDarcIntSources+=$(grep -oh '"darc-int-[^"]*" value="true"' $ConfigFile | tr -d '"') - for DisabledSourceName in ${DisabledDarcIntSources[@]} ; do - if [[ $DisabledSourceName == darc-int* ]] - then - OldDisableValue="" - NewDisableValue="" - sed -i.bak "s|$OldDisableValue|$NewDisableValue|" $ConfigFile - echo "Neutralized disablePackageSources entry for '$DisabledSourceName'" - fi - done -fi diff --git a/eng/common/core-templates/steps/install-microbuild.yml b/eng/common/core-templates/steps/install-microbuild.yml index d6b9878f54..f2248ebfd7 100644 --- a/eng/common/core-templates/steps/install-microbuild.yml +++ b/eng/common/core-templates/steps/install-microbuild.yml @@ -11,23 +11,22 @@ parameters: # Unfortunately, _SignType can't be used to exclude the use of the service connection in non-real sign scenarios. The # variable is not available in template expression. _SignType has a very large proliferation across .NET, so replacing it is tough. microbuildUseESRP: true - # Location of the MicroBuild output folder - # NOTE: There's something that relies on this being in the "default" source directory for tasks such as Signing to work properly. - microBuildOutputFolder: '$(Build.SourcesDirectory)' continueOnError: false steps: - ${{ if eq(parameters.enableMicrobuild, 'true') }}: - ${{ if eq(parameters.enableMicrobuildForMacAndLinux, 'true') }}: - # Needed to download the MicroBuild plugin nupkgs on Mac and Linux when nuget.exe is unavailable + # Installing .NET 8 is required to use the MicroBuild signing plugin on non-Windows platforms - task: UseDotNet@2 displayName: Install .NET 8.0 SDK for MicroBuild Plugin inputs: packageType: sdk version: 8.0.x - installationPath: ${{ parameters.microBuildOutputFolder }}/.dotnet - workingDirectory: ${{ parameters.microBuildOutputFolder }} + # Installing the SDK in a '.dotnet-microbuild' directory is required for signing. + # See target FindDotNetPathForMicroBuild in arcade/src/Microsoft.DotNet.Arcade.Sdk/tools/Sign.proj + # Do not remove '.dotnet-microbuild' from the path without changing the corresponding logic. + installationPath: $(Agent.TempDirectory)/.dotnet-microbuild condition: and(succeeded(), ne(variables['Agent.Os'], 'Windows_NT')) - script: | @@ -65,7 +64,7 @@ steps: ConnectedPMEServiceName: 248d384a-b39b-46e3-8ad5-c2c210d5e7ca env: TeamName: $(_TeamName) - MicroBuildOutputFolderOverride: ${{ parameters.microBuildOutputFolder }} + MicroBuildOutputFolderOverride: $(Agent.TempDirectory)/MicroBuild SYSTEM_ACCESSTOKEN: $(System.AccessToken) continueOnError: ${{ parameters.continueOnError }} condition: and(succeeded(), eq(variables['Agent.Os'], 'Windows_NT'), in(variables['_SignType'], 'real', 'test')) @@ -85,7 +84,7 @@ steps: ConnectedPMEServiceName: c24de2a5-cc7a-493d-95e4-8e5ff5cad2bc env: TeamName: $(_TeamName) - MicroBuildOutputFolderOverride: ${{ parameters.microBuildOutputFolder }} + MicroBuildOutputFolderOverride: $(Agent.TempDirectory)/MicroBuild SYSTEM_ACCESSTOKEN: $(System.AccessToken) continueOnError: ${{ parameters.continueOnError }} condition: and(succeeded(), ne(variables['Agent.Os'], 'Windows_NT'), eq(variables['_SignType'], 'real')) diff --git a/eng/common/post-build/nuget-verification.ps1 b/eng/common/post-build/nuget-verification.ps1 index a365194a93..ac5c69ffca 100644 --- a/eng/common/post-build/nuget-verification.ps1 +++ b/eng/common/post-build/nuget-verification.ps1 @@ -30,7 +30,7 @@ [CmdletBinding(PositionalBinding = $false)] param( [string]$NuGetExePath, - [string]$PackageSource = "https://api.nuget.org/v3/index.json", + [string]$PackageSource = "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public/nuget/v3/index.json", [string]$DownloadPath, [Parameter(ValueFromRemainingArguments = $true)] [string[]]$args diff --git a/global.json b/global.json index 3cf65e2ca3..e990786896 100644 --- a/global.json +++ b/global.json @@ -18,6 +18,6 @@ "msbuild-sdks": { "Microsoft.Build.NoTargets": "3.5.0", "Microsoft.Build.Traversal": "3.4.0", - "Microsoft.DotNet.Arcade.Sdk": "10.0.0-beta.25476.104" + "Microsoft.DotNet.Arcade.Sdk": "10.0.0-beta.25555.106" } } From ea6796b6d0556f8ab3c01d0c0d8f234fdfdf1d73 Mon Sep 17 00:00:00 2001 From: Juan Hoyos <19413848+hoyosjs@users.noreply.github.com> Date: Fri, 7 Nov 2025 15:05:52 -0800 Subject: [PATCH 25/44] Fix and enforce CFS violations (#5638) --- eng/pipelines/prepare-release.yml | 4 +--- eng/pipelines/templateInternal.yml | 3 +++ 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/eng/pipelines/prepare-release.yml b/eng/pipelines/prepare-release.yml index e5f2ce1194..0b547a4690 100644 --- a/eng/pipelines/prepare-release.yml +++ b/eng/pipelines/prepare-release.yml @@ -33,13 +33,11 @@ stages: condition: succeeded() variables: - ${{ if and(eq(parameters.isOfficialBuild, true), or(startsWith(variables['Build.SourceBranch'], 'refs/heads/release/'), startsWith(variables['Build.SourceBranch'], 'refs/heads/internal/release/'))) }}: - - group: DotNet-Diagnostics-Storage - group: Release-Pipeline steps: - ${{ if or(eq(parameters.isOfficialBuild, false), eq(variables['Build.SourceBranch'], 'refs/heads/main')) }}: - - script: '$(Build.Repository.LocalPath)\dotnet.cmd build $(Build.Repository.LocalPath)\eng\release\DiagnosticsReleaseTool\DiagnosticsReleaseTool.csproj -c Release /bl' - workingDirectory: '$(System.ArtifactsDirectory)' + - script: '$(Build.Repository.LocalPath)\dotnet.cmd build $(Build.Repository.LocalPath)\eng\release\DiagnosticsReleaseTool\DiagnosticsReleaseTool.csproj -c Release' displayName: 'Build Manifest generation and asset publishing tool' - ${{ elseif and(eq(parameters.isOfficialBuild, true), or(startsWith(variables['Build.SourceBranch'], 'refs/heads/release/'), startsWith(variables['Build.SourceBranch'], 'refs/heads/internal/release/'))) }}: - task: UseDotNet@2 diff --git a/eng/pipelines/templateInternal.yml b/eng/pipelines/templateInternal.yml index af64305fd9..2f2c05b298 100644 --- a/eng/pipelines/templateInternal.yml +++ b/eng/pipelines/templateInternal.yml @@ -29,6 +29,9 @@ extends: enabled: true tsa: enabled: true + settings: + # Do not add CFSClean2 yet - microbuild needs some endpoints behind it. + networkIsolationPolicy: Permissive,CFSClean featureFlags: autoBaseline: true From 6eeb6287fd8eb1cb1f689836e9fc34e07cd8efff Mon Sep 17 00:00:00 2001 From: Mitchell Hwang <16830051+mdh1418@users.noreply.github.com> Date: Fri, 21 Nov 2025 10:29:52 -0500 Subject: [PATCH 26/44] [Tests][CollectLinux] Reduce redundant unsupported validation (#5642) As functional test cases increase, validating unsupported behavior becomes more redundant. Instead, leverage ConditionalFact and ConditionalTheory attributes from Microsoft.DotNet.XUnitExtensions https://github.com/dotnet/arcade/tree/main/src/Microsoft.DotNet.XUnitExtensions.Shared/Attributes to simplify test logic. --- eng/Versions.props | 1 + .../CollectLinuxCommandFunctionalTests.cs | 51 ++++++++----------- .../dotnet-trace/DotnetTrace.UnitTests.csproj | 4 ++ 3 files changed, 27 insertions(+), 29 deletions(-) diff --git a/eng/Versions.props b/eng/Versions.props index 13d605ccef..82fe464071 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -30,6 +30,7 @@ 9.0.8 17.10.0-beta1.24272.1 3.1.23 + 11.0.0-beta.25528.108 8.0.1 8.0.3 8.0.1 diff --git a/src/tests/dotnet-trace/CollectLinuxCommandFunctionalTests.cs b/src/tests/dotnet-trace/CollectLinuxCommandFunctionalTests.cs index f9b7616cf5..c37c3ec12e 100644 --- a/src/tests/dotnet-trace/CollectLinuxCommandFunctionalTests.cs +++ b/src/tests/dotnet-trace/CollectLinuxCommandFunctionalTests.cs @@ -5,12 +5,13 @@ using System.Collections.Generic; using System.CommandLine; using System.IO; +using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; -using System.Linq; using Microsoft.Diagnostics.Tests.Common; using Microsoft.Diagnostics.Tools.Trace; +using Microsoft.DotNet.XUnitExtensions; using Microsoft.Internal.Common.Utils; using Xunit; @@ -18,6 +19,8 @@ namespace Microsoft.Diagnostics.Tools.Trace { public class CollectLinuxCommandFunctionalTests { + public static bool IsCollectLinuxSupported => CollectLinuxCommandHandler.IsSupported(); + public static bool IsCollectLinuxNotSupported => !CollectLinuxCommandHandler.IsSupported(); private static CollectLinuxCommandHandler.CollectLinuxArgs TestArgs( CancellationToken ct = default, string[] providers = null, @@ -42,46 +45,36 @@ private static CollectLinuxCommandHandler.CollectLinuxArgs TestArgs( processId); } - [Theory] + [ConditionalTheory(nameof(IsCollectLinuxSupported))] [MemberData(nameof(BasicCases))] public void CollectLinuxCommandProviderConfigurationConsolidation(object testArgs, string[] expectedLines) { MockConsole console = new(200, 30); int exitCode = Run(testArgs, console); - if (CollectLinuxCommandHandler.IsSupported()) - { - Assert.Equal((int)ReturnCode.Ok, exitCode); - console.AssertSanitizedLinesEqual(CollectLinuxSanitizer, expectedLines); - } - else - { - Assert.Equal((int)ReturnCode.PlatformNotSupportedError, exitCode); - console.AssertSanitizedLinesEqual(null, new string[] { - $"The collect-linux command is not supported on this platform.", - $"For requirements, please visit https://learn.microsoft.com/en-us/dotnet/core/diagnostics/dotnet-trace." - }); - } + Assert.Equal((int)ReturnCode.Ok, exitCode); + console.AssertSanitizedLinesEqual(CollectLinuxSanitizer, expectedLines); } - [Theory] + [ConditionalTheory(nameof(IsCollectLinuxSupported))] [MemberData(nameof(InvalidProviders))] public void CollectLinuxCommandProviderConfigurationConsolidation_Throws(object testArgs, string[] expectedException) { MockConsole console = new(200, 30); int exitCode = Run(testArgs, console); - if (CollectLinuxCommandHandler.IsSupported()) - { - Assert.Equal((int)ReturnCode.ArgumentError, exitCode); - console.AssertSanitizedLinesEqual(null, expectedException); - } - else - { - Assert.Equal((int)ReturnCode.PlatformNotSupportedError, exitCode); - console.AssertSanitizedLinesEqual(null, new string[] { - $"The collect-linux command is not supported on this platform.", - $"For requirements, please visit https://learn.microsoft.com/en-us/dotnet/core/diagnostics/dotnet-trace." - }); - } + Assert.Equal((int)ReturnCode.ArgumentError, exitCode); + console.AssertSanitizedLinesEqual(null, expectedException); + } + + [ConditionalFact(nameof(IsCollectLinuxNotSupported))] + public void CollectLinuxCommand_NotSupported_OnNonLinux() + { + MockConsole console = new(200, 30); + int exitCode = Run(TestArgs(), console); + Assert.Equal((int)ReturnCode.PlatformNotSupportedError, exitCode); + console.AssertSanitizedLinesEqual(null, new string[] { + "The collect-linux command is not supported on this platform.", + "For requirements, please visit https://learn.microsoft.com/en-us/dotnet/core/diagnostics/dotnet-trace." + }); } private static int Run(object args, MockConsole console) diff --git a/src/tests/dotnet-trace/DotnetTrace.UnitTests.csproj b/src/tests/dotnet-trace/DotnetTrace.UnitTests.csproj index d1518411ff..1f62530a1c 100644 --- a/src/tests/dotnet-trace/DotnetTrace.UnitTests.csproj +++ b/src/tests/dotnet-trace/DotnetTrace.UnitTests.csproj @@ -4,6 +4,10 @@ $(NetCoreAppMinTargetFramework) + + + + From a1564fbf18ce0f28a4d9eefb7431ce4cb9b412e8 Mon Sep 17 00:00:00 2001 From: Mitchell Hwang <16830051+mdh1418@users.noreply.github.com> Date: Fri, 21 Nov 2025 22:57:51 -0500 Subject: [PATCH 27/44] [Tests] Add CommandUtils Exception Validation Test Cases (#5643) Now that https://github.com/dotnet/diagnostics/pull/5622 enables redirecting exception messages from CommandUtils, add corresponding tests to dotnet-trace functional tests. --- .../CommandLine/Commands/CollectCommand.cs | 10 +++- .../CollectCommandFunctionalTests.cs | 35 +++++++++++- .../CollectLinuxCommandFunctionalTests.cs | 55 +++++++++++++++++++ 3 files changed, 96 insertions(+), 4 deletions(-) diff --git a/src/Tools/dotnet-trace/CommandLine/Commands/CollectCommand.cs b/src/Tools/dotnet-trace/CommandLine/Commands/CollectCommand.cs index 9c6ec43d63..c72f43686c 100644 --- a/src/Tools/dotnet-trace/CommandLine/Commands/CollectCommand.cs +++ b/src/Tools/dotnet-trace/CommandLine/Commands/CollectCommand.cs @@ -29,6 +29,7 @@ public CollectCommandHandler(IConsole console = null) StartTraceSessionAsync = async (client, config, ct) => new CollectSession(await client.StartEventPipeSessionAsync(config, ct).ConfigureAwait(false)); ResumeRuntimeAsync = (client, ct) => client.ResumeRuntimeAsync(ct); CollectSessionEventStream = (name) => new FileStream(name, FileMode.Create, FileAccess.Write); + HasChildProcess = () => ProcessLauncher.Launcher.HasChildProc; } private void ConsoleWriteLine(string str = "") @@ -77,7 +78,9 @@ internal async Task Collect(CancellationToken ct, CommandLineConfiguration Debug.Assert(output != null); Debug.Assert(profile != null); - if (ProcessLauncher.Launcher.HasChildProc && showchildio) + bool hasChildProcess = HasChildProcess(); + + if (hasChildProcess && showchildio) { // If showing IO, then all IO (including CtrlC) behavior is delegated to the child process cancelOnCtrlC = false; @@ -96,7 +99,7 @@ internal async Task Collect(CancellationToken ct, CommandLineConfiguration ct = CancellationToken.None; } - if (!ProcessLauncher.Launcher.HasChildProc) + if (!hasChildProcess) { if (showchildio) { @@ -204,7 +207,7 @@ internal async Task Collect(CancellationToken ct, CommandLineConfiguration return (int)ReturnCode.Ok; } diagnosticsClient = holder.Client; - if (ProcessLauncher.Launcher.HasChildProc) + if (hasChildProcess) { process = Process.GetProcessById(holder.EndpointInfo.ProcessId); } @@ -667,6 +670,7 @@ private sealed class CollectSession : ICollectSession internal Func ResumeRuntimeAsync { get; set; } internal Func CollectSessionEventStream { get; set; } internal IConsole Console { get; set; } + internal Func HasChildProcess { get; set; } #endregion } } diff --git a/src/tests/dotnet-trace/CollectCommandFunctionalTests.cs b/src/tests/dotnet-trace/CollectCommandFunctionalTests.cs index 2ca87ace32..4a5dc38ab3 100644 --- a/src/tests/dotnet-trace/CollectCommandFunctionalTests.cs +++ b/src/tests/dotnet-trace/CollectCommandFunctionalTests.cs @@ -70,12 +70,24 @@ public async Task CollectCommandInvalidProviderConfiguration_Throws(CollectArgs console.AssertSanitizedLinesEqual(CollectSanitizer, expectedException); } - private static async Task RunAsync(CollectArgs config, MockConsole console) + [Theory] + [MemberData(nameof(InvalidProcessSpecifierConfigurations))] + public async Task CollectCommand_InvalidProcessSpecifierConfigurations(CollectArgs args, bool childMode, string expectedError) + { + MockConsole console = new(200, 30); + int exitCode = await RunAsync(args, console, hasChildProcess: childMode).ConfigureAwait(true); + + Assert.Equal((int)ReturnCode.ArgumentError, exitCode); + console.AssertSanitizedLinesEqual(CollectSanitizer, new[] { expectedError }); + } + + private static async Task RunAsync(CollectArgs config, MockConsole console, bool hasChildProcess = false) { var handler = new CollectCommandHandler(console); handler.StartTraceSessionAsync = (client, cfg, ct) => Task.FromResult(new TestCollectSession()); handler.ResumeRuntimeAsync = (client, ct) => Task.CompletedTask; handler.CollectSessionEventStream = (name) => config.EventStream; + handler.HasChildProcess = () => hasChildProcess; return await handler.Collect( config.ct, @@ -101,6 +113,7 @@ private static async Task RunAsync(CollectArgs config, MockConsole console) ).ConfigureAwait(false); } + private static string[] CollectSanitizer(string[] lines) { List result = new(); @@ -252,6 +265,26 @@ public static IEnumerable InvalidProviders() }; } + public static IEnumerable InvalidProcessSpecifierConfigurations() + { + const string childErrorMsg = "None of the --name, --process-id, or --diagnostic-port options may be specified when launching a child process."; + const string attachMissingMsg = "Must specify either --process-id, --name, --diagnostic-port, or --dsrouter."; + const string attachOnlyOneMsg = "Only one of the --name, --process-id, --diagnostic-port, or --dsrouter options may be specified."; + + yield return new object[] { new CollectArgs(processId: 0, name: ""), false, FormatException(attachMissingMsg) }; + yield return new object[] { new CollectArgs(processId: -5, name: ""), false, FormatException("-5 is not a valid process ID") }; + yield return new object[] { new CollectArgs(processId: 1234, name: "foo"), false, FormatException(attachOnlyOneMsg) }; + yield return new object[] { new CollectArgs(processId: 0, name: "foo", diagnosticPort: "socket"), false, FormatException(attachOnlyOneMsg) }; + yield return new object[] { new CollectArgs(processId: 1234, name: "", diagnosticPort: "socket"), false, FormatException(attachOnlyOneMsg) }; + yield return new object[] { new CollectArgs(processId: 0, name: "", dsrouter: "invalid"), false, FormatException("Invalid value for --dsrouter. Valid values are 'ios', 'ios-sim', 'android' and 'android-emu'.") }; + yield return new object[] { new CollectArgs(processId: 0, name: "foo", dsrouter: "android"), false, FormatException(attachOnlyOneMsg) }; + + yield return new object[] { new CollectArgs(processId: 1234, name: ""), true, FormatException(childErrorMsg) }; + yield return new object[] { new CollectArgs(processId: 0, name: "foo"), true, FormatException(childErrorMsg) }; + yield return new object[] { new CollectArgs(processId: 0, name: "", diagnosticPort: "socket"), true, FormatException(childErrorMsg) }; + yield return new object[] { new CollectArgs(processId: 1234, name: "foo", diagnosticPort: "socket"), true, FormatException(childErrorMsg) }; + } + private static string outputFile = $"Output File : {Directory.GetCurrentDirectory() + Path.DirectorySeparatorChar}trace.nettrace"; private const string ProviderHeader = "Provider Name Keywords Level Enabled By"; private static readonly string[] CommonTail = [ diff --git a/src/tests/dotnet-trace/CollectLinuxCommandFunctionalTests.cs b/src/tests/dotnet-trace/CollectLinuxCommandFunctionalTests.cs index c37c3ec12e..ac5a271119 100644 --- a/src/tests/dotnet-trace/CollectLinuxCommandFunctionalTests.cs +++ b/src/tests/dotnet-trace/CollectLinuxCommandFunctionalTests.cs @@ -65,6 +65,40 @@ public void CollectLinuxCommandProviderConfigurationConsolidation_Throws(object console.AssertSanitizedLinesEqual(null, expectedException); } + [ConditionalFact(nameof(IsCollectLinuxSupported))] + public void CollectLinuxCommand_ReportsResolveProcessErrors() + { + MockConsole console = new(200, 30); + var args = TestArgs(processId: -1); + int exitCode = Run(args, console); + + Assert.Equal((int)ReturnCode.ArgumentError, exitCode); + console.AssertSanitizedLinesEqual(null, FormatException("-1 is not a valid process ID")); + } + + [ConditionalFact(nameof(IsCollectLinuxSupported))] + public void CollectLinuxCommand_ReportsResolveProcessNameErrors() + { + MockConsole console = new(200, 30); + var args = TestArgs(name: "process-that-should-not-exist", processId: 0); + int exitCode = Run(args, console); + + Assert.Equal((int)ReturnCode.ArgumentError, exitCode); + console.AssertSanitizedLinesEqual(null, FormatException("There is no active process with the given name: process-that-should-not-exist")); + } + + [ConditionalTheory(nameof(IsCollectLinuxSupported))] + [MemberData(nameof(ResolveProcessExceptions))] + public void CollectLinuxCommand_ResolveProcessExceptions(object testArgs, string[] expectedError) + { + MockConsole console = new(200, 30); + + int exitCode = Run(testArgs, console); + + Assert.Equal((int)ReturnCode.ArgumentError, exitCode); + console.AssertSanitizedLinesEqual(null, expectedError); + } + [ConditionalFact(nameof(IsCollectLinuxNotSupported))] public void CollectLinuxCommand_NotSupported_OnNonLinux() { @@ -224,6 +258,27 @@ public static IEnumerable InvalidProviders() }; } + public static IEnumerable ResolveProcessExceptions() + { + yield return new object[] + { + TestArgs(processId: -1, name: string.Empty), + FormatException("-1 is not a valid process ID") + }; + + yield return new object[] + { + TestArgs(processId: 1, name: "dummy"), + FormatException("Only one of the --name or --process-id options may be specified.") + }; + + yield return new object[] + { + TestArgs(processId: int.MaxValue, name: string.Empty), + FormatException("No process with ID 2147483647 is currently running.") + }; + } + private const string ProviderHeader = "Provider Name Keywords Level Enabled By"; private static string LinuxHeader => $"{"Linux Perf Events",-80}Enabled By"; private static string LinuxProfile(string name) => $"{name,-80}--profile"; From 10a0e391571682b575284fafb3e3d640a5a419d3 Mon Sep 17 00:00:00 2001 From: Matt Mitchell Date: Mon, 24 Nov 2025 10:57:28 -0800 Subject: [PATCH 28/44] Disable AzDO dependabot (#5641) Disable AzDO dependabot. --- .azuredevops/dependabot.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .azuredevops/dependabot.yml diff --git a/.azuredevops/dependabot.yml b/.azuredevops/dependabot.yml new file mode 100644 index 0000000000..f18e60565a --- /dev/null +++ b/.azuredevops/dependabot.yml @@ -0,0 +1,5 @@ +version: 2 + +# Disabling dependabot on Azure DevOps as this is a mirrored repo. Updates should go through github. +enable-campaigned-updates: false +enable-security-updates: false From f824c828d2ddbed1d327e018c10a100295d4f4c5 Mon Sep 17 00:00:00 2001 From: Jan Jones Date: Fri, 28 Nov 2025 03:57:19 +0100 Subject: [PATCH 29/44] Fix typo in ListProfilesCommandHandler.cs (#5647) --- .../CommandLine/Commands/ListProfilesCommandHandler.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Tools/dotnet-trace/CommandLine/Commands/ListProfilesCommandHandler.cs b/src/Tools/dotnet-trace/CommandLine/Commands/ListProfilesCommandHandler.cs index 432e6599ae..c9b37b1cb9 100644 --- a/src/Tools/dotnet-trace/CommandLine/Commands/ListProfilesCommandHandler.cs +++ b/src/Tools/dotnet-trace/CommandLine/Commands/ListProfilesCommandHandler.cs @@ -71,7 +71,7 @@ public static Command ListProfilesCommand() new EventPipeProvider[] { new("Microsoft-DotNETCore-SampleProfiler", EventLevel.Informational), }, - "Samples .NET thread stacks (~100 Hz) toestimate how much wall clock time code is using.") { VerbExclusivity = "collect" }, + "Samples .NET thread stacks (~100 Hz) to estimate how much wall clock time code is using.") { VerbExclusivity = "collect" }, new Profile( "gc-verbose", new EventPipeProvider[] { From c887c680cb501e6094859e0eb726624d6d4bf54f Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" <42748379+dotnet-maestro[bot]@users.noreply.github.com> Date: Tue, 2 Dec 2025 11:14:16 -0500 Subject: [PATCH 30/44] [main] Update dependencies from dotnet/dotnet (#5640) --- NuGet.config | 2 +- eng/Version.Details.props | 34 +++++----- eng/Version.Details.xml | 68 +++++++++---------- .../job/publish-build-assets.yml | 5 ++ .../core-templates/post-build/post-build.yml | 5 ++ eng/common/cross/x64/tizen/tizen.patch | 9 +++ global.json | 2 +- 7 files changed, 72 insertions(+), 53 deletions(-) create mode 100644 eng/common/cross/x64/tizen/tizen.patch diff --git a/NuGet.config b/NuGet.config index 1f39c78b51..b3cf44e4c1 100644 --- a/NuGet.config +++ b/NuGet.config @@ -7,7 +7,7 @@ - + diff --git a/eng/Version.Details.props b/eng/Version.Details.props index 85b11c1951..b3f728aa59 100644 --- a/eng/Version.Details.props +++ b/eng/Version.Details.props @@ -13,23 +13,23 @@ This file should be imported by eng/Versions.props 1.0.105-preview.225 - 10.0.1 - 10.0.1-servicing.25555.106 - 5.0.0-2.25555.106 - 5.0.0-2.25555.106 - 5.0.0-2.25555.106 - 10.0.101 - 10.0.0-beta.25555.106 - 10.0.0-beta.25555.106 - 10.0.101-servicing.25555.106 - 10.0.1 - 10.0.1-servicing.25555.106 - 10.0.1-servicing.25555.106 - 10.0.1-servicing.25555.106 - 10.0.1-servicing.25555.106 - 10.0.1-servicing.25555.106 - 10.0.1-servicing.25555.106 - 10.0.1-servicing.25555.106 + 10.0.2 + 10.0.2-servicing.25601.102 + 5.0.0-2.25601.102 + 5.0.0-2.25601.102 + 5.0.0-2.25601.102 + 10.0.102 + 10.0.0-beta.25601.102 + 10.0.0-beta.25601.102 + 10.0.102-servicing.25601.102 + 10.0.2 + 10.0.2-servicing.25601.102 + 10.0.2-servicing.25601.102 + 10.0.2-servicing.25601.102 + 10.0.2-servicing.25601.102 + 10.0.2-servicing.25601.102 + 10.0.2-servicing.25601.102 + 10.0.2-servicing.25601.102 7.0.0-beta.22316.2 diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index c261c24bf5..4d647374bd 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -19,88 +19,88 @@ - + https://github.com/dotnet/dotnet - e17b0d08def649f30aed9c09cf4a2c5741a3c76c + f2d1a92c2429848e41e78af560381a597f933090 - + https://github.com/dotnet/dotnet - e17b0d08def649f30aed9c09cf4a2c5741a3c76c + f2d1a92c2429848e41e78af560381a597f933090 https://github.com/dotnet/arcade ccfe6da198c5f05534863bbb1bff66e830e0c6ab - + https://github.com/dotnet/dotnet - e17b0d08def649f30aed9c09cf4a2c5741a3c76c + f2d1a92c2429848e41e78af560381a597f933090 - + https://github.com/dotnet/dotnet - e17b0d08def649f30aed9c09cf4a2c5741a3c76c + f2d1a92c2429848e41e78af560381a597f933090 - + https://github.com/dotnet/dotnet - e17b0d08def649f30aed9c09cf4a2c5741a3c76c + f2d1a92c2429848e41e78af560381a597f933090 - + https://github.com/dotnet/dotnet - e17b0d08def649f30aed9c09cf4a2c5741a3c76c + f2d1a92c2429848e41e78af560381a597f933090 - + https://github.com/dotnet/dotnet - e17b0d08def649f30aed9c09cf4a2c5741a3c76c + f2d1a92c2429848e41e78af560381a597f933090 - + https://github.com/dotnet/dotnet - e17b0d08def649f30aed9c09cf4a2c5741a3c76c + f2d1a92c2429848e41e78af560381a597f933090 - + https://github.com/dotnet/dotnet - e17b0d08def649f30aed9c09cf4a2c5741a3c76c + f2d1a92c2429848e41e78af560381a597f933090 - + https://github.com/dotnet/dotnet - e17b0d08def649f30aed9c09cf4a2c5741a3c76c + f2d1a92c2429848e41e78af560381a597f933090 - + https://github.com/dotnet/dotnet - e17b0d08def649f30aed9c09cf4a2c5741a3c76c + f2d1a92c2429848e41e78af560381a597f933090 - + https://github.com/dotnet/dotnet - e17b0d08def649f30aed9c09cf4a2c5741a3c76c + f2d1a92c2429848e41e78af560381a597f933090 - + https://github.com/dotnet/dotnet - e17b0d08def649f30aed9c09cf4a2c5741a3c76c + f2d1a92c2429848e41e78af560381a597f933090 - + https://github.com/dotnet/dotnet - e17b0d08def649f30aed9c09cf4a2c5741a3c76c + f2d1a92c2429848e41e78af560381a597f933090 - + https://github.com/dotnet/dotnet - e17b0d08def649f30aed9c09cf4a2c5741a3c76c + f2d1a92c2429848e41e78af560381a597f933090 - + https://github.com/dotnet/dotnet - e17b0d08def649f30aed9c09cf4a2c5741a3c76c + f2d1a92c2429848e41e78af560381a597f933090 - + https://github.com/dotnet/dotnet - e17b0d08def649f30aed9c09cf4a2c5741a3c76c + f2d1a92c2429848e41e78af560381a597f933090 diff --git a/eng/common/core-templates/job/publish-build-assets.yml b/eng/common/core-templates/job/publish-build-assets.yml index 37dff559fc..e7daa6d2fa 100644 --- a/eng/common/core-templates/job/publish-build-assets.yml +++ b/eng/common/core-templates/job/publish-build-assets.yml @@ -180,6 +180,11 @@ jobs: PromoteToChannelIds: ${{ parameters.PromoteToChannelIds }} is1ESPipeline: ${{ parameters.is1ESPipeline }} + # Darc is targeting 8.0, so make sure it's installed + - task: UseDotNet@2 + inputs: + version: 8.0.x + - task: AzureCLI@2 displayName: Publish Using Darc inputs: diff --git a/eng/common/core-templates/post-build/post-build.yml b/eng/common/core-templates/post-build/post-build.yml index f6f87fe5c6..55361908c2 100644 --- a/eng/common/core-templates/post-build/post-build.yml +++ b/eng/common/core-templates/post-build/post-build.yml @@ -307,6 +307,11 @@ stages: - task: NuGetAuthenticate@1 + # Darc is targeting 8.0, so make sure it's installed + - task: UseDotNet@2 + inputs: + version: 8.0.x + - task: AzureCLI@2 displayName: Publish Using Darc inputs: diff --git a/eng/common/cross/x64/tizen/tizen.patch b/eng/common/cross/x64/tizen/tizen.patch new file mode 100644 index 0000000000..56fbc88109 --- /dev/null +++ b/eng/common/cross/x64/tizen/tizen.patch @@ -0,0 +1,9 @@ +diff -u -r a/usr/lib64/libc.so b/usr/lib64/libc.so +--- a/usr/lib64/libc.so 2016-12-30 23:00:08.284951863 +0900 ++++ b/usr/lib64/libc.so 2016-12-30 23:00:32.140951815 +0900 +@@ -2,4 +2,4 @@ + Use the shared library, but some functions are only in + the static library, so try that secondarily. */ + OUTPUT_FORMAT(elf64-x86-64) +-GROUP ( /lib64/libc.so.6 /usr/lib64/libc_nonshared.a AS_NEEDED ( /lib64/ld-linux-x86-64.so.2 ) ) ++GROUP ( libc.so.6 libc_nonshared.a AS_NEEDED ( ld-linux-x86-64.so.2 ) ) diff --git a/global.json b/global.json index e990786896..4869b29109 100644 --- a/global.json +++ b/global.json @@ -18,6 +18,6 @@ "msbuild-sdks": { "Microsoft.Build.NoTargets": "3.5.0", "Microsoft.Build.Traversal": "3.4.0", - "Microsoft.DotNet.Arcade.Sdk": "10.0.0-beta.25555.106" + "Microsoft.DotNet.Arcade.Sdk": "10.0.0-beta.25601.102" } } From 9c087c3226c188cd13c69b990ef820d7a93ceab5 Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" <42748379+dotnet-maestro[bot]@users.noreply.github.com> Date: Wed, 3 Dec 2025 08:01:01 -0500 Subject: [PATCH 31/44] [main] Update dependencies from dotnet/dotnet (#5648) This pull request updates the following dependencies [marker]: <> (Begin:9c7d85bb-274e-4ad6-970a-48ffc448929b) ## From https://github.com/dotnet/dotnet - **Subscription**: [9c7d85bb-274e-4ad6-970a-48ffc448929b](https://maestro.dot.net/subscriptions?search=9c7d85bb-274e-4ad6-970a-48ffc448929b) - **Build**: [20251201.10](https://dev.azure.com/dnceng/internal/_build/results?buildId=2851609) ([292938](https://maestro.dot.net/channel/5173/github:dotnet:dotnet/build/292938)) - **Date Produced**: December 2, 2025 10:42:42 AM UTC - **Commit**: [7dedd35363daf74f94a980da38f2cf4dc86cc23a](https://github.com/dotnet/dotnet/commit/7dedd35363daf74f94a980da38f2cf4dc86cc23a) - **Branch**: [release/10.0.1xx](https://github.com/dotnet/dotnet/tree/release/10.0.1xx) [DependencyUpdate]: <> (Begin) - **Dependency Updates**: - From [10.0.2-servicing.25601.102 to 10.0.2-servicing.25601.110][1] - runtime.linux-arm64.Microsoft.DotNet.Cdac.Transport - runtime.linux-x64.Microsoft.DotNet.Cdac.Transport - runtime.osx-arm64.Microsoft.DotNet.Cdac.Transport - runtime.osx-x64.Microsoft.DotNet.Cdac.Transport - runtime.win-arm64.Microsoft.DotNet.Cdac.Transport - Microsoft.AspNetCore.App.Ref.Internal - Microsoft.NETCore.Platforms - runtime.win-x64.Microsoft.DotNet.Cdac.Transport - From [10.0.2 to 10.0.2][1] - Microsoft.AspNetCore.App.Ref - Microsoft.NETCore.App.Ref - From [5.0.0-2.25601.102 to 5.0.0-2.25601.110][1] - Microsoft.CodeAnalysis - Microsoft.CodeAnalysis.Analyzers - Microsoft.CodeAnalysis.CSharp - From [10.0.102 to 10.0.102][1] - Microsoft.CodeAnalysis.NetAnalyzers - From [10.0.0-beta.25601.102 to 10.0.0-beta.25601.110][1] - Microsoft.DotNet.Arcade.Sdk - Microsoft.DotNet.CodeAnalysis - From [10.0.102-servicing.25601.102 to 10.0.102-servicing.25601.110][1] - Microsoft.NET.Sdk [1]: https://github.com/dotnet/dotnet/compare/f2d1a92c24...7dedd35363 [DependencyUpdate]: <> (End) [marker]: <> (End:9c7d85bb-274e-4ad6-970a-48ffc448929b) Co-authored-by: dotnet-maestro[bot] --- NuGet.config | 2 +- eng/Version.Details.props | 28 +++++++++--------- eng/Version.Details.xml | 62 +++++++++++++++++++-------------------- global.json | 2 +- 4 files changed, 47 insertions(+), 47 deletions(-) diff --git a/NuGet.config b/NuGet.config index b3cf44e4c1..324bea91ab 100644 --- a/NuGet.config +++ b/NuGet.config @@ -7,7 +7,7 @@ - + diff --git a/eng/Version.Details.props b/eng/Version.Details.props index b3f728aa59..600df683a0 100644 --- a/eng/Version.Details.props +++ b/eng/Version.Details.props @@ -14,22 +14,22 @@ This file should be imported by eng/Versions.props 1.0.105-preview.225 10.0.2 - 10.0.2-servicing.25601.102 - 5.0.0-2.25601.102 - 5.0.0-2.25601.102 - 5.0.0-2.25601.102 + 10.0.2-servicing.25601.110 + 5.0.0-2.25601.110 + 5.0.0-2.25601.110 + 5.0.0-2.25601.110 10.0.102 - 10.0.0-beta.25601.102 - 10.0.0-beta.25601.102 - 10.0.102-servicing.25601.102 + 10.0.0-beta.25601.110 + 10.0.0-beta.25601.110 + 10.0.102-servicing.25601.110 10.0.2 - 10.0.2-servicing.25601.102 - 10.0.2-servicing.25601.102 - 10.0.2-servicing.25601.102 - 10.0.2-servicing.25601.102 - 10.0.2-servicing.25601.102 - 10.0.2-servicing.25601.102 - 10.0.2-servicing.25601.102 + 10.0.2-servicing.25601.110 + 10.0.2-servicing.25601.110 + 10.0.2-servicing.25601.110 + 10.0.2-servicing.25601.110 + 10.0.2-servicing.25601.110 + 10.0.2-servicing.25601.110 + 10.0.2-servicing.25601.110 7.0.0-beta.22316.2 diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index 4d647374bd..1021d2fe52 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -19,31 +19,31 @@ - + https://github.com/dotnet/dotnet - f2d1a92c2429848e41e78af560381a597f933090 + 7dedd35363daf74f94a980da38f2cf4dc86cc23a - + https://github.com/dotnet/dotnet - f2d1a92c2429848e41e78af560381a597f933090 + 7dedd35363daf74f94a980da38f2cf4dc86cc23a https://github.com/dotnet/arcade ccfe6da198c5f05534863bbb1bff66e830e0c6ab - + https://github.com/dotnet/dotnet - f2d1a92c2429848e41e78af560381a597f933090 + 7dedd35363daf74f94a980da38f2cf4dc86cc23a - + https://github.com/dotnet/dotnet - f2d1a92c2429848e41e78af560381a597f933090 + 7dedd35363daf74f94a980da38f2cf4dc86cc23a https://github.com/dotnet/dotnet - f2d1a92c2429848e41e78af560381a597f933090 + 7dedd35363daf74f94a980da38f2cf4dc86cc23a https://github.com/dotnet/dotnet - f2d1a92c2429848e41e78af560381a597f933090 + 7dedd35363daf74f94a980da38f2cf4dc86cc23a - + https://github.com/dotnet/dotnet - f2d1a92c2429848e41e78af560381a597f933090 + 7dedd35363daf74f94a980da38f2cf4dc86cc23a - + https://github.com/dotnet/dotnet - f2d1a92c2429848e41e78af560381a597f933090 + 7dedd35363daf74f94a980da38f2cf4dc86cc23a - + https://github.com/dotnet/dotnet - f2d1a92c2429848e41e78af560381a597f933090 + 7dedd35363daf74f94a980da38f2cf4dc86cc23a - + https://github.com/dotnet/dotnet - f2d1a92c2429848e41e78af560381a597f933090 + 7dedd35363daf74f94a980da38f2cf4dc86cc23a - + https://github.com/dotnet/dotnet - f2d1a92c2429848e41e78af560381a597f933090 + 7dedd35363daf74f94a980da38f2cf4dc86cc23a - + https://github.com/dotnet/dotnet - f2d1a92c2429848e41e78af560381a597f933090 + 7dedd35363daf74f94a980da38f2cf4dc86cc23a - + https://github.com/dotnet/dotnet - f2d1a92c2429848e41e78af560381a597f933090 + 7dedd35363daf74f94a980da38f2cf4dc86cc23a - + https://github.com/dotnet/dotnet - f2d1a92c2429848e41e78af560381a597f933090 + 7dedd35363daf74f94a980da38f2cf4dc86cc23a - + https://github.com/dotnet/dotnet - f2d1a92c2429848e41e78af560381a597f933090 + 7dedd35363daf74f94a980da38f2cf4dc86cc23a - + https://github.com/dotnet/dotnet - f2d1a92c2429848e41e78af560381a597f933090 + 7dedd35363daf74f94a980da38f2cf4dc86cc23a https://github.com/dotnet/dotnet - f2d1a92c2429848e41e78af560381a597f933090 + 7dedd35363daf74f94a980da38f2cf4dc86cc23a diff --git a/global.json b/global.json index 4869b29109..4827c55875 100644 --- a/global.json +++ b/global.json @@ -18,6 +18,6 @@ "msbuild-sdks": { "Microsoft.Build.NoTargets": "3.5.0", "Microsoft.Build.Traversal": "3.4.0", - "Microsoft.DotNet.Arcade.Sdk": "10.0.0-beta.25601.102" + "Microsoft.DotNet.Arcade.Sdk": "10.0.0-beta.25601.110" } } From 94caedf0b8883d247423368ba360f42253c80a3b Mon Sep 17 00:00:00 2001 From: Max Charlamb <44248479+max-charlamb@users.noreply.github.com> Date: Thu, 4 Dec 2025 13:07:42 -0500 Subject: [PATCH 32/44] Remove `FreeLibrary` invocations in managed SOS host (#5586) * Fixes intermittent failures when using the cDAC * Prepares SOS to consume NativeAOT packages --- src/SOS/SOS.Hosting/RuntimeWrapper.cs | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/SOS/SOS.Hosting/RuntimeWrapper.cs b/src/SOS/SOS.Hosting/RuntimeWrapper.cs index bfca28db91..ac37d23e01 100644 --- a/src/SOS/SOS.Hosting/RuntimeWrapper.cs +++ b/src/SOS/SOS.Hosting/RuntimeWrapper.cs @@ -158,12 +158,13 @@ protected override void Destroy() } if (_dacHandle != IntPtr.Zero) { - DataTarget.PlatformFunctions.FreeLibrary(_dacHandle); + // Previously, the DAC was freed here, but as we transition to the cDAC which uses NativeAOT, + // it is no longer possible to free the DAC library when it is using the shimmed cDAC. _dacHandle = IntPtr.Zero; } if (_cdacHandle != IntPtr.Zero) { - DataTarget.PlatformFunctions.FreeLibrary(_cdacHandle); + // cDAC can not be freed because it is a NativeAOT dll. _cdacHandle = IntPtr.Zero; } if (_dbiHandle != IntPtr.Zero) From a81816d3b17861fcaa506c8da27ea9333c4b3482 Mon Sep 17 00:00:00 2001 From: Max Charlamb <44248479+max-charlamb@users.noreply.github.com> Date: Thu, 4 Dec 2025 13:29:25 -0500 Subject: [PATCH 33/44] move lldbplugin.tests to test folder (#5651) --- src/SOS/SOS.UnitTests/SOS.cs | 2 +- src/{SOS => tests}/lldbplugin.tests/README.md | 0 src/{SOS => tests}/lldbplugin.tests/TestDebuggee/Test.cs | 0 .../lldbplugin.tests/TestDebuggee/TestDebuggee.csproj | 0 src/{SOS => tests}/lldbplugin.tests/t_cmd_bpmd_clear.py | 0 src/{SOS => tests}/lldbplugin.tests/t_cmd_bpmd_clearall.py | 0 src/{SOS => tests}/lldbplugin.tests/t_cmd_bpmd_methoddesc.py | 0 .../lldbplugin.tests/t_cmd_bpmd_module_function.py | 0 .../lldbplugin.tests/t_cmd_bpmd_module_function_iloffset.py | 0 .../t_cmd_bpmd_nofuturemodule_module_function.py | 0 src/{SOS => tests}/lldbplugin.tests/t_cmd_clrstack.py | 0 src/{SOS => tests}/lldbplugin.tests/t_cmd_clrthreads.py | 0 src/{SOS => tests}/lldbplugin.tests/t_cmd_clru.py | 0 src/{SOS => tests}/lldbplugin.tests/t_cmd_dso.py | 0 src/{SOS => tests}/lldbplugin.tests/t_cmd_dumpclass.py | 0 src/{SOS => tests}/lldbplugin.tests/t_cmd_dumpheap.py | 0 src/{SOS => tests}/lldbplugin.tests/t_cmd_dumpil.py | 0 src/{SOS => tests}/lldbplugin.tests/t_cmd_dumplog.py | 0 src/{SOS => tests}/lldbplugin.tests/t_cmd_dumpmd.py | 0 src/{SOS => tests}/lldbplugin.tests/t_cmd_dumpmodule.py | 0 src/{SOS => tests}/lldbplugin.tests/t_cmd_dumpmt.py | 0 src/{SOS => tests}/lldbplugin.tests/t_cmd_dumpobj.py | 0 src/{SOS => tests}/lldbplugin.tests/t_cmd_dumpstack.py | 0 src/{SOS => tests}/lldbplugin.tests/t_cmd_eeheap.py | 0 src/{SOS => tests}/lldbplugin.tests/t_cmd_eestack.py | 0 src/{SOS => tests}/lldbplugin.tests/t_cmd_gcroot.py | 0 src/{SOS => tests}/lldbplugin.tests/t_cmd_histclear.py | 0 src/{SOS => tests}/lldbplugin.tests/t_cmd_histinit.py | 0 src/{SOS => tests}/lldbplugin.tests/t_cmd_histobj.py | 0 src/{SOS => tests}/lldbplugin.tests/t_cmd_histobjfind.py | 0 src/{SOS => tests}/lldbplugin.tests/t_cmd_histroot.py | 0 src/{SOS => tests}/lldbplugin.tests/t_cmd_ip2md.py | 0 src/{SOS => tests}/lldbplugin.tests/t_cmd_name2ee.py | 0 src/{SOS => tests}/lldbplugin.tests/t_cmd_pe.py | 0 src/{SOS => tests}/lldbplugin.tests/t_cmd_sos.py | 0 src/{SOS => tests}/lldbplugin.tests/t_cmd_soshelp.py | 0 src/{SOS => tests}/lldbplugin.tests/test_libsosplugin.py | 0 src/{SOS => tests}/lldbplugin.tests/testsos.sh | 4 ++-- src/{SOS => tests}/lldbplugin.tests/testutils.py | 0 39 files changed, 3 insertions(+), 3 deletions(-) rename src/{SOS => tests}/lldbplugin.tests/README.md (100%) rename src/{SOS => tests}/lldbplugin.tests/TestDebuggee/Test.cs (100%) rename src/{SOS => tests}/lldbplugin.tests/TestDebuggee/TestDebuggee.csproj (100%) rename src/{SOS => tests}/lldbplugin.tests/t_cmd_bpmd_clear.py (100%) rename src/{SOS => tests}/lldbplugin.tests/t_cmd_bpmd_clearall.py (100%) rename src/{SOS => tests}/lldbplugin.tests/t_cmd_bpmd_methoddesc.py (100%) rename src/{SOS => tests}/lldbplugin.tests/t_cmd_bpmd_module_function.py (100%) rename src/{SOS => tests}/lldbplugin.tests/t_cmd_bpmd_module_function_iloffset.py (100%) rename src/{SOS => tests}/lldbplugin.tests/t_cmd_bpmd_nofuturemodule_module_function.py (100%) rename src/{SOS => tests}/lldbplugin.tests/t_cmd_clrstack.py (100%) rename src/{SOS => tests}/lldbplugin.tests/t_cmd_clrthreads.py (100%) rename src/{SOS => tests}/lldbplugin.tests/t_cmd_clru.py (100%) rename src/{SOS => tests}/lldbplugin.tests/t_cmd_dso.py (100%) rename src/{SOS => tests}/lldbplugin.tests/t_cmd_dumpclass.py (100%) rename src/{SOS => tests}/lldbplugin.tests/t_cmd_dumpheap.py (100%) rename src/{SOS => tests}/lldbplugin.tests/t_cmd_dumpil.py (100%) rename src/{SOS => tests}/lldbplugin.tests/t_cmd_dumplog.py (100%) rename src/{SOS => tests}/lldbplugin.tests/t_cmd_dumpmd.py (100%) rename src/{SOS => tests}/lldbplugin.tests/t_cmd_dumpmodule.py (100%) rename src/{SOS => tests}/lldbplugin.tests/t_cmd_dumpmt.py (100%) rename src/{SOS => tests}/lldbplugin.tests/t_cmd_dumpobj.py (100%) rename src/{SOS => tests}/lldbplugin.tests/t_cmd_dumpstack.py (100%) rename src/{SOS => tests}/lldbplugin.tests/t_cmd_eeheap.py (100%) rename src/{SOS => tests}/lldbplugin.tests/t_cmd_eestack.py (100%) rename src/{SOS => tests}/lldbplugin.tests/t_cmd_gcroot.py (100%) rename src/{SOS => tests}/lldbplugin.tests/t_cmd_histclear.py (100%) rename src/{SOS => tests}/lldbplugin.tests/t_cmd_histinit.py (100%) rename src/{SOS => tests}/lldbplugin.tests/t_cmd_histobj.py (100%) rename src/{SOS => tests}/lldbplugin.tests/t_cmd_histobjfind.py (100%) rename src/{SOS => tests}/lldbplugin.tests/t_cmd_histroot.py (100%) rename src/{SOS => tests}/lldbplugin.tests/t_cmd_ip2md.py (100%) rename src/{SOS => tests}/lldbplugin.tests/t_cmd_name2ee.py (100%) rename src/{SOS => tests}/lldbplugin.tests/t_cmd_pe.py (100%) rename src/{SOS => tests}/lldbplugin.tests/t_cmd_sos.py (100%) rename src/{SOS => tests}/lldbplugin.tests/t_cmd_soshelp.py (100%) rename src/{SOS => tests}/lldbplugin.tests/test_libsosplugin.py (100%) rename src/{SOS => tests}/lldbplugin.tests/testsos.sh (77%) mode change 100755 => 100644 rename src/{SOS => tests}/lldbplugin.tests/testutils.py (100%) diff --git a/src/SOS/SOS.UnitTests/SOS.cs b/src/SOS/SOS.UnitTests/SOS.cs index 3a66a4046f..a4fa145545 100644 --- a/src/SOS/SOS.UnitTests/SOS.cs +++ b/src/SOS/SOS.UnitTests/SOS.cs @@ -680,7 +680,7 @@ public async Task LLDBPluginTests(TestConfiguration config) string repoRootDir = TestConfiguration.MakeCanonicalPath(config.AllSettings["RepoRootDir"]); // Get test python script path - string scriptDir = Path.Combine(repoRootDir, "src", "SOS", "lldbplugin.tests"); + string scriptDir = Path.Combine(repoRootDir, "src", "tests", "lldbplugin.tests"); arguments.Append(Path.Combine(scriptDir, "test_libsosplugin.py")); arguments.Append(' '); diff --git a/src/SOS/lldbplugin.tests/README.md b/src/tests/lldbplugin.tests/README.md similarity index 100% rename from src/SOS/lldbplugin.tests/README.md rename to src/tests/lldbplugin.tests/README.md diff --git a/src/SOS/lldbplugin.tests/TestDebuggee/Test.cs b/src/tests/lldbplugin.tests/TestDebuggee/Test.cs similarity index 100% rename from src/SOS/lldbplugin.tests/TestDebuggee/Test.cs rename to src/tests/lldbplugin.tests/TestDebuggee/Test.cs diff --git a/src/SOS/lldbplugin.tests/TestDebuggee/TestDebuggee.csproj b/src/tests/lldbplugin.tests/TestDebuggee/TestDebuggee.csproj similarity index 100% rename from src/SOS/lldbplugin.tests/TestDebuggee/TestDebuggee.csproj rename to src/tests/lldbplugin.tests/TestDebuggee/TestDebuggee.csproj diff --git a/src/SOS/lldbplugin.tests/t_cmd_bpmd_clear.py b/src/tests/lldbplugin.tests/t_cmd_bpmd_clear.py similarity index 100% rename from src/SOS/lldbplugin.tests/t_cmd_bpmd_clear.py rename to src/tests/lldbplugin.tests/t_cmd_bpmd_clear.py diff --git a/src/SOS/lldbplugin.tests/t_cmd_bpmd_clearall.py b/src/tests/lldbplugin.tests/t_cmd_bpmd_clearall.py similarity index 100% rename from src/SOS/lldbplugin.tests/t_cmd_bpmd_clearall.py rename to src/tests/lldbplugin.tests/t_cmd_bpmd_clearall.py diff --git a/src/SOS/lldbplugin.tests/t_cmd_bpmd_methoddesc.py b/src/tests/lldbplugin.tests/t_cmd_bpmd_methoddesc.py similarity index 100% rename from src/SOS/lldbplugin.tests/t_cmd_bpmd_methoddesc.py rename to src/tests/lldbplugin.tests/t_cmd_bpmd_methoddesc.py diff --git a/src/SOS/lldbplugin.tests/t_cmd_bpmd_module_function.py b/src/tests/lldbplugin.tests/t_cmd_bpmd_module_function.py similarity index 100% rename from src/SOS/lldbplugin.tests/t_cmd_bpmd_module_function.py rename to src/tests/lldbplugin.tests/t_cmd_bpmd_module_function.py diff --git a/src/SOS/lldbplugin.tests/t_cmd_bpmd_module_function_iloffset.py b/src/tests/lldbplugin.tests/t_cmd_bpmd_module_function_iloffset.py similarity index 100% rename from src/SOS/lldbplugin.tests/t_cmd_bpmd_module_function_iloffset.py rename to src/tests/lldbplugin.tests/t_cmd_bpmd_module_function_iloffset.py diff --git a/src/SOS/lldbplugin.tests/t_cmd_bpmd_nofuturemodule_module_function.py b/src/tests/lldbplugin.tests/t_cmd_bpmd_nofuturemodule_module_function.py similarity index 100% rename from src/SOS/lldbplugin.tests/t_cmd_bpmd_nofuturemodule_module_function.py rename to src/tests/lldbplugin.tests/t_cmd_bpmd_nofuturemodule_module_function.py diff --git a/src/SOS/lldbplugin.tests/t_cmd_clrstack.py b/src/tests/lldbplugin.tests/t_cmd_clrstack.py similarity index 100% rename from src/SOS/lldbplugin.tests/t_cmd_clrstack.py rename to src/tests/lldbplugin.tests/t_cmd_clrstack.py diff --git a/src/SOS/lldbplugin.tests/t_cmd_clrthreads.py b/src/tests/lldbplugin.tests/t_cmd_clrthreads.py similarity index 100% rename from src/SOS/lldbplugin.tests/t_cmd_clrthreads.py rename to src/tests/lldbplugin.tests/t_cmd_clrthreads.py diff --git a/src/SOS/lldbplugin.tests/t_cmd_clru.py b/src/tests/lldbplugin.tests/t_cmd_clru.py similarity index 100% rename from src/SOS/lldbplugin.tests/t_cmd_clru.py rename to src/tests/lldbplugin.tests/t_cmd_clru.py diff --git a/src/SOS/lldbplugin.tests/t_cmd_dso.py b/src/tests/lldbplugin.tests/t_cmd_dso.py similarity index 100% rename from src/SOS/lldbplugin.tests/t_cmd_dso.py rename to src/tests/lldbplugin.tests/t_cmd_dso.py diff --git a/src/SOS/lldbplugin.tests/t_cmd_dumpclass.py b/src/tests/lldbplugin.tests/t_cmd_dumpclass.py similarity index 100% rename from src/SOS/lldbplugin.tests/t_cmd_dumpclass.py rename to src/tests/lldbplugin.tests/t_cmd_dumpclass.py diff --git a/src/SOS/lldbplugin.tests/t_cmd_dumpheap.py b/src/tests/lldbplugin.tests/t_cmd_dumpheap.py similarity index 100% rename from src/SOS/lldbplugin.tests/t_cmd_dumpheap.py rename to src/tests/lldbplugin.tests/t_cmd_dumpheap.py diff --git a/src/SOS/lldbplugin.tests/t_cmd_dumpil.py b/src/tests/lldbplugin.tests/t_cmd_dumpil.py similarity index 100% rename from src/SOS/lldbplugin.tests/t_cmd_dumpil.py rename to src/tests/lldbplugin.tests/t_cmd_dumpil.py diff --git a/src/SOS/lldbplugin.tests/t_cmd_dumplog.py b/src/tests/lldbplugin.tests/t_cmd_dumplog.py similarity index 100% rename from src/SOS/lldbplugin.tests/t_cmd_dumplog.py rename to src/tests/lldbplugin.tests/t_cmd_dumplog.py diff --git a/src/SOS/lldbplugin.tests/t_cmd_dumpmd.py b/src/tests/lldbplugin.tests/t_cmd_dumpmd.py similarity index 100% rename from src/SOS/lldbplugin.tests/t_cmd_dumpmd.py rename to src/tests/lldbplugin.tests/t_cmd_dumpmd.py diff --git a/src/SOS/lldbplugin.tests/t_cmd_dumpmodule.py b/src/tests/lldbplugin.tests/t_cmd_dumpmodule.py similarity index 100% rename from src/SOS/lldbplugin.tests/t_cmd_dumpmodule.py rename to src/tests/lldbplugin.tests/t_cmd_dumpmodule.py diff --git a/src/SOS/lldbplugin.tests/t_cmd_dumpmt.py b/src/tests/lldbplugin.tests/t_cmd_dumpmt.py similarity index 100% rename from src/SOS/lldbplugin.tests/t_cmd_dumpmt.py rename to src/tests/lldbplugin.tests/t_cmd_dumpmt.py diff --git a/src/SOS/lldbplugin.tests/t_cmd_dumpobj.py b/src/tests/lldbplugin.tests/t_cmd_dumpobj.py similarity index 100% rename from src/SOS/lldbplugin.tests/t_cmd_dumpobj.py rename to src/tests/lldbplugin.tests/t_cmd_dumpobj.py diff --git a/src/SOS/lldbplugin.tests/t_cmd_dumpstack.py b/src/tests/lldbplugin.tests/t_cmd_dumpstack.py similarity index 100% rename from src/SOS/lldbplugin.tests/t_cmd_dumpstack.py rename to src/tests/lldbplugin.tests/t_cmd_dumpstack.py diff --git a/src/SOS/lldbplugin.tests/t_cmd_eeheap.py b/src/tests/lldbplugin.tests/t_cmd_eeheap.py similarity index 100% rename from src/SOS/lldbplugin.tests/t_cmd_eeheap.py rename to src/tests/lldbplugin.tests/t_cmd_eeheap.py diff --git a/src/SOS/lldbplugin.tests/t_cmd_eestack.py b/src/tests/lldbplugin.tests/t_cmd_eestack.py similarity index 100% rename from src/SOS/lldbplugin.tests/t_cmd_eestack.py rename to src/tests/lldbplugin.tests/t_cmd_eestack.py diff --git a/src/SOS/lldbplugin.tests/t_cmd_gcroot.py b/src/tests/lldbplugin.tests/t_cmd_gcroot.py similarity index 100% rename from src/SOS/lldbplugin.tests/t_cmd_gcroot.py rename to src/tests/lldbplugin.tests/t_cmd_gcroot.py diff --git a/src/SOS/lldbplugin.tests/t_cmd_histclear.py b/src/tests/lldbplugin.tests/t_cmd_histclear.py similarity index 100% rename from src/SOS/lldbplugin.tests/t_cmd_histclear.py rename to src/tests/lldbplugin.tests/t_cmd_histclear.py diff --git a/src/SOS/lldbplugin.tests/t_cmd_histinit.py b/src/tests/lldbplugin.tests/t_cmd_histinit.py similarity index 100% rename from src/SOS/lldbplugin.tests/t_cmd_histinit.py rename to src/tests/lldbplugin.tests/t_cmd_histinit.py diff --git a/src/SOS/lldbplugin.tests/t_cmd_histobj.py b/src/tests/lldbplugin.tests/t_cmd_histobj.py similarity index 100% rename from src/SOS/lldbplugin.tests/t_cmd_histobj.py rename to src/tests/lldbplugin.tests/t_cmd_histobj.py diff --git a/src/SOS/lldbplugin.tests/t_cmd_histobjfind.py b/src/tests/lldbplugin.tests/t_cmd_histobjfind.py similarity index 100% rename from src/SOS/lldbplugin.tests/t_cmd_histobjfind.py rename to src/tests/lldbplugin.tests/t_cmd_histobjfind.py diff --git a/src/SOS/lldbplugin.tests/t_cmd_histroot.py b/src/tests/lldbplugin.tests/t_cmd_histroot.py similarity index 100% rename from src/SOS/lldbplugin.tests/t_cmd_histroot.py rename to src/tests/lldbplugin.tests/t_cmd_histroot.py diff --git a/src/SOS/lldbplugin.tests/t_cmd_ip2md.py b/src/tests/lldbplugin.tests/t_cmd_ip2md.py similarity index 100% rename from src/SOS/lldbplugin.tests/t_cmd_ip2md.py rename to src/tests/lldbplugin.tests/t_cmd_ip2md.py diff --git a/src/SOS/lldbplugin.tests/t_cmd_name2ee.py b/src/tests/lldbplugin.tests/t_cmd_name2ee.py similarity index 100% rename from src/SOS/lldbplugin.tests/t_cmd_name2ee.py rename to src/tests/lldbplugin.tests/t_cmd_name2ee.py diff --git a/src/SOS/lldbplugin.tests/t_cmd_pe.py b/src/tests/lldbplugin.tests/t_cmd_pe.py similarity index 100% rename from src/SOS/lldbplugin.tests/t_cmd_pe.py rename to src/tests/lldbplugin.tests/t_cmd_pe.py diff --git a/src/SOS/lldbplugin.tests/t_cmd_sos.py b/src/tests/lldbplugin.tests/t_cmd_sos.py similarity index 100% rename from src/SOS/lldbplugin.tests/t_cmd_sos.py rename to src/tests/lldbplugin.tests/t_cmd_sos.py diff --git a/src/SOS/lldbplugin.tests/t_cmd_soshelp.py b/src/tests/lldbplugin.tests/t_cmd_soshelp.py similarity index 100% rename from src/SOS/lldbplugin.tests/t_cmd_soshelp.py rename to src/tests/lldbplugin.tests/t_cmd_soshelp.py diff --git a/src/SOS/lldbplugin.tests/test_libsosplugin.py b/src/tests/lldbplugin.tests/test_libsosplugin.py similarity index 100% rename from src/SOS/lldbplugin.tests/test_libsosplugin.py rename to src/tests/lldbplugin.tests/test_libsosplugin.py diff --git a/src/SOS/lldbplugin.tests/testsos.sh b/src/tests/lldbplugin.tests/testsos.sh old mode 100755 new mode 100644 similarity index 77% rename from src/SOS/lldbplugin.tests/testsos.sh rename to src/tests/lldbplugin.tests/testsos.sh index 38fd76b690..ed968e85b4 --- a/src/SOS/lldbplugin.tests/testsos.sh +++ b/src/tests/lldbplugin.tests/testsos.sh @@ -26,6 +26,6 @@ fi log_dir=$results_dir/lldbplugin.tests_$(date +%Y_%m_%d_%H_%M_%S) mkdir -p $log_dir -cd $project_root/src/SOS/lldbplugin.tests/ +cd $project_root/src/tests/lldbplugin.tests/ rm -f StressLog.txt -python $project_root/src/SOS/lldbplugin.tests/test_libsosplugin.py --lldb $LLDB_PATH --host "$host" --plugin $plugin --logfiledir $log_dir --assembly $test_program +python $project_root/src/tests/lldbplugin.tests/test_libsosplugin.py --lldb $LLDB_PATH --host "$host" --plugin $plugin --logfiledir $log_dir --assembly $test_program diff --git a/src/SOS/lldbplugin.tests/testutils.py b/src/tests/lldbplugin.tests/testutils.py similarity index 100% rename from src/SOS/lldbplugin.tests/testutils.py rename to src/tests/lldbplugin.tests/testutils.py From 4ba3f427b5076c3e06794ddd3eabc73852216e6d Mon Sep 17 00:00:00 2001 From: Max Charlamb <44248479+max-charlamb@users.noreply.github.com> Date: Thu, 4 Dec 2025 18:53:44 -0500 Subject: [PATCH 34/44] Remove references to $(RepoRoot) in testing scripts (#5614) This brings us closer to sending the tests to helix --- .../ConfigFiles/Unix/Debugger.Tests.Config.txt | 2 +- .../ConfigFiles/Windows/Debugger.Tests.Config.txt | 2 +- src/SOS/SOS.UnitTests/SOS.UnitTests.csproj | 11 +++++++++++ 3 files changed, 13 insertions(+), 2 deletions(-) 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 698895147d..c6d11338cb 100644 --- a/src/SOS/SOS.UnitTests/ConfigFiles/Unix/Debugger.Tests.Config.txt +++ b/src/SOS/SOS.UnitTests/ConfigFiles/Unix/Debugger.Tests.Config.txt @@ -13,7 +13,7 @@ ProjectK - $(RepoRootDir)/src/SOS/SOS.UnitTests/Scripts + $(ArtifactsDir)/bin/SOS.UnitTests/Scripts $(ArtifactsDir)/bin/$(OS).$(TargetArchitecture).$(TargetConfiguration) $(ArtifactsDir)/TestResults/$(TargetConfiguration)/sos.unittests_$(Timestamp) $(ArtifactsDir)/tmp/$(TargetConfiguration)\dumps 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 1639348111..e6e3c468a7 100644 --- a/src/SOS/SOS.UnitTests/ConfigFiles/Windows/Debugger.Tests.Config.txt +++ b/src/SOS/SOS.UnitTests/ConfigFiles/Windows/Debugger.Tests.Config.txt @@ -12,7 +12,7 @@ $(ArtifactsDir)\dotnet-test - $(RepoRootDir)\src\SOS\SOS.UnitTests\Scripts + $(ArtifactsDir)\bin\SOS.UnitTests\Scripts $(ArtifactsDir)\bin\Windows_NT.$(TargetArchitecture).$(TargetConfiguration) $(ArtifactsDir)\TestResults\$(TargetConfiguration)\sos.unittests_$(Timestamp) $(ArtifactsDir)\tmp\$(TargetConfiguration)\dumps diff --git a/src/SOS/SOS.UnitTests/SOS.UnitTests.csproj b/src/SOS/SOS.UnitTests/SOS.UnitTests.csproj index 913e37d4b7..cd5b73d5f8 100644 --- a/src/SOS/SOS.UnitTests/SOS.UnitTests.csproj +++ b/src/SOS/SOS.UnitTests/SOS.UnitTests.csproj @@ -62,4 +62,15 @@ + + + + + + + + + From bc690978a4eb3e98c3b09ab198fe213d5eb884b7 Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" <42748379+dotnet-maestro[bot]@users.noreply.github.com> Date: Thu, 4 Dec 2025 16:20:38 -0800 Subject: [PATCH 35/44] [main] Update dependencies from dotnet/dotnet (#5650) This pull request updates the following dependencies [marker]: <> (Begin:9c7d85bb-274e-4ad6-970a-48ffc448929b) ## From https://github.com/dotnet/dotnet - **Subscription**: [9c7d85bb-274e-4ad6-970a-48ffc448929b](https://maestro.dot.net/subscriptions?search=9c7d85bb-274e-4ad6-970a-48ffc448929b) - **Build**: [20251203.3](https://dev.azure.com/dnceng/internal/_build/results?buildId=2852778) ([293194](https://maestro.dot.net/channel/5173/github:dotnet:dotnet/build/293194)) - **Date Produced**: December 3, 2025 7:24:47 PM UTC - **Commit**: [5ddd0ddc0ebadca21645a05c419ed5a034454605](https://github.com/dotnet/dotnet/commit/5ddd0ddc0ebadca21645a05c419ed5a034454605) - **Branch**: [release/10.0.1xx](https://github.com/dotnet/dotnet/tree/release/10.0.1xx) [DependencyUpdate]: <> (Begin) - **Dependency Updates**: - From [10.0.2-servicing.25601.110 to 10.0.2-servicing.25603.103][1] - runtime.linux-arm64.Microsoft.DotNet.Cdac.Transport - runtime.linux-x64.Microsoft.DotNet.Cdac.Transport - runtime.osx-arm64.Microsoft.DotNet.Cdac.Transport - runtime.osx-x64.Microsoft.DotNet.Cdac.Transport - runtime.win-arm64.Microsoft.DotNet.Cdac.Transport - Microsoft.AspNetCore.App.Ref.Internal - Microsoft.NETCore.Platforms - runtime.win-x64.Microsoft.DotNet.Cdac.Transport - From [10.0.2 to 10.0.2][1] - Microsoft.AspNetCore.App.Ref - Microsoft.NETCore.App.Ref - From [5.0.0-2.25601.110 to 5.0.0-2.25603.103][1] - Microsoft.CodeAnalysis - Microsoft.CodeAnalysis.Analyzers - Microsoft.CodeAnalysis.CSharp - From [10.0.102 to 10.0.102][1] - Microsoft.CodeAnalysis.NetAnalyzers - From [10.0.0-beta.25601.110 to 10.0.0-beta.25603.103][1] - Microsoft.DotNet.Arcade.Sdk - Microsoft.DotNet.CodeAnalysis - From [10.0.102-servicing.25601.110 to 10.0.102-servicing.25603.103][1] - Microsoft.NET.Sdk [1]: https://github.com/dotnet/dotnet/compare/7dedd35363...5ddd0ddc0e [DependencyUpdate]: <> (End) [marker]: <> (End:9c7d85bb-274e-4ad6-970a-48ffc448929b) Co-authored-by: dotnet-maestro[bot] --- NuGet.config | 2 +- eng/Version.Details.props | 28 +++++++++--------- eng/Version.Details.xml | 62 +++++++++++++++++++-------------------- global.json | 2 +- 4 files changed, 47 insertions(+), 47 deletions(-) diff --git a/NuGet.config b/NuGet.config index 324bea91ab..2dc10a79b4 100644 --- a/NuGet.config +++ b/NuGet.config @@ -7,7 +7,7 @@ - + diff --git a/eng/Version.Details.props b/eng/Version.Details.props index 600df683a0..dffd39389a 100644 --- a/eng/Version.Details.props +++ b/eng/Version.Details.props @@ -14,22 +14,22 @@ This file should be imported by eng/Versions.props 1.0.105-preview.225 10.0.2 - 10.0.2-servicing.25601.110 - 5.0.0-2.25601.110 - 5.0.0-2.25601.110 - 5.0.0-2.25601.110 + 10.0.2-servicing.25603.103 + 5.0.0-2.25603.103 + 5.0.0-2.25603.103 + 5.0.0-2.25603.103 10.0.102 - 10.0.0-beta.25601.110 - 10.0.0-beta.25601.110 - 10.0.102-servicing.25601.110 + 10.0.0-beta.25603.103 + 10.0.0-beta.25603.103 + 10.0.102-servicing.25603.103 10.0.2 - 10.0.2-servicing.25601.110 - 10.0.2-servicing.25601.110 - 10.0.2-servicing.25601.110 - 10.0.2-servicing.25601.110 - 10.0.2-servicing.25601.110 - 10.0.2-servicing.25601.110 - 10.0.2-servicing.25601.110 + 10.0.2-servicing.25603.103 + 10.0.2-servicing.25603.103 + 10.0.2-servicing.25603.103 + 10.0.2-servicing.25603.103 + 10.0.2-servicing.25603.103 + 10.0.2-servicing.25603.103 + 10.0.2-servicing.25603.103 7.0.0-beta.22316.2 diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index 1021d2fe52..4d073c2f0c 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -19,31 +19,31 @@ - + https://github.com/dotnet/dotnet - 7dedd35363daf74f94a980da38f2cf4dc86cc23a + 5ddd0ddc0ebadca21645a05c419ed5a034454605 - + https://github.com/dotnet/dotnet - 7dedd35363daf74f94a980da38f2cf4dc86cc23a + 5ddd0ddc0ebadca21645a05c419ed5a034454605 https://github.com/dotnet/arcade ccfe6da198c5f05534863bbb1bff66e830e0c6ab - + https://github.com/dotnet/dotnet - 7dedd35363daf74f94a980da38f2cf4dc86cc23a + 5ddd0ddc0ebadca21645a05c419ed5a034454605 - + https://github.com/dotnet/dotnet - 7dedd35363daf74f94a980da38f2cf4dc86cc23a + 5ddd0ddc0ebadca21645a05c419ed5a034454605 https://github.com/dotnet/dotnet - 7dedd35363daf74f94a980da38f2cf4dc86cc23a + 5ddd0ddc0ebadca21645a05c419ed5a034454605 https://github.com/dotnet/dotnet - 7dedd35363daf74f94a980da38f2cf4dc86cc23a + 5ddd0ddc0ebadca21645a05c419ed5a034454605 - + https://github.com/dotnet/dotnet - 7dedd35363daf74f94a980da38f2cf4dc86cc23a + 5ddd0ddc0ebadca21645a05c419ed5a034454605 - + https://github.com/dotnet/dotnet - 7dedd35363daf74f94a980da38f2cf4dc86cc23a + 5ddd0ddc0ebadca21645a05c419ed5a034454605 - + https://github.com/dotnet/dotnet - 7dedd35363daf74f94a980da38f2cf4dc86cc23a + 5ddd0ddc0ebadca21645a05c419ed5a034454605 - + https://github.com/dotnet/dotnet - 7dedd35363daf74f94a980da38f2cf4dc86cc23a + 5ddd0ddc0ebadca21645a05c419ed5a034454605 - + https://github.com/dotnet/dotnet - 7dedd35363daf74f94a980da38f2cf4dc86cc23a + 5ddd0ddc0ebadca21645a05c419ed5a034454605 - + https://github.com/dotnet/dotnet - 7dedd35363daf74f94a980da38f2cf4dc86cc23a + 5ddd0ddc0ebadca21645a05c419ed5a034454605 - + https://github.com/dotnet/dotnet - 7dedd35363daf74f94a980da38f2cf4dc86cc23a + 5ddd0ddc0ebadca21645a05c419ed5a034454605 - + https://github.com/dotnet/dotnet - 7dedd35363daf74f94a980da38f2cf4dc86cc23a + 5ddd0ddc0ebadca21645a05c419ed5a034454605 - + https://github.com/dotnet/dotnet - 7dedd35363daf74f94a980da38f2cf4dc86cc23a + 5ddd0ddc0ebadca21645a05c419ed5a034454605 - + https://github.com/dotnet/dotnet - 7dedd35363daf74f94a980da38f2cf4dc86cc23a + 5ddd0ddc0ebadca21645a05c419ed5a034454605 https://github.com/dotnet/dotnet - 7dedd35363daf74f94a980da38f2cf4dc86cc23a + 5ddd0ddc0ebadca21645a05c419ed5a034454605 diff --git a/global.json b/global.json index 4827c55875..f6eb7542fc 100644 --- a/global.json +++ b/global.json @@ -18,6 +18,6 @@ "msbuild-sdks": { "Microsoft.Build.NoTargets": "3.5.0", "Microsoft.Build.Traversal": "3.4.0", - "Microsoft.DotNet.Arcade.Sdk": "10.0.0-beta.25601.110" + "Microsoft.DotNet.Arcade.Sdk": "10.0.0-beta.25603.103" } } From 848b19c830197ff075fa503b005a6c9224901624 Mon Sep 17 00:00:00 2001 From: Max Charlamb <44248479+max-charlamb@users.noreply.github.com> Date: Thu, 4 Dec 2025 22:37:26 -0500 Subject: [PATCH 36/44] Simplify test `csproj` files (#5653) ## Adds * MSBuild property: `$(SrcDir) -> $(RepoRoot)/src/` * MSBuild property: `$(TestDir) -> $(ReporRoot/src/tests/` ## Modifies * Tests `.csproj` files to use these properties to simplify imports. This also allows us to move around the test/src directories without modifying each project individually. * `Microsoft.FileFormats.UnitTests.csproj` and `Microsoft.SymbolStore.UnitTests.csproj` both copy test binary assets from the source tree into the artifacts tree. This was handled individually for each item with some inconsistencies. I simplified this process using globbing. There are a couple more files that are copied now, but I believe this shouldn't have any appreciable impact. --- Directory.Build.props | 2 + .../CommonTestRunner/CommonTestRunner.csproj | 2 +- .../DbgShim.UnitTests.csproj | 4 +- src/tests/Grape/Grape.csproj | 4 +- ...Diagnostics.DebugServices.UnitTests.csproj | 8 +- ...tics.Monitoring.EventPipe.UnitTests.csproj | 6 +- ...ft.Diagnostics.Monitoring.UnitTests.csproj | 6 +- ...iagnostics.NETCore.Client.UnitTests.csproj | 6 +- .../Microsoft.FileFormats.UnitTests.csproj | 58 +----------- .../Microsoft.SymbolStore.UnitTests.csproj | 94 ++----------------- src/tests/TestExtension/TestExtension.csproj | 2 +- src/tests/TestHelpers/TestHelpers.csproj | 2 +- .../DotnetCounters.UnitTests.csproj | 6 +- .../dotnet-stack/DotnetStack.UnitTests.csproj | 4 +- .../dotnet-trace/DotnetTrace.UnitTests.csproj | 4 +- .../eventpipe/EventPipe.UnitTests.csproj | 2 +- 16 files changed, 41 insertions(+), 169 deletions(-) diff --git a/Directory.Build.props b/Directory.Build.props index b225f2f659..c2fceffbab 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -33,6 +33,8 @@ --> + $([MSBuild]::NormalizeDirectory('$(RepoRoot)', 'src')) + $([MSBuild]::NormalizeDirectory('$(RepoRoot)', 'src', 'tests')) $([MSBuild]::NormalizeDirectory('$(ArtifactsDir)', 'dotnet-test')) diff --git a/src/tests/CommonTestRunner/CommonTestRunner.csproj b/src/tests/CommonTestRunner/CommonTestRunner.csproj index 5c7edce292..4d969d300b 100644 --- a/src/tests/CommonTestRunner/CommonTestRunner.csproj +++ b/src/tests/CommonTestRunner/CommonTestRunner.csproj @@ -6,7 +6,7 @@ - + diff --git a/src/tests/DbgShim.UnitTests/DbgShim.UnitTests.csproj b/src/tests/DbgShim.UnitTests/DbgShim.UnitTests.csproj index 3e386ce635..e7ec5d53c4 100644 --- a/src/tests/DbgShim.UnitTests/DbgShim.UnitTests.csproj +++ b/src/tests/DbgShim.UnitTests/DbgShim.UnitTests.csproj @@ -12,8 +12,8 @@ - - + + diff --git a/src/tests/Grape/Grape.csproj b/src/tests/Grape/Grape.csproj index f37e603eb4..76be2271ac 100644 --- a/src/tests/Grape/Grape.csproj +++ b/src/tests/Grape/Grape.csproj @@ -6,8 +6,8 @@ - - + + diff --git a/src/tests/Microsoft.Diagnostics.DebugServices.UnitTests/Microsoft.Diagnostics.DebugServices.UnitTests.csproj b/src/tests/Microsoft.Diagnostics.DebugServices.UnitTests/Microsoft.Diagnostics.DebugServices.UnitTests.csproj index c6efc5cfd9..9a4014149c 100644 --- a/src/tests/Microsoft.Diagnostics.DebugServices.UnitTests/Microsoft.Diagnostics.DebugServices.UnitTests.csproj +++ b/src/tests/Microsoft.Diagnostics.DebugServices.UnitTests/Microsoft.Diagnostics.DebugServices.UnitTests.csproj @@ -13,10 +13,10 @@ - - - - + + + + diff --git a/src/tests/Microsoft.Diagnostics.Monitoring.EventPipe/Microsoft.Diagnostics.Monitoring.EventPipe.UnitTests.csproj b/src/tests/Microsoft.Diagnostics.Monitoring.EventPipe/Microsoft.Diagnostics.Monitoring.EventPipe.UnitTests.csproj index 8f50320f25..7d44500941 100644 --- a/src/tests/Microsoft.Diagnostics.Monitoring.EventPipe/Microsoft.Diagnostics.Monitoring.EventPipe.UnitTests.csproj +++ b/src/tests/Microsoft.Diagnostics.Monitoring.EventPipe/Microsoft.Diagnostics.Monitoring.EventPipe.UnitTests.csproj @@ -5,9 +5,9 @@ - - - + + + diff --git a/src/tests/Microsoft.Diagnostics.Monitoring/Microsoft.Diagnostics.Monitoring.UnitTests.csproj b/src/tests/Microsoft.Diagnostics.Monitoring/Microsoft.Diagnostics.Monitoring.UnitTests.csproj index 599592baf7..e7bb6394da 100644 --- a/src/tests/Microsoft.Diagnostics.Monitoring/Microsoft.Diagnostics.Monitoring.UnitTests.csproj +++ b/src/tests/Microsoft.Diagnostics.Monitoring/Microsoft.Diagnostics.Monitoring.UnitTests.csproj @@ -5,9 +5,9 @@ - - - + + + diff --git a/src/tests/Microsoft.Diagnostics.NETCore.Client/Microsoft.Diagnostics.NETCore.Client.UnitTests.csproj b/src/tests/Microsoft.Diagnostics.NETCore.Client/Microsoft.Diagnostics.NETCore.Client.UnitTests.csproj index 0737076d0e..30562d9f87 100644 --- a/src/tests/Microsoft.Diagnostics.NETCore.Client/Microsoft.Diagnostics.NETCore.Client.UnitTests.csproj +++ b/src/tests/Microsoft.Diagnostics.NETCore.Client/Microsoft.Diagnostics.NETCore.Client.UnitTests.csproj @@ -5,9 +5,9 @@ - - - + + + diff --git a/src/tests/Microsoft.FileFormats.UnitTests/Microsoft.FileFormats.UnitTests.csproj b/src/tests/Microsoft.FileFormats.UnitTests/Microsoft.FileFormats.UnitTests.csproj index 35b78f4be7..808617aa05 100644 --- a/src/tests/Microsoft.FileFormats.UnitTests/Microsoft.FileFormats.UnitTests.csproj +++ b/src/tests/Microsoft.FileFormats.UnitTests/Microsoft.FileFormats.UnitTests.csproj @@ -3,64 +3,16 @@ $(NetCoreAppMinTargetFramework) ;1591;1701 + - + + - - PreserveNewest - - - Always - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - + + TestBinaries\%(RecursiveDir)%(Filename)%(Extension) PreserveNewest - - - - - - diff --git a/src/tests/Microsoft.SymbolStore.UnitTests/Microsoft.SymbolStore.UnitTests.csproj b/src/tests/Microsoft.SymbolStore.UnitTests/Microsoft.SymbolStore.UnitTests.csproj index b3a103a3fa..e2dc9e42a7 100644 --- a/src/tests/Microsoft.SymbolStore.UnitTests/Microsoft.SymbolStore.UnitTests.csproj +++ b/src/tests/Microsoft.SymbolStore.UnitTests/Microsoft.SymbolStore.UnitTests.csproj @@ -13,8 +13,8 @@ - - + + @@ -22,94 +22,12 @@ - - PreserveNewest - - - - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - + + TestBinaries\%(RecursiveDir)%(Filename)%(Extension) PreserveNewest - + + TestBinaries\%(RecursiveDir)%(Filename)%(Extension) PreserveNewest diff --git a/src/tests/TestExtension/TestExtension.csproj b/src/tests/TestExtension/TestExtension.csproj index 3db8fe9c15..a78394a2c1 100644 --- a/src/tests/TestExtension/TestExtension.csproj +++ b/src/tests/TestExtension/TestExtension.csproj @@ -5,7 +5,7 @@ - + diff --git a/src/tests/TestHelpers/TestHelpers.csproj b/src/tests/TestHelpers/TestHelpers.csproj index 3ad5a576f6..7da9351438 100644 --- a/src/tests/TestHelpers/TestHelpers.csproj +++ b/src/tests/TestHelpers/TestHelpers.csproj @@ -5,6 +5,6 @@ - + diff --git a/src/tests/dotnet-counters/DotnetCounters.UnitTests.csproj b/src/tests/dotnet-counters/DotnetCounters.UnitTests.csproj index 70eb65bb61..aa872e9b45 100644 --- a/src/tests/dotnet-counters/DotnetCounters.UnitTests.csproj +++ b/src/tests/dotnet-counters/DotnetCounters.UnitTests.csproj @@ -5,9 +5,9 @@ - - - + + + diff --git a/src/tests/dotnet-stack/DotnetStack.UnitTests.csproj b/src/tests/dotnet-stack/DotnetStack.UnitTests.csproj index d6b536f04d..ec1182198c 100644 --- a/src/tests/dotnet-stack/DotnetStack.UnitTests.csproj +++ b/src/tests/dotnet-stack/DotnetStack.UnitTests.csproj @@ -5,8 +5,8 @@ - - + + diff --git a/src/tests/dotnet-trace/DotnetTrace.UnitTests.csproj b/src/tests/dotnet-trace/DotnetTrace.UnitTests.csproj index 1f62530a1c..9d70543023 100644 --- a/src/tests/dotnet-trace/DotnetTrace.UnitTests.csproj +++ b/src/tests/dotnet-trace/DotnetTrace.UnitTests.csproj @@ -9,8 +9,8 @@ - - + + diff --git a/src/tests/eventpipe/EventPipe.UnitTests.csproj b/src/tests/eventpipe/EventPipe.UnitTests.csproj index d375aac992..0234a80bbe 100644 --- a/src/tests/eventpipe/EventPipe.UnitTests.csproj +++ b/src/tests/eventpipe/EventPipe.UnitTests.csproj @@ -8,7 +8,7 @@ - + From d1421e4bd32edb03709d3780c6bd8d2551ed05b2 Mon Sep 17 00:00:00 2001 From: Max Charlamb <44248479+max-charlamb@users.noreply.github.com> Date: Fri, 5 Dec 2025 11:35:14 -0500 Subject: [PATCH 37/44] add MiniDumpLocalVarLookup test (#5579) * Adds SOS test for minidump local var lookup --- .../MiniDumpLocalVarLookup.csproj | 7 +++ .../MiniDumpLocalVarLookup/Program.cs | 26 ++++++++++ src/SOS/SOS.UnitTests/SOS.cs | 50 +++++++++++++++++-- src/SOS/SOS.UnitTests/SOSRunner.cs | 10 ++++ .../Scripts/MiniDumpLocalVarLookup.script | 15 ++++++ 5 files changed, 105 insertions(+), 3 deletions(-) create mode 100644 src/SOS/SOS.UnitTests/Debuggees/MiniDumpLocalVarLookup/MiniDumpLocalVarLookup.csproj create mode 100644 src/SOS/SOS.UnitTests/Debuggees/MiniDumpLocalVarLookup/Program.cs create mode 100644 src/SOS/SOS.UnitTests/Scripts/MiniDumpLocalVarLookup.script diff --git a/src/SOS/SOS.UnitTests/Debuggees/MiniDumpLocalVarLookup/MiniDumpLocalVarLookup.csproj b/src/SOS/SOS.UnitTests/Debuggees/MiniDumpLocalVarLookup/MiniDumpLocalVarLookup.csproj new file mode 100644 index 0000000000..644ea7fa32 --- /dev/null +++ b/src/SOS/SOS.UnitTests/Debuggees/MiniDumpLocalVarLookup/MiniDumpLocalVarLookup.csproj @@ -0,0 +1,7 @@ + + + Exe + $(BuildProjectFramework) + $(SupportedSubProcessTargetFrameworks) + + diff --git a/src/SOS/SOS.UnitTests/Debuggees/MiniDumpLocalVarLookup/Program.cs b/src/SOS/SOS.UnitTests/Debuggees/MiniDumpLocalVarLookup/Program.cs new file mode 100644 index 0000000000..cbea65ad93 --- /dev/null +++ b/src/SOS/SOS.UnitTests/Debuggees/MiniDumpLocalVarLookup/Program.cs @@ -0,0 +1,26 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +using System; +using System.Diagnostics; + +namespace MiniDumpLocalVarLookup; + +internal class Program +{ + static public void Main() + { + int intValue = 42; + string stringValue = "Hello, World!"; + + PrintValues(intValue, stringValue); + } + + static void PrintValues(int intValue, string stringValue) + { + int length = stringValue.Length; + Debugger.Break(); + Console.WriteLine($"intValue: {intValue}"); + Console.WriteLine($"stringValue: {stringValue} (length = {length})"); + } +} diff --git a/src/SOS/SOS.UnitTests/SOS.cs b/src/SOS/SOS.UnitTests/SOS.cs index a4fa145545..7099fc8d2b 100644 --- a/src/SOS/SOS.UnitTests/SOS.cs +++ b/src/SOS/SOS.UnitTests/SOS.cs @@ -139,7 +139,9 @@ internal static async Task RunTest( string testName = null, bool testLive = true, bool testDump = true, - bool testTriage = false) + bool testTriage = false, + bool testMini = false, + SOSRunner.DumpGenerator dumpGenerator = SOSRunner.DumpGenerator.CreateDump) { await RunTest(scriptName, new SOSRunner.TestInformation @@ -149,7 +151,8 @@ await RunTest(scriptName, TestLive = testLive, TestDump = testDump, DebuggeeName = debuggeeName, - DumpType = SOSRunner.DumpType.Heap + DumpType = SOSRunner.DumpType.Heap, + DumpGenerator = dumpGenerator, }, output); @@ -165,7 +168,23 @@ await RunTest(scriptName, TestLive = false, TestDump = testDump, DebuggeeName = debuggeeName, - DumpType = SOSRunner.DumpType.Triage + DumpType = SOSRunner.DumpType.Triage, + DumpGenerator = dumpGenerator, + }, + output); + } + if (testMini && !config.PublishSingleFile) + { + await RunTest(scriptName, + new SOSRunner.TestInformation + { + TestConfiguration = config, + TestName = testName, + TestLive = false, + TestDump = testDump, + DebuggeeName = debuggeeName, + DumpType = SOSRunner.DumpType.Mini, + DumpGenerator = dumpGenerator, }, output); } @@ -234,6 +253,31 @@ public SOS(ITestOutputHelper output) public static IEnumerable Configurations => SOSTestHelpers.GetConfigurations("TestName", value: null); + [SkippableTheory, MemberData(nameof(SOSTestHelpers.GetNetCoreConfigurations), MemberType = typeof(SOSTestHelpers))] + public async Task MiniDumpLocalVarLookup(TestConfiguration config) + { + if (OS.Kind != OSKind.Windows) + { + throw new SkipTestException("Test only supports CDB and therefore only runs on Windows"); + } + + if (config.PublishSingleFile) + { + throw new SkipTestException("Single file does not support mini dumps"); + } + + // The default dumpGenerator, CreateDump, only supports taking dumps at exceptions. + // DotnetDump could support taking a dump at a breakpoint, but this SOS test framework doesn't currently support this operation. + // Therefore we use the NativeDebugger to take a dump at the DebugBreak() call in the debuggee. + await SOSTestHelpers.RunTest( + config, + debuggeeName: "MiniDumpLocalVarLookup", + scriptName: "MiniDumpLocalVarLookup.script", + Output, + testName: "SOS.MiniDumpLocalVarLookup", + testMini: true, + dumpGenerator: SOSRunner.DumpGenerator.NativeDebugger); + } [SkippableTheory, MemberData(nameof(SOSTestHelpers.GetNetCoreConfigurations), MemberType = typeof(SOSTestHelpers))] public async Task VarargPInvokeInteropMD(TestConfiguration config) diff --git a/src/SOS/SOS.UnitTests/SOSRunner.cs b/src/SOS/SOS.UnitTests/SOSRunner.cs index 382a66bfe9..80fed0eb5e 100644 --- a/src/SOS/SOS.UnitTests/SOSRunner.cs +++ b/src/SOS/SOS.UnitTests/SOSRunner.cs @@ -34,6 +34,7 @@ public enum DumpGenerator public enum DumpType { Triage, + Mini, Heap, Full } @@ -235,6 +236,9 @@ public static async Task CreateDump(TestInformation information) await runner.ContinueExecution(); switch (information.DumpType) { + case DumpType.Mini: + command = ".dump /o /m %DUMP_NAME%"; + break; case DumpType.Heap: command = ".dump /o /mw %DUMP_NAME%"; break; @@ -349,6 +353,9 @@ public static async Task CreateDump(TestInformation information) } switch (dumpType) { + case DumpType.Mini: + processRunner.WithRuntimeConfiguration("DbgMiniDumpType", "1"); + break; case DumpType.Heap: processRunner.WithRuntimeConfiguration("DbgMiniDumpType", "2"); break; @@ -1498,6 +1505,9 @@ private HashSet GetEnabledDefines() { switch (_dumpType.Value) { + case DumpType.Mini: + defines.Add("MINI_DUMP"); + break; case DumpType.Triage: defines.Add("TRIAGE_DUMP"); break; diff --git a/src/SOS/SOS.UnitTests/Scripts/MiniDumpLocalVarLookup.script b/src/SOS/SOS.UnitTests/Scripts/MiniDumpLocalVarLookup.script new file mode 100644 index 0000000000..8ce9245019 --- /dev/null +++ b/src/SOS/SOS.UnitTests/Scripts/MiniDumpLocalVarLookup.script @@ -0,0 +1,15 @@ +# +# Verifies that local stack value variables are able to be parsed by the debugger in mini/triage dumps +# Utilizes the ICorDebug stackwalk with -i +# + +CONTINUE + +LOADSOS + +# stackwalk with locals +SOSCOMMAND:clrstack -l + +# stackwalk through ICorDebug with locals +SOSCOMMAND:clrstack -i -l +VERIFY:int\s+length\s+=\s+13 From 5de3340acb90f8f47f0a16f2391e9939b4ed5da6 Mon Sep 17 00:00:00 2001 From: Max Charlamb <44248479+max-charlamb@users.noreply.github.com> Date: Fri, 5 Dec 2025 11:36:00 -0500 Subject: [PATCH 38/44] move native SOS test helpers to test folder (#5652) * Moves `runcommand` and `DesktopClrHost` from under the SOS package to `src/tests/` --- src/CMakeLists.txt | 1 + src/SOS/CMakeLists.txt | 7 +------ src/tests/CMakeLists.txt | 9 +++++++++ .../Debuggees => tests}/DesktopClrHost/CMakeLists.txt | 3 ++- .../DesktopClrHost/DesktopClrHost.cpp | 0 src/{SOS => tests}/runcommand/CMakeLists.txt | 1 - src/{SOS => tests}/runcommand/runcommand.cpp | 0 7 files changed, 13 insertions(+), 8 deletions(-) create mode 100644 src/tests/CMakeLists.txt rename src/{SOS/SOS.UnitTests/Debuggees => tests}/DesktopClrHost/CMakeLists.txt (93%) rename src/{SOS/SOS.UnitTests/Debuggees => tests}/DesktopClrHost/DesktopClrHost.cpp (100%) rename src/{SOS => tests}/runcommand/CMakeLists.txt (96%) rename src/{SOS => tests}/runcommand/runcommand.cpp (100%) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index bcc839a522..9cc90dbd49 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -7,3 +7,4 @@ endif (CLR_CMAKE_HOST_UNIX) add_subdirectory(shared) add_subdirectory(SOS) add_subdirectory(dbgshim) +add_subdirectory(tests) diff --git a/src/SOS/CMakeLists.txt b/src/SOS/CMakeLists.txt index 901a26e428..79d7eef563 100644 --- a/src/SOS/CMakeLists.txt +++ b/src/SOS/CMakeLists.txt @@ -10,13 +10,8 @@ if(CLR_CMAKE_HOST_WIN32) message(STATUS "VSInstallDir: $ENV{VSInstallDir}") include_directories("$ENV{VSInstallDir}/DIA SDK/include") - + add_compile_options(/Zl) # omit default library name in .OBJ - - add_subdirectory(runcommand) - if(NOT CLR_CMAKE_TARGET_ARCH_ARM) - add_subdirectory(SOS.UnitTests/Debuggees/DesktopClrHost) - endif(NOT CLR_CMAKE_TARGET_ARCH_ARM) endif(CLR_CMAKE_HOST_WIN32) add_compile_definitions(STRESS_LOG_ANALYZER) diff --git a/src/tests/CMakeLists.txt b/src/tests/CMakeLists.txt new file mode 100644 index 0000000000..bf31588276 --- /dev/null +++ b/src/tests/CMakeLists.txt @@ -0,0 +1,9 @@ +include(${CLR_SHARED_DIR}/shared.cmake) + +if(CLR_CMAKE_HOST_WIN32) + # test helpers used by SOS tests + add_subdirectory(runcommand) + if(NOT CLR_CMAKE_TARGET_ARCH_ARM) + add_subdirectory(DesktopClrHost) + endif(NOT CLR_CMAKE_TARGET_ARCH_ARM) +endif(CLR_CMAKE_HOST_WIN32) diff --git a/src/SOS/SOS.UnitTests/Debuggees/DesktopClrHost/CMakeLists.txt b/src/tests/DesktopClrHost/CMakeLists.txt similarity index 93% rename from src/SOS/SOS.UnitTests/Debuggees/DesktopClrHost/CMakeLists.txt rename to src/tests/DesktopClrHost/CMakeLists.txt index 567493fa1e..0c2facfd78 100644 --- a/src/SOS/SOS.UnitTests/Debuggees/DesktopClrHost/CMakeLists.txt +++ b/src/tests/DesktopClrHost/CMakeLists.txt @@ -2,11 +2,12 @@ project(DesktopClrHost) set(CMAKE_INCLUDE_CURRENT_DIR ON) -include_directories(inc) include_directories("$ENV{VSInstallDir}/DIA SDK/include") add_definitions(-DUSE_STL) +add_compile_options(/Zl) # omit default library name in .OBJ + set(DESKTOPCLRHOST_SOURCES DesktopClrHost.cpp ) diff --git a/src/SOS/SOS.UnitTests/Debuggees/DesktopClrHost/DesktopClrHost.cpp b/src/tests/DesktopClrHost/DesktopClrHost.cpp similarity index 100% rename from src/SOS/SOS.UnitTests/Debuggees/DesktopClrHost/DesktopClrHost.cpp rename to src/tests/DesktopClrHost/DesktopClrHost.cpp diff --git a/src/SOS/runcommand/CMakeLists.txt b/src/tests/runcommand/CMakeLists.txt similarity index 96% rename from src/SOS/runcommand/CMakeLists.txt rename to src/tests/runcommand/CMakeLists.txt index c9b492de8a..a52c56da3f 100644 --- a/src/SOS/runcommand/CMakeLists.txt +++ b/src/tests/runcommand/CMakeLists.txt @@ -2,7 +2,6 @@ project(runcommand) set(CMAKE_INCLUDE_CURRENT_DIR ON) -include_directories(inc) include_directories("$ENV{VSInstallDir}/DIA SDK/include") add_definitions(-DUSE_STL) diff --git a/src/SOS/runcommand/runcommand.cpp b/src/tests/runcommand/runcommand.cpp similarity index 100% rename from src/SOS/runcommand/runcommand.cpp rename to src/tests/runcommand/runcommand.cpp From 33fbc9520aca73c454d700bba479e744d969dcb8 Mon Sep 17 00:00:00 2001 From: Max Charlamb <44248479+max-charlamb@users.noreply.github.com> Date: Fri, 5 Dec 2025 15:16:38 -0500 Subject: [PATCH 39/44] Move SOS.UnitTests to tests folder (#5655) --- build.sln | 833 +++++++++--------- eng/testsos.cmd | 2 +- eng/testsos.sh | 2 +- eng/testsoscdac.cmd | 2 +- eng/testsoscdac.sh | 2 +- src/dirs.proj | 1 - .../Unix/Debugger.Tests.Config.txt | 2 +- .../Windows/Debugger.Tests.Config.txt | 2 +- .../Debuggees/Directory.Build.props | 0 .../Debuggees/DivZero/DivZero.cs | 0 .../Debuggees/DivZero/DivZero.csproj | 0 .../DotnetDumpCommands.csproj | 0 .../Debuggees/DotnetDumpCommands/Program.cs | 0 .../Debuggees/DumpGCData/DumpGCData.csproj | 0 .../Debuggees/DumpGCData/Program.cs | 0 .../DynamicMethod/DynamicMethod.csproj | 0 .../Debuggees/DynamicMethod/Program.cs | 0 .../FindRootsOlderGeneration.csproj | 0 .../FindRootsOlderGeneration/Program.cs | 0 .../SOS.UnitTests/Debuggees/GCPOH/GCPOH.cs | 0 .../Debuggees/GCPOH/GCPOH.csproj | 0 .../Debuggees/GCWhere/GCWhere.cs | 0 .../Debuggees/GCWhere/GCWhere.csproj | 0 .../Debuggees/LineNums/LineNums.csproj | 0 .../Debuggees/LineNums/Program.cs | 0 .../MiniDumpLocalVarLookup.csproj | 0 .../MiniDumpLocalVarLookup/Program.cs | 0 .../NestedExceptionTest.cs | 0 .../NestedExceptionTest.csproj | 0 .../Debuggees/Overflow/Overflow.cs | 0 .../Debuggees/Overflow/Overflow.csproj | 0 .../ReflectionTest/ReflectionTest.cs | 0 .../ReflectionTest/ReflectionTest.csproj | 0 .../Debuggees/SimpleThrow/SimpleThrow.cs | 0 .../Debuggees/SimpleThrow/SimpleThrow.csproj | 0 .../Debuggees/SimpleThrow/UserObject.cs | 0 .../Debuggees/SymbolTestApp/SymbolTestApp.sln | 0 .../SymbolTestApp/SymbolTestApp.cs | 0 .../SymbolTestApp/SymbolTestApp.csproj | 0 .../SymbolTestDll/SymbolTestDll.csproj | 0 .../SymbolTestApp/SymbolTestDll/TestClass.cs | 0 .../RandomUserLibrary.csproj | 0 .../RandomUserLibrary/RandomUserTask.cs | 0 .../TaskNestedException.sln | 0 .../TaskNestedException.cs | 0 .../TaskNestedException.csproj | 0 .../VarargPInvokeInteropMD/Program.cs | 0 .../VarargPInvokeInteropMD.csproj | 0 .../Debuggees/WebApp3/Program.cs | 0 .../WebApp3/Properties/launchSettings.json | 0 .../Debuggees/WebApp3/Startup.cs | 0 .../Debuggees/WebApp3/WebApp3.csproj | 0 .../WebApp3/appsettings.Development.json | 0 .../Debuggees/WebApp3/appsettings.json | 0 .../SOS.UnitTests/DumpGenerationFixture.cs | 0 .../SOS.UnitTests/SOS.UnitTests.csproj | 4 +- src/{SOS => tests}/SOS.UnitTests/SOS.cs | 0 src/{SOS => tests}/SOS.UnitTests/SOSRunner.cs | 0 .../Scripts/ClrStackWithNumberOfFrames.script | 0 .../Scripts/ConcurrentDictionaries.script | 0 .../SOS.UnitTests/Scripts/DivZero.script | 0 .../SOS.UnitTests/Scripts/DualRuntimes.script | 0 .../SOS.UnitTests/Scripts/DumpGCData.script | 0 .../SOS.UnitTests/Scripts/DumpGen.script | 0 .../Scripts/DynamicMethod.script | 0 .../Scripts/FindRootsOlderGeneration.script | 0 .../SOS.UnitTests/Scripts/GCPOH.script | 0 .../SOS.UnitTests/Scripts/GCTests.script | 0 .../SOS.UnitTests/Scripts/LineNums.script | 0 .../Scripts/MiniDumpLocalVarLookup.script | 0 .../Scripts/NestedExceptionTest.script | 0 .../Scripts/OtherCommands.script | 0 .../SOS.UnitTests/Scripts/Overflow.script | 0 .../SOS.UnitTests/Scripts/Reflection.script | 0 .../SOS.UnitTests/Scripts/SimpleThrow.script | 0 .../Scripts/StackAndOtherTests.script | 0 .../SOS.UnitTests/Scripts/StackTests.script | 0 .../StackTraceFaultingExceptionFrame.script | 0 .../StackTraceSoftwareExceptionFrame.script | 0 .../Scripts/TaskNestedException.script | 0 .../Scripts/TestExtensions.script | 0 .../Scripts/VarargPInvokeInteropMD.script | 0 .../SOS.UnitTests/Scripts/WebApp.script | 0 .../SOS.UnitTests/Scripts/lldbhelper.py | 0 src/tests/dirs.proj | 2 +- 85 files changed, 436 insertions(+), 416 deletions(-) rename src/{SOS => tests}/SOS.UnitTests/ConfigFiles/Unix/Debugger.Tests.Config.txt (99%) rename src/{SOS => tests}/SOS.UnitTests/ConfigFiles/Windows/Debugger.Tests.Config.txt (99%) rename src/{SOS => tests}/SOS.UnitTests/Debuggees/Directory.Build.props (100%) rename src/{SOS => tests}/SOS.UnitTests/Debuggees/DivZero/DivZero.cs (100%) rename src/{SOS => tests}/SOS.UnitTests/Debuggees/DivZero/DivZero.csproj (100%) rename src/{SOS => tests}/SOS.UnitTests/Debuggees/DotnetDumpCommands/DotnetDumpCommands.csproj (100%) rename src/{SOS => tests}/SOS.UnitTests/Debuggees/DotnetDumpCommands/Program.cs (100%) rename src/{SOS => tests}/SOS.UnitTests/Debuggees/DumpGCData/DumpGCData.csproj (100%) rename src/{SOS => tests}/SOS.UnitTests/Debuggees/DumpGCData/Program.cs (100%) rename src/{SOS => tests}/SOS.UnitTests/Debuggees/DynamicMethod/DynamicMethod.csproj (100%) rename src/{SOS => tests}/SOS.UnitTests/Debuggees/DynamicMethod/Program.cs (100%) rename src/{SOS => tests}/SOS.UnitTests/Debuggees/FindRootsOlderGeneration/FindRootsOlderGeneration.csproj (100%) rename src/{SOS => tests}/SOS.UnitTests/Debuggees/FindRootsOlderGeneration/Program.cs (100%) rename src/{SOS => tests}/SOS.UnitTests/Debuggees/GCPOH/GCPOH.cs (100%) rename src/{SOS => tests}/SOS.UnitTests/Debuggees/GCPOH/GCPOH.csproj (100%) rename src/{SOS => tests}/SOS.UnitTests/Debuggees/GCWhere/GCWhere.cs (100%) rename src/{SOS => tests}/SOS.UnitTests/Debuggees/GCWhere/GCWhere.csproj (100%) rename src/{SOS => tests}/SOS.UnitTests/Debuggees/LineNums/LineNums.csproj (100%) rename src/{SOS => tests}/SOS.UnitTests/Debuggees/LineNums/Program.cs (100%) rename src/{SOS => tests}/SOS.UnitTests/Debuggees/MiniDumpLocalVarLookup/MiniDumpLocalVarLookup.csproj (100%) rename src/{SOS => tests}/SOS.UnitTests/Debuggees/MiniDumpLocalVarLookup/Program.cs (100%) rename src/{SOS => tests}/SOS.UnitTests/Debuggees/NestedExceptionTest/NestedExceptionTest.cs (100%) rename src/{SOS => tests}/SOS.UnitTests/Debuggees/NestedExceptionTest/NestedExceptionTest.csproj (100%) rename src/{SOS => tests}/SOS.UnitTests/Debuggees/Overflow/Overflow.cs (100%) rename src/{SOS => tests}/SOS.UnitTests/Debuggees/Overflow/Overflow.csproj (100%) rename src/{SOS => tests}/SOS.UnitTests/Debuggees/ReflectionTest/ReflectionTest.cs (100%) rename src/{SOS => tests}/SOS.UnitTests/Debuggees/ReflectionTest/ReflectionTest.csproj (100%) rename src/{SOS => tests}/SOS.UnitTests/Debuggees/SimpleThrow/SimpleThrow.cs (100%) rename src/{SOS => tests}/SOS.UnitTests/Debuggees/SimpleThrow/SimpleThrow.csproj (100%) rename src/{SOS => tests}/SOS.UnitTests/Debuggees/SimpleThrow/UserObject.cs (100%) rename src/{SOS => tests}/SOS.UnitTests/Debuggees/SymbolTestApp/SymbolTestApp.sln (100%) rename src/{SOS => tests}/SOS.UnitTests/Debuggees/SymbolTestApp/SymbolTestApp/SymbolTestApp.cs (100%) rename src/{SOS => tests}/SOS.UnitTests/Debuggees/SymbolTestApp/SymbolTestApp/SymbolTestApp.csproj (100%) rename src/{SOS => tests}/SOS.UnitTests/Debuggees/SymbolTestApp/SymbolTestDll/SymbolTestDll.csproj (100%) rename src/{SOS => tests}/SOS.UnitTests/Debuggees/SymbolTestApp/SymbolTestDll/TestClass.cs (100%) rename src/{SOS => tests}/SOS.UnitTests/Debuggees/TaskNestedException/RandomUserLibrary/RandomUserLibrary.csproj (100%) rename src/{SOS => tests}/SOS.UnitTests/Debuggees/TaskNestedException/RandomUserLibrary/RandomUserTask.cs (100%) rename src/{SOS => tests}/SOS.UnitTests/Debuggees/TaskNestedException/TaskNestedException.sln (100%) rename src/{SOS => tests}/SOS.UnitTests/Debuggees/TaskNestedException/TaskNestedException/TaskNestedException.cs (100%) rename src/{SOS => tests}/SOS.UnitTests/Debuggees/TaskNestedException/TaskNestedException/TaskNestedException.csproj (100%) rename src/{SOS => tests}/SOS.UnitTests/Debuggees/VarargPInvokeInteropMD/Program.cs (100%) rename src/{SOS => tests}/SOS.UnitTests/Debuggees/VarargPInvokeInteropMD/VarargPInvokeInteropMD.csproj (100%) rename src/{SOS => tests}/SOS.UnitTests/Debuggees/WebApp3/Program.cs (100%) rename src/{SOS => tests}/SOS.UnitTests/Debuggees/WebApp3/Properties/launchSettings.json (100%) rename src/{SOS => tests}/SOS.UnitTests/Debuggees/WebApp3/Startup.cs (100%) rename src/{SOS => tests}/SOS.UnitTests/Debuggees/WebApp3/WebApp3.csproj (100%) rename src/{SOS => tests}/SOS.UnitTests/Debuggees/WebApp3/appsettings.Development.json (100%) rename src/{SOS => tests}/SOS.UnitTests/Debuggees/WebApp3/appsettings.json (100%) rename src/{SOS => tests}/SOS.UnitTests/DumpGenerationFixture.cs (100%) rename src/{SOS => tests}/SOS.UnitTests/SOS.UnitTests.csproj (91%) rename src/{SOS => tests}/SOS.UnitTests/SOS.cs (100%) rename src/{SOS => tests}/SOS.UnitTests/SOSRunner.cs (100%) rename src/{SOS => tests}/SOS.UnitTests/Scripts/ClrStackWithNumberOfFrames.script (100%) rename src/{SOS => tests}/SOS.UnitTests/Scripts/ConcurrentDictionaries.script (100%) rename src/{SOS => tests}/SOS.UnitTests/Scripts/DivZero.script (100%) rename src/{SOS => tests}/SOS.UnitTests/Scripts/DualRuntimes.script (100%) rename src/{SOS => tests}/SOS.UnitTests/Scripts/DumpGCData.script (100%) rename src/{SOS => tests}/SOS.UnitTests/Scripts/DumpGen.script (100%) rename src/{SOS => tests}/SOS.UnitTests/Scripts/DynamicMethod.script (100%) rename src/{SOS => tests}/SOS.UnitTests/Scripts/FindRootsOlderGeneration.script (100%) rename src/{SOS => tests}/SOS.UnitTests/Scripts/GCPOH.script (100%) rename src/{SOS => tests}/SOS.UnitTests/Scripts/GCTests.script (100%) rename src/{SOS => tests}/SOS.UnitTests/Scripts/LineNums.script (100%) rename src/{SOS => tests}/SOS.UnitTests/Scripts/MiniDumpLocalVarLookup.script (100%) rename src/{SOS => tests}/SOS.UnitTests/Scripts/NestedExceptionTest.script (100%) rename src/{SOS => tests}/SOS.UnitTests/Scripts/OtherCommands.script (100%) rename src/{SOS => tests}/SOS.UnitTests/Scripts/Overflow.script (100%) rename src/{SOS => tests}/SOS.UnitTests/Scripts/Reflection.script (100%) rename src/{SOS => tests}/SOS.UnitTests/Scripts/SimpleThrow.script (100%) rename src/{SOS => tests}/SOS.UnitTests/Scripts/StackAndOtherTests.script (100%) rename src/{SOS => tests}/SOS.UnitTests/Scripts/StackTests.script (100%) rename src/{SOS => tests}/SOS.UnitTests/Scripts/StackTraceFaultingExceptionFrame.script (100%) rename src/{SOS => tests}/SOS.UnitTests/Scripts/StackTraceSoftwareExceptionFrame.script (100%) rename src/{SOS => tests}/SOS.UnitTests/Scripts/TaskNestedException.script (100%) rename src/{SOS => tests}/SOS.UnitTests/Scripts/TestExtensions.script (100%) rename src/{SOS => tests}/SOS.UnitTests/Scripts/VarargPInvokeInteropMD.script (100%) rename src/{SOS => tests}/SOS.UnitTests/Scripts/WebApp.script (100%) rename src/{SOS => tests}/SOS.UnitTests/Scripts/lldbhelper.py (100%) diff --git a/build.sln b/build.sln index 77f4a34698..2afc70257e 100644 --- a/build.sln +++ b/build.sln @@ -47,73 +47,75 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SOS.Package", "src\SOS\SOS. EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SOS.Symbol.Package", "src\SOS\SOS.Package\SOS.Symbol.Package.csproj", "{02D40854-2429-4EF7-8405-04C87565853A}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DivZero", "src\SOS\SOS.UnitTests\Debuggees\DivZero\DivZero.csproj", "{193E7716-8469-4A72-A689-27C5E828772C}" +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Strike", "src\SOS\Strike\Strike.vcxproj", "{41F59D85-FC36-3015-861B-F177863252BC}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DotnetDumpCommands", "src\SOS\SOS.UnitTests\Debuggees\DotnetDumpCommands\DotnetDumpCommands.csproj", "{87E9BB01-B579-4891-BA1C-BB600AC9829A}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "CommonTestRunner", "src\tests\CommonTestRunner\CommonTestRunner.csproj", "{DE21994B-542A-437E-8405-F62A5A3F41D4}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DumpGCData", "src\SOS\SOS.UnitTests\Debuggees\DumpGCData\DumpGCData.csproj", "{8F7085F1-DA86-4AA1-9801-2A9A2498E7BB}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DbgShim.UnitTests", "src\tests\DbgShim.UnitTests\DbgShim.UnitTests.csproj", "{B580256B-3E8A-4EBB-8ED0-B751622A1BDE}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DynamicMethod", "src\SOS\SOS.UnitTests\Debuggees\DynamicMethod\DynamicMethod.csproj", "{F682A9D8-9523-406A-9357-E48B463A8303}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SimpleDebuggee", "src\tests\DbgShim.UnitTests\Debuggees\SimpleDebuggee\SimpleDebuggee.csproj", "{ED806ECA-3F5A-4E89-9F10-A8A58D7CE2D5}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "FindRootsOlderGeneration", "src\SOS\SOS.UnitTests\Debuggees\FindRootsOlderGeneration\FindRootsOlderGeneration.csproj", "{981A8ECD-2821-44F5-B617-BF0E7E9382C6}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DotnetCounters.UnitTests", "src\tests\dotnet-counters\DotnetCounters.UnitTests.csproj", "{CEDB87DB-22B9-4466-B79F-AA2A40BE6AA9}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "GCPOH", "src\SOS\SOS.UnitTests\Debuggees\GCPOH\GCPOH.csproj", "{3F0A4CCD-6944-40A9-B42C-4D120148E2A9}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DotnetTrace.UnitTests", "src\tests\dotnet-trace\DotnetTrace.UnitTests.csproj", "{38E7B98A-541C-4D53-B07A-4039E88CDDA0}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "GCWhere", "src\SOS\SOS.UnitTests\Debuggees\GCWhere\GCWhere.csproj", "{761CC2CC-85A1-413D-AD6B-CD000420E378}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "EventPipe.UnitTests", "src\tests\eventpipe\EventPipe.UnitTests.csproj", "{7A8C135E-A694-4110-B724-E71521986ACD}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LineNums", "src\SOS\SOS.UnitTests\Debuggees\LineNums\LineNums.csproj", "{62BB9630-E6F3-4CB7-A781-5C4E963ADCEB}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "EventPipeTracee", "src\tests\EventPipeTracee\EventPipeTracee.csproj", "{612753EE-C926-4E45-AC1E-A174AE25D91B}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "NestedExceptionTest", "src\SOS\SOS.UnitTests\Debuggees\NestedExceptionTest\NestedExceptionTest.csproj", "{C20C7B5B-9D29-4AB3-AA84-36137CE44DB9}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ExitCodeTracee", "src\tests\ExitCodeTracee\ExitCodeTracee.csproj", "{EAD22B68-3099-47DF-9356-A1B3E5ADD7CB}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Overflow", "src\SOS\SOS.UnitTests\Debuggees\Overflow\Overflow.csproj", "{B37F4A90-69E4-449D-AB84-ED2441E38E5F}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Diagnostics.DebugServices.UnitTests", "src\tests\Microsoft.Diagnostics.DebugServices.UnitTests\Microsoft.Diagnostics.DebugServices.UnitTests.csproj", "{DD0C14D2-D7B0-47E2-8D75-498956C7B0C9}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ReflectionTest", "src\SOS\SOS.UnitTests\Debuggees\ReflectionTest\ReflectionTest.csproj", "{AD59F28F-06D6-4743-9E0F-9EAB2617601A}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Diagnostics.Monitoring.EventPipe.UnitTests", "src\tests\Microsoft.Diagnostics.Monitoring.EventPipe\Microsoft.Diagnostics.Monitoring.EventPipe.UnitTests.csproj", "{9E162337-F39B-461F-90D1-294ED529FDBF}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SimpleThrow", "src\SOS\SOS.UnitTests\Debuggees\SimpleThrow\SimpleThrow.csproj", "{794DB744-5F00-4187-8AB6-A99B19ABAAB2}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Diagnostics.Monitoring.UnitTests", "src\tests\Microsoft.Diagnostics.Monitoring\Microsoft.Diagnostics.Monitoring.UnitTests.csproj", "{B7D8475F-0577-4B53-BD7F-9FFE4FA6320A}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SymbolTestApp", "src\SOS\SOS.UnitTests\Debuggees\SymbolTestApp\SymbolTestApp\SymbolTestApp.csproj", "{A698EB04-2139-4A63-819B-0BC686478568}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Diagnostics.NETCore.Client.UnitTests", "src\tests\Microsoft.Diagnostics.NETCore.Client\Microsoft.Diagnostics.NETCore.Client.UnitTests.csproj", "{490D2993-80D2-494E-B9EF-BBC9F6D7B12F}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SymbolTestDll", "src\SOS\SOS.UnitTests\Debuggees\SymbolTestApp\SymbolTestDll\SymbolTestDll.csproj", "{A29C9F3E-1093-48F1-8CF4-21515EDB301A}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.FileFormats.UnitTests", "src\tests\Microsoft.FileFormats.UnitTests\Microsoft.FileFormats.UnitTests.csproj", "{1F7E837F-0E68-43CF-8071-994CE2904901}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "RandomUserLibrary", "src\SOS\SOS.UnitTests\Debuggees\TaskNestedException\RandomUserLibrary\RandomUserLibrary.csproj", "{6D83F8E9-A84C-42AE-B91E-D342623D7783}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.SymbolStore.UnitTests", "src\tests\Microsoft.SymbolStore.UnitTests\Microsoft.SymbolStore.UnitTests.csproj", "{AB277B63-4D5F-4269-824B-91A675B92F5B}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "TaskNestedException", "src\SOS\SOS.UnitTests\Debuggees\TaskNestedException\TaskNestedException\TaskNestedException.csproj", "{C40AB24F-39F3-4BEF-98E4-DAD9804EE7E2}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DivZero", "src\tests\SOS.UnitTests\Debuggees\DivZero\DivZero.csproj", "{963E8F75-D5F8-4BE2-A577-1D61505AC0DB}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "VarargPInvokeInteropMD", "src\SOS\SOS.UnitTests\Debuggees\VarargPInvokeInteropMD\VarargPInvokeInteropMD.csproj", "{F9E1B91C-3AE6-4894-A91A-EE6824D31E48}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DotnetDumpCommands", "src\tests\SOS.UnitTests\Debuggees\DotnetDumpCommands\DotnetDumpCommands.csproj", "{B3CBBAD9-A133-4B75-A00D-ECD13008F7CC}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WebApp3", "src\SOS\SOS.UnitTests\Debuggees\WebApp3\WebApp3.csproj", "{D2810F09-0CCD-4779-B21B-322081E84E87}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DumpGCData", "src\tests\SOS.UnitTests\Debuggees\DumpGCData\DumpGCData.csproj", "{5BFF64E3-34AA-4274-BA6E-0037E735EAB3}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SOS.UnitTests", "src\SOS\SOS.UnitTests\SOS.UnitTests.csproj", "{5933AB07-5CBD-4AF3-9BCE-0B765363D27D}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DynamicMethod", "src\tests\SOS.UnitTests\Debuggees\DynamicMethod\DynamicMethod.csproj", "{01CEE320-DF1D-48E2-A1D2-15867C4984E6}" EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Strike", "src\SOS\Strike\Strike.vcxproj", "{41F59D85-FC36-3015-861B-F177863252BC}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "FindRootsOlderGeneration", "src\tests\SOS.UnitTests\Debuggees\FindRootsOlderGeneration\FindRootsOlderGeneration.csproj", "{79B6C88E-00FC-4990-A4AC-1EB1549F3542}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "CommonTestRunner", "src\tests\CommonTestRunner\CommonTestRunner.csproj", "{DE21994B-542A-437E-8405-F62A5A3F41D4}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "GCPOH", "src\tests\SOS.UnitTests\Debuggees\GCPOH\GCPOH.csproj", "{C69F541A-82B2-4545-A371-72D38218C569}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DbgShim.UnitTests", "src\tests\DbgShim.UnitTests\DbgShim.UnitTests.csproj", "{B580256B-3E8A-4EBB-8ED0-B751622A1BDE}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "GCWhere", "src\tests\SOS.UnitTests\Debuggees\GCWhere\GCWhere.csproj", "{BCBCA951-17AC-43C3-BC1F-ED8137C08923}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SimpleDebuggee", "src\tests\DbgShim.UnitTests\Debuggees\SimpleDebuggee\SimpleDebuggee.csproj", "{ED806ECA-3F5A-4E89-9F10-A8A58D7CE2D5}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LineNums", "src\tests\SOS.UnitTests\Debuggees\LineNums\LineNums.csproj", "{D39F4E7C-558C-4697-8692-9DD92DB97D92}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DotnetCounters.UnitTests", "src\tests\dotnet-counters\DotnetCounters.UnitTests.csproj", "{CEDB87DB-22B9-4466-B79F-AA2A40BE6AA9}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MiniDumpLocalVarLookup", "src\tests\SOS.UnitTests\Debuggees\MiniDumpLocalVarLookup\MiniDumpLocalVarLookup.csproj", "{57A8B0FF-5FD9-4E8E-806F-3F25E30B3E74}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DotnetTrace.UnitTests", "src\tests\dotnet-trace\DotnetTrace.UnitTests.csproj", "{38E7B98A-541C-4D53-B07A-4039E88CDDA0}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "NestedExceptionTest", "src\tests\SOS.UnitTests\Debuggees\NestedExceptionTest\NestedExceptionTest.csproj", "{A39F9BC5-892F-4B68-9B2A-C9EF99EEDBF0}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "EventPipe.UnitTests", "src\tests\eventpipe\EventPipe.UnitTests.csproj", "{7A8C135E-A694-4110-B724-E71521986ACD}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Overflow", "src\tests\SOS.UnitTests\Debuggees\Overflow\Overflow.csproj", "{2654C11D-41F2-42C6-8614-2873A794FCB7}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "EventPipeTracee", "src\tests\EventPipeTracee\EventPipeTracee.csproj", "{612753EE-C926-4E45-AC1E-A174AE25D91B}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ReflectionTest", "src\tests\SOS.UnitTests\Debuggees\ReflectionTest\ReflectionTest.csproj", "{699AAD88-F832-4FAE-993D-C3C62ED46EA5}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ExitCodeTracee", "src\tests\ExitCodeTracee\ExitCodeTracee.csproj", "{EAD22B68-3099-47DF-9356-A1B3E5ADD7CB}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SimpleThrow", "src\tests\SOS.UnitTests\Debuggees\SimpleThrow\SimpleThrow.csproj", "{A2C8D695-00FF-420C-B354-B1DBCAB58CE2}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Diagnostics.DebugServices.UnitTests", "src\tests\Microsoft.Diagnostics.DebugServices.UnitTests\Microsoft.Diagnostics.DebugServices.UnitTests.csproj", "{DD0C14D2-D7B0-47E2-8D75-498956C7B0C9}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SymbolTestApp", "src\tests\SOS.UnitTests\Debuggees\SymbolTestApp\SymbolTestApp\SymbolTestApp.csproj", "{848B453F-1020-4814-9EDA-F5E01F21EA95}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Diagnostics.Monitoring.EventPipe.UnitTests", "src\tests\Microsoft.Diagnostics.Monitoring.EventPipe\Microsoft.Diagnostics.Monitoring.EventPipe.UnitTests.csproj", "{9E162337-F39B-461F-90D1-294ED529FDBF}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SymbolTestDll", "src\tests\SOS.UnitTests\Debuggees\SymbolTestApp\SymbolTestDll\SymbolTestDll.csproj", "{11B8DEC6-18F7-4129-A785-D7F4AA779841}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Diagnostics.Monitoring.UnitTests", "src\tests\Microsoft.Diagnostics.Monitoring\Microsoft.Diagnostics.Monitoring.UnitTests.csproj", "{B7D8475F-0577-4B53-BD7F-9FFE4FA6320A}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "RandomUserLibrary", "src\tests\SOS.UnitTests\Debuggees\TaskNestedException\RandomUserLibrary\RandomUserLibrary.csproj", "{F5372D50-84CD-4DA1-A74A-FFEDA78920CC}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Diagnostics.NETCore.Client.UnitTests", "src\tests\Microsoft.Diagnostics.NETCore.Client\Microsoft.Diagnostics.NETCore.Client.UnitTests.csproj", "{490D2993-80D2-494E-B9EF-BBC9F6D7B12F}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "TaskNestedException", "src\tests\SOS.UnitTests\Debuggees\TaskNestedException\TaskNestedException\TaskNestedException.csproj", "{A01C5649-8C86-45B9-A9A2-117056343F8A}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.FileFormats.UnitTests", "src\tests\Microsoft.FileFormats.UnitTests\Microsoft.FileFormats.UnitTests.csproj", "{1F7E837F-0E68-43CF-8071-994CE2904901}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "VarargPInvokeInteropMD", "src\tests\SOS.UnitTests\Debuggees\VarargPInvokeInteropMD\VarargPInvokeInteropMD.csproj", "{8AADF39D-B793-4574-96F4-F13391C46288}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.SymbolStore.UnitTests", "src\tests\Microsoft.SymbolStore.UnitTests\Microsoft.SymbolStore.UnitTests.csproj", "{AB277B63-4D5F-4269-824B-91A675B92F5B}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WebApp3", "src\tests\SOS.UnitTests\Debuggees\WebApp3\WebApp3.csproj", "{AEDAD92F-C123-4880-A4EB-569074A31DE7}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SOS.UnitTests", "src\tests\SOS.UnitTests\SOS.UnitTests.csproj", "{3EE8CB83-EC2F-415D-A681-997AC6FB0B9A}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "StackTracee", "src\tests\StackTracee\StackTracee.csproj", "{614E442A-A8FD-4E14-9C3E-1F312864D9E0}" EndProject @@ -145,19 +147,19 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "shared", "src\shared", "{2E EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "SOS.Package", "src\SOS\SOS.Package", "{BE481BCB-9C28-4CF3-A92C-2CBC49F49710}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "SymbolTestApp", "src\SOS\SOS.UnitTests\Debuggees\SymbolTestApp", "{A652E56D-8614-4338-9098-6B252270A1BB}" +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "SOS", "src\SOS", "{C12FE574-60EF-4CF0-A879-68F3D093651C}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "TaskNestedException", "src\SOS\SOS.UnitTests\Debuggees\TaskNestedException", "{44F59FE3-F8DB-4E3E-B6F7-E3AB9C05F416}" +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Debuggees", "src\tests\DbgShim.UnitTests\Debuggees", "{D166FD15-A4F1-47B9-881B-D3965B5DCF7D}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Debuggees", "src\SOS\SOS.UnitTests\Debuggees", "{D09612C8-B493-42BE-9F3F-28B315F9751A}" +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "DbgShim.UnitTests", "src\tests\DbgShim.UnitTests", "{C9BD4CB1-E9A7-4A35-B8F8-8B7984A8A950}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "SOS.UnitTests", "src\SOS\SOS.UnitTests", "{67BF6867-0EA6-4853-B14B-8A0A9091A255}" +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "SymbolTestApp", "src\tests\SOS.UnitTests\Debuggees\SymbolTestApp", "{1282F2AC-ACFE-45A7-9899-E79FAA30CB4D}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "SOS", "src\SOS", "{C12FE574-60EF-4CF0-A879-68F3D093651C}" +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "TaskNestedException", "src\tests\SOS.UnitTests\Debuggees\TaskNestedException", "{B3B7EE0F-7C92-466C-949B-0CE1393D2ECB}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Debuggees", "src\tests\DbgShim.UnitTests\Debuggees", "{D166FD15-A4F1-47B9-881B-D3965B5DCF7D}" +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Debuggees", "src\tests\SOS.UnitTests\Debuggees", "{C02DE277-7341-4C63-B105-BA695F40277F}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "DbgShim.UnitTests", "src\tests\DbgShim.UnitTests", "{C9BD4CB1-E9A7-4A35-B8F8-8B7984A8A950}" +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "SOS.UnitTests", "src\tests\SOS.UnitTests", "{2E5032C3-87A7-43F7-B729-6B1ECDC84B32}" EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "tests", "src\tests", "{59E97F80-3F6D-4E83-9962-236C98411375}" EndProject @@ -621,348 +623,6 @@ Global {02D40854-2429-4EF7-8405-04C87565853A}.RelWithDebInfo|Any CPU.ActiveCfg = Debug|Any CPU {02D40854-2429-4EF7-8405-04C87565853A}.RelWithDebInfo|x64.ActiveCfg = Debug|Any CPU {02D40854-2429-4EF7-8405-04C87565853A}.RelWithDebInfo|x86.ActiveCfg = Debug|Any CPU - {193E7716-8469-4A72-A689-27C5E828772C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {193E7716-8469-4A72-A689-27C5E828772C}.Debug|Any CPU.Build.0 = Debug|Any CPU - {193E7716-8469-4A72-A689-27C5E828772C}.Debug|x64.ActiveCfg = Debug|Any CPU - {193E7716-8469-4A72-A689-27C5E828772C}.Debug|x64.Build.0 = Debug|Any CPU - {193E7716-8469-4A72-A689-27C5E828772C}.Debug|x86.ActiveCfg = Debug|Any CPU - {193E7716-8469-4A72-A689-27C5E828772C}.Debug|x86.Build.0 = Debug|Any CPU - {193E7716-8469-4A72-A689-27C5E828772C}.Release|Any CPU.ActiveCfg = Release|Any CPU - {193E7716-8469-4A72-A689-27C5E828772C}.Release|Any CPU.Build.0 = Release|Any CPU - {193E7716-8469-4A72-A689-27C5E828772C}.Release|x64.ActiveCfg = Release|Any CPU - {193E7716-8469-4A72-A689-27C5E828772C}.Release|x64.Build.0 = Release|Any CPU - {193E7716-8469-4A72-A689-27C5E828772C}.Release|x86.ActiveCfg = Release|Any CPU - {193E7716-8469-4A72-A689-27C5E828772C}.Release|x86.Build.0 = Release|Any CPU - {193E7716-8469-4A72-A689-27C5E828772C}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {193E7716-8469-4A72-A689-27C5E828772C}.Checked|x64.ActiveCfg = Debug|Any CPU - {193E7716-8469-4A72-A689-27C5E828772C}.Checked|x86.ActiveCfg = Debug|Any CPU - {193E7716-8469-4A72-A689-27C5E828772C}.RelWithDebInfo|Any CPU.ActiveCfg = Debug|Any CPU - {193E7716-8469-4A72-A689-27C5E828772C}.RelWithDebInfo|x64.ActiveCfg = Debug|Any CPU - {193E7716-8469-4A72-A689-27C5E828772C}.RelWithDebInfo|x86.ActiveCfg = Debug|Any CPU - {87E9BB01-B579-4891-BA1C-BB600AC9829A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {87E9BB01-B579-4891-BA1C-BB600AC9829A}.Debug|Any CPU.Build.0 = Debug|Any CPU - {87E9BB01-B579-4891-BA1C-BB600AC9829A}.Debug|x64.ActiveCfg = Debug|Any CPU - {87E9BB01-B579-4891-BA1C-BB600AC9829A}.Debug|x64.Build.0 = Debug|Any CPU - {87E9BB01-B579-4891-BA1C-BB600AC9829A}.Debug|x86.ActiveCfg = Debug|Any CPU - {87E9BB01-B579-4891-BA1C-BB600AC9829A}.Debug|x86.Build.0 = Debug|Any CPU - {87E9BB01-B579-4891-BA1C-BB600AC9829A}.Release|Any CPU.ActiveCfg = Release|Any CPU - {87E9BB01-B579-4891-BA1C-BB600AC9829A}.Release|Any CPU.Build.0 = Release|Any CPU - {87E9BB01-B579-4891-BA1C-BB600AC9829A}.Release|x64.ActiveCfg = Release|Any CPU - {87E9BB01-B579-4891-BA1C-BB600AC9829A}.Release|x64.Build.0 = Release|Any CPU - {87E9BB01-B579-4891-BA1C-BB600AC9829A}.Release|x86.ActiveCfg = Release|Any CPU - {87E9BB01-B579-4891-BA1C-BB600AC9829A}.Release|x86.Build.0 = Release|Any CPU - {87E9BB01-B579-4891-BA1C-BB600AC9829A}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {87E9BB01-B579-4891-BA1C-BB600AC9829A}.Checked|x64.ActiveCfg = Debug|Any CPU - {87E9BB01-B579-4891-BA1C-BB600AC9829A}.Checked|x86.ActiveCfg = Debug|Any CPU - {87E9BB01-B579-4891-BA1C-BB600AC9829A}.RelWithDebInfo|Any CPU.ActiveCfg = Debug|Any CPU - {87E9BB01-B579-4891-BA1C-BB600AC9829A}.RelWithDebInfo|x64.ActiveCfg = Debug|Any CPU - {87E9BB01-B579-4891-BA1C-BB600AC9829A}.RelWithDebInfo|x86.ActiveCfg = Debug|Any CPU - {8F7085F1-DA86-4AA1-9801-2A9A2498E7BB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {8F7085F1-DA86-4AA1-9801-2A9A2498E7BB}.Debug|Any CPU.Build.0 = Debug|Any CPU - {8F7085F1-DA86-4AA1-9801-2A9A2498E7BB}.Debug|x64.ActiveCfg = Debug|Any CPU - {8F7085F1-DA86-4AA1-9801-2A9A2498E7BB}.Debug|x64.Build.0 = Debug|Any CPU - {8F7085F1-DA86-4AA1-9801-2A9A2498E7BB}.Debug|x86.ActiveCfg = Debug|Any CPU - {8F7085F1-DA86-4AA1-9801-2A9A2498E7BB}.Debug|x86.Build.0 = Debug|Any CPU - {8F7085F1-DA86-4AA1-9801-2A9A2498E7BB}.Release|Any CPU.ActiveCfg = Release|Any CPU - {8F7085F1-DA86-4AA1-9801-2A9A2498E7BB}.Release|Any CPU.Build.0 = Release|Any CPU - {8F7085F1-DA86-4AA1-9801-2A9A2498E7BB}.Release|x64.ActiveCfg = Release|Any CPU - {8F7085F1-DA86-4AA1-9801-2A9A2498E7BB}.Release|x64.Build.0 = Release|Any CPU - {8F7085F1-DA86-4AA1-9801-2A9A2498E7BB}.Release|x86.ActiveCfg = Release|Any CPU - {8F7085F1-DA86-4AA1-9801-2A9A2498E7BB}.Release|x86.Build.0 = Release|Any CPU - {8F7085F1-DA86-4AA1-9801-2A9A2498E7BB}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {8F7085F1-DA86-4AA1-9801-2A9A2498E7BB}.Checked|x64.ActiveCfg = Debug|Any CPU - {8F7085F1-DA86-4AA1-9801-2A9A2498E7BB}.Checked|x86.ActiveCfg = Debug|Any CPU - {8F7085F1-DA86-4AA1-9801-2A9A2498E7BB}.RelWithDebInfo|Any CPU.ActiveCfg = Debug|Any CPU - {8F7085F1-DA86-4AA1-9801-2A9A2498E7BB}.RelWithDebInfo|x64.ActiveCfg = Debug|Any CPU - {8F7085F1-DA86-4AA1-9801-2A9A2498E7BB}.RelWithDebInfo|x86.ActiveCfg = Debug|Any CPU - {F682A9D8-9523-406A-9357-E48B463A8303}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {F682A9D8-9523-406A-9357-E48B463A8303}.Debug|Any CPU.Build.0 = Debug|Any CPU - {F682A9D8-9523-406A-9357-E48B463A8303}.Debug|x64.ActiveCfg = Debug|Any CPU - {F682A9D8-9523-406A-9357-E48B463A8303}.Debug|x64.Build.0 = Debug|Any CPU - {F682A9D8-9523-406A-9357-E48B463A8303}.Debug|x86.ActiveCfg = Debug|Any CPU - {F682A9D8-9523-406A-9357-E48B463A8303}.Debug|x86.Build.0 = Debug|Any CPU - {F682A9D8-9523-406A-9357-E48B463A8303}.Release|Any CPU.ActiveCfg = Release|Any CPU - {F682A9D8-9523-406A-9357-E48B463A8303}.Release|Any CPU.Build.0 = Release|Any CPU - {F682A9D8-9523-406A-9357-E48B463A8303}.Release|x64.ActiveCfg = Release|Any CPU - {F682A9D8-9523-406A-9357-E48B463A8303}.Release|x64.Build.0 = Release|Any CPU - {F682A9D8-9523-406A-9357-E48B463A8303}.Release|x86.ActiveCfg = Release|Any CPU - {F682A9D8-9523-406A-9357-E48B463A8303}.Release|x86.Build.0 = Release|Any CPU - {F682A9D8-9523-406A-9357-E48B463A8303}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {F682A9D8-9523-406A-9357-E48B463A8303}.Checked|x64.ActiveCfg = Debug|Any CPU - {F682A9D8-9523-406A-9357-E48B463A8303}.Checked|x86.ActiveCfg = Debug|Any CPU - {F682A9D8-9523-406A-9357-E48B463A8303}.RelWithDebInfo|Any CPU.ActiveCfg = Debug|Any CPU - {F682A9D8-9523-406A-9357-E48B463A8303}.RelWithDebInfo|x64.ActiveCfg = Debug|Any CPU - {F682A9D8-9523-406A-9357-E48B463A8303}.RelWithDebInfo|x86.ActiveCfg = Debug|Any CPU - {981A8ECD-2821-44F5-B617-BF0E7E9382C6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {981A8ECD-2821-44F5-B617-BF0E7E9382C6}.Debug|Any CPU.Build.0 = Debug|Any CPU - {981A8ECD-2821-44F5-B617-BF0E7E9382C6}.Debug|x64.ActiveCfg = Debug|Any CPU - {981A8ECD-2821-44F5-B617-BF0E7E9382C6}.Debug|x64.Build.0 = Debug|Any CPU - {981A8ECD-2821-44F5-B617-BF0E7E9382C6}.Debug|x86.ActiveCfg = Debug|Any CPU - {981A8ECD-2821-44F5-B617-BF0E7E9382C6}.Debug|x86.Build.0 = Debug|Any CPU - {981A8ECD-2821-44F5-B617-BF0E7E9382C6}.Release|Any CPU.ActiveCfg = Release|Any CPU - {981A8ECD-2821-44F5-B617-BF0E7E9382C6}.Release|Any CPU.Build.0 = Release|Any CPU - {981A8ECD-2821-44F5-B617-BF0E7E9382C6}.Release|x64.ActiveCfg = Release|Any CPU - {981A8ECD-2821-44F5-B617-BF0E7E9382C6}.Release|x64.Build.0 = Release|Any CPU - {981A8ECD-2821-44F5-B617-BF0E7E9382C6}.Release|x86.ActiveCfg = Release|Any CPU - {981A8ECD-2821-44F5-B617-BF0E7E9382C6}.Release|x86.Build.0 = Release|Any CPU - {981A8ECD-2821-44F5-B617-BF0E7E9382C6}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {981A8ECD-2821-44F5-B617-BF0E7E9382C6}.Checked|x64.ActiveCfg = Debug|Any CPU - {981A8ECD-2821-44F5-B617-BF0E7E9382C6}.Checked|x86.ActiveCfg = Debug|Any CPU - {981A8ECD-2821-44F5-B617-BF0E7E9382C6}.RelWithDebInfo|Any CPU.ActiveCfg = Debug|Any CPU - {981A8ECD-2821-44F5-B617-BF0E7E9382C6}.RelWithDebInfo|x64.ActiveCfg = Debug|Any CPU - {981A8ECD-2821-44F5-B617-BF0E7E9382C6}.RelWithDebInfo|x86.ActiveCfg = Debug|Any CPU - {3F0A4CCD-6944-40A9-B42C-4D120148E2A9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {3F0A4CCD-6944-40A9-B42C-4D120148E2A9}.Debug|Any CPU.Build.0 = Debug|Any CPU - {3F0A4CCD-6944-40A9-B42C-4D120148E2A9}.Debug|x64.ActiveCfg = Debug|Any CPU - {3F0A4CCD-6944-40A9-B42C-4D120148E2A9}.Debug|x64.Build.0 = Debug|Any CPU - {3F0A4CCD-6944-40A9-B42C-4D120148E2A9}.Debug|x86.ActiveCfg = Debug|Any CPU - {3F0A4CCD-6944-40A9-B42C-4D120148E2A9}.Debug|x86.Build.0 = Debug|Any CPU - {3F0A4CCD-6944-40A9-B42C-4D120148E2A9}.Release|Any CPU.ActiveCfg = Release|Any CPU - {3F0A4CCD-6944-40A9-B42C-4D120148E2A9}.Release|Any CPU.Build.0 = Release|Any CPU - {3F0A4CCD-6944-40A9-B42C-4D120148E2A9}.Release|x64.ActiveCfg = Release|Any CPU - {3F0A4CCD-6944-40A9-B42C-4D120148E2A9}.Release|x64.Build.0 = Release|Any CPU - {3F0A4CCD-6944-40A9-B42C-4D120148E2A9}.Release|x86.ActiveCfg = Release|Any CPU - {3F0A4CCD-6944-40A9-B42C-4D120148E2A9}.Release|x86.Build.0 = Release|Any CPU - {3F0A4CCD-6944-40A9-B42C-4D120148E2A9}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {3F0A4CCD-6944-40A9-B42C-4D120148E2A9}.Checked|x64.ActiveCfg = Debug|Any CPU - {3F0A4CCD-6944-40A9-B42C-4D120148E2A9}.Checked|x86.ActiveCfg = Debug|Any CPU - {3F0A4CCD-6944-40A9-B42C-4D120148E2A9}.RelWithDebInfo|Any CPU.ActiveCfg = Debug|Any CPU - {3F0A4CCD-6944-40A9-B42C-4D120148E2A9}.RelWithDebInfo|x64.ActiveCfg = Debug|Any CPU - {3F0A4CCD-6944-40A9-B42C-4D120148E2A9}.RelWithDebInfo|x86.ActiveCfg = Debug|Any CPU - {761CC2CC-85A1-413D-AD6B-CD000420E378}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {761CC2CC-85A1-413D-AD6B-CD000420E378}.Debug|Any CPU.Build.0 = Debug|Any CPU - {761CC2CC-85A1-413D-AD6B-CD000420E378}.Debug|x64.ActiveCfg = Debug|Any CPU - {761CC2CC-85A1-413D-AD6B-CD000420E378}.Debug|x64.Build.0 = Debug|Any CPU - {761CC2CC-85A1-413D-AD6B-CD000420E378}.Debug|x86.ActiveCfg = Debug|Any CPU - {761CC2CC-85A1-413D-AD6B-CD000420E378}.Debug|x86.Build.0 = Debug|Any CPU - {761CC2CC-85A1-413D-AD6B-CD000420E378}.Release|Any CPU.ActiveCfg = Release|Any CPU - {761CC2CC-85A1-413D-AD6B-CD000420E378}.Release|Any CPU.Build.0 = Release|Any CPU - {761CC2CC-85A1-413D-AD6B-CD000420E378}.Release|x64.ActiveCfg = Release|Any CPU - {761CC2CC-85A1-413D-AD6B-CD000420E378}.Release|x64.Build.0 = Release|Any CPU - {761CC2CC-85A1-413D-AD6B-CD000420E378}.Release|x86.ActiveCfg = Release|Any CPU - {761CC2CC-85A1-413D-AD6B-CD000420E378}.Release|x86.Build.0 = Release|Any CPU - {761CC2CC-85A1-413D-AD6B-CD000420E378}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {761CC2CC-85A1-413D-AD6B-CD000420E378}.Checked|x64.ActiveCfg = Debug|Any CPU - {761CC2CC-85A1-413D-AD6B-CD000420E378}.Checked|x86.ActiveCfg = Debug|Any CPU - {761CC2CC-85A1-413D-AD6B-CD000420E378}.RelWithDebInfo|Any CPU.ActiveCfg = Debug|Any CPU - {761CC2CC-85A1-413D-AD6B-CD000420E378}.RelWithDebInfo|x64.ActiveCfg = Debug|Any CPU - {761CC2CC-85A1-413D-AD6B-CD000420E378}.RelWithDebInfo|x86.ActiveCfg = Debug|Any CPU - {62BB9630-E6F3-4CB7-A781-5C4E963ADCEB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {62BB9630-E6F3-4CB7-A781-5C4E963ADCEB}.Debug|Any CPU.Build.0 = Debug|Any CPU - {62BB9630-E6F3-4CB7-A781-5C4E963ADCEB}.Debug|x64.ActiveCfg = Debug|Any CPU - {62BB9630-E6F3-4CB7-A781-5C4E963ADCEB}.Debug|x64.Build.0 = Debug|Any CPU - {62BB9630-E6F3-4CB7-A781-5C4E963ADCEB}.Debug|x86.ActiveCfg = Debug|Any CPU - {62BB9630-E6F3-4CB7-A781-5C4E963ADCEB}.Debug|x86.Build.0 = Debug|Any CPU - {62BB9630-E6F3-4CB7-A781-5C4E963ADCEB}.Release|Any CPU.ActiveCfg = Release|Any CPU - {62BB9630-E6F3-4CB7-A781-5C4E963ADCEB}.Release|Any CPU.Build.0 = Release|Any CPU - {62BB9630-E6F3-4CB7-A781-5C4E963ADCEB}.Release|x64.ActiveCfg = Release|Any CPU - {62BB9630-E6F3-4CB7-A781-5C4E963ADCEB}.Release|x64.Build.0 = Release|Any CPU - {62BB9630-E6F3-4CB7-A781-5C4E963ADCEB}.Release|x86.ActiveCfg = Release|Any CPU - {62BB9630-E6F3-4CB7-A781-5C4E963ADCEB}.Release|x86.Build.0 = Release|Any CPU - {62BB9630-E6F3-4CB7-A781-5C4E963ADCEB}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {62BB9630-E6F3-4CB7-A781-5C4E963ADCEB}.Checked|x64.ActiveCfg = Debug|Any CPU - {62BB9630-E6F3-4CB7-A781-5C4E963ADCEB}.Checked|x86.ActiveCfg = Debug|Any CPU - {62BB9630-E6F3-4CB7-A781-5C4E963ADCEB}.RelWithDebInfo|Any CPU.ActiveCfg = Debug|Any CPU - {62BB9630-E6F3-4CB7-A781-5C4E963ADCEB}.RelWithDebInfo|x64.ActiveCfg = Debug|Any CPU - {62BB9630-E6F3-4CB7-A781-5C4E963ADCEB}.RelWithDebInfo|x86.ActiveCfg = Debug|Any CPU - {C20C7B5B-9D29-4AB3-AA84-36137CE44DB9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {C20C7B5B-9D29-4AB3-AA84-36137CE44DB9}.Debug|Any CPU.Build.0 = Debug|Any CPU - {C20C7B5B-9D29-4AB3-AA84-36137CE44DB9}.Debug|x64.ActiveCfg = Debug|Any CPU - {C20C7B5B-9D29-4AB3-AA84-36137CE44DB9}.Debug|x64.Build.0 = Debug|Any CPU - {C20C7B5B-9D29-4AB3-AA84-36137CE44DB9}.Debug|x86.ActiveCfg = Debug|Any CPU - {C20C7B5B-9D29-4AB3-AA84-36137CE44DB9}.Debug|x86.Build.0 = Debug|Any CPU - {C20C7B5B-9D29-4AB3-AA84-36137CE44DB9}.Release|Any CPU.ActiveCfg = Release|Any CPU - {C20C7B5B-9D29-4AB3-AA84-36137CE44DB9}.Release|Any CPU.Build.0 = Release|Any CPU - {C20C7B5B-9D29-4AB3-AA84-36137CE44DB9}.Release|x64.ActiveCfg = Release|Any CPU - {C20C7B5B-9D29-4AB3-AA84-36137CE44DB9}.Release|x64.Build.0 = Release|Any CPU - {C20C7B5B-9D29-4AB3-AA84-36137CE44DB9}.Release|x86.ActiveCfg = Release|Any CPU - {C20C7B5B-9D29-4AB3-AA84-36137CE44DB9}.Release|x86.Build.0 = Release|Any CPU - {C20C7B5B-9D29-4AB3-AA84-36137CE44DB9}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {C20C7B5B-9D29-4AB3-AA84-36137CE44DB9}.Checked|x64.ActiveCfg = Debug|Any CPU - {C20C7B5B-9D29-4AB3-AA84-36137CE44DB9}.Checked|x86.ActiveCfg = Debug|Any CPU - {C20C7B5B-9D29-4AB3-AA84-36137CE44DB9}.RelWithDebInfo|Any CPU.ActiveCfg = Debug|Any CPU - {C20C7B5B-9D29-4AB3-AA84-36137CE44DB9}.RelWithDebInfo|x64.ActiveCfg = Debug|Any CPU - {C20C7B5B-9D29-4AB3-AA84-36137CE44DB9}.RelWithDebInfo|x86.ActiveCfg = Debug|Any CPU - {B37F4A90-69E4-449D-AB84-ED2441E38E5F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {B37F4A90-69E4-449D-AB84-ED2441E38E5F}.Debug|Any CPU.Build.0 = Debug|Any CPU - {B37F4A90-69E4-449D-AB84-ED2441E38E5F}.Debug|x64.ActiveCfg = Debug|Any CPU - {B37F4A90-69E4-449D-AB84-ED2441E38E5F}.Debug|x64.Build.0 = Debug|Any CPU - {B37F4A90-69E4-449D-AB84-ED2441E38E5F}.Debug|x86.ActiveCfg = Debug|Any CPU - {B37F4A90-69E4-449D-AB84-ED2441E38E5F}.Debug|x86.Build.0 = Debug|Any CPU - {B37F4A90-69E4-449D-AB84-ED2441E38E5F}.Release|Any CPU.ActiveCfg = Release|Any CPU - {B37F4A90-69E4-449D-AB84-ED2441E38E5F}.Release|Any CPU.Build.0 = Release|Any CPU - {B37F4A90-69E4-449D-AB84-ED2441E38E5F}.Release|x64.ActiveCfg = Release|Any CPU - {B37F4A90-69E4-449D-AB84-ED2441E38E5F}.Release|x64.Build.0 = Release|Any CPU - {B37F4A90-69E4-449D-AB84-ED2441E38E5F}.Release|x86.ActiveCfg = Release|Any CPU - {B37F4A90-69E4-449D-AB84-ED2441E38E5F}.Release|x86.Build.0 = Release|Any CPU - {B37F4A90-69E4-449D-AB84-ED2441E38E5F}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {B37F4A90-69E4-449D-AB84-ED2441E38E5F}.Checked|x64.ActiveCfg = Debug|Any CPU - {B37F4A90-69E4-449D-AB84-ED2441E38E5F}.Checked|x86.ActiveCfg = Debug|Any CPU - {B37F4A90-69E4-449D-AB84-ED2441E38E5F}.RelWithDebInfo|Any CPU.ActiveCfg = Debug|Any CPU - {B37F4A90-69E4-449D-AB84-ED2441E38E5F}.RelWithDebInfo|x64.ActiveCfg = Debug|Any CPU - {B37F4A90-69E4-449D-AB84-ED2441E38E5F}.RelWithDebInfo|x86.ActiveCfg = Debug|Any CPU - {AD59F28F-06D6-4743-9E0F-9EAB2617601A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {AD59F28F-06D6-4743-9E0F-9EAB2617601A}.Debug|Any CPU.Build.0 = Debug|Any CPU - {AD59F28F-06D6-4743-9E0F-9EAB2617601A}.Debug|x64.ActiveCfg = Debug|Any CPU - {AD59F28F-06D6-4743-9E0F-9EAB2617601A}.Debug|x64.Build.0 = Debug|Any CPU - {AD59F28F-06D6-4743-9E0F-9EAB2617601A}.Debug|x86.ActiveCfg = Debug|Any CPU - {AD59F28F-06D6-4743-9E0F-9EAB2617601A}.Debug|x86.Build.0 = Debug|Any CPU - {AD59F28F-06D6-4743-9E0F-9EAB2617601A}.Release|Any CPU.ActiveCfg = Release|Any CPU - {AD59F28F-06D6-4743-9E0F-9EAB2617601A}.Release|Any CPU.Build.0 = Release|Any CPU - {AD59F28F-06D6-4743-9E0F-9EAB2617601A}.Release|x64.ActiveCfg = Release|Any CPU - {AD59F28F-06D6-4743-9E0F-9EAB2617601A}.Release|x64.Build.0 = Release|Any CPU - {AD59F28F-06D6-4743-9E0F-9EAB2617601A}.Release|x86.ActiveCfg = Release|Any CPU - {AD59F28F-06D6-4743-9E0F-9EAB2617601A}.Release|x86.Build.0 = Release|Any CPU - {AD59F28F-06D6-4743-9E0F-9EAB2617601A}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {AD59F28F-06D6-4743-9E0F-9EAB2617601A}.Checked|x64.ActiveCfg = Debug|Any CPU - {AD59F28F-06D6-4743-9E0F-9EAB2617601A}.Checked|x86.ActiveCfg = Debug|Any CPU - {AD59F28F-06D6-4743-9E0F-9EAB2617601A}.RelWithDebInfo|Any CPU.ActiveCfg = Debug|Any CPU - {AD59F28F-06D6-4743-9E0F-9EAB2617601A}.RelWithDebInfo|x64.ActiveCfg = Debug|Any CPU - {AD59F28F-06D6-4743-9E0F-9EAB2617601A}.RelWithDebInfo|x86.ActiveCfg = Debug|Any CPU - {794DB744-5F00-4187-8AB6-A99B19ABAAB2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {794DB744-5F00-4187-8AB6-A99B19ABAAB2}.Debug|Any CPU.Build.0 = Debug|Any CPU - {794DB744-5F00-4187-8AB6-A99B19ABAAB2}.Debug|x64.ActiveCfg = Debug|Any CPU - {794DB744-5F00-4187-8AB6-A99B19ABAAB2}.Debug|x64.Build.0 = Debug|Any CPU - {794DB744-5F00-4187-8AB6-A99B19ABAAB2}.Debug|x86.ActiveCfg = Debug|Any CPU - {794DB744-5F00-4187-8AB6-A99B19ABAAB2}.Debug|x86.Build.0 = Debug|Any CPU - {794DB744-5F00-4187-8AB6-A99B19ABAAB2}.Release|Any CPU.ActiveCfg = Release|Any CPU - {794DB744-5F00-4187-8AB6-A99B19ABAAB2}.Release|Any CPU.Build.0 = Release|Any CPU - {794DB744-5F00-4187-8AB6-A99B19ABAAB2}.Release|x64.ActiveCfg = Release|Any CPU - {794DB744-5F00-4187-8AB6-A99B19ABAAB2}.Release|x64.Build.0 = Release|Any CPU - {794DB744-5F00-4187-8AB6-A99B19ABAAB2}.Release|x86.ActiveCfg = Release|Any CPU - {794DB744-5F00-4187-8AB6-A99B19ABAAB2}.Release|x86.Build.0 = Release|Any CPU - {794DB744-5F00-4187-8AB6-A99B19ABAAB2}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {794DB744-5F00-4187-8AB6-A99B19ABAAB2}.Checked|x64.ActiveCfg = Debug|Any CPU - {794DB744-5F00-4187-8AB6-A99B19ABAAB2}.Checked|x86.ActiveCfg = Debug|Any CPU - {794DB744-5F00-4187-8AB6-A99B19ABAAB2}.RelWithDebInfo|Any CPU.ActiveCfg = Debug|Any CPU - {794DB744-5F00-4187-8AB6-A99B19ABAAB2}.RelWithDebInfo|x64.ActiveCfg = Debug|Any CPU - {794DB744-5F00-4187-8AB6-A99B19ABAAB2}.RelWithDebInfo|x86.ActiveCfg = Debug|Any CPU - {A698EB04-2139-4A63-819B-0BC686478568}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {A698EB04-2139-4A63-819B-0BC686478568}.Debug|Any CPU.Build.0 = Debug|Any CPU - {A698EB04-2139-4A63-819B-0BC686478568}.Debug|x64.ActiveCfg = Debug|Any CPU - {A698EB04-2139-4A63-819B-0BC686478568}.Debug|x64.Build.0 = Debug|Any CPU - {A698EB04-2139-4A63-819B-0BC686478568}.Debug|x86.ActiveCfg = Debug|Any CPU - {A698EB04-2139-4A63-819B-0BC686478568}.Debug|x86.Build.0 = Debug|Any CPU - {A698EB04-2139-4A63-819B-0BC686478568}.Release|Any CPU.ActiveCfg = Release|Any CPU - {A698EB04-2139-4A63-819B-0BC686478568}.Release|Any CPU.Build.0 = Release|Any CPU - {A698EB04-2139-4A63-819B-0BC686478568}.Release|x64.ActiveCfg = Release|Any CPU - {A698EB04-2139-4A63-819B-0BC686478568}.Release|x64.Build.0 = Release|Any CPU - {A698EB04-2139-4A63-819B-0BC686478568}.Release|x86.ActiveCfg = Release|Any CPU - {A698EB04-2139-4A63-819B-0BC686478568}.Release|x86.Build.0 = Release|Any CPU - {A698EB04-2139-4A63-819B-0BC686478568}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {A698EB04-2139-4A63-819B-0BC686478568}.Checked|x64.ActiveCfg = Debug|Any CPU - {A698EB04-2139-4A63-819B-0BC686478568}.Checked|x86.ActiveCfg = Debug|Any CPU - {A698EB04-2139-4A63-819B-0BC686478568}.RelWithDebInfo|Any CPU.ActiveCfg = Debug|Any CPU - {A698EB04-2139-4A63-819B-0BC686478568}.RelWithDebInfo|x64.ActiveCfg = Debug|Any CPU - {A698EB04-2139-4A63-819B-0BC686478568}.RelWithDebInfo|x86.ActiveCfg = Debug|Any CPU - {A29C9F3E-1093-48F1-8CF4-21515EDB301A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {A29C9F3E-1093-48F1-8CF4-21515EDB301A}.Debug|Any CPU.Build.0 = Debug|Any CPU - {A29C9F3E-1093-48F1-8CF4-21515EDB301A}.Debug|x64.ActiveCfg = Debug|Any CPU - {A29C9F3E-1093-48F1-8CF4-21515EDB301A}.Debug|x64.Build.0 = Debug|Any CPU - {A29C9F3E-1093-48F1-8CF4-21515EDB301A}.Debug|x86.ActiveCfg = Debug|Any CPU - {A29C9F3E-1093-48F1-8CF4-21515EDB301A}.Debug|x86.Build.0 = Debug|Any CPU - {A29C9F3E-1093-48F1-8CF4-21515EDB301A}.Release|Any CPU.ActiveCfg = Release|Any CPU - {A29C9F3E-1093-48F1-8CF4-21515EDB301A}.Release|Any CPU.Build.0 = Release|Any CPU - {A29C9F3E-1093-48F1-8CF4-21515EDB301A}.Release|x64.ActiveCfg = Release|Any CPU - {A29C9F3E-1093-48F1-8CF4-21515EDB301A}.Release|x64.Build.0 = Release|Any CPU - {A29C9F3E-1093-48F1-8CF4-21515EDB301A}.Release|x86.ActiveCfg = Release|Any CPU - {A29C9F3E-1093-48F1-8CF4-21515EDB301A}.Release|x86.Build.0 = Release|Any CPU - {A29C9F3E-1093-48F1-8CF4-21515EDB301A}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {A29C9F3E-1093-48F1-8CF4-21515EDB301A}.Checked|x64.ActiveCfg = Debug|Any CPU - {A29C9F3E-1093-48F1-8CF4-21515EDB301A}.Checked|x86.ActiveCfg = Debug|Any CPU - {A29C9F3E-1093-48F1-8CF4-21515EDB301A}.RelWithDebInfo|Any CPU.ActiveCfg = Debug|Any CPU - {A29C9F3E-1093-48F1-8CF4-21515EDB301A}.RelWithDebInfo|x64.ActiveCfg = Debug|Any CPU - {A29C9F3E-1093-48F1-8CF4-21515EDB301A}.RelWithDebInfo|x86.ActiveCfg = Debug|Any CPU - {6D83F8E9-A84C-42AE-B91E-D342623D7783}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {6D83F8E9-A84C-42AE-B91E-D342623D7783}.Debug|Any CPU.Build.0 = Debug|Any CPU - {6D83F8E9-A84C-42AE-B91E-D342623D7783}.Debug|x64.ActiveCfg = Debug|Any CPU - {6D83F8E9-A84C-42AE-B91E-D342623D7783}.Debug|x64.Build.0 = Debug|Any CPU - {6D83F8E9-A84C-42AE-B91E-D342623D7783}.Debug|x86.ActiveCfg = Debug|Any CPU - {6D83F8E9-A84C-42AE-B91E-D342623D7783}.Debug|x86.Build.0 = Debug|Any CPU - {6D83F8E9-A84C-42AE-B91E-D342623D7783}.Release|Any CPU.ActiveCfg = Release|Any CPU - {6D83F8E9-A84C-42AE-B91E-D342623D7783}.Release|Any CPU.Build.0 = Release|Any CPU - {6D83F8E9-A84C-42AE-B91E-D342623D7783}.Release|x64.ActiveCfg = Release|Any CPU - {6D83F8E9-A84C-42AE-B91E-D342623D7783}.Release|x64.Build.0 = Release|Any CPU - {6D83F8E9-A84C-42AE-B91E-D342623D7783}.Release|x86.ActiveCfg = Release|Any CPU - {6D83F8E9-A84C-42AE-B91E-D342623D7783}.Release|x86.Build.0 = Release|Any CPU - {6D83F8E9-A84C-42AE-B91E-D342623D7783}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {6D83F8E9-A84C-42AE-B91E-D342623D7783}.Checked|x64.ActiveCfg = Debug|Any CPU - {6D83F8E9-A84C-42AE-B91E-D342623D7783}.Checked|x86.ActiveCfg = Debug|Any CPU - {6D83F8E9-A84C-42AE-B91E-D342623D7783}.RelWithDebInfo|Any CPU.ActiveCfg = Debug|Any CPU - {6D83F8E9-A84C-42AE-B91E-D342623D7783}.RelWithDebInfo|x64.ActiveCfg = Debug|Any CPU - {6D83F8E9-A84C-42AE-B91E-D342623D7783}.RelWithDebInfo|x86.ActiveCfg = Debug|Any CPU - {C40AB24F-39F3-4BEF-98E4-DAD9804EE7E2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {C40AB24F-39F3-4BEF-98E4-DAD9804EE7E2}.Debug|Any CPU.Build.0 = Debug|Any CPU - {C40AB24F-39F3-4BEF-98E4-DAD9804EE7E2}.Debug|x64.ActiveCfg = Debug|Any CPU - {C40AB24F-39F3-4BEF-98E4-DAD9804EE7E2}.Debug|x64.Build.0 = Debug|Any CPU - {C40AB24F-39F3-4BEF-98E4-DAD9804EE7E2}.Debug|x86.ActiveCfg = Debug|Any CPU - {C40AB24F-39F3-4BEF-98E4-DAD9804EE7E2}.Debug|x86.Build.0 = Debug|Any CPU - {C40AB24F-39F3-4BEF-98E4-DAD9804EE7E2}.Release|Any CPU.ActiveCfg = Release|Any CPU - {C40AB24F-39F3-4BEF-98E4-DAD9804EE7E2}.Release|Any CPU.Build.0 = Release|Any CPU - {C40AB24F-39F3-4BEF-98E4-DAD9804EE7E2}.Release|x64.ActiveCfg = Release|Any CPU - {C40AB24F-39F3-4BEF-98E4-DAD9804EE7E2}.Release|x64.Build.0 = Release|Any CPU - {C40AB24F-39F3-4BEF-98E4-DAD9804EE7E2}.Release|x86.ActiveCfg = Release|Any CPU - {C40AB24F-39F3-4BEF-98E4-DAD9804EE7E2}.Release|x86.Build.0 = Release|Any CPU - {C40AB24F-39F3-4BEF-98E4-DAD9804EE7E2}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {C40AB24F-39F3-4BEF-98E4-DAD9804EE7E2}.Checked|x64.ActiveCfg = Debug|Any CPU - {C40AB24F-39F3-4BEF-98E4-DAD9804EE7E2}.Checked|x86.ActiveCfg = Debug|Any CPU - {C40AB24F-39F3-4BEF-98E4-DAD9804EE7E2}.RelWithDebInfo|Any CPU.ActiveCfg = Debug|Any CPU - {C40AB24F-39F3-4BEF-98E4-DAD9804EE7E2}.RelWithDebInfo|x64.ActiveCfg = Debug|Any CPU - {C40AB24F-39F3-4BEF-98E4-DAD9804EE7E2}.RelWithDebInfo|x86.ActiveCfg = Debug|Any CPU - {F9E1B91C-3AE6-4894-A91A-EE6824D31E48}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {F9E1B91C-3AE6-4894-A91A-EE6824D31E48}.Debug|Any CPU.Build.0 = Debug|Any CPU - {F9E1B91C-3AE6-4894-A91A-EE6824D31E48}.Debug|x64.ActiveCfg = Debug|Any CPU - {F9E1B91C-3AE6-4894-A91A-EE6824D31E48}.Debug|x64.Build.0 = Debug|Any CPU - {F9E1B91C-3AE6-4894-A91A-EE6824D31E48}.Debug|x86.ActiveCfg = Debug|Any CPU - {F9E1B91C-3AE6-4894-A91A-EE6824D31E48}.Debug|x86.Build.0 = Debug|Any CPU - {F9E1B91C-3AE6-4894-A91A-EE6824D31E48}.Release|Any CPU.ActiveCfg = Release|Any CPU - {F9E1B91C-3AE6-4894-A91A-EE6824D31E48}.Release|Any CPU.Build.0 = Release|Any CPU - {F9E1B91C-3AE6-4894-A91A-EE6824D31E48}.Release|x64.ActiveCfg = Release|Any CPU - {F9E1B91C-3AE6-4894-A91A-EE6824D31E48}.Release|x64.Build.0 = Release|Any CPU - {F9E1B91C-3AE6-4894-A91A-EE6824D31E48}.Release|x86.ActiveCfg = Release|Any CPU - {F9E1B91C-3AE6-4894-A91A-EE6824D31E48}.Release|x86.Build.0 = Release|Any CPU - {F9E1B91C-3AE6-4894-A91A-EE6824D31E48}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {F9E1B91C-3AE6-4894-A91A-EE6824D31E48}.Checked|x64.ActiveCfg = Debug|Any CPU - {F9E1B91C-3AE6-4894-A91A-EE6824D31E48}.Checked|x86.ActiveCfg = Debug|Any CPU - {F9E1B91C-3AE6-4894-A91A-EE6824D31E48}.RelWithDebInfo|Any CPU.ActiveCfg = Debug|Any CPU - {F9E1B91C-3AE6-4894-A91A-EE6824D31E48}.RelWithDebInfo|x64.ActiveCfg = Debug|Any CPU - {F9E1B91C-3AE6-4894-A91A-EE6824D31E48}.RelWithDebInfo|x86.ActiveCfg = Debug|Any CPU - {D2810F09-0CCD-4779-B21B-322081E84E87}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {D2810F09-0CCD-4779-B21B-322081E84E87}.Debug|Any CPU.Build.0 = Debug|Any CPU - {D2810F09-0CCD-4779-B21B-322081E84E87}.Debug|x64.ActiveCfg = Debug|Any CPU - {D2810F09-0CCD-4779-B21B-322081E84E87}.Debug|x64.Build.0 = Debug|Any CPU - {D2810F09-0CCD-4779-B21B-322081E84E87}.Debug|x86.ActiveCfg = Debug|Any CPU - {D2810F09-0CCD-4779-B21B-322081E84E87}.Debug|x86.Build.0 = Debug|Any CPU - {D2810F09-0CCD-4779-B21B-322081E84E87}.Release|Any CPU.ActiveCfg = Release|Any CPU - {D2810F09-0CCD-4779-B21B-322081E84E87}.Release|Any CPU.Build.0 = Release|Any CPU - {D2810F09-0CCD-4779-B21B-322081E84E87}.Release|x64.ActiveCfg = Release|Any CPU - {D2810F09-0CCD-4779-B21B-322081E84E87}.Release|x64.Build.0 = Release|Any CPU - {D2810F09-0CCD-4779-B21B-322081E84E87}.Release|x86.ActiveCfg = Release|Any CPU - {D2810F09-0CCD-4779-B21B-322081E84E87}.Release|x86.Build.0 = Release|Any CPU - {D2810F09-0CCD-4779-B21B-322081E84E87}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {D2810F09-0CCD-4779-B21B-322081E84E87}.Checked|x64.ActiveCfg = Debug|Any CPU - {D2810F09-0CCD-4779-B21B-322081E84E87}.Checked|x86.ActiveCfg = Debug|Any CPU - {D2810F09-0CCD-4779-B21B-322081E84E87}.RelWithDebInfo|Any CPU.ActiveCfg = Debug|Any CPU - {D2810F09-0CCD-4779-B21B-322081E84E87}.RelWithDebInfo|x64.ActiveCfg = Debug|Any CPU - {D2810F09-0CCD-4779-B21B-322081E84E87}.RelWithDebInfo|x86.ActiveCfg = Debug|Any CPU - {5933AB07-5CBD-4AF3-9BCE-0B765363D27D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {5933AB07-5CBD-4AF3-9BCE-0B765363D27D}.Debug|Any CPU.Build.0 = Debug|Any CPU - {5933AB07-5CBD-4AF3-9BCE-0B765363D27D}.Debug|x64.ActiveCfg = Debug|Any CPU - {5933AB07-5CBD-4AF3-9BCE-0B765363D27D}.Debug|x64.Build.0 = Debug|Any CPU - {5933AB07-5CBD-4AF3-9BCE-0B765363D27D}.Debug|x86.ActiveCfg = Debug|Any CPU - {5933AB07-5CBD-4AF3-9BCE-0B765363D27D}.Debug|x86.Build.0 = Debug|Any CPU - {5933AB07-5CBD-4AF3-9BCE-0B765363D27D}.Release|Any CPU.ActiveCfg = Release|Any CPU - {5933AB07-5CBD-4AF3-9BCE-0B765363D27D}.Release|Any CPU.Build.0 = Release|Any CPU - {5933AB07-5CBD-4AF3-9BCE-0B765363D27D}.Release|x64.ActiveCfg = Release|Any CPU - {5933AB07-5CBD-4AF3-9BCE-0B765363D27D}.Release|x64.Build.0 = Release|Any CPU - {5933AB07-5CBD-4AF3-9BCE-0B765363D27D}.Release|x86.ActiveCfg = Release|Any CPU - {5933AB07-5CBD-4AF3-9BCE-0B765363D27D}.Release|x86.Build.0 = Release|Any CPU - {5933AB07-5CBD-4AF3-9BCE-0B765363D27D}.Checked|Any CPU.ActiveCfg = Debug|Any CPU - {5933AB07-5CBD-4AF3-9BCE-0B765363D27D}.Checked|x64.ActiveCfg = Debug|Any CPU - {5933AB07-5CBD-4AF3-9BCE-0B765363D27D}.Checked|x86.ActiveCfg = Debug|Any CPU - {5933AB07-5CBD-4AF3-9BCE-0B765363D27D}.RelWithDebInfo|Any CPU.ActiveCfg = Debug|Any CPU - {5933AB07-5CBD-4AF3-9BCE-0B765363D27D}.RelWithDebInfo|x64.ActiveCfg = Debug|Any CPU - {5933AB07-5CBD-4AF3-9BCE-0B765363D27D}.RelWithDebInfo|x86.ActiveCfg = Debug|Any CPU {41F59D85-FC36-3015-861B-F177863252BC}.Debug|Any CPU.ActiveCfg = Debug|x64 {41F59D85-FC36-3015-861B-F177863252BC}.Debug|Any CPU.Build.0 = Debug|x64 {41F59D85-FC36-3015-861B-F177863252BC}.Debug|x64.ActiveCfg = Debug|x64 @@ -1235,6 +895,366 @@ Global {AB277B63-4D5F-4269-824B-91A675B92F5B}.RelWithDebInfo|Any CPU.ActiveCfg = Debug|Any CPU {AB277B63-4D5F-4269-824B-91A675B92F5B}.RelWithDebInfo|x64.ActiveCfg = Debug|Any CPU {AB277B63-4D5F-4269-824B-91A675B92F5B}.RelWithDebInfo|x86.ActiveCfg = Debug|Any CPU + {963E8F75-D5F8-4BE2-A577-1D61505AC0DB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {963E8F75-D5F8-4BE2-A577-1D61505AC0DB}.Debug|Any CPU.Build.0 = Debug|Any CPU + {963E8F75-D5F8-4BE2-A577-1D61505AC0DB}.Debug|x64.ActiveCfg = Debug|Any CPU + {963E8F75-D5F8-4BE2-A577-1D61505AC0DB}.Debug|x64.Build.0 = Debug|Any CPU + {963E8F75-D5F8-4BE2-A577-1D61505AC0DB}.Debug|x86.ActiveCfg = Debug|Any CPU + {963E8F75-D5F8-4BE2-A577-1D61505AC0DB}.Debug|x86.Build.0 = Debug|Any CPU + {963E8F75-D5F8-4BE2-A577-1D61505AC0DB}.Release|Any CPU.ActiveCfg = Release|Any CPU + {963E8F75-D5F8-4BE2-A577-1D61505AC0DB}.Release|Any CPU.Build.0 = Release|Any CPU + {963E8F75-D5F8-4BE2-A577-1D61505AC0DB}.Release|x64.ActiveCfg = Release|Any CPU + {963E8F75-D5F8-4BE2-A577-1D61505AC0DB}.Release|x64.Build.0 = Release|Any CPU + {963E8F75-D5F8-4BE2-A577-1D61505AC0DB}.Release|x86.ActiveCfg = Release|Any CPU + {963E8F75-D5F8-4BE2-A577-1D61505AC0DB}.Release|x86.Build.0 = Release|Any CPU + {963E8F75-D5F8-4BE2-A577-1D61505AC0DB}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {963E8F75-D5F8-4BE2-A577-1D61505AC0DB}.Checked|x64.ActiveCfg = Debug|Any CPU + {963E8F75-D5F8-4BE2-A577-1D61505AC0DB}.Checked|x86.ActiveCfg = Debug|Any CPU + {963E8F75-D5F8-4BE2-A577-1D61505AC0DB}.RelWithDebInfo|Any CPU.ActiveCfg = Debug|Any CPU + {963E8F75-D5F8-4BE2-A577-1D61505AC0DB}.RelWithDebInfo|x64.ActiveCfg = Debug|Any CPU + {963E8F75-D5F8-4BE2-A577-1D61505AC0DB}.RelWithDebInfo|x86.ActiveCfg = Debug|Any CPU + {B3CBBAD9-A133-4B75-A00D-ECD13008F7CC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {B3CBBAD9-A133-4B75-A00D-ECD13008F7CC}.Debug|Any CPU.Build.0 = Debug|Any CPU + {B3CBBAD9-A133-4B75-A00D-ECD13008F7CC}.Debug|x64.ActiveCfg = Debug|Any CPU + {B3CBBAD9-A133-4B75-A00D-ECD13008F7CC}.Debug|x64.Build.0 = Debug|Any CPU + {B3CBBAD9-A133-4B75-A00D-ECD13008F7CC}.Debug|x86.ActiveCfg = Debug|Any CPU + {B3CBBAD9-A133-4B75-A00D-ECD13008F7CC}.Debug|x86.Build.0 = Debug|Any CPU + {B3CBBAD9-A133-4B75-A00D-ECD13008F7CC}.Release|Any CPU.ActiveCfg = Release|Any CPU + {B3CBBAD9-A133-4B75-A00D-ECD13008F7CC}.Release|Any CPU.Build.0 = Release|Any CPU + {B3CBBAD9-A133-4B75-A00D-ECD13008F7CC}.Release|x64.ActiveCfg = Release|Any CPU + {B3CBBAD9-A133-4B75-A00D-ECD13008F7CC}.Release|x64.Build.0 = Release|Any CPU + {B3CBBAD9-A133-4B75-A00D-ECD13008F7CC}.Release|x86.ActiveCfg = Release|Any CPU + {B3CBBAD9-A133-4B75-A00D-ECD13008F7CC}.Release|x86.Build.0 = Release|Any CPU + {B3CBBAD9-A133-4B75-A00D-ECD13008F7CC}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {B3CBBAD9-A133-4B75-A00D-ECD13008F7CC}.Checked|x64.ActiveCfg = Debug|Any CPU + {B3CBBAD9-A133-4B75-A00D-ECD13008F7CC}.Checked|x86.ActiveCfg = Debug|Any CPU + {B3CBBAD9-A133-4B75-A00D-ECD13008F7CC}.RelWithDebInfo|Any CPU.ActiveCfg = Debug|Any CPU + {B3CBBAD9-A133-4B75-A00D-ECD13008F7CC}.RelWithDebInfo|x64.ActiveCfg = Debug|Any CPU + {B3CBBAD9-A133-4B75-A00D-ECD13008F7CC}.RelWithDebInfo|x86.ActiveCfg = Debug|Any CPU + {5BFF64E3-34AA-4274-BA6E-0037E735EAB3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {5BFF64E3-34AA-4274-BA6E-0037E735EAB3}.Debug|Any CPU.Build.0 = Debug|Any CPU + {5BFF64E3-34AA-4274-BA6E-0037E735EAB3}.Debug|x64.ActiveCfg = Debug|Any CPU + {5BFF64E3-34AA-4274-BA6E-0037E735EAB3}.Debug|x64.Build.0 = Debug|Any CPU + {5BFF64E3-34AA-4274-BA6E-0037E735EAB3}.Debug|x86.ActiveCfg = Debug|Any CPU + {5BFF64E3-34AA-4274-BA6E-0037E735EAB3}.Debug|x86.Build.0 = Debug|Any CPU + {5BFF64E3-34AA-4274-BA6E-0037E735EAB3}.Release|Any CPU.ActiveCfg = Release|Any CPU + {5BFF64E3-34AA-4274-BA6E-0037E735EAB3}.Release|Any CPU.Build.0 = Release|Any CPU + {5BFF64E3-34AA-4274-BA6E-0037E735EAB3}.Release|x64.ActiveCfg = Release|Any CPU + {5BFF64E3-34AA-4274-BA6E-0037E735EAB3}.Release|x64.Build.0 = Release|Any CPU + {5BFF64E3-34AA-4274-BA6E-0037E735EAB3}.Release|x86.ActiveCfg = Release|Any CPU + {5BFF64E3-34AA-4274-BA6E-0037E735EAB3}.Release|x86.Build.0 = Release|Any CPU + {5BFF64E3-34AA-4274-BA6E-0037E735EAB3}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {5BFF64E3-34AA-4274-BA6E-0037E735EAB3}.Checked|x64.ActiveCfg = Debug|Any CPU + {5BFF64E3-34AA-4274-BA6E-0037E735EAB3}.Checked|x86.ActiveCfg = Debug|Any CPU + {5BFF64E3-34AA-4274-BA6E-0037E735EAB3}.RelWithDebInfo|Any CPU.ActiveCfg = Debug|Any CPU + {5BFF64E3-34AA-4274-BA6E-0037E735EAB3}.RelWithDebInfo|x64.ActiveCfg = Debug|Any CPU + {5BFF64E3-34AA-4274-BA6E-0037E735EAB3}.RelWithDebInfo|x86.ActiveCfg = Debug|Any CPU + {01CEE320-DF1D-48E2-A1D2-15867C4984E6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {01CEE320-DF1D-48E2-A1D2-15867C4984E6}.Debug|Any CPU.Build.0 = Debug|Any CPU + {01CEE320-DF1D-48E2-A1D2-15867C4984E6}.Debug|x64.ActiveCfg = Debug|Any CPU + {01CEE320-DF1D-48E2-A1D2-15867C4984E6}.Debug|x64.Build.0 = Debug|Any CPU + {01CEE320-DF1D-48E2-A1D2-15867C4984E6}.Debug|x86.ActiveCfg = Debug|Any CPU + {01CEE320-DF1D-48E2-A1D2-15867C4984E6}.Debug|x86.Build.0 = Debug|Any CPU + {01CEE320-DF1D-48E2-A1D2-15867C4984E6}.Release|Any CPU.ActiveCfg = Release|Any CPU + {01CEE320-DF1D-48E2-A1D2-15867C4984E6}.Release|Any CPU.Build.0 = Release|Any CPU + {01CEE320-DF1D-48E2-A1D2-15867C4984E6}.Release|x64.ActiveCfg = Release|Any CPU + {01CEE320-DF1D-48E2-A1D2-15867C4984E6}.Release|x64.Build.0 = Release|Any CPU + {01CEE320-DF1D-48E2-A1D2-15867C4984E6}.Release|x86.ActiveCfg = Release|Any CPU + {01CEE320-DF1D-48E2-A1D2-15867C4984E6}.Release|x86.Build.0 = Release|Any CPU + {01CEE320-DF1D-48E2-A1D2-15867C4984E6}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {01CEE320-DF1D-48E2-A1D2-15867C4984E6}.Checked|x64.ActiveCfg = Debug|Any CPU + {01CEE320-DF1D-48E2-A1D2-15867C4984E6}.Checked|x86.ActiveCfg = Debug|Any CPU + {01CEE320-DF1D-48E2-A1D2-15867C4984E6}.RelWithDebInfo|Any CPU.ActiveCfg = Debug|Any CPU + {01CEE320-DF1D-48E2-A1D2-15867C4984E6}.RelWithDebInfo|x64.ActiveCfg = Debug|Any CPU + {01CEE320-DF1D-48E2-A1D2-15867C4984E6}.RelWithDebInfo|x86.ActiveCfg = Debug|Any CPU + {79B6C88E-00FC-4990-A4AC-1EB1549F3542}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {79B6C88E-00FC-4990-A4AC-1EB1549F3542}.Debug|Any CPU.Build.0 = Debug|Any CPU + {79B6C88E-00FC-4990-A4AC-1EB1549F3542}.Debug|x64.ActiveCfg = Debug|Any CPU + {79B6C88E-00FC-4990-A4AC-1EB1549F3542}.Debug|x64.Build.0 = Debug|Any CPU + {79B6C88E-00FC-4990-A4AC-1EB1549F3542}.Debug|x86.ActiveCfg = Debug|Any CPU + {79B6C88E-00FC-4990-A4AC-1EB1549F3542}.Debug|x86.Build.0 = Debug|Any CPU + {79B6C88E-00FC-4990-A4AC-1EB1549F3542}.Release|Any CPU.ActiveCfg = Release|Any CPU + {79B6C88E-00FC-4990-A4AC-1EB1549F3542}.Release|Any CPU.Build.0 = Release|Any CPU + {79B6C88E-00FC-4990-A4AC-1EB1549F3542}.Release|x64.ActiveCfg = Release|Any CPU + {79B6C88E-00FC-4990-A4AC-1EB1549F3542}.Release|x64.Build.0 = Release|Any CPU + {79B6C88E-00FC-4990-A4AC-1EB1549F3542}.Release|x86.ActiveCfg = Release|Any CPU + {79B6C88E-00FC-4990-A4AC-1EB1549F3542}.Release|x86.Build.0 = Release|Any CPU + {79B6C88E-00FC-4990-A4AC-1EB1549F3542}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {79B6C88E-00FC-4990-A4AC-1EB1549F3542}.Checked|x64.ActiveCfg = Debug|Any CPU + {79B6C88E-00FC-4990-A4AC-1EB1549F3542}.Checked|x86.ActiveCfg = Debug|Any CPU + {79B6C88E-00FC-4990-A4AC-1EB1549F3542}.RelWithDebInfo|Any CPU.ActiveCfg = Debug|Any CPU + {79B6C88E-00FC-4990-A4AC-1EB1549F3542}.RelWithDebInfo|x64.ActiveCfg = Debug|Any CPU + {79B6C88E-00FC-4990-A4AC-1EB1549F3542}.RelWithDebInfo|x86.ActiveCfg = Debug|Any CPU + {C69F541A-82B2-4545-A371-72D38218C569}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {C69F541A-82B2-4545-A371-72D38218C569}.Debug|Any CPU.Build.0 = Debug|Any CPU + {C69F541A-82B2-4545-A371-72D38218C569}.Debug|x64.ActiveCfg = Debug|Any CPU + {C69F541A-82B2-4545-A371-72D38218C569}.Debug|x64.Build.0 = Debug|Any CPU + {C69F541A-82B2-4545-A371-72D38218C569}.Debug|x86.ActiveCfg = Debug|Any CPU + {C69F541A-82B2-4545-A371-72D38218C569}.Debug|x86.Build.0 = Debug|Any CPU + {C69F541A-82B2-4545-A371-72D38218C569}.Release|Any CPU.ActiveCfg = Release|Any CPU + {C69F541A-82B2-4545-A371-72D38218C569}.Release|Any CPU.Build.0 = Release|Any CPU + {C69F541A-82B2-4545-A371-72D38218C569}.Release|x64.ActiveCfg = Release|Any CPU + {C69F541A-82B2-4545-A371-72D38218C569}.Release|x64.Build.0 = Release|Any CPU + {C69F541A-82B2-4545-A371-72D38218C569}.Release|x86.ActiveCfg = Release|Any CPU + {C69F541A-82B2-4545-A371-72D38218C569}.Release|x86.Build.0 = Release|Any CPU + {C69F541A-82B2-4545-A371-72D38218C569}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {C69F541A-82B2-4545-A371-72D38218C569}.Checked|x64.ActiveCfg = Debug|Any CPU + {C69F541A-82B2-4545-A371-72D38218C569}.Checked|x86.ActiveCfg = Debug|Any CPU + {C69F541A-82B2-4545-A371-72D38218C569}.RelWithDebInfo|Any CPU.ActiveCfg = Debug|Any CPU + {C69F541A-82B2-4545-A371-72D38218C569}.RelWithDebInfo|x64.ActiveCfg = Debug|Any CPU + {C69F541A-82B2-4545-A371-72D38218C569}.RelWithDebInfo|x86.ActiveCfg = Debug|Any CPU + {BCBCA951-17AC-43C3-BC1F-ED8137C08923}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {BCBCA951-17AC-43C3-BC1F-ED8137C08923}.Debug|Any CPU.Build.0 = Debug|Any CPU + {BCBCA951-17AC-43C3-BC1F-ED8137C08923}.Debug|x64.ActiveCfg = Debug|Any CPU + {BCBCA951-17AC-43C3-BC1F-ED8137C08923}.Debug|x64.Build.0 = Debug|Any CPU + {BCBCA951-17AC-43C3-BC1F-ED8137C08923}.Debug|x86.ActiveCfg = Debug|Any CPU + {BCBCA951-17AC-43C3-BC1F-ED8137C08923}.Debug|x86.Build.0 = Debug|Any CPU + {BCBCA951-17AC-43C3-BC1F-ED8137C08923}.Release|Any CPU.ActiveCfg = Release|Any CPU + {BCBCA951-17AC-43C3-BC1F-ED8137C08923}.Release|Any CPU.Build.0 = Release|Any CPU + {BCBCA951-17AC-43C3-BC1F-ED8137C08923}.Release|x64.ActiveCfg = Release|Any CPU + {BCBCA951-17AC-43C3-BC1F-ED8137C08923}.Release|x64.Build.0 = Release|Any CPU + {BCBCA951-17AC-43C3-BC1F-ED8137C08923}.Release|x86.ActiveCfg = Release|Any CPU + {BCBCA951-17AC-43C3-BC1F-ED8137C08923}.Release|x86.Build.0 = Release|Any CPU + {BCBCA951-17AC-43C3-BC1F-ED8137C08923}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {BCBCA951-17AC-43C3-BC1F-ED8137C08923}.Checked|x64.ActiveCfg = Debug|Any CPU + {BCBCA951-17AC-43C3-BC1F-ED8137C08923}.Checked|x86.ActiveCfg = Debug|Any CPU + {BCBCA951-17AC-43C3-BC1F-ED8137C08923}.RelWithDebInfo|Any CPU.ActiveCfg = Debug|Any CPU + {BCBCA951-17AC-43C3-BC1F-ED8137C08923}.RelWithDebInfo|x64.ActiveCfg = Debug|Any CPU + {BCBCA951-17AC-43C3-BC1F-ED8137C08923}.RelWithDebInfo|x86.ActiveCfg = Debug|Any CPU + {D39F4E7C-558C-4697-8692-9DD92DB97D92}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {D39F4E7C-558C-4697-8692-9DD92DB97D92}.Debug|Any CPU.Build.0 = Debug|Any CPU + {D39F4E7C-558C-4697-8692-9DD92DB97D92}.Debug|x64.ActiveCfg = Debug|Any CPU + {D39F4E7C-558C-4697-8692-9DD92DB97D92}.Debug|x64.Build.0 = Debug|Any CPU + {D39F4E7C-558C-4697-8692-9DD92DB97D92}.Debug|x86.ActiveCfg = Debug|Any CPU + {D39F4E7C-558C-4697-8692-9DD92DB97D92}.Debug|x86.Build.0 = Debug|Any CPU + {D39F4E7C-558C-4697-8692-9DD92DB97D92}.Release|Any CPU.ActiveCfg = Release|Any CPU + {D39F4E7C-558C-4697-8692-9DD92DB97D92}.Release|Any CPU.Build.0 = Release|Any CPU + {D39F4E7C-558C-4697-8692-9DD92DB97D92}.Release|x64.ActiveCfg = Release|Any CPU + {D39F4E7C-558C-4697-8692-9DD92DB97D92}.Release|x64.Build.0 = Release|Any CPU + {D39F4E7C-558C-4697-8692-9DD92DB97D92}.Release|x86.ActiveCfg = Release|Any CPU + {D39F4E7C-558C-4697-8692-9DD92DB97D92}.Release|x86.Build.0 = Release|Any CPU + {D39F4E7C-558C-4697-8692-9DD92DB97D92}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {D39F4E7C-558C-4697-8692-9DD92DB97D92}.Checked|x64.ActiveCfg = Debug|Any CPU + {D39F4E7C-558C-4697-8692-9DD92DB97D92}.Checked|x86.ActiveCfg = Debug|Any CPU + {D39F4E7C-558C-4697-8692-9DD92DB97D92}.RelWithDebInfo|Any CPU.ActiveCfg = Debug|Any CPU + {D39F4E7C-558C-4697-8692-9DD92DB97D92}.RelWithDebInfo|x64.ActiveCfg = Debug|Any CPU + {D39F4E7C-558C-4697-8692-9DD92DB97D92}.RelWithDebInfo|x86.ActiveCfg = Debug|Any CPU + {57A8B0FF-5FD9-4E8E-806F-3F25E30B3E74}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {57A8B0FF-5FD9-4E8E-806F-3F25E30B3E74}.Debug|Any CPU.Build.0 = Debug|Any CPU + {57A8B0FF-5FD9-4E8E-806F-3F25E30B3E74}.Debug|x64.ActiveCfg = Debug|Any CPU + {57A8B0FF-5FD9-4E8E-806F-3F25E30B3E74}.Debug|x64.Build.0 = Debug|Any CPU + {57A8B0FF-5FD9-4E8E-806F-3F25E30B3E74}.Debug|x86.ActiveCfg = Debug|Any CPU + {57A8B0FF-5FD9-4E8E-806F-3F25E30B3E74}.Debug|x86.Build.0 = Debug|Any CPU + {57A8B0FF-5FD9-4E8E-806F-3F25E30B3E74}.Release|Any CPU.ActiveCfg = Release|Any CPU + {57A8B0FF-5FD9-4E8E-806F-3F25E30B3E74}.Release|Any CPU.Build.0 = Release|Any CPU + {57A8B0FF-5FD9-4E8E-806F-3F25E30B3E74}.Release|x64.ActiveCfg = Release|Any CPU + {57A8B0FF-5FD9-4E8E-806F-3F25E30B3E74}.Release|x64.Build.0 = Release|Any CPU + {57A8B0FF-5FD9-4E8E-806F-3F25E30B3E74}.Release|x86.ActiveCfg = Release|Any CPU + {57A8B0FF-5FD9-4E8E-806F-3F25E30B3E74}.Release|x86.Build.0 = Release|Any CPU + {57A8B0FF-5FD9-4E8E-806F-3F25E30B3E74}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {57A8B0FF-5FD9-4E8E-806F-3F25E30B3E74}.Checked|x64.ActiveCfg = Debug|Any CPU + {57A8B0FF-5FD9-4E8E-806F-3F25E30B3E74}.Checked|x86.ActiveCfg = Debug|Any CPU + {57A8B0FF-5FD9-4E8E-806F-3F25E30B3E74}.RelWithDebInfo|Any CPU.ActiveCfg = Debug|Any CPU + {57A8B0FF-5FD9-4E8E-806F-3F25E30B3E74}.RelWithDebInfo|x64.ActiveCfg = Debug|Any CPU + {57A8B0FF-5FD9-4E8E-806F-3F25E30B3E74}.RelWithDebInfo|x86.ActiveCfg = Debug|Any CPU + {A39F9BC5-892F-4B68-9B2A-C9EF99EEDBF0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {A39F9BC5-892F-4B68-9B2A-C9EF99EEDBF0}.Debug|Any CPU.Build.0 = Debug|Any CPU + {A39F9BC5-892F-4B68-9B2A-C9EF99EEDBF0}.Debug|x64.ActiveCfg = Debug|Any CPU + {A39F9BC5-892F-4B68-9B2A-C9EF99EEDBF0}.Debug|x64.Build.0 = Debug|Any CPU + {A39F9BC5-892F-4B68-9B2A-C9EF99EEDBF0}.Debug|x86.ActiveCfg = Debug|Any CPU + {A39F9BC5-892F-4B68-9B2A-C9EF99EEDBF0}.Debug|x86.Build.0 = Debug|Any CPU + {A39F9BC5-892F-4B68-9B2A-C9EF99EEDBF0}.Release|Any CPU.ActiveCfg = Release|Any CPU + {A39F9BC5-892F-4B68-9B2A-C9EF99EEDBF0}.Release|Any CPU.Build.0 = Release|Any CPU + {A39F9BC5-892F-4B68-9B2A-C9EF99EEDBF0}.Release|x64.ActiveCfg = Release|Any CPU + {A39F9BC5-892F-4B68-9B2A-C9EF99EEDBF0}.Release|x64.Build.0 = Release|Any CPU + {A39F9BC5-892F-4B68-9B2A-C9EF99EEDBF0}.Release|x86.ActiveCfg = Release|Any CPU + {A39F9BC5-892F-4B68-9B2A-C9EF99EEDBF0}.Release|x86.Build.0 = Release|Any CPU + {A39F9BC5-892F-4B68-9B2A-C9EF99EEDBF0}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {A39F9BC5-892F-4B68-9B2A-C9EF99EEDBF0}.Checked|x64.ActiveCfg = Debug|Any CPU + {A39F9BC5-892F-4B68-9B2A-C9EF99EEDBF0}.Checked|x86.ActiveCfg = Debug|Any CPU + {A39F9BC5-892F-4B68-9B2A-C9EF99EEDBF0}.RelWithDebInfo|Any CPU.ActiveCfg = Debug|Any CPU + {A39F9BC5-892F-4B68-9B2A-C9EF99EEDBF0}.RelWithDebInfo|x64.ActiveCfg = Debug|Any CPU + {A39F9BC5-892F-4B68-9B2A-C9EF99EEDBF0}.RelWithDebInfo|x86.ActiveCfg = Debug|Any CPU + {2654C11D-41F2-42C6-8614-2873A794FCB7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {2654C11D-41F2-42C6-8614-2873A794FCB7}.Debug|Any CPU.Build.0 = Debug|Any CPU + {2654C11D-41F2-42C6-8614-2873A794FCB7}.Debug|x64.ActiveCfg = Debug|Any CPU + {2654C11D-41F2-42C6-8614-2873A794FCB7}.Debug|x64.Build.0 = Debug|Any CPU + {2654C11D-41F2-42C6-8614-2873A794FCB7}.Debug|x86.ActiveCfg = Debug|Any CPU + {2654C11D-41F2-42C6-8614-2873A794FCB7}.Debug|x86.Build.0 = Debug|Any CPU + {2654C11D-41F2-42C6-8614-2873A794FCB7}.Release|Any CPU.ActiveCfg = Release|Any CPU + {2654C11D-41F2-42C6-8614-2873A794FCB7}.Release|Any CPU.Build.0 = Release|Any CPU + {2654C11D-41F2-42C6-8614-2873A794FCB7}.Release|x64.ActiveCfg = Release|Any CPU + {2654C11D-41F2-42C6-8614-2873A794FCB7}.Release|x64.Build.0 = Release|Any CPU + {2654C11D-41F2-42C6-8614-2873A794FCB7}.Release|x86.ActiveCfg = Release|Any CPU + {2654C11D-41F2-42C6-8614-2873A794FCB7}.Release|x86.Build.0 = Release|Any CPU + {2654C11D-41F2-42C6-8614-2873A794FCB7}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {2654C11D-41F2-42C6-8614-2873A794FCB7}.Checked|x64.ActiveCfg = Debug|Any CPU + {2654C11D-41F2-42C6-8614-2873A794FCB7}.Checked|x86.ActiveCfg = Debug|Any CPU + {2654C11D-41F2-42C6-8614-2873A794FCB7}.RelWithDebInfo|Any CPU.ActiveCfg = Debug|Any CPU + {2654C11D-41F2-42C6-8614-2873A794FCB7}.RelWithDebInfo|x64.ActiveCfg = Debug|Any CPU + {2654C11D-41F2-42C6-8614-2873A794FCB7}.RelWithDebInfo|x86.ActiveCfg = Debug|Any CPU + {699AAD88-F832-4FAE-993D-C3C62ED46EA5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {699AAD88-F832-4FAE-993D-C3C62ED46EA5}.Debug|Any CPU.Build.0 = Debug|Any CPU + {699AAD88-F832-4FAE-993D-C3C62ED46EA5}.Debug|x64.ActiveCfg = Debug|Any CPU + {699AAD88-F832-4FAE-993D-C3C62ED46EA5}.Debug|x64.Build.0 = Debug|Any CPU + {699AAD88-F832-4FAE-993D-C3C62ED46EA5}.Debug|x86.ActiveCfg = Debug|Any CPU + {699AAD88-F832-4FAE-993D-C3C62ED46EA5}.Debug|x86.Build.0 = Debug|Any CPU + {699AAD88-F832-4FAE-993D-C3C62ED46EA5}.Release|Any CPU.ActiveCfg = Release|Any CPU + {699AAD88-F832-4FAE-993D-C3C62ED46EA5}.Release|Any CPU.Build.0 = Release|Any CPU + {699AAD88-F832-4FAE-993D-C3C62ED46EA5}.Release|x64.ActiveCfg = Release|Any CPU + {699AAD88-F832-4FAE-993D-C3C62ED46EA5}.Release|x64.Build.0 = Release|Any CPU + {699AAD88-F832-4FAE-993D-C3C62ED46EA5}.Release|x86.ActiveCfg = Release|Any CPU + {699AAD88-F832-4FAE-993D-C3C62ED46EA5}.Release|x86.Build.0 = Release|Any CPU + {699AAD88-F832-4FAE-993D-C3C62ED46EA5}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {699AAD88-F832-4FAE-993D-C3C62ED46EA5}.Checked|x64.ActiveCfg = Debug|Any CPU + {699AAD88-F832-4FAE-993D-C3C62ED46EA5}.Checked|x86.ActiveCfg = Debug|Any CPU + {699AAD88-F832-4FAE-993D-C3C62ED46EA5}.RelWithDebInfo|Any CPU.ActiveCfg = Debug|Any CPU + {699AAD88-F832-4FAE-993D-C3C62ED46EA5}.RelWithDebInfo|x64.ActiveCfg = Debug|Any CPU + {699AAD88-F832-4FAE-993D-C3C62ED46EA5}.RelWithDebInfo|x86.ActiveCfg = Debug|Any CPU + {A2C8D695-00FF-420C-B354-B1DBCAB58CE2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {A2C8D695-00FF-420C-B354-B1DBCAB58CE2}.Debug|Any CPU.Build.0 = Debug|Any CPU + {A2C8D695-00FF-420C-B354-B1DBCAB58CE2}.Debug|x64.ActiveCfg = Debug|Any CPU + {A2C8D695-00FF-420C-B354-B1DBCAB58CE2}.Debug|x64.Build.0 = Debug|Any CPU + {A2C8D695-00FF-420C-B354-B1DBCAB58CE2}.Debug|x86.ActiveCfg = Debug|Any CPU + {A2C8D695-00FF-420C-B354-B1DBCAB58CE2}.Debug|x86.Build.0 = Debug|Any CPU + {A2C8D695-00FF-420C-B354-B1DBCAB58CE2}.Release|Any CPU.ActiveCfg = Release|Any CPU + {A2C8D695-00FF-420C-B354-B1DBCAB58CE2}.Release|Any CPU.Build.0 = Release|Any CPU + {A2C8D695-00FF-420C-B354-B1DBCAB58CE2}.Release|x64.ActiveCfg = Release|Any CPU + {A2C8D695-00FF-420C-B354-B1DBCAB58CE2}.Release|x64.Build.0 = Release|Any CPU + {A2C8D695-00FF-420C-B354-B1DBCAB58CE2}.Release|x86.ActiveCfg = Release|Any CPU + {A2C8D695-00FF-420C-B354-B1DBCAB58CE2}.Release|x86.Build.0 = Release|Any CPU + {A2C8D695-00FF-420C-B354-B1DBCAB58CE2}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {A2C8D695-00FF-420C-B354-B1DBCAB58CE2}.Checked|x64.ActiveCfg = Debug|Any CPU + {A2C8D695-00FF-420C-B354-B1DBCAB58CE2}.Checked|x86.ActiveCfg = Debug|Any CPU + {A2C8D695-00FF-420C-B354-B1DBCAB58CE2}.RelWithDebInfo|Any CPU.ActiveCfg = Debug|Any CPU + {A2C8D695-00FF-420C-B354-B1DBCAB58CE2}.RelWithDebInfo|x64.ActiveCfg = Debug|Any CPU + {A2C8D695-00FF-420C-B354-B1DBCAB58CE2}.RelWithDebInfo|x86.ActiveCfg = Debug|Any CPU + {848B453F-1020-4814-9EDA-F5E01F21EA95}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {848B453F-1020-4814-9EDA-F5E01F21EA95}.Debug|Any CPU.Build.0 = Debug|Any CPU + {848B453F-1020-4814-9EDA-F5E01F21EA95}.Debug|x64.ActiveCfg = Debug|Any CPU + {848B453F-1020-4814-9EDA-F5E01F21EA95}.Debug|x64.Build.0 = Debug|Any CPU + {848B453F-1020-4814-9EDA-F5E01F21EA95}.Debug|x86.ActiveCfg = Debug|Any CPU + {848B453F-1020-4814-9EDA-F5E01F21EA95}.Debug|x86.Build.0 = Debug|Any CPU + {848B453F-1020-4814-9EDA-F5E01F21EA95}.Release|Any CPU.ActiveCfg = Release|Any CPU + {848B453F-1020-4814-9EDA-F5E01F21EA95}.Release|Any CPU.Build.0 = Release|Any CPU + {848B453F-1020-4814-9EDA-F5E01F21EA95}.Release|x64.ActiveCfg = Release|Any CPU + {848B453F-1020-4814-9EDA-F5E01F21EA95}.Release|x64.Build.0 = Release|Any CPU + {848B453F-1020-4814-9EDA-F5E01F21EA95}.Release|x86.ActiveCfg = Release|Any CPU + {848B453F-1020-4814-9EDA-F5E01F21EA95}.Release|x86.Build.0 = Release|Any CPU + {848B453F-1020-4814-9EDA-F5E01F21EA95}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {848B453F-1020-4814-9EDA-F5E01F21EA95}.Checked|x64.ActiveCfg = Debug|Any CPU + {848B453F-1020-4814-9EDA-F5E01F21EA95}.Checked|x86.ActiveCfg = Debug|Any CPU + {848B453F-1020-4814-9EDA-F5E01F21EA95}.RelWithDebInfo|Any CPU.ActiveCfg = Debug|Any CPU + {848B453F-1020-4814-9EDA-F5E01F21EA95}.RelWithDebInfo|x64.ActiveCfg = Debug|Any CPU + {848B453F-1020-4814-9EDA-F5E01F21EA95}.RelWithDebInfo|x86.ActiveCfg = Debug|Any CPU + {11B8DEC6-18F7-4129-A785-D7F4AA779841}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {11B8DEC6-18F7-4129-A785-D7F4AA779841}.Debug|Any CPU.Build.0 = Debug|Any CPU + {11B8DEC6-18F7-4129-A785-D7F4AA779841}.Debug|x64.ActiveCfg = Debug|Any CPU + {11B8DEC6-18F7-4129-A785-D7F4AA779841}.Debug|x64.Build.0 = Debug|Any CPU + {11B8DEC6-18F7-4129-A785-D7F4AA779841}.Debug|x86.ActiveCfg = Debug|Any CPU + {11B8DEC6-18F7-4129-A785-D7F4AA779841}.Debug|x86.Build.0 = Debug|Any CPU + {11B8DEC6-18F7-4129-A785-D7F4AA779841}.Release|Any CPU.ActiveCfg = Release|Any CPU + {11B8DEC6-18F7-4129-A785-D7F4AA779841}.Release|Any CPU.Build.0 = Release|Any CPU + {11B8DEC6-18F7-4129-A785-D7F4AA779841}.Release|x64.ActiveCfg = Release|Any CPU + {11B8DEC6-18F7-4129-A785-D7F4AA779841}.Release|x64.Build.0 = Release|Any CPU + {11B8DEC6-18F7-4129-A785-D7F4AA779841}.Release|x86.ActiveCfg = Release|Any CPU + {11B8DEC6-18F7-4129-A785-D7F4AA779841}.Release|x86.Build.0 = Release|Any CPU + {11B8DEC6-18F7-4129-A785-D7F4AA779841}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {11B8DEC6-18F7-4129-A785-D7F4AA779841}.Checked|x64.ActiveCfg = Debug|Any CPU + {11B8DEC6-18F7-4129-A785-D7F4AA779841}.Checked|x86.ActiveCfg = Debug|Any CPU + {11B8DEC6-18F7-4129-A785-D7F4AA779841}.RelWithDebInfo|Any CPU.ActiveCfg = Debug|Any CPU + {11B8DEC6-18F7-4129-A785-D7F4AA779841}.RelWithDebInfo|x64.ActiveCfg = Debug|Any CPU + {11B8DEC6-18F7-4129-A785-D7F4AA779841}.RelWithDebInfo|x86.ActiveCfg = Debug|Any CPU + {F5372D50-84CD-4DA1-A74A-FFEDA78920CC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {F5372D50-84CD-4DA1-A74A-FFEDA78920CC}.Debug|Any CPU.Build.0 = Debug|Any CPU + {F5372D50-84CD-4DA1-A74A-FFEDA78920CC}.Debug|x64.ActiveCfg = Debug|Any CPU + {F5372D50-84CD-4DA1-A74A-FFEDA78920CC}.Debug|x64.Build.0 = Debug|Any CPU + {F5372D50-84CD-4DA1-A74A-FFEDA78920CC}.Debug|x86.ActiveCfg = Debug|Any CPU + {F5372D50-84CD-4DA1-A74A-FFEDA78920CC}.Debug|x86.Build.0 = Debug|Any CPU + {F5372D50-84CD-4DA1-A74A-FFEDA78920CC}.Release|Any CPU.ActiveCfg = Release|Any CPU + {F5372D50-84CD-4DA1-A74A-FFEDA78920CC}.Release|Any CPU.Build.0 = Release|Any CPU + {F5372D50-84CD-4DA1-A74A-FFEDA78920CC}.Release|x64.ActiveCfg = Release|Any CPU + {F5372D50-84CD-4DA1-A74A-FFEDA78920CC}.Release|x64.Build.0 = Release|Any CPU + {F5372D50-84CD-4DA1-A74A-FFEDA78920CC}.Release|x86.ActiveCfg = Release|Any CPU + {F5372D50-84CD-4DA1-A74A-FFEDA78920CC}.Release|x86.Build.0 = Release|Any CPU + {F5372D50-84CD-4DA1-A74A-FFEDA78920CC}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {F5372D50-84CD-4DA1-A74A-FFEDA78920CC}.Checked|x64.ActiveCfg = Debug|Any CPU + {F5372D50-84CD-4DA1-A74A-FFEDA78920CC}.Checked|x86.ActiveCfg = Debug|Any CPU + {F5372D50-84CD-4DA1-A74A-FFEDA78920CC}.RelWithDebInfo|Any CPU.ActiveCfg = Debug|Any CPU + {F5372D50-84CD-4DA1-A74A-FFEDA78920CC}.RelWithDebInfo|x64.ActiveCfg = Debug|Any CPU + {F5372D50-84CD-4DA1-A74A-FFEDA78920CC}.RelWithDebInfo|x86.ActiveCfg = Debug|Any CPU + {A01C5649-8C86-45B9-A9A2-117056343F8A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {A01C5649-8C86-45B9-A9A2-117056343F8A}.Debug|Any CPU.Build.0 = Debug|Any CPU + {A01C5649-8C86-45B9-A9A2-117056343F8A}.Debug|x64.ActiveCfg = Debug|Any CPU + {A01C5649-8C86-45B9-A9A2-117056343F8A}.Debug|x64.Build.0 = Debug|Any CPU + {A01C5649-8C86-45B9-A9A2-117056343F8A}.Debug|x86.ActiveCfg = Debug|Any CPU + {A01C5649-8C86-45B9-A9A2-117056343F8A}.Debug|x86.Build.0 = Debug|Any CPU + {A01C5649-8C86-45B9-A9A2-117056343F8A}.Release|Any CPU.ActiveCfg = Release|Any CPU + {A01C5649-8C86-45B9-A9A2-117056343F8A}.Release|Any CPU.Build.0 = Release|Any CPU + {A01C5649-8C86-45B9-A9A2-117056343F8A}.Release|x64.ActiveCfg = Release|Any CPU + {A01C5649-8C86-45B9-A9A2-117056343F8A}.Release|x64.Build.0 = Release|Any CPU + {A01C5649-8C86-45B9-A9A2-117056343F8A}.Release|x86.ActiveCfg = Release|Any CPU + {A01C5649-8C86-45B9-A9A2-117056343F8A}.Release|x86.Build.0 = Release|Any CPU + {A01C5649-8C86-45B9-A9A2-117056343F8A}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {A01C5649-8C86-45B9-A9A2-117056343F8A}.Checked|x64.ActiveCfg = Debug|Any CPU + {A01C5649-8C86-45B9-A9A2-117056343F8A}.Checked|x86.ActiveCfg = Debug|Any CPU + {A01C5649-8C86-45B9-A9A2-117056343F8A}.RelWithDebInfo|Any CPU.ActiveCfg = Debug|Any CPU + {A01C5649-8C86-45B9-A9A2-117056343F8A}.RelWithDebInfo|x64.ActiveCfg = Debug|Any CPU + {A01C5649-8C86-45B9-A9A2-117056343F8A}.RelWithDebInfo|x86.ActiveCfg = Debug|Any CPU + {8AADF39D-B793-4574-96F4-F13391C46288}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {8AADF39D-B793-4574-96F4-F13391C46288}.Debug|Any CPU.Build.0 = Debug|Any CPU + {8AADF39D-B793-4574-96F4-F13391C46288}.Debug|x64.ActiveCfg = Debug|Any CPU + {8AADF39D-B793-4574-96F4-F13391C46288}.Debug|x64.Build.0 = Debug|Any CPU + {8AADF39D-B793-4574-96F4-F13391C46288}.Debug|x86.ActiveCfg = Debug|Any CPU + {8AADF39D-B793-4574-96F4-F13391C46288}.Debug|x86.Build.0 = Debug|Any CPU + {8AADF39D-B793-4574-96F4-F13391C46288}.Release|Any CPU.ActiveCfg = Release|Any CPU + {8AADF39D-B793-4574-96F4-F13391C46288}.Release|Any CPU.Build.0 = Release|Any CPU + {8AADF39D-B793-4574-96F4-F13391C46288}.Release|x64.ActiveCfg = Release|Any CPU + {8AADF39D-B793-4574-96F4-F13391C46288}.Release|x64.Build.0 = Release|Any CPU + {8AADF39D-B793-4574-96F4-F13391C46288}.Release|x86.ActiveCfg = Release|Any CPU + {8AADF39D-B793-4574-96F4-F13391C46288}.Release|x86.Build.0 = Release|Any CPU + {8AADF39D-B793-4574-96F4-F13391C46288}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {8AADF39D-B793-4574-96F4-F13391C46288}.Checked|x64.ActiveCfg = Debug|Any CPU + {8AADF39D-B793-4574-96F4-F13391C46288}.Checked|x86.ActiveCfg = Debug|Any CPU + {8AADF39D-B793-4574-96F4-F13391C46288}.RelWithDebInfo|Any CPU.ActiveCfg = Debug|Any CPU + {8AADF39D-B793-4574-96F4-F13391C46288}.RelWithDebInfo|x64.ActiveCfg = Debug|Any CPU + {8AADF39D-B793-4574-96F4-F13391C46288}.RelWithDebInfo|x86.ActiveCfg = Debug|Any CPU + {AEDAD92F-C123-4880-A4EB-569074A31DE7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {AEDAD92F-C123-4880-A4EB-569074A31DE7}.Debug|Any CPU.Build.0 = Debug|Any CPU + {AEDAD92F-C123-4880-A4EB-569074A31DE7}.Debug|x64.ActiveCfg = Debug|Any CPU + {AEDAD92F-C123-4880-A4EB-569074A31DE7}.Debug|x64.Build.0 = Debug|Any CPU + {AEDAD92F-C123-4880-A4EB-569074A31DE7}.Debug|x86.ActiveCfg = Debug|Any CPU + {AEDAD92F-C123-4880-A4EB-569074A31DE7}.Debug|x86.Build.0 = Debug|Any CPU + {AEDAD92F-C123-4880-A4EB-569074A31DE7}.Release|Any CPU.ActiveCfg = Release|Any CPU + {AEDAD92F-C123-4880-A4EB-569074A31DE7}.Release|Any CPU.Build.0 = Release|Any CPU + {AEDAD92F-C123-4880-A4EB-569074A31DE7}.Release|x64.ActiveCfg = Release|Any CPU + {AEDAD92F-C123-4880-A4EB-569074A31DE7}.Release|x64.Build.0 = Release|Any CPU + {AEDAD92F-C123-4880-A4EB-569074A31DE7}.Release|x86.ActiveCfg = Release|Any CPU + {AEDAD92F-C123-4880-A4EB-569074A31DE7}.Release|x86.Build.0 = Release|Any CPU + {AEDAD92F-C123-4880-A4EB-569074A31DE7}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {AEDAD92F-C123-4880-A4EB-569074A31DE7}.Checked|x64.ActiveCfg = Debug|Any CPU + {AEDAD92F-C123-4880-A4EB-569074A31DE7}.Checked|x86.ActiveCfg = Debug|Any CPU + {AEDAD92F-C123-4880-A4EB-569074A31DE7}.RelWithDebInfo|Any CPU.ActiveCfg = Debug|Any CPU + {AEDAD92F-C123-4880-A4EB-569074A31DE7}.RelWithDebInfo|x64.ActiveCfg = Debug|Any CPU + {AEDAD92F-C123-4880-A4EB-569074A31DE7}.RelWithDebInfo|x86.ActiveCfg = Debug|Any CPU + {3EE8CB83-EC2F-415D-A681-997AC6FB0B9A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {3EE8CB83-EC2F-415D-A681-997AC6FB0B9A}.Debug|Any CPU.Build.0 = Debug|Any CPU + {3EE8CB83-EC2F-415D-A681-997AC6FB0B9A}.Debug|x64.ActiveCfg = Debug|Any CPU + {3EE8CB83-EC2F-415D-A681-997AC6FB0B9A}.Debug|x64.Build.0 = Debug|Any CPU + {3EE8CB83-EC2F-415D-A681-997AC6FB0B9A}.Debug|x86.ActiveCfg = Debug|Any CPU + {3EE8CB83-EC2F-415D-A681-997AC6FB0B9A}.Debug|x86.Build.0 = Debug|Any CPU + {3EE8CB83-EC2F-415D-A681-997AC6FB0B9A}.Release|Any CPU.ActiveCfg = Release|Any CPU + {3EE8CB83-EC2F-415D-A681-997AC6FB0B9A}.Release|Any CPU.Build.0 = Release|Any CPU + {3EE8CB83-EC2F-415D-A681-997AC6FB0B9A}.Release|x64.ActiveCfg = Release|Any CPU + {3EE8CB83-EC2F-415D-A681-997AC6FB0B9A}.Release|x64.Build.0 = Release|Any CPU + {3EE8CB83-EC2F-415D-A681-997AC6FB0B9A}.Release|x86.ActiveCfg = Release|Any CPU + {3EE8CB83-EC2F-415D-A681-997AC6FB0B9A}.Release|x86.Build.0 = Release|Any CPU + {3EE8CB83-EC2F-415D-A681-997AC6FB0B9A}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {3EE8CB83-EC2F-415D-A681-997AC6FB0B9A}.Checked|x64.ActiveCfg = Debug|Any CPU + {3EE8CB83-EC2F-415D-A681-997AC6FB0B9A}.Checked|x86.ActiveCfg = Debug|Any CPU + {3EE8CB83-EC2F-415D-A681-997AC6FB0B9A}.RelWithDebInfo|Any CPU.ActiveCfg = Debug|Any CPU + {3EE8CB83-EC2F-415D-A681-997AC6FB0B9A}.RelWithDebInfo|x64.ActiveCfg = Debug|Any CPU + {3EE8CB83-EC2F-415D-A681-997AC6FB0B9A}.RelWithDebInfo|x86.ActiveCfg = Debug|Any CPU {614E442A-A8FD-4E14-9C3E-1F312864D9E0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {614E442A-A8FD-4E14-9C3E-1F312864D9E0}.Debug|Any CPU.Build.0 = Debug|Any CPU {614E442A-A8FD-4E14-9C3E-1F312864D9E0}.Debug|x64.ActiveCfg = Debug|Any CPU @@ -1463,29 +1483,6 @@ Global {7E252D99-B616-4234-9A63-26A00208AB27} = {BE481BCB-9C28-4CF3-A92C-2CBC49F49710} {02D40854-2429-4EF7-8405-04C87565853A} = {BE481BCB-9C28-4CF3-A92C-2CBC49F49710} {BE481BCB-9C28-4CF3-A92C-2CBC49F49710} = {C12FE574-60EF-4CF0-A879-68F3D093651C} - {A698EB04-2139-4A63-819B-0BC686478568} = {A652E56D-8614-4338-9098-6B252270A1BB} - {A29C9F3E-1093-48F1-8CF4-21515EDB301A} = {A652E56D-8614-4338-9098-6B252270A1BB} - {A652E56D-8614-4338-9098-6B252270A1BB} = {D09612C8-B493-42BE-9F3F-28B315F9751A} - {6D83F8E9-A84C-42AE-B91E-D342623D7783} = {44F59FE3-F8DB-4E3E-B6F7-E3AB9C05F416} - {C40AB24F-39F3-4BEF-98E4-DAD9804EE7E2} = {44F59FE3-F8DB-4E3E-B6F7-E3AB9C05F416} - {44F59FE3-F8DB-4E3E-B6F7-E3AB9C05F416} = {D09612C8-B493-42BE-9F3F-28B315F9751A} - {193E7716-8469-4A72-A689-27C5E828772C} = {D09612C8-B493-42BE-9F3F-28B315F9751A} - {87E9BB01-B579-4891-BA1C-BB600AC9829A} = {D09612C8-B493-42BE-9F3F-28B315F9751A} - {8F7085F1-DA86-4AA1-9801-2A9A2498E7BB} = {D09612C8-B493-42BE-9F3F-28B315F9751A} - {F682A9D8-9523-406A-9357-E48B463A8303} = {D09612C8-B493-42BE-9F3F-28B315F9751A} - {981A8ECD-2821-44F5-B617-BF0E7E9382C6} = {D09612C8-B493-42BE-9F3F-28B315F9751A} - {3F0A4CCD-6944-40A9-B42C-4D120148E2A9} = {D09612C8-B493-42BE-9F3F-28B315F9751A} - {761CC2CC-85A1-413D-AD6B-CD000420E378} = {D09612C8-B493-42BE-9F3F-28B315F9751A} - {62BB9630-E6F3-4CB7-A781-5C4E963ADCEB} = {D09612C8-B493-42BE-9F3F-28B315F9751A} - {C20C7B5B-9D29-4AB3-AA84-36137CE44DB9} = {D09612C8-B493-42BE-9F3F-28B315F9751A} - {B37F4A90-69E4-449D-AB84-ED2441E38E5F} = {D09612C8-B493-42BE-9F3F-28B315F9751A} - {AD59F28F-06D6-4743-9E0F-9EAB2617601A} = {D09612C8-B493-42BE-9F3F-28B315F9751A} - {794DB744-5F00-4187-8AB6-A99B19ABAAB2} = {D09612C8-B493-42BE-9F3F-28B315F9751A} - {F9E1B91C-3AE6-4894-A91A-EE6824D31E48} = {D09612C8-B493-42BE-9F3F-28B315F9751A} - {D2810F09-0CCD-4779-B21B-322081E84E87} = {D09612C8-B493-42BE-9F3F-28B315F9751A} - {D09612C8-B493-42BE-9F3F-28B315F9751A} = {67BF6867-0EA6-4853-B14B-8A0A9091A255} - {5933AB07-5CBD-4AF3-9BCE-0B765363D27D} = {67BF6867-0EA6-4853-B14B-8A0A9091A255} - {67BF6867-0EA6-4853-B14B-8A0A9091A255} = {C12FE574-60EF-4CF0-A879-68F3D093651C} {EEC90A42-CDCD-4EE3-B47D-C109D604E7E2} = {C12FE574-60EF-4CF0-A879-68F3D093651C} {D52C65C4-2C7D-45E6-9F5C-6F3A96796018} = {C12FE574-60EF-4CF0-A879-68F3D093651C} {0F848647-AF41-464F-BC7E-B363DCC4A54A} = {C12FE574-60EF-4CF0-A879-68F3D093651C} @@ -1496,6 +1493,30 @@ Global {D166FD15-A4F1-47B9-881B-D3965B5DCF7D} = {C9BD4CB1-E9A7-4A35-B8F8-8B7984A8A950} {B580256B-3E8A-4EBB-8ED0-B751622A1BDE} = {C9BD4CB1-E9A7-4A35-B8F8-8B7984A8A950} {C9BD4CB1-E9A7-4A35-B8F8-8B7984A8A950} = {59E97F80-3F6D-4E83-9962-236C98411375} + {848B453F-1020-4814-9EDA-F5E01F21EA95} = {1282F2AC-ACFE-45A7-9899-E79FAA30CB4D} + {11B8DEC6-18F7-4129-A785-D7F4AA779841} = {1282F2AC-ACFE-45A7-9899-E79FAA30CB4D} + {1282F2AC-ACFE-45A7-9899-E79FAA30CB4D} = {C02DE277-7341-4C63-B105-BA695F40277F} + {F5372D50-84CD-4DA1-A74A-FFEDA78920CC} = {B3B7EE0F-7C92-466C-949B-0CE1393D2ECB} + {A01C5649-8C86-45B9-A9A2-117056343F8A} = {B3B7EE0F-7C92-466C-949B-0CE1393D2ECB} + {B3B7EE0F-7C92-466C-949B-0CE1393D2ECB} = {C02DE277-7341-4C63-B105-BA695F40277F} + {963E8F75-D5F8-4BE2-A577-1D61505AC0DB} = {C02DE277-7341-4C63-B105-BA695F40277F} + {B3CBBAD9-A133-4B75-A00D-ECD13008F7CC} = {C02DE277-7341-4C63-B105-BA695F40277F} + {5BFF64E3-34AA-4274-BA6E-0037E735EAB3} = {C02DE277-7341-4C63-B105-BA695F40277F} + {01CEE320-DF1D-48E2-A1D2-15867C4984E6} = {C02DE277-7341-4C63-B105-BA695F40277F} + {79B6C88E-00FC-4990-A4AC-1EB1549F3542} = {C02DE277-7341-4C63-B105-BA695F40277F} + {C69F541A-82B2-4545-A371-72D38218C569} = {C02DE277-7341-4C63-B105-BA695F40277F} + {BCBCA951-17AC-43C3-BC1F-ED8137C08923} = {C02DE277-7341-4C63-B105-BA695F40277F} + {D39F4E7C-558C-4697-8692-9DD92DB97D92} = {C02DE277-7341-4C63-B105-BA695F40277F} + {57A8B0FF-5FD9-4E8E-806F-3F25E30B3E74} = {C02DE277-7341-4C63-B105-BA695F40277F} + {A39F9BC5-892F-4B68-9B2A-C9EF99EEDBF0} = {C02DE277-7341-4C63-B105-BA695F40277F} + {2654C11D-41F2-42C6-8614-2873A794FCB7} = {C02DE277-7341-4C63-B105-BA695F40277F} + {699AAD88-F832-4FAE-993D-C3C62ED46EA5} = {C02DE277-7341-4C63-B105-BA695F40277F} + {A2C8D695-00FF-420C-B354-B1DBCAB58CE2} = {C02DE277-7341-4C63-B105-BA695F40277F} + {8AADF39D-B793-4574-96F4-F13391C46288} = {C02DE277-7341-4C63-B105-BA695F40277F} + {AEDAD92F-C123-4880-A4EB-569074A31DE7} = {C02DE277-7341-4C63-B105-BA695F40277F} + {C02DE277-7341-4C63-B105-BA695F40277F} = {2E5032C3-87A7-43F7-B729-6B1ECDC84B32} + {3EE8CB83-EC2F-415D-A681-997AC6FB0B9A} = {2E5032C3-87A7-43F7-B729-6B1ECDC84B32} + {2E5032C3-87A7-43F7-B729-6B1ECDC84B32} = {59E97F80-3F6D-4E83-9962-236C98411375} {DE21994B-542A-437E-8405-F62A5A3F41D4} = {59E97F80-3F6D-4E83-9962-236C98411375} {CEDB87DB-22B9-4466-B79F-AA2A40BE6AA9} = {59E97F80-3F6D-4E83-9962-236C98411375} {38E7B98A-541C-4D53-B07A-4039E88CDDA0} = {59E97F80-3F6D-4E83-9962-236C98411375} diff --git a/eng/testsos.cmd b/eng/testsos.cmd index 949e583534..640638a32d 100644 --- a/eng/testsos.cmd +++ b/eng/testsos.cmd @@ -1 +1 @@ -%~dp0..\.dotnet\dotnet.exe test --no-build --logger "console;verbosity=detailed" %~dp0..\src\SOS\SOS.UnitTests\SOS.UnitTests.csproj +%~dp0..\.dotnet\dotnet.exe test --no-build --logger "console;verbosity=detailed" %~dp0..\src\tests\SOS.UnitTests\SOS.UnitTests.csproj diff --git a/eng/testsos.sh b/eng/testsos.sh index 273455e2fd..aa911d7a16 100755 --- a/eng/testsos.sh +++ b/eng/testsos.sh @@ -14,4 +14,4 @@ done scriptroot="$( cd -P "$( dirname "$source" )" && pwd )" export LLDB_PATH=/usr/bin/lldb -$scriptroot/../.dotnet/dotnet test --no-build --logger "console;verbosity=detailed" $scriptroot/../src/SOS/SOS.UnitTests/SOS.UnitTests.csproj +$scriptroot/../.dotnet/dotnet test --no-build --logger "console;verbosity=detailed" $scriptroot/../src/tests/SOS.UnitTests/SOS.UnitTests.csproj diff --git a/eng/testsoscdac.cmd b/eng/testsoscdac.cmd index 17f025b0c8..c499ffaecb 100644 --- a/eng/testsoscdac.cmd +++ b/eng/testsoscdac.cmd @@ -1,2 +1,2 @@ set SOS_TEST_CDAC=true -%~dp0..\.dotnet\dotnet.exe test --no-build --logger "console;verbosity=detailed" %~dp0..\src\SOS\SOS.UnitTests\SOS.UnitTests.csproj --filter "Category=CDACCompatible" +%~dp0..\.dotnet\dotnet.exe test --no-build --logger "console;verbosity=detailed" %~dp0..\src\tests\SOS.UnitTests\SOS.UnitTests.csproj --filter "Category=CDACCompatible" diff --git a/eng/testsoscdac.sh b/eng/testsoscdac.sh index 4bad4dd7b4..bafe751021 100644 --- a/eng/testsoscdac.sh +++ b/eng/testsoscdac.sh @@ -15,4 +15,4 @@ done scriptroot="$( cd -P "$( dirname "$source" )" && pwd )" export LLDB_PATH=/usr/bin/lldb export SOS_TEST_CDAC=true -$scriptroot/../.dotnet/dotnet test --no-build --logger "console;verbosity=detailed" $scriptroot/../src/SOS/SOS.UnitTests/SOS.UnitTests.csproj --filter "Category=CDACCompatible" +$scriptroot/../.dotnet/dotnet test --no-build --logger "console;verbosity=detailed" $scriptroot/../src/tests/SOS.UnitTests/SOS.UnitTests.csproj --filter "Category=CDACCompatible" diff --git a/src/dirs.proj b/src/dirs.proj index 79328cb2ae..d023a2fbad 100644 --- a/src/dirs.proj +++ b/src/dirs.proj @@ -6,7 +6,6 @@ - diff --git a/src/SOS/SOS.UnitTests/ConfigFiles/Unix/Debugger.Tests.Config.txt b/src/tests/SOS.UnitTests/ConfigFiles/Unix/Debugger.Tests.Config.txt similarity index 99% rename from src/SOS/SOS.UnitTests/ConfigFiles/Unix/Debugger.Tests.Config.txt rename to src/tests/SOS.UnitTests/ConfigFiles/Unix/Debugger.Tests.Config.txt index c6d11338cb..d3649f1d09 100644 --- a/src/SOS/SOS.UnitTests/ConfigFiles/Unix/Debugger.Tests.Config.txt +++ b/src/tests/SOS.UnitTests/ConfigFiles/Unix/Debugger.Tests.Config.txt @@ -27,7 +27,7 @@ true false - $(RepoRootDir)/src/SOS/SOS.UnitTests/Debuggees + $(RepoRootDir)/src/tests/SOS.UnitTests/Debuggees $(RepoRootDir)/eng/AuxMsbuildFiles sdk.prebuilt $(ArtifactsDir) diff --git a/src/SOS/SOS.UnitTests/ConfigFiles/Windows/Debugger.Tests.Config.txt b/src/tests/SOS.UnitTests/ConfigFiles/Windows/Debugger.Tests.Config.txt similarity index 99% rename from src/SOS/SOS.UnitTests/ConfigFiles/Windows/Debugger.Tests.Config.txt rename to src/tests/SOS.UnitTests/ConfigFiles/Windows/Debugger.Tests.Config.txt index e6e3c468a7..ab01a5ce7d 100644 --- a/src/SOS/SOS.UnitTests/ConfigFiles/Windows/Debugger.Tests.Config.txt +++ b/src/tests/SOS.UnitTests/ConfigFiles/Windows/Debugger.Tests.Config.txt @@ -36,7 +36,7 @@ $(WinDir)\Microsoft.Net\Framework64\v4.0.30319\ $(WinDir)\Microsoft.Net\Framework\v4.0.30319\ - $(RepoRootDir)\src\SOS\SOS.UnitTests\Debuggees + $(RepoRootDir)\src\tests\SOS.UnitTests\Debuggees $(RepoRootDir)\eng\AuxMsbuildFiles sdk.prebuilt $(ArtifactsDir) diff --git a/src/SOS/SOS.UnitTests/Debuggees/Directory.Build.props b/src/tests/SOS.UnitTests/Debuggees/Directory.Build.props similarity index 100% rename from src/SOS/SOS.UnitTests/Debuggees/Directory.Build.props rename to src/tests/SOS.UnitTests/Debuggees/Directory.Build.props diff --git a/src/SOS/SOS.UnitTests/Debuggees/DivZero/DivZero.cs b/src/tests/SOS.UnitTests/Debuggees/DivZero/DivZero.cs similarity index 100% rename from src/SOS/SOS.UnitTests/Debuggees/DivZero/DivZero.cs rename to src/tests/SOS.UnitTests/Debuggees/DivZero/DivZero.cs diff --git a/src/SOS/SOS.UnitTests/Debuggees/DivZero/DivZero.csproj b/src/tests/SOS.UnitTests/Debuggees/DivZero/DivZero.csproj similarity index 100% rename from src/SOS/SOS.UnitTests/Debuggees/DivZero/DivZero.csproj rename to src/tests/SOS.UnitTests/Debuggees/DivZero/DivZero.csproj diff --git a/src/SOS/SOS.UnitTests/Debuggees/DotnetDumpCommands/DotnetDumpCommands.csproj b/src/tests/SOS.UnitTests/Debuggees/DotnetDumpCommands/DotnetDumpCommands.csproj similarity index 100% rename from src/SOS/SOS.UnitTests/Debuggees/DotnetDumpCommands/DotnetDumpCommands.csproj rename to src/tests/SOS.UnitTests/Debuggees/DotnetDumpCommands/DotnetDumpCommands.csproj diff --git a/src/SOS/SOS.UnitTests/Debuggees/DotnetDumpCommands/Program.cs b/src/tests/SOS.UnitTests/Debuggees/DotnetDumpCommands/Program.cs similarity index 100% rename from src/SOS/SOS.UnitTests/Debuggees/DotnetDumpCommands/Program.cs rename to src/tests/SOS.UnitTests/Debuggees/DotnetDumpCommands/Program.cs diff --git a/src/SOS/SOS.UnitTests/Debuggees/DumpGCData/DumpGCData.csproj b/src/tests/SOS.UnitTests/Debuggees/DumpGCData/DumpGCData.csproj similarity index 100% rename from src/SOS/SOS.UnitTests/Debuggees/DumpGCData/DumpGCData.csproj rename to src/tests/SOS.UnitTests/Debuggees/DumpGCData/DumpGCData.csproj diff --git a/src/SOS/SOS.UnitTests/Debuggees/DumpGCData/Program.cs b/src/tests/SOS.UnitTests/Debuggees/DumpGCData/Program.cs similarity index 100% rename from src/SOS/SOS.UnitTests/Debuggees/DumpGCData/Program.cs rename to src/tests/SOS.UnitTests/Debuggees/DumpGCData/Program.cs diff --git a/src/SOS/SOS.UnitTests/Debuggees/DynamicMethod/DynamicMethod.csproj b/src/tests/SOS.UnitTests/Debuggees/DynamicMethod/DynamicMethod.csproj similarity index 100% rename from src/SOS/SOS.UnitTests/Debuggees/DynamicMethod/DynamicMethod.csproj rename to src/tests/SOS.UnitTests/Debuggees/DynamicMethod/DynamicMethod.csproj diff --git a/src/SOS/SOS.UnitTests/Debuggees/DynamicMethod/Program.cs b/src/tests/SOS.UnitTests/Debuggees/DynamicMethod/Program.cs similarity index 100% rename from src/SOS/SOS.UnitTests/Debuggees/DynamicMethod/Program.cs rename to src/tests/SOS.UnitTests/Debuggees/DynamicMethod/Program.cs diff --git a/src/SOS/SOS.UnitTests/Debuggees/FindRootsOlderGeneration/FindRootsOlderGeneration.csproj b/src/tests/SOS.UnitTests/Debuggees/FindRootsOlderGeneration/FindRootsOlderGeneration.csproj similarity index 100% rename from src/SOS/SOS.UnitTests/Debuggees/FindRootsOlderGeneration/FindRootsOlderGeneration.csproj rename to src/tests/SOS.UnitTests/Debuggees/FindRootsOlderGeneration/FindRootsOlderGeneration.csproj diff --git a/src/SOS/SOS.UnitTests/Debuggees/FindRootsOlderGeneration/Program.cs b/src/tests/SOS.UnitTests/Debuggees/FindRootsOlderGeneration/Program.cs similarity index 100% rename from src/SOS/SOS.UnitTests/Debuggees/FindRootsOlderGeneration/Program.cs rename to src/tests/SOS.UnitTests/Debuggees/FindRootsOlderGeneration/Program.cs diff --git a/src/SOS/SOS.UnitTests/Debuggees/GCPOH/GCPOH.cs b/src/tests/SOS.UnitTests/Debuggees/GCPOH/GCPOH.cs similarity index 100% rename from src/SOS/SOS.UnitTests/Debuggees/GCPOH/GCPOH.cs rename to src/tests/SOS.UnitTests/Debuggees/GCPOH/GCPOH.cs diff --git a/src/SOS/SOS.UnitTests/Debuggees/GCPOH/GCPOH.csproj b/src/tests/SOS.UnitTests/Debuggees/GCPOH/GCPOH.csproj similarity index 100% rename from src/SOS/SOS.UnitTests/Debuggees/GCPOH/GCPOH.csproj rename to src/tests/SOS.UnitTests/Debuggees/GCPOH/GCPOH.csproj diff --git a/src/SOS/SOS.UnitTests/Debuggees/GCWhere/GCWhere.cs b/src/tests/SOS.UnitTests/Debuggees/GCWhere/GCWhere.cs similarity index 100% rename from src/SOS/SOS.UnitTests/Debuggees/GCWhere/GCWhere.cs rename to src/tests/SOS.UnitTests/Debuggees/GCWhere/GCWhere.cs diff --git a/src/SOS/SOS.UnitTests/Debuggees/GCWhere/GCWhere.csproj b/src/tests/SOS.UnitTests/Debuggees/GCWhere/GCWhere.csproj similarity index 100% rename from src/SOS/SOS.UnitTests/Debuggees/GCWhere/GCWhere.csproj rename to src/tests/SOS.UnitTests/Debuggees/GCWhere/GCWhere.csproj diff --git a/src/SOS/SOS.UnitTests/Debuggees/LineNums/LineNums.csproj b/src/tests/SOS.UnitTests/Debuggees/LineNums/LineNums.csproj similarity index 100% rename from src/SOS/SOS.UnitTests/Debuggees/LineNums/LineNums.csproj rename to src/tests/SOS.UnitTests/Debuggees/LineNums/LineNums.csproj diff --git a/src/SOS/SOS.UnitTests/Debuggees/LineNums/Program.cs b/src/tests/SOS.UnitTests/Debuggees/LineNums/Program.cs similarity index 100% rename from src/SOS/SOS.UnitTests/Debuggees/LineNums/Program.cs rename to src/tests/SOS.UnitTests/Debuggees/LineNums/Program.cs diff --git a/src/SOS/SOS.UnitTests/Debuggees/MiniDumpLocalVarLookup/MiniDumpLocalVarLookup.csproj b/src/tests/SOS.UnitTests/Debuggees/MiniDumpLocalVarLookup/MiniDumpLocalVarLookup.csproj similarity index 100% rename from src/SOS/SOS.UnitTests/Debuggees/MiniDumpLocalVarLookup/MiniDumpLocalVarLookup.csproj rename to src/tests/SOS.UnitTests/Debuggees/MiniDumpLocalVarLookup/MiniDumpLocalVarLookup.csproj diff --git a/src/SOS/SOS.UnitTests/Debuggees/MiniDumpLocalVarLookup/Program.cs b/src/tests/SOS.UnitTests/Debuggees/MiniDumpLocalVarLookup/Program.cs similarity index 100% rename from src/SOS/SOS.UnitTests/Debuggees/MiniDumpLocalVarLookup/Program.cs rename to src/tests/SOS.UnitTests/Debuggees/MiniDumpLocalVarLookup/Program.cs diff --git a/src/SOS/SOS.UnitTests/Debuggees/NestedExceptionTest/NestedExceptionTest.cs b/src/tests/SOS.UnitTests/Debuggees/NestedExceptionTest/NestedExceptionTest.cs similarity index 100% rename from src/SOS/SOS.UnitTests/Debuggees/NestedExceptionTest/NestedExceptionTest.cs rename to src/tests/SOS.UnitTests/Debuggees/NestedExceptionTest/NestedExceptionTest.cs diff --git a/src/SOS/SOS.UnitTests/Debuggees/NestedExceptionTest/NestedExceptionTest.csproj b/src/tests/SOS.UnitTests/Debuggees/NestedExceptionTest/NestedExceptionTest.csproj similarity index 100% rename from src/SOS/SOS.UnitTests/Debuggees/NestedExceptionTest/NestedExceptionTest.csproj rename to src/tests/SOS.UnitTests/Debuggees/NestedExceptionTest/NestedExceptionTest.csproj diff --git a/src/SOS/SOS.UnitTests/Debuggees/Overflow/Overflow.cs b/src/tests/SOS.UnitTests/Debuggees/Overflow/Overflow.cs similarity index 100% rename from src/SOS/SOS.UnitTests/Debuggees/Overflow/Overflow.cs rename to src/tests/SOS.UnitTests/Debuggees/Overflow/Overflow.cs diff --git a/src/SOS/SOS.UnitTests/Debuggees/Overflow/Overflow.csproj b/src/tests/SOS.UnitTests/Debuggees/Overflow/Overflow.csproj similarity index 100% rename from src/SOS/SOS.UnitTests/Debuggees/Overflow/Overflow.csproj rename to src/tests/SOS.UnitTests/Debuggees/Overflow/Overflow.csproj diff --git a/src/SOS/SOS.UnitTests/Debuggees/ReflectionTest/ReflectionTest.cs b/src/tests/SOS.UnitTests/Debuggees/ReflectionTest/ReflectionTest.cs similarity index 100% rename from src/SOS/SOS.UnitTests/Debuggees/ReflectionTest/ReflectionTest.cs rename to src/tests/SOS.UnitTests/Debuggees/ReflectionTest/ReflectionTest.cs diff --git a/src/SOS/SOS.UnitTests/Debuggees/ReflectionTest/ReflectionTest.csproj b/src/tests/SOS.UnitTests/Debuggees/ReflectionTest/ReflectionTest.csproj similarity index 100% rename from src/SOS/SOS.UnitTests/Debuggees/ReflectionTest/ReflectionTest.csproj rename to src/tests/SOS.UnitTests/Debuggees/ReflectionTest/ReflectionTest.csproj diff --git a/src/SOS/SOS.UnitTests/Debuggees/SimpleThrow/SimpleThrow.cs b/src/tests/SOS.UnitTests/Debuggees/SimpleThrow/SimpleThrow.cs similarity index 100% rename from src/SOS/SOS.UnitTests/Debuggees/SimpleThrow/SimpleThrow.cs rename to src/tests/SOS.UnitTests/Debuggees/SimpleThrow/SimpleThrow.cs diff --git a/src/SOS/SOS.UnitTests/Debuggees/SimpleThrow/SimpleThrow.csproj b/src/tests/SOS.UnitTests/Debuggees/SimpleThrow/SimpleThrow.csproj similarity index 100% rename from src/SOS/SOS.UnitTests/Debuggees/SimpleThrow/SimpleThrow.csproj rename to src/tests/SOS.UnitTests/Debuggees/SimpleThrow/SimpleThrow.csproj diff --git a/src/SOS/SOS.UnitTests/Debuggees/SimpleThrow/UserObject.cs b/src/tests/SOS.UnitTests/Debuggees/SimpleThrow/UserObject.cs similarity index 100% rename from src/SOS/SOS.UnitTests/Debuggees/SimpleThrow/UserObject.cs rename to src/tests/SOS.UnitTests/Debuggees/SimpleThrow/UserObject.cs diff --git a/src/SOS/SOS.UnitTests/Debuggees/SymbolTestApp/SymbolTestApp.sln b/src/tests/SOS.UnitTests/Debuggees/SymbolTestApp/SymbolTestApp.sln similarity index 100% rename from src/SOS/SOS.UnitTests/Debuggees/SymbolTestApp/SymbolTestApp.sln rename to src/tests/SOS.UnitTests/Debuggees/SymbolTestApp/SymbolTestApp.sln diff --git a/src/SOS/SOS.UnitTests/Debuggees/SymbolTestApp/SymbolTestApp/SymbolTestApp.cs b/src/tests/SOS.UnitTests/Debuggees/SymbolTestApp/SymbolTestApp/SymbolTestApp.cs similarity index 100% rename from src/SOS/SOS.UnitTests/Debuggees/SymbolTestApp/SymbolTestApp/SymbolTestApp.cs rename to src/tests/SOS.UnitTests/Debuggees/SymbolTestApp/SymbolTestApp/SymbolTestApp.cs diff --git a/src/SOS/SOS.UnitTests/Debuggees/SymbolTestApp/SymbolTestApp/SymbolTestApp.csproj b/src/tests/SOS.UnitTests/Debuggees/SymbolTestApp/SymbolTestApp/SymbolTestApp.csproj similarity index 100% rename from src/SOS/SOS.UnitTests/Debuggees/SymbolTestApp/SymbolTestApp/SymbolTestApp.csproj rename to src/tests/SOS.UnitTests/Debuggees/SymbolTestApp/SymbolTestApp/SymbolTestApp.csproj diff --git a/src/SOS/SOS.UnitTests/Debuggees/SymbolTestApp/SymbolTestDll/SymbolTestDll.csproj b/src/tests/SOS.UnitTests/Debuggees/SymbolTestApp/SymbolTestDll/SymbolTestDll.csproj similarity index 100% rename from src/SOS/SOS.UnitTests/Debuggees/SymbolTestApp/SymbolTestDll/SymbolTestDll.csproj rename to src/tests/SOS.UnitTests/Debuggees/SymbolTestApp/SymbolTestDll/SymbolTestDll.csproj diff --git a/src/SOS/SOS.UnitTests/Debuggees/SymbolTestApp/SymbolTestDll/TestClass.cs b/src/tests/SOS.UnitTests/Debuggees/SymbolTestApp/SymbolTestDll/TestClass.cs similarity index 100% rename from src/SOS/SOS.UnitTests/Debuggees/SymbolTestApp/SymbolTestDll/TestClass.cs rename to src/tests/SOS.UnitTests/Debuggees/SymbolTestApp/SymbolTestDll/TestClass.cs diff --git a/src/SOS/SOS.UnitTests/Debuggees/TaskNestedException/RandomUserLibrary/RandomUserLibrary.csproj b/src/tests/SOS.UnitTests/Debuggees/TaskNestedException/RandomUserLibrary/RandomUserLibrary.csproj similarity index 100% rename from src/SOS/SOS.UnitTests/Debuggees/TaskNestedException/RandomUserLibrary/RandomUserLibrary.csproj rename to src/tests/SOS.UnitTests/Debuggees/TaskNestedException/RandomUserLibrary/RandomUserLibrary.csproj diff --git a/src/SOS/SOS.UnitTests/Debuggees/TaskNestedException/RandomUserLibrary/RandomUserTask.cs b/src/tests/SOS.UnitTests/Debuggees/TaskNestedException/RandomUserLibrary/RandomUserTask.cs similarity index 100% rename from src/SOS/SOS.UnitTests/Debuggees/TaskNestedException/RandomUserLibrary/RandomUserTask.cs rename to src/tests/SOS.UnitTests/Debuggees/TaskNestedException/RandomUserLibrary/RandomUserTask.cs diff --git a/src/SOS/SOS.UnitTests/Debuggees/TaskNestedException/TaskNestedException.sln b/src/tests/SOS.UnitTests/Debuggees/TaskNestedException/TaskNestedException.sln similarity index 100% rename from src/SOS/SOS.UnitTests/Debuggees/TaskNestedException/TaskNestedException.sln rename to src/tests/SOS.UnitTests/Debuggees/TaskNestedException/TaskNestedException.sln diff --git a/src/SOS/SOS.UnitTests/Debuggees/TaskNestedException/TaskNestedException/TaskNestedException.cs b/src/tests/SOS.UnitTests/Debuggees/TaskNestedException/TaskNestedException/TaskNestedException.cs similarity index 100% rename from src/SOS/SOS.UnitTests/Debuggees/TaskNestedException/TaskNestedException/TaskNestedException.cs rename to src/tests/SOS.UnitTests/Debuggees/TaskNestedException/TaskNestedException/TaskNestedException.cs diff --git a/src/SOS/SOS.UnitTests/Debuggees/TaskNestedException/TaskNestedException/TaskNestedException.csproj b/src/tests/SOS.UnitTests/Debuggees/TaskNestedException/TaskNestedException/TaskNestedException.csproj similarity index 100% rename from src/SOS/SOS.UnitTests/Debuggees/TaskNestedException/TaskNestedException/TaskNestedException.csproj rename to src/tests/SOS.UnitTests/Debuggees/TaskNestedException/TaskNestedException/TaskNestedException.csproj diff --git a/src/SOS/SOS.UnitTests/Debuggees/VarargPInvokeInteropMD/Program.cs b/src/tests/SOS.UnitTests/Debuggees/VarargPInvokeInteropMD/Program.cs similarity index 100% rename from src/SOS/SOS.UnitTests/Debuggees/VarargPInvokeInteropMD/Program.cs rename to src/tests/SOS.UnitTests/Debuggees/VarargPInvokeInteropMD/Program.cs diff --git a/src/SOS/SOS.UnitTests/Debuggees/VarargPInvokeInteropMD/VarargPInvokeInteropMD.csproj b/src/tests/SOS.UnitTests/Debuggees/VarargPInvokeInteropMD/VarargPInvokeInteropMD.csproj similarity index 100% rename from src/SOS/SOS.UnitTests/Debuggees/VarargPInvokeInteropMD/VarargPInvokeInteropMD.csproj rename to src/tests/SOS.UnitTests/Debuggees/VarargPInvokeInteropMD/VarargPInvokeInteropMD.csproj diff --git a/src/SOS/SOS.UnitTests/Debuggees/WebApp3/Program.cs b/src/tests/SOS.UnitTests/Debuggees/WebApp3/Program.cs similarity index 100% rename from src/SOS/SOS.UnitTests/Debuggees/WebApp3/Program.cs rename to src/tests/SOS.UnitTests/Debuggees/WebApp3/Program.cs diff --git a/src/SOS/SOS.UnitTests/Debuggees/WebApp3/Properties/launchSettings.json b/src/tests/SOS.UnitTests/Debuggees/WebApp3/Properties/launchSettings.json similarity index 100% rename from src/SOS/SOS.UnitTests/Debuggees/WebApp3/Properties/launchSettings.json rename to src/tests/SOS.UnitTests/Debuggees/WebApp3/Properties/launchSettings.json diff --git a/src/SOS/SOS.UnitTests/Debuggees/WebApp3/Startup.cs b/src/tests/SOS.UnitTests/Debuggees/WebApp3/Startup.cs similarity index 100% rename from src/SOS/SOS.UnitTests/Debuggees/WebApp3/Startup.cs rename to src/tests/SOS.UnitTests/Debuggees/WebApp3/Startup.cs diff --git a/src/SOS/SOS.UnitTests/Debuggees/WebApp3/WebApp3.csproj b/src/tests/SOS.UnitTests/Debuggees/WebApp3/WebApp3.csproj similarity index 100% rename from src/SOS/SOS.UnitTests/Debuggees/WebApp3/WebApp3.csproj rename to src/tests/SOS.UnitTests/Debuggees/WebApp3/WebApp3.csproj diff --git a/src/SOS/SOS.UnitTests/Debuggees/WebApp3/appsettings.Development.json b/src/tests/SOS.UnitTests/Debuggees/WebApp3/appsettings.Development.json similarity index 100% rename from src/SOS/SOS.UnitTests/Debuggees/WebApp3/appsettings.Development.json rename to src/tests/SOS.UnitTests/Debuggees/WebApp3/appsettings.Development.json diff --git a/src/SOS/SOS.UnitTests/Debuggees/WebApp3/appsettings.json b/src/tests/SOS.UnitTests/Debuggees/WebApp3/appsettings.json similarity index 100% rename from src/SOS/SOS.UnitTests/Debuggees/WebApp3/appsettings.json rename to src/tests/SOS.UnitTests/Debuggees/WebApp3/appsettings.json diff --git a/src/SOS/SOS.UnitTests/DumpGenerationFixture.cs b/src/tests/SOS.UnitTests/DumpGenerationFixture.cs similarity index 100% rename from src/SOS/SOS.UnitTests/DumpGenerationFixture.cs rename to src/tests/SOS.UnitTests/DumpGenerationFixture.cs diff --git a/src/SOS/SOS.UnitTests/SOS.UnitTests.csproj b/src/tests/SOS.UnitTests/SOS.UnitTests.csproj similarity index 91% rename from src/SOS/SOS.UnitTests/SOS.UnitTests.csproj rename to src/tests/SOS.UnitTests/SOS.UnitTests.csproj index cd5b73d5f8..3c07ba413a 100644 --- a/src/SOS/SOS.UnitTests/SOS.UnitTests.csproj +++ b/src/tests/SOS.UnitTests/SOS.UnitTests.csproj @@ -30,8 +30,8 @@ - - + + diff --git a/src/SOS/SOS.UnitTests/SOS.cs b/src/tests/SOS.UnitTests/SOS.cs similarity index 100% rename from src/SOS/SOS.UnitTests/SOS.cs rename to src/tests/SOS.UnitTests/SOS.cs diff --git a/src/SOS/SOS.UnitTests/SOSRunner.cs b/src/tests/SOS.UnitTests/SOSRunner.cs similarity index 100% rename from src/SOS/SOS.UnitTests/SOSRunner.cs rename to src/tests/SOS.UnitTests/SOSRunner.cs diff --git a/src/SOS/SOS.UnitTests/Scripts/ClrStackWithNumberOfFrames.script b/src/tests/SOS.UnitTests/Scripts/ClrStackWithNumberOfFrames.script similarity index 100% rename from src/SOS/SOS.UnitTests/Scripts/ClrStackWithNumberOfFrames.script rename to src/tests/SOS.UnitTests/Scripts/ClrStackWithNumberOfFrames.script diff --git a/src/SOS/SOS.UnitTests/Scripts/ConcurrentDictionaries.script b/src/tests/SOS.UnitTests/Scripts/ConcurrentDictionaries.script similarity index 100% rename from src/SOS/SOS.UnitTests/Scripts/ConcurrentDictionaries.script rename to src/tests/SOS.UnitTests/Scripts/ConcurrentDictionaries.script diff --git a/src/SOS/SOS.UnitTests/Scripts/DivZero.script b/src/tests/SOS.UnitTests/Scripts/DivZero.script similarity index 100% rename from src/SOS/SOS.UnitTests/Scripts/DivZero.script rename to src/tests/SOS.UnitTests/Scripts/DivZero.script diff --git a/src/SOS/SOS.UnitTests/Scripts/DualRuntimes.script b/src/tests/SOS.UnitTests/Scripts/DualRuntimes.script similarity index 100% rename from src/SOS/SOS.UnitTests/Scripts/DualRuntimes.script rename to src/tests/SOS.UnitTests/Scripts/DualRuntimes.script diff --git a/src/SOS/SOS.UnitTests/Scripts/DumpGCData.script b/src/tests/SOS.UnitTests/Scripts/DumpGCData.script similarity index 100% rename from src/SOS/SOS.UnitTests/Scripts/DumpGCData.script rename to src/tests/SOS.UnitTests/Scripts/DumpGCData.script diff --git a/src/SOS/SOS.UnitTests/Scripts/DumpGen.script b/src/tests/SOS.UnitTests/Scripts/DumpGen.script similarity index 100% rename from src/SOS/SOS.UnitTests/Scripts/DumpGen.script rename to src/tests/SOS.UnitTests/Scripts/DumpGen.script diff --git a/src/SOS/SOS.UnitTests/Scripts/DynamicMethod.script b/src/tests/SOS.UnitTests/Scripts/DynamicMethod.script similarity index 100% rename from src/SOS/SOS.UnitTests/Scripts/DynamicMethod.script rename to src/tests/SOS.UnitTests/Scripts/DynamicMethod.script diff --git a/src/SOS/SOS.UnitTests/Scripts/FindRootsOlderGeneration.script b/src/tests/SOS.UnitTests/Scripts/FindRootsOlderGeneration.script similarity index 100% rename from src/SOS/SOS.UnitTests/Scripts/FindRootsOlderGeneration.script rename to src/tests/SOS.UnitTests/Scripts/FindRootsOlderGeneration.script diff --git a/src/SOS/SOS.UnitTests/Scripts/GCPOH.script b/src/tests/SOS.UnitTests/Scripts/GCPOH.script similarity index 100% rename from src/SOS/SOS.UnitTests/Scripts/GCPOH.script rename to src/tests/SOS.UnitTests/Scripts/GCPOH.script diff --git a/src/SOS/SOS.UnitTests/Scripts/GCTests.script b/src/tests/SOS.UnitTests/Scripts/GCTests.script similarity index 100% rename from src/SOS/SOS.UnitTests/Scripts/GCTests.script rename to src/tests/SOS.UnitTests/Scripts/GCTests.script diff --git a/src/SOS/SOS.UnitTests/Scripts/LineNums.script b/src/tests/SOS.UnitTests/Scripts/LineNums.script similarity index 100% rename from src/SOS/SOS.UnitTests/Scripts/LineNums.script rename to src/tests/SOS.UnitTests/Scripts/LineNums.script diff --git a/src/SOS/SOS.UnitTests/Scripts/MiniDumpLocalVarLookup.script b/src/tests/SOS.UnitTests/Scripts/MiniDumpLocalVarLookup.script similarity index 100% rename from src/SOS/SOS.UnitTests/Scripts/MiniDumpLocalVarLookup.script rename to src/tests/SOS.UnitTests/Scripts/MiniDumpLocalVarLookup.script diff --git a/src/SOS/SOS.UnitTests/Scripts/NestedExceptionTest.script b/src/tests/SOS.UnitTests/Scripts/NestedExceptionTest.script similarity index 100% rename from src/SOS/SOS.UnitTests/Scripts/NestedExceptionTest.script rename to src/tests/SOS.UnitTests/Scripts/NestedExceptionTest.script diff --git a/src/SOS/SOS.UnitTests/Scripts/OtherCommands.script b/src/tests/SOS.UnitTests/Scripts/OtherCommands.script similarity index 100% rename from src/SOS/SOS.UnitTests/Scripts/OtherCommands.script rename to src/tests/SOS.UnitTests/Scripts/OtherCommands.script diff --git a/src/SOS/SOS.UnitTests/Scripts/Overflow.script b/src/tests/SOS.UnitTests/Scripts/Overflow.script similarity index 100% rename from src/SOS/SOS.UnitTests/Scripts/Overflow.script rename to src/tests/SOS.UnitTests/Scripts/Overflow.script diff --git a/src/SOS/SOS.UnitTests/Scripts/Reflection.script b/src/tests/SOS.UnitTests/Scripts/Reflection.script similarity index 100% rename from src/SOS/SOS.UnitTests/Scripts/Reflection.script rename to src/tests/SOS.UnitTests/Scripts/Reflection.script diff --git a/src/SOS/SOS.UnitTests/Scripts/SimpleThrow.script b/src/tests/SOS.UnitTests/Scripts/SimpleThrow.script similarity index 100% rename from src/SOS/SOS.UnitTests/Scripts/SimpleThrow.script rename to src/tests/SOS.UnitTests/Scripts/SimpleThrow.script diff --git a/src/SOS/SOS.UnitTests/Scripts/StackAndOtherTests.script b/src/tests/SOS.UnitTests/Scripts/StackAndOtherTests.script similarity index 100% rename from src/SOS/SOS.UnitTests/Scripts/StackAndOtherTests.script rename to src/tests/SOS.UnitTests/Scripts/StackAndOtherTests.script diff --git a/src/SOS/SOS.UnitTests/Scripts/StackTests.script b/src/tests/SOS.UnitTests/Scripts/StackTests.script similarity index 100% rename from src/SOS/SOS.UnitTests/Scripts/StackTests.script rename to src/tests/SOS.UnitTests/Scripts/StackTests.script diff --git a/src/SOS/SOS.UnitTests/Scripts/StackTraceFaultingExceptionFrame.script b/src/tests/SOS.UnitTests/Scripts/StackTraceFaultingExceptionFrame.script similarity index 100% rename from src/SOS/SOS.UnitTests/Scripts/StackTraceFaultingExceptionFrame.script rename to src/tests/SOS.UnitTests/Scripts/StackTraceFaultingExceptionFrame.script diff --git a/src/SOS/SOS.UnitTests/Scripts/StackTraceSoftwareExceptionFrame.script b/src/tests/SOS.UnitTests/Scripts/StackTraceSoftwareExceptionFrame.script similarity index 100% rename from src/SOS/SOS.UnitTests/Scripts/StackTraceSoftwareExceptionFrame.script rename to src/tests/SOS.UnitTests/Scripts/StackTraceSoftwareExceptionFrame.script diff --git a/src/SOS/SOS.UnitTests/Scripts/TaskNestedException.script b/src/tests/SOS.UnitTests/Scripts/TaskNestedException.script similarity index 100% rename from src/SOS/SOS.UnitTests/Scripts/TaskNestedException.script rename to src/tests/SOS.UnitTests/Scripts/TaskNestedException.script diff --git a/src/SOS/SOS.UnitTests/Scripts/TestExtensions.script b/src/tests/SOS.UnitTests/Scripts/TestExtensions.script similarity index 100% rename from src/SOS/SOS.UnitTests/Scripts/TestExtensions.script rename to src/tests/SOS.UnitTests/Scripts/TestExtensions.script diff --git a/src/SOS/SOS.UnitTests/Scripts/VarargPInvokeInteropMD.script b/src/tests/SOS.UnitTests/Scripts/VarargPInvokeInteropMD.script similarity index 100% rename from src/SOS/SOS.UnitTests/Scripts/VarargPInvokeInteropMD.script rename to src/tests/SOS.UnitTests/Scripts/VarargPInvokeInteropMD.script diff --git a/src/SOS/SOS.UnitTests/Scripts/WebApp.script b/src/tests/SOS.UnitTests/Scripts/WebApp.script similarity index 100% rename from src/SOS/SOS.UnitTests/Scripts/WebApp.script rename to src/tests/SOS.UnitTests/Scripts/WebApp.script diff --git a/src/SOS/SOS.UnitTests/Scripts/lldbhelper.py b/src/tests/SOS.UnitTests/Scripts/lldbhelper.py similarity index 100% rename from src/SOS/SOS.UnitTests/Scripts/lldbhelper.py rename to src/tests/SOS.UnitTests/Scripts/lldbhelper.py diff --git a/src/tests/dirs.proj b/src/tests/dirs.proj index 81a6b1efc7..ab6dbead5c 100644 --- a/src/tests/dirs.proj +++ b/src/tests/dirs.proj @@ -1,7 +1,7 @@ - + From 5d3d7c4898de66eaa20ee03e06468611c2c4480b Mon Sep 17 00:00:00 2001 From: Hyungju Lee Date: Tue, 9 Dec 2025 07:52:08 +0900 Subject: [PATCH 40/44] Fix build break with clang-21 on linux-x64 (#5658) linux-x64 build with clang-21 fails with below error. ``` [ 248s] In file included from /home/abuild/rpmbuild/BUILD/coreclr-diagnostics-8.0.547301/src/SOS/Strike/disasm.cpp:57: [ 248s] In file included from /home/abuild/rpmbuild/BUILD/coreclr-diagnostics-8.0.547301/src/shared/gcdump/gcdumpnonx86.cpp:13: [ 248s] In file included from /home/abuild/rpmbuild/BUILD/coreclr-diagnostics-8.0.547301/src/shared/inc/gcinfodecoder.h:170: [ 248s] /home/abuild/rpmbuild/BUILD/coreclr-diagnostics-8.0.547301/src/shared/inc/regdisp.h:261:16: error: first argument in call to 'memset' is a pointer to non-trivially copyable type 'REGDISPLAY' [-Werror,-Wnontrivial-memcall] [ 248s] 261 | memset(this, 0, sizeof(REGDISPLAY)); [ 248s] | ^ [ 248s] /home/abuild/rpmbuild/BUILD/coreclr-diagnostics-8.0.547301/src/shared/inc/regdisp.h:261:16: note: explicitly cast the pointer to silence this warning [ 248s] 261 | memset(this, 0, sizeof(REGDISPLAY)); [ 248s] | ^ [ 248s] | (void*) [ 248s] In file included from /home/abuild/rpmbuild/BUILD/coreclr-diagnostics-8.0.547301/src/SOS/Strike/disasm.cpp:57: [ 248s] In file included from /home/abuild/rpmbuild/BUILD/coreclr-diagnostics-8.0.547301/src/shared/gcdump/gcdumpnonx86.cpp:591: [ 248s] /home/abuild/rpmbuild/BUILD/coreclr-diagnostics-8.0.547301/src/shared/gcdump/../gcinfo/gcinfodumper.cpp:620:16: error: first argument in call to 'memset' is a pointer to non-trivially copyable type 'REGDISPLAY' [-Werror,-Wnontrivial-memcall] [ 248s] 620 | ZeroMemory(®disp, sizeof(regdisp)); [ 248s] | ^ [ 248s] /home/abuild/rpmbuild/BUILD/coreclr-diagnostics-8.0.547301/src/shared/gcdump/../gcinfo/gcinfodumper.cpp:620:16: note: explicitly cast the pointer to silence this warning [ 248s] 2 errors generated. [ 248s] make[2]: *** [src/SOS/Strike/CMakeFiles/sos.dir/build.make:79: src/SOS/Strike/CMakeFiles/sos.dir/disasm.cpp.o] Error 1 [ 248s] make[2]: *** Waiting for unfinished jobs.... [ 248s] [ 99%] Linking CXX shared library libdbgshim.so [ 248s] [ 99%] Built target dbgshim [ 249s] [ 99%] Linking CXX shared library libsosplugin.so [ 249s] [ 99%] Built target sosplugin [ 250s] make[1]: *** [CMakeFiles/Makefile2:742: src/SOS/Strike/CMakeFiles/sos.dir/all] Error 2 [ 250s] make: *** [Makefile:136: all] Error 2 [ 250s] Failed to build. ``` refer to https://github.com/dotnet/diagnostics/commit/6b1e6c531cb5167f9157d68d21724d42d2ad6537 --- src/shared/gcinfo/gcinfodumper.cpp | 2 +- src/shared/inc/regdisp.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/shared/gcinfo/gcinfodumper.cpp b/src/shared/gcinfo/gcinfodumper.cpp index 99ef186d38..cc7205ff14 100644 --- a/src/shared/gcinfo/gcinfodumper.cpp +++ b/src/shared/gcinfo/gcinfodumper.cpp @@ -617,7 +617,7 @@ GcInfoDumper::EnumerateStateChangesResults GcInfoDumper::EnumerateStateChanges ( REGDISPLAY regdisp; - ZeroMemory(®disp, sizeof(regdisp)); + ZeroMemory(static_cast(®disp), sizeof(regdisp)); regdisp.pContext = ®disp.ctxOne; regdisp.IsCallerContextValid = TRUE; diff --git a/src/shared/inc/regdisp.h b/src/shared/inc/regdisp.h index b4431c3519..8c4e0fa5bd 100644 --- a/src/shared/inc/regdisp.h +++ b/src/shared/inc/regdisp.h @@ -258,7 +258,7 @@ struct REGDISPLAY : public REGDISPLAY_BASE { REGDISPLAY() { // Initialize - memset(this, 0, sizeof(REGDISPLAY)); + memset(static_cast(this), 0, sizeof(REGDISPLAY)); } }; From de92ce213146690bad45efbca212005b142ebe03 Mon Sep 17 00:00:00 2001 From: Mitchell Hwang <16830051+mdh1418@users.noreply.github.com> Date: Thu, 11 Dec 2025 12:00:49 -0500 Subject: [PATCH 41/44] [dotnet-trace][CollectLinux] Add capability to probe .NET processes for UserEvents IPC Command Support (#5657) This PR gives `dotnet-trace collect-linux` the option `--probe` to display which .NET processes are capable of parsing an EventPipe UserEvents IPC Command without collecting a trace. The option is compatible with `-p|--process-id` and `-n|--name` to probe a single .NET process. It is also compatible with `-o|--output` to generate a csv file ordered with supported processes first followed by unsupported in the format `pid,processName,supportsCollectLinux` (e.g. `1234,MyApp,true`). This also changes the behavior of `collect-linux` when tracing a single process from a silent failure to erroring with a message indicating that the single .NET process' runtime is not > 10.0.0. Support is determined as .NET Runtime 10.0.0 Release and onward. ### Probe option ```sh --probe Probe .NET processes for support of the EventPipe UserEvents IPC command used by collect-linux, without collecting a trace. Results list supported processes first. Use '-o stdout' to print CSV (pid,processName,supportsCollectLinux) to the console, or '-o ' to write the CSV. Probe a single process with -n|--name or -p|--process-id. ``` ### Example outputs One process that running .NET 10.0.0 and another using a preview. ```sh ./artifacts/bin/dotnet-trace/Debug/net8.0/dotnet-trace collect-linux --probe ========================================================================================== The collect-linux verb is a new preview feature and relies on an updated version of the .nettrace file format. The latest PerfView release supports these trace files but other ways of using the trace file may not work yet. For more details, see the docs at https://learn.microsoft.com/dotnet/core/diagnostics/dotnet-trace. ========================================================================================== Probing .NET processes for support of the EventPipe UserEvents IPC command used by collect-linux. Requires runtime '10.0.0' or later. .NET processes that support the command: 3802935 MyApp .NET processes that do NOT support the command: 3809123 dotnet - Detected runtime: '10.0.0-rc.1.25451.107' ``` Printing csv to console ```sh ./artifacts/bin/dotnet-trace/Debug/net8.0/dotnet-trace collect-linux --probe -o stdout ========================================================================================== The collect-linux verb is a new preview feature and relies on an updated version of the .nettrace file format. The latest PerfView release supports these trace files but other ways of using the trace file may not work yet. For more details, see the docs at https://learn.microsoft.com/dotnet/core/diagnostics/dotnet-trace. ========================================================================================== pid,processName,supportsCollectLinux 3802935,MyApp,true 3809123,dotnet,false ``` Writing results to csv file ```sh ./artifacts/bin/dotnet-trace/Debug/net8.0/dotnet-trace collect-linux --probe -o probe.out ========================================================================================== The collect-linux verb is a new preview feature and relies on an updated version of the .nettrace file format. The latest PerfView release supports these trace files but other ways of using the trace file may not work yet. For more details, see the docs at https://learn.microsoft.com/dotnet/core/diagnostics/dotnet-trace. ========================================================================================== Successfully wrote EventPipe UserEvents IPC command support results to '/home/mihw/repo/diagnostics/probe.out'. ``` Generated csv ```csv pid,processName,supportsCollectLinux 3802935,MyApp,true 3809123,dotnet,false ``` Targeting a single process running .NET runtime 10.0.0 ```sh ./artifacts/bin/dotnet-trace/Debug/net8.0/dotnet-trace collect-linux --probe -n MyApp ========================================================================================== The collect-linux verb is a new preview feature and relies on an updated version of the .nettrace file format. The latest PerfView release supports these trace files but other ways of using the trace file may not work yet. For more details, see the docs at https://learn.microsoft.com/dotnet/core/diagnostics/dotnet-trace. ========================================================================================== .NET process 'MyApp (3802935)' supports the EventPipe UserEvents IPC command used by collect-linux. ``` Targeting a single process older than .NET runtime 10.0.0 release ```sh ./artifacts/bin/dotnet-trace/Debug/net8.0/dotnet-trace collect-linux --probe -p 3809123 ========================================================================================== The collect-linux verb is a new preview feature and relies on an updated version of the .nettrace file format. The latest PerfView release supports these trace files but other ways of using the trace file may not work yet. For more details, see the docs at https://learn.microsoft.com/dotnet/core/diagnostics/dotnet-trace. ========================================================================================== .NET process 'dotnet (3809123)' does NOT support the EventPipe UserEvents IPC command used by collect-linux. Required runtime: '10.0.0'. Detected runtime: '10.0.0-rc.1.25451.107'. ``` --- documentation/design-docs/ipc-protocol.md | 18 +- .../DiagnosticsIpc/ProcessInfo.cs | 4 +- src/Tools/dotnet-counters/CounterMonitor.cs | 2 +- .../Commands/CollectLinuxCommand.cs | 180 +++++++++++++++++- .../CollectLinuxCommandFunctionalTests.cs | 145 +++++++++++++- 5 files changed, 328 insertions(+), 21 deletions(-) diff --git a/documentation/design-docs/ipc-protocol.md b/documentation/design-docs/ipc-protocol.md index 2ee2a3440e..a02c3582e7 100644 --- a/documentation/design-docs/ipc-protocol.md +++ b/documentation/design-docs/ipc-protocol.md @@ -1573,15 +1573,21 @@ In the event an error occurs in the handling of an Ipc Message, the Diagnostic S Errors are `HRESULTS` encoded as `int32_t` when sent back to the client. There are a few Diagnostics IPC specific `HRESULT`s: ```c -#define CORDIAGIPC_E_BAD_ENCODING = 0x80131384 -#define CORDIAGIPC_E_UNKNOWN_COMMAND = 0x80131385 -#define CORDIAGIPC_E_UNKNOWN_MAGIC = 0x80131386 -#define CORDIAGIPC_E_UNKNOWN_ERROR = 0x80131387 +#define DS_IPC_E_BAD_ENCODING ((ds_ipc_result_t)(0x80131384L)) +#define DS_IPC_E_UNKNOWN_COMMAND ((ds_ipc_result_t)(0x80131385L)) +#define DS_IPC_E_UNKNOWN_MAGIC ((ds_ipc_result_t)(0x80131386L)) +#define DS_IPC_E_NOTSUPPORTED ((ds_ipc_result_t)(0x80131515L)) +#define DS_IPC_E_FAIL ((ds_ipc_result_t)(0x80004005L)) +#define DS_IPC_E_NOT_YET_AVAILABLE ((ds_ipc_result_t)(0x8013135bL)) +#define DS_IPC_E_RUNTIME_UNINITIALIZED ((ds_ipc_result_t)(0x80131371L)) +#define DS_IPC_E_INVALIDARG ((ds_ipc_result_t)(0x80070057L)) +#define DS_IPC_E_INSUFFICIENT_BUFFER ((ds_ipc_result_t)(0x8007007A)) +#define DS_IPC_E_ENVVAR_NOT_FOUND ((ds_ipc_result_t)(0x800000CB)) ``` Diagnostic Server errors are sent as a Diagnostic IPC Message with: -* a `command_set` of `0xFF` -* a `command_id` of `0xFF` +* a `command_set` of `0xFF` (Server) +* a `command_id` of `0xFF` (Error) * a Payload consisting of a `int32_t` representing the error encountered (described above) All errors will result in the Server closing the connection. diff --git a/src/Microsoft.Diagnostics.NETCore.Client/DiagnosticsIpc/ProcessInfo.cs b/src/Microsoft.Diagnostics.NETCore.Client/DiagnosticsIpc/ProcessInfo.cs index 4a5c75a61c..f5abe69f9f 100644 --- a/src/Microsoft.Diagnostics.NETCore.Client/DiagnosticsIpc/ProcessInfo.cs +++ b/src/Microsoft.Diagnostics.NETCore.Client/DiagnosticsIpc/ProcessInfo.cs @@ -98,9 +98,10 @@ private static ProcessInfo ParseCommon(byte[] payload, ref int index) return processInfo; } - internal bool TryGetProcessClrVersion(out Version version) + internal bool TryGetProcessClrVersion(out Version version, out bool isPrerelease) { version = null; + isPrerelease = true; if (string.IsNullOrEmpty(ClrProductVersionString)) { return false; @@ -120,6 +121,7 @@ internal bool TryGetProcessClrVersion(out Version version) int prereleaseIndex = noMetadataVersion.IndexOf('-'); if (-1 == prereleaseIndex) { + isPrerelease = false; prereleaseIndex = metadataIndex; } diff --git a/src/Tools/dotnet-counters/CounterMonitor.cs b/src/Tools/dotnet-counters/CounterMonitor.cs index 230bea4940..87cfd4da79 100644 --- a/src/Tools/dotnet-counters/CounterMonitor.cs +++ b/src/Tools/dotnet-counters/CounterMonitor.cs @@ -217,7 +217,7 @@ public async Task Monitor( _settings.UseCounterRateAndValuePayloads = true; bool useSharedSession = false; - if (_diagnosticsClient.GetProcessInfo().TryGetProcessClrVersion(out Version version)) + if (_diagnosticsClient.GetProcessInfo().TryGetProcessClrVersion(out Version version, out bool _)) { useSharedSession = version.Major >= 8 ? true : false; } diff --git a/src/Tools/dotnet-trace/CommandLine/Commands/CollectLinuxCommand.cs b/src/Tools/dotnet-trace/CommandLine/Commands/CollectLinuxCommand.cs index 63bb18dabb..08bce2e961 100644 --- a/src/Tools/dotnet-trace/CommandLine/Commands/CollectLinuxCommand.cs +++ b/src/Tools/dotnet-trace/CommandLine/Commands/CollectLinuxCommand.cs @@ -22,6 +22,7 @@ internal partial class CollectLinuxCommandHandler private Stopwatch stopwatch = new(); private LineRewriter rewriter; private long statusUpdateTimestamp; + private Version minRuntimeSupportingUserEventsIPCCommand = new(10, 0, 0); internal sealed record CollectLinuxArgs( CancellationToken Ct, @@ -33,7 +34,8 @@ internal sealed record CollectLinuxArgs( FileInfo Output, TimeSpan Duration, string Name, - int ProcessId); + int ProcessId, + bool Probe); public CollectLinuxCommandHandler(IConsole console = null) { @@ -82,9 +84,19 @@ internal int CollectLinux(CollectLinuxArgs args) string scriptPath = null; try { + if (args.Probe) + { + ret = SupportsCollectLinux(args); + return ret; + } + if (args.ProcessId != 0 || !string.IsNullOrEmpty(args.Name)) { - CommandUtils.ResolveProcess(args.ProcessId, args.Name, out int resolvedProcessId, out string resolvedProcessName); + if (!ProcessSupportsUserEventsIpcCommand(args.ProcessId, args.Name, out int resolvedProcessId, out string resolvedProcessName, out string detectedRuntimeVersion)) + { + Console.Error.WriteLine($"[ERROR] Process '{resolvedProcessName} ({resolvedProcessId})' cannot be traced by collect-linux. Required runtime: {minRuntimeSupportingUserEventsIPCCommand}. Detected runtime: {detectedRuntimeVersion}"); + return (int)ReturnCode.TracingError; + } args = args with { Name = resolvedProcessName, ProcessId = resolvedProcessId }; } @@ -146,14 +158,15 @@ public static Command CollectLinuxCommand() CommonOptions.CLREventLevelOption, CommonOptions.CLREventsOption, PerfEventsOption, + ProbeOption, CommonOptions.ProfileOption, CommonOptions.OutputPathOption, CommonOptions.DurationOption, CommonOptions.NameOption, - CommonOptions.ProcessIdOption + CommonOptions.ProcessIdOption, }; collectLinuxCommand.TreatUnmatchedTokensAsErrors = true; // collect-linux currently does not support child process tracing. - collectLinuxCommand.Description = "Collects diagnostic traces using perf_events, a Linux OS technology. collect-linux requires admin privileges to capture kernel- and user-mode events, and by default, captures events from all processes. This Linux-only command includes the same .NET events as dotnet-trace collect, and it uses the kernel’s user_events mechanism to emit .NET events as perf events, enabling unification of user-space .NET events with kernel-space system events."; + collectLinuxCommand.Description = "Collects diagnostic traces using perf_events, a Linux OS technology. collect-linux requires admin privileges to capture kernel- and user-mode events, and by default, captures events from all processes. This Linux-only command includes the same .NET events as dotnet-trace collect, and it uses the kernel’s user_events mechanism to emit .NET events as perf events, enabling unification of user-space .NET events with kernel-space system events. Use --probe (optionally with -p|--process-id or -n|--name) to only check which processes can be traced by collect-linux without collecting a trace."; collectLinuxCommand.SetAction((parseResult, ct) => { string providersValue = parseResult.GetValue(CommonOptions.ProvidersOption) ?? string.Empty; @@ -171,13 +184,157 @@ public static Command CollectLinuxCommand() Output: parseResult.GetValue(CommonOptions.OutputPathOption) ?? new FileInfo(CommonOptions.DefaultTraceName), Duration: parseResult.GetValue(CommonOptions.DurationOption), Name: parseResult.GetValue(CommonOptions.NameOption) ?? string.Empty, - ProcessId: parseResult.GetValue(CommonOptions.ProcessIdOption))); + ProcessId: parseResult.GetValue(CommonOptions.ProcessIdOption), + Probe: parseResult.GetValue(ProbeOption))); return Task.FromResult(rc); }); return collectLinuxCommand; } + internal int SupportsCollectLinux(CollectLinuxArgs args) + { + int ret; + try + { + ProbeOutputMode mode = DetermineProbeOutputMode(args.Output.Name); + bool generateCsv = mode == ProbeOutputMode.CsvToConsole || mode == ProbeOutputMode.Csv; + StringBuilder supportedCsv = generateCsv ? new StringBuilder() : null; + StringBuilder unsupportedCsv = generateCsv ? new StringBuilder() : null; + + if (args.ProcessId != 0 || !string.IsNullOrEmpty(args.Name)) + { + bool supports = ProcessSupportsUserEventsIpcCommand(args.ProcessId, args.Name, out int resolvedPid, out string resolvedName, out string detectedRuntimeVersion); + BuildProcessSupportCsv(resolvedPid, resolvedName, supports, supportedCsv, unsupportedCsv); + + if (mode == ProbeOutputMode.Console) + { + Console.WriteLine($".NET process '{resolvedName} ({resolvedPid})' {(supports ? "supports" : "does NOT support")} the EventPipe UserEvents IPC command used by collect-linux."); + if (!supports) + { + Console.WriteLine($"Required runtime: '{minRuntimeSupportingUserEventsIPCCommand}'. Detected runtime: '{detectedRuntimeVersion}'."); + } + } + } + else + { + if (mode == ProbeOutputMode.Console) + { + Console.WriteLine($"Probing .NET processes for support of the EventPipe UserEvents IPC command used by collect-linux. Requires runtime '{minRuntimeSupportingUserEventsIPCCommand}' or later."); + } + StringBuilder supportedProcesses = new(); + StringBuilder unsupportedProcesses = new(); + + IEnumerable pids = DiagnosticsClient.GetPublishedProcesses(); + foreach (int pid in pids) + { + if (pid == Environment.ProcessId) + { + continue; + } + + bool supports = ProcessSupportsUserEventsIpcCommand(pid, string.Empty, out int resolvedPid, out string resolvedName, out string detectedRuntimeVersion); + BuildProcessSupportCsv(resolvedPid, resolvedName, supports, supportedCsv, unsupportedCsv); + if (supports) + { + supportedProcesses.AppendLine($"{resolvedPid} {resolvedName}"); + } + else + { + unsupportedProcesses.AppendLine($"{resolvedPid} {resolvedName} - Detected runtime: '{detectedRuntimeVersion}'"); + } + } + + if (mode == ProbeOutputMode.Console) + { + Console.WriteLine($".NET processes that support the command:"); + Console.WriteLine(supportedProcesses.ToString()); + Console.WriteLine($".NET processes that do NOT support the command:"); + Console.WriteLine(unsupportedProcesses.ToString()); + } + } + + if (mode == ProbeOutputMode.CsvToConsole) + { + Console.WriteLine("pid,processName,supportsCollectLinux"); + Console.Write(supportedCsv?.ToString()); + Console.Write(unsupportedCsv?.ToString()); + } + + if (mode == ProbeOutputMode.Csv) + { + using StreamWriter writer = new(args.Output.FullName, append: false, Encoding.UTF8); + writer.WriteLine("pid,processName,supportsCollectLinux"); + writer.Write(supportedCsv?.ToString()); + writer.Write(unsupportedCsv?.ToString()); + Console.WriteLine($"Successfully wrote EventPipe UserEvents IPC command support results to '{args.Output.FullName}'."); + } + + ret = (int)ReturnCode.Ok; + } + catch (DiagnosticToolException dte) + { + Console.WriteLine($"[ERROR] {dte.Message}"); + ret = (int)ReturnCode.ArgumentError; + } + catch (Exception ex) + { + Console.Error.WriteLine(ex); + ret = (int)ReturnCode.UnknownError; + } + + return ret; + } + + private static ProbeOutputMode DetermineProbeOutputMode(string outputName) + { + if (string.Equals(outputName, CommonOptions.DefaultTraceName, StringComparison.OrdinalIgnoreCase)) + { + return ProbeOutputMode.Console; + } + if (string.Equals(outputName, "stdout", StringComparison.OrdinalIgnoreCase)) + { + return ProbeOutputMode.CsvToConsole; + } + return ProbeOutputMode.Csv; + } + + private bool ProcessSupportsUserEventsIpcCommand(int pid, string processName, out int resolvedPid, out string resolvedName, out string detectedRuntimeVersion) + { + CommandUtils.ResolveProcess(pid, processName, out resolvedPid, out resolvedName); + + bool supports = false; + DiagnosticsClient client = new(resolvedPid); + ProcessInfo processInfo = client.GetProcessInfo(); + detectedRuntimeVersion = processInfo.ClrProductVersionString; + if (processInfo.TryGetProcessClrVersion(out Version version, out bool isPrerelease) && + (version > minRuntimeSupportingUserEventsIPCCommand || + (version == minRuntimeSupportingUserEventsIPCCommand && !isPrerelease))) + { + supports = true; + } + + return supports; + } + + private static void BuildProcessSupportCsv(int resolvedPid, string resolvedName, bool supports, StringBuilder supportedCsv, StringBuilder unsupportedCsv) + { + if (supportedCsv == null && unsupportedCsv == null) + { + return; + } + + string escapedName = (resolvedName ?? string.Empty).Replace(",", string.Empty); + if (supports) + { + supportedCsv?.AppendLine($"{resolvedPid},{escapedName},true"); + } + else + { + unsupportedCsv?.AppendLine($"{resolvedPid},{escapedName},false"); + } + } + private byte[] BuildRecordTraceArgs(CollectLinuxArgs args, out string scriptPath) { scriptPath = null; @@ -354,6 +511,19 @@ private int OutputHandler(uint type, IntPtr data, UIntPtr dataLen) Description = @"Comma-separated list of perf events (e.g. syscalls:sys_enter_execve,sched:sched_switch)." }; + private static readonly Option ProbeOption = + new("--probe") + { + Description = "Probe .NET processes for support of the EventPipe UserEvents IPC command used by collect-linux, without collecting a trace. Results list supported processes first. Use '-o stdout' to print CSV (pid,processName,supportsCollectLinux) to the console, or '-o ' to write the CSV. Probe a single process with -n|--name or -p|--process-id.", + }; + + private enum ProbeOutputMode + { + Console, + Csv, + CsvToConsole, + } + private enum OutputType : uint { Normal = 0, diff --git a/src/tests/dotnet-trace/CollectLinuxCommandFunctionalTests.cs b/src/tests/dotnet-trace/CollectLinuxCommandFunctionalTests.cs index ac5a271119..71477b55c5 100644 --- a/src/tests/dotnet-trace/CollectLinuxCommandFunctionalTests.cs +++ b/src/tests/dotnet-trace/CollectLinuxCommandFunctionalTests.cs @@ -7,6 +7,7 @@ using System.IO; using System.Linq; using System.Text; +using System.Text.RegularExpressions; using System.Threading; using System.Threading.Tasks; using Microsoft.Diagnostics.Tests.Common; @@ -31,7 +32,8 @@ private static CollectLinuxCommandHandler.CollectLinuxArgs TestArgs( FileInfo output = null, TimeSpan duration = default, string name = "", - int processId = 0) + int processId = 0, + bool probe = false) { return new CollectLinuxCommandHandler.CollectLinuxArgs(ct, providers ?? Array.Empty(), @@ -42,7 +44,8 @@ private static CollectLinuxCommandHandler.CollectLinuxArgs TestArgs( output ?? new FileInfo("trace.nettrace"), duration, name, - processId); + processId, + probe); } [ConditionalTheory(nameof(IsCollectLinuxSupported))] @@ -99,6 +102,106 @@ public void CollectLinuxCommand_ResolveProcessExceptions(object testArgs, string console.AssertSanitizedLinesEqual(null, expectedError); } + [ConditionalFact(nameof(IsCollectLinuxSupported))] + public void CollectLinuxCommand_Probe_ListsProcesses_WhenNoArgs() + { + MockConsole console = new(200, 2000); + var args = TestArgs(probe: true, output: new FileInfo(CommonOptions.DefaultTraceName)); + int exitCode = Run(args, console); + + Assert.Equal((int)ReturnCode.Ok, exitCode); + string[] expected = ExpectPreviewWithMessages( + new[] { + "Probing .NET processes for support of the EventPipe UserEvents IPC command used by collect-linux. Requires runtime '10.0.0' or later.", + ".NET processes that support the command:", + "", + ".NET processes that do NOT support the command:", + "", + } + ); + console.AssertSanitizedLinesEqual(CollectLinuxProbeSanitizer, expected); + } + + [ConditionalFact(nameof(IsCollectLinuxSupported))] + public void CollectLinuxCommand_Probe_CsvToConsole() + { + MockConsole console = new(200, 2000); + var args = TestArgs(probe: true, output: new FileInfo("stdout")); + int exitCode = Run(args, console); + + Assert.Equal((int)ReturnCode.Ok, exitCode); + string[] expected = ExpectPreviewWithMessages( + new[] { + "pid,processName,supportsCollectLinux", + "" + } + ); + console.AssertSanitizedLinesEqual(CollectLinuxProbeSanitizer, expected); + } + + [ConditionalFact(nameof(IsCollectLinuxSupported))] + public void CollectLinuxCommand_Probe_Csv() + { + MockConsole console = new(200, 2000); + string tempFilePath = Path.GetTempFileName(); + var args = TestArgs(probe: true, output: new FileInfo(tempFilePath)); + int exitCode = Run(args, console); + + Assert.Equal((int)ReturnCode.Ok, exitCode); + string[] expected = ExpectPreviewWithMessages( + new[] { + "Successfully wrote EventPipe UserEvents IPC command support results to '" + tempFilePath + "'.", + } + ); + + File.Delete(tempFilePath); + console.AssertSanitizedLinesEqual(null, expected); + } + + [ConditionalFact(nameof(IsCollectLinuxSupported))] + public void CollectLinuxCommand_Probe_ReportsResolveProcessErrors_InvalidPid() + { + MockConsole console = new(200, 30); + var args = TestArgs(processId: -1, probe: true); + int exitCode = Run(args, console); + + Assert.Equal((int)ReturnCode.ArgumentError, exitCode); + + string[] expected = FormatException("-1 is not a valid process ID"); + + console.AssertSanitizedLinesEqual(null, expected); + } + + [ConditionalFact(nameof(IsCollectLinuxSupported))] + public void CollectLinuxCommand_Probe_ReportsResolveProcessErrors_InvalidName() + { + MockConsole console = new(200, 30); + var args = TestArgs(name: "process-that-should-not-exist", processId: 0, probe: true); + int exitCode = Run(args, console); + + Assert.Equal((int)ReturnCode.ArgumentError, exitCode); + + string[] expected = FormatException("There is no active process with the given name: process-that-should-not-exist"); + + console.AssertSanitizedLinesEqual(null, expected); + } + + [ConditionalFact(nameof(IsCollectLinuxSupported))] + public void CollectLinuxCommand_Probe_ReportsResolveProcessErrors_BothPidAndName() + { + MockConsole console = new(200, 30); + var args = TestArgs(name: "dummy", processId: 1, probe: true); + int exitCode = Run(args, console); + + Assert.Equal((int)ReturnCode.ArgumentError, exitCode); + + // When both PID and name are supplied, the banner still refers to the PID + // because the implementation prioritizes ProcessId when it is non-zero. + string[] expected = FormatException("Only one of the --name or --process-id options may be specified."); + + console.AssertSanitizedLinesEqual(null, expected); + } + [ConditionalFact(nameof(IsCollectLinuxNotSupported))] public void CollectLinuxCommand_NotSupported_OnNonLinux() { @@ -138,11 +241,26 @@ private static string[] CollectLinuxSanitizer(string[] lines) return result.ToArray(); } + private static string[] CollectLinuxProbeSanitizer(string[] lines) + { + List result = new(); + foreach (string line in lines) + { + // Filter out possible pid lines + if (Regex.IsMatch(line, @"^\d")) + { + continue; + } + result.Add(line); + } + return result.ToArray(); + } + public static IEnumerable BasicCases() { yield return new object[] { TestArgs(), - ExpectProvidersAndLinuxWithMessages( + ExpectProvidersAndPerfEventsWithMessages( new[]{"No providers, profiles, ClrEvents, or PerfEvents were specified, defaulting to trace profiles 'dotnet-common' + 'cpu-sampling'."}, new[]{FormatProvider("Microsoft-Windows-DotNETRuntime","000000100003801D","Informational",4,"--profile")}, new[]{LinuxProfile("cpu-sampling")}) @@ -167,7 +285,7 @@ public static IEnumerable BasicCases() yield return new object[] { TestArgs(profile: new[]{"cpu-sampling"}), - ExpectProvidersAndLinuxWithMessages( + ExpectProvidersAndPerfEventsWithMessages( new[]{"No .NET providers were configured."}, Array.Empty(), new[]{LinuxProfile("cpu-sampling")}) @@ -196,7 +314,7 @@ public static IEnumerable BasicCases() yield return new object[] { TestArgs(providers: new[]{"Microsoft-Windows-DotNETRuntime:0x1:4"}, clrEvents: "gc"), - ExpectProvidersAndLinuxWithMessages( + ExpectProvidersAndPerfEventsWithMessages( new[]{"Warning: The CLR provider was already specified through --providers or --profile. Ignoring --clrevents."}, new[]{FormatProvider("Microsoft-Windows-DotNETRuntime","0000000000000001","Informational",4,"--providers")}, Array.Empty()) @@ -218,7 +336,7 @@ public static IEnumerable BasicCases() yield return new object[] { TestArgs(perfEvents: new[]{"sched:sched_switch"}), - ExpectProvidersAndLinuxWithMessages( + ExpectProvidersAndPerfEventsWithMessages( new[]{"No .NET providers were configured."}, Array.Empty(), new[]{LinuxPerfEvent("sched:sched_switch")}) @@ -313,10 +431,21 @@ private static string[] FormatException(string message) "==========================================================================================" ]; + private static string[] ExpectPreviewWithMessages(string[] messages) + { + List result = new(); + result.AddRange(PreviewMessages); + if (messages.Length > 0) + { + result.AddRange(messages); + } + return result.ToArray(); + } + private static string[] ExpectProvidersAndLinux(string[] dotnetProviders, string[] linuxPerfEvents) - => ExpectProvidersAndLinuxWithMessages(Array.Empty(), dotnetProviders, linuxPerfEvents); + => ExpectProvidersAndPerfEventsWithMessages(Array.Empty(), dotnetProviders, linuxPerfEvents); - private static string[] ExpectProvidersAndLinuxWithMessages(string[] messages, string[] dotnetProviders, string[] linuxPerfEvents) + private static string[] ExpectProvidersAndPerfEventsWithMessages(string[] messages, string[] dotnetProviders, string[] linuxPerfEvents) { List result = new(); From 9ced7d3751da3cffa934df9071521927e23c9783 Mon Sep 17 00:00:00 2001 From: Juan Hoyos <19413848+hoyosjs@users.noreply.github.com> Date: Fri, 12 Dec 2025 07:57:40 -0800 Subject: [PATCH 42/44] Add linux-musl-arm and remove osx-x64 from aka.ms link publishing (#5637) --- eng/release/tool-list.json | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/eng/release/tool-list.json b/eng/release/tool-list.json index fca42a3fa3..8fd4726997 100644 --- a/eng/release/tool-list.json +++ b/eng/release/tool-list.json @@ -4,35 +4,35 @@ "AssetList": [ { "name": "dotnet-counters", - "rids": ["win-x64", "win-x86", "win-arm64", "linux-x64", "linux-musl-arm64", "osx-x64", "linux-arm64", "linux-musl-x64", "linux-arm"] + "rids": ["win-x64", "win-x86", "win-arm64", "linux-x64", "linux-arm64", "linux-arm", "linux-musl-x64", "linux-musl-arm64", "linux-musl-arm"] }, { "name": "dotnet-dump", - "rids": ["win-x64", "win-x86", "win-arm64", "linux-x64", "linux-musl-arm64", "osx-x64", "linux-arm64", "linux-musl-x64", "linux-arm"] + "rids": ["win-x64", "win-x86", "win-arm64", "linux-x64", "linux-arm64", "linux-arm", "linux-musl-x64", "linux-musl-arm64", "linux-musl-arm"] }, { "name": "dotnet-gcdump", - "rids": ["win-x64", "win-x86", "win-arm64", "linux-x64", "linux-musl-arm64", "osx-x64", "linux-arm64", "linux-musl-x64", "linux-arm"] + "rids": ["win-x64", "win-x86", "win-arm64", "linux-x64", "linux-arm64", "linux-arm", "linux-musl-x64", "linux-musl-arm64", "linux-musl-arm"] }, { "name": "dotnet-sos", - "rids": ["win-x64", "win-x86", "win-arm64", "linux-x64", "linux-musl-arm64", "osx-x64", "linux-arm64", "linux-musl-x64", "linux-arm"] + "rids": ["win-x64", "win-x86", "win-arm64", "linux-x64", "linux-arm64", "linux-arm", "linux-musl-x64", "linux-musl-arm64", "linux-musl-arm"] }, { "name": "dotnet-trace", - "rids": ["win-x64", "win-x86", "win-arm64", "linux-x64", "linux-musl-arm64", "osx-x64", "linux-arm64", "linux-musl-x64", "linux-arm"] + "rids": ["win-x64", "win-x86", "win-arm64", "linux-x64", "linux-arm64", "linux-arm", "linux-musl-x64", "linux-musl-arm64", "linux-musl-arm"] }, { "name": "dotnet-stack", - "rids": ["win-x64", "win-x86", "win-arm64", "linux-x64", "linux-musl-arm64", "osx-x64", "linux-arm64", "linux-musl-x64", "linux-arm"] + "rids": ["win-x64", "win-x86", "win-arm64", "linux-x64", "linux-arm64", "linux-arm", "linux-musl-x64", "linux-musl-arm64", "linux-musl-arm"] }, { "name": "dotnet-dsrouter", - "rids": ["win-x64", "win-x86", "win-arm64", "linux-x64", "linux-musl-arm64", "osx-x64", "linux-arm64", "linux-musl-x64", "linux-arm"] + "rids": ["win-x64", "win-x86", "win-arm64", "linux-x64", "linux-arm64", "linux-arm", "linux-musl-x64", "linux-musl-arm64", "linux-musl-arm"] }, { "name": "dotnet-symbol", - "rids": ["win-x64", "win-x86", "win-arm64", "linux-x64", "linux-musl-arm64", "osx-x64", "linux-arm64", "linux-musl-x64", "linux-arm"] + "rids": ["win-x64", "win-x86", "win-arm64", "linux-x64", "linux-arm64", "linux-arm", "linux-musl-x64", "linux-musl-arm64", "linux-musl-arm"] } ] }, From 5c38ac0b506892e49f4dbcc5e7fc2406189942ee Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" <42748379+dotnet-maestro[bot]@users.noreply.github.com> Date: Mon, 15 Dec 2025 16:23:16 -0300 Subject: [PATCH 43/44] [main] Update dependencies from microsoft/clrmd (#5660) This pull request updates the following dependencies [marker]: <> (Begin:cb58fe07-ae24-4e73-0e84-08d8e40a189f) ## From https://github.com/microsoft/clrmd - **Subscription**: [cb58fe07-ae24-4e73-0e84-08d8e40a189f](https://maestro.dot.net/subscriptions?search=cb58fe07-ae24-4e73-0e84-08d8e40a189f) - **Build**: [20251210.1](https://dev.azure.com/dnceng/internal/_build/results?buildId=2858360) ([294188](https://maestro.dot.net/channel/548/github:microsoft:clrmd/build/294188)) - **Date Produced**: December 10, 2025 7:16:34 PM UTC - **Commit**: [41c1e91786141d37b26cfdfb8059fc522e81fb8d](https://github.com/microsoft/clrmd/commit/41c1e91786141d37b26cfdfb8059fc522e81fb8d) - **Branch**: [main](https://github.com/microsoft/clrmd/tree/main) [DependencyUpdate]: <> (Begin) - **Dependency Updates**: - From [4.0.0-beta.25381.2 to 4.0.0-beta.25610.1][1] - Microsoft.Diagnostics.Runtime - Microsoft.Diagnostics.Runtime.Utilities [1]: https://github.com/microsoft/clrmd/compare/f11663fc2e...41c1e91786 [DependencyUpdate]: <> (End) [marker]: <> (End:cb58fe07-ae24-4e73-0e84-08d8e40a189f) --------- Co-authored-by: dotnet-maestro[bot] Co-authored-by: Copilot <198982749+Copilot@users.noreply.github.com> Co-authored-by: hoyosjs <19413848+hoyosjs@users.noreply.github.com> --- eng/Version.Details.props | 4 ++-- eng/Version.Details.xml | 8 ++++---- eng/Versions.props | 2 +- src/SOS/extensions/hostcoreclr.cpp | 16 +++------------- 4 files changed, 10 insertions(+), 20 deletions(-) diff --git a/eng/Version.Details.props b/eng/Version.Details.props index dffd39389a..e98bd685db 100644 --- a/eng/Version.Details.props +++ b/eng/Version.Details.props @@ -6,8 +6,8 @@ This file should be imported by eng/Versions.props - 4.0.0-beta.25381.2 - 4.0.0-beta.25381.2 + 4.0.0-beta.25610.1 + 4.0.0-beta.25610.1 2.0.0-beta5.25210.1 diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index 4d073c2f0c..5a7068e214 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -1,13 +1,13 @@ - + https://github.com/microsoft/clrmd - f11663fc2e71ddd0869deb528047f0f476a0e346 + 41c1e91786141d37b26cfdfb8059fc522e81fb8d - + https://github.com/microsoft/clrmd - f11663fc2e71ddd0869deb528047f0f476a0e346 + 41c1e91786141d37b26cfdfb8059fc522e81fb8d https://github.com/dotnet/command-line-api diff --git a/eng/Versions.props b/eng/Versions.props index 82fe464071..e40a722c1e 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -25,7 +25,7 @@ 8.0.0 - 8.0.0 + 9.0.11 9.0.8 17.10.0-beta1.24272.1 diff --git a/src/SOS/extensions/hostcoreclr.cpp b/src/SOS/extensions/hostcoreclr.cpp index e9e48eb6c7..36ae77c82f 100644 --- a/src/SOS/extensions/hostcoreclr.cpp +++ b/src/SOS/extensions/hostcoreclr.cpp @@ -71,8 +71,8 @@ namespace RuntimeHostingConstants constexpr RuntimeVersion SupportedHostRuntimeVersions[] = { {9, 0}, {8, 0}, - {6, 0}, {10, 0}, + {11, 0}, }; constexpr char DotnetRootEnvVar[] = "DOTNET_ROOT"; @@ -327,20 +327,10 @@ static std::string GetTpaListForRuntimeVersion( // assembly version than the ones in the ones in the framework. The test could just // have a list of assemblies we pack with the versions, and if we end up using a newer assembly // fail the test and point to update this list. - // - // There's currently no DLLs SOS requires that are of a higher version than those provided by - // the supported host frameworks. In case it's needed, add: a section here before AddFilesFromDirectoryToTpaList. - // - // if (hostRuntimeVersion.Major < 5) - // { - // AddFileToTpaList(directory, "System.Collections.Immutable.dll", tpaList); - // ... - // } - - if (hostRuntimeVersion.Major > 0 && hostRuntimeVersion.Major < 8) + + if (hostRuntimeVersion.Major > 0 && hostRuntimeVersion.Major < 9) { AddFileToTpaList(directory, "System.Collections.Immutable.dll", tpaList); - AddFileToTpaList(directory, "System.Reflection.Metadata.dll", tpaList); } // Trust the runtime assemblies that are newer than the ones needed and provided by SOS's managed From 9dc3ab30c42b72b928b81f0621db62f41a5df5b6 Mon Sep 17 00:00:00 2001 From: Juan Hoyos <19413848+hoyosjs@users.noreply.github.com> Date: Mon, 15 Dec 2025 13:13:57 -0800 Subject: [PATCH 44/44] Update SDK to 10.0.101 (#5667) --- global.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/global.json b/global.json index f6eb7542fc..9f6c495ef7 100644 --- a/global.json +++ b/global.json @@ -1,11 +1,11 @@ { "sdk": { - "version": "10.0.100-rc.1.25451.107", + "version": "10.0.101", "allowPrerelease": true, "rollForward": "major" }, "tools": { - "dotnet": "10.0.100-rc.1.25451.107", + "dotnet": "10.0.101", "runtimes": { "dotnet": [ "$(MicrosoftNETCoreApp80Version)"