Skip to content

Conversation

@hoyosjs
Copy link
Member

@hoyosjs hoyosjs commented Dec 15, 2025

No description provided.

mdh1418 and others added 30 commits October 14, 2025 10:27
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: <END_COMMAND_OUTPUT>
        00:00.164: 0:000> 
        STDIN: 00:00.164: !runcommand sxd dz
        00:00.164: <END_COMMAND_OUTPUT>
        00:00.164: 0:000> 
        STDIN: 00:00.165: !runcommand sxd iov
        00:00.165: <END_COMMAND_OUTPUT>
        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: <END_COMMAND_OUTPUT>
        00:00.165: 0:000> 
        STDIN: 00:00.165: !runcommand .outmask- 0x244
        00:00.165: Client 06703CF8 mask is 1B3
        00:00.165: <END_COMMAND_OUTPUT>
        00:00.165: 0:000> 
        STDIN: 00:00.165: !runcommand !sym quiet
        00:00.165: quiet mode - symbol prompts off
        00:00.165: <END_COMMAND_OUTPUT>
        00:00.165: 0:000> 
        STDIN: 00:00.165: !runcommand .lines
        00:00.165: Line number information will be loaded
        00:00.166: <END_COMMAND_OUTPUT>
        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: <END_COMMAND_OUTPUT>
        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% => 
        <DEBUGGEE_EXE> => D:\\a\\_work\\1\\s\\artifacts\\bin\\FindRootsOlderGeneration\\Release\\net10.0\\FindRootsOlderGeneration.dll
        <DEBUG_ROOT> => D:\\a\\_work\\1\\s\\artifacts\\bin\\FindRootsOlderGeneration\\Release\\net10.0
        <SOURCE_PATH> => D:\\a\\_work\\1\\s\\src\\SOS\\SOS.UnitTests\\Debuggees\\FindRootsOlderGeneration
        <HEXVAL> => [A-Fa-f0-9]+(`[A-Fa-f0-9]+)?
        <DECVAL> => [,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: <END_COMMAND_OUTPUT>
        00:00.251: 0:000> 
        STDIN: 00:00.251: !runcommand .unload sos
        00:00.251: No extension named 'sos' in chain
        00:00.251: <END_COMMAND_OUTPUT>
        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: <END_COMMAND_OUTPUT>
        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: <END_COMMAND_OUTPUT>
        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: f40e210, 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: <END_COMMAND_OUTPUT>
        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: <END_COMMAND_OUTPUT>
        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: <END_COMMAND_OUTPUT>
        00:00.274: 0:000> 
        STDIN: 00:00.274: !runcommand !FindRoots -gen any
        00:00.519: <END_COMMAND_OUTPUT>
        00:00.519: 0:000> 
        STDIN: 00:00.519: !runcommand sxe CLRN
        00:00.519: <END_COMMAND_OUTPUT>
        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: <END_COMMAND_OUTPUT>
        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: <END_COMMAND_OUTPUT>
        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: <END_COMMAND_OUTPUT>
        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: <END_COMMAND_OUTPUT>
        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: <END_COMMAND_OUTPUT>
    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 <POUT>\w+\s+(<HEXVAL>)\s+(FindRootsOlderGeneration.Thing)(?!\[\])<POUT>
       34 VERIFY:Found 1 unique roots.
       35 
       36 COMMAND:sxn CLRN
        00:00.763: 0:000> <END_COMMAND_ERROR>
        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
}
```
The api.nuget.org source will clash with the CFSClean network isolation
policy and the same data is provided by AzDO now.
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.
* moved the dotnet install from root to `/artifacts/dotnet-test` which can be packaged and sent up to helix
- Use file-based app to generate manifests for SOS packages
- Generate both regular and uncompressed manifest formats
- [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

<!-- START COPILOT CODING AGENT SUFFIX -->



<details>

<summary>Original prompt</summary>

> 
> ----
> 
> *This section details on the original issue you should resolve*
> 
> <issue_title>Create AGENTS.md</issue_title>
> <issue_description>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.</issue_description>
> 
> ## Comments on the Issue (you are @copilot in this section)
> 
> <comments>
> </comments>
> 


</details>

Fixes #5608

<!-- START COPILOT CODING AGENT TIPS -->
---

✨ 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>
Implements dotnet/docs#47894

Following the addition of emitting native runtime and custom EventSource
events as user_events through
dotnet/runtime#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
dotnet/docs#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
<details>
<summary>collect-linux</summary>
<details>
  <summary>collect-linux --help</summary>

```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 '<appname>_<yyyyMMdd>_<HHmmss>.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
```
</details>
<details>
<summary>`collect-linux` without elevated privileges</summary>

```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)
```
</details>
<details>
<summary>`collect-linux` with elevated privileges</summary>

```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 <Enter> or <Ctrl-C> to exit...
Recording stopped.
Resolving symbols.
Finished recording trace.
Trace written to /home/mihw/repo/diagnostics/trace_20251022_152124.nettrace
```
</details>
</details>

On Windows (and I presume other non-Linux OS):
<details>
<summary>`collect-linux`</summary>

```pwsh
.\artifacts\bin\dotnet-trace\Debug\net8.0\dotnet-trace.exe collect-linux
The collect-linux command is only supported on Linux.
```
</details>

### dotnet-trace list-profiles

<details>
<summary>`list-profiles`</summary>

```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
```
</details>

<img width="215" height="172" alt="Screenshot 2025-09-19 142848"
src="https://github.com/user-attachments/assets/9229b2f0-92fa-4c87-89e7-505c55f7ae6a"
/>
<img width="730" height="1049" alt="Screenshot 2025-09-19 142945"
src="https://github.com/user-attachments/assets/4be3f222-0495-4f93-979c-43d68cd5f964"
/>
<img width="1903" height="823" alt="Screenshot 2025-09-19 142858"
src="https://github.com/user-attachments/assets/370648f8-a5b5-436e-a9dc-73bffa0b2ad4"
/>
Updated comments and compile options for signed overflow and strict
aliasing.

See related code for dotnet/runtime -
dotnet/runtime#120775
Fixes librecordtrace.so not being packed into the official build of
dotnet-trace.
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.
…ach (#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.
`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

<!-- START COPILOT CODING AGENT SUFFIX -->



<details>

<summary>Original prompt</summary>

> 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?


</details>



<!-- START COPILOT CODING AGENT TIPS -->
---

✨ 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>
Co-authored-by: Noah Falk <noahfalk@users.noreply.github.com>
With microsoft/one-collect#209, we can now allow
specifying a particular process to be traced.
#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 <juan.s.hoyos@outlook.com>
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.
RecordTrace does not build for musl platforms at this time.
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
#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
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](dotnet/dotnet@50d7970)
- **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]: dotnet/dotnet@e1eaf1b...50d7970

[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] <dotnet-maestro[bot]@users.noreply.github.com>
Co-authored-by: Juan Hoyos <19413848+hoyosjs@users.noreply.github.com>
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.
Now that #5622 enables
redirecting exception messages from CommandUtils, add corresponding
tests to dotnet-trace functional tests.
Disable AzDO dependabot.
dotnet-maestro bot and others added 14 commits December 3, 2025 08:01
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](dotnet/dotnet@7dedd35)
- **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]: dotnet/dotnet@f2d1a92...7dedd35

[DependencyUpdate]: <> (End)


[marker]: <> (End:9c7d85bb-274e-4ad6-970a-48ffc448929b)

Co-authored-by: dotnet-maestro[bot] <dotnet-maestro[bot]@users.noreply.github.com>
* Fixes intermittent failures when using the cDAC
* Prepares SOS to consume NativeAOT packages
This brings us closer to sending the tests to helix
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](dotnet/dotnet@5ddd0dd)
- **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]: dotnet/dotnet@7dedd35...5ddd0dd

[DependencyUpdate]: <> (End)


[marker]: <> (End:9c7d85bb-274e-4ad6-970a-48ffc448929b)

Co-authored-by: dotnet-maestro[bot] <dotnet-maestro[bot]@users.noreply.github.com>
## 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.
* Adds SOS test for minidump local var lookup
* Moves `runcommand` and `DesktopClrHost` from under the SOS package to
`src/tests/`
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(&regdisp, 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
6b1e6c5
…or 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 <file>' 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'.
```
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](microsoft/clrmd@41c1e91)
- **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]: microsoft/clrmd@f11663f...41c1e91

[DependencyUpdate]: <> (End)


[marker]: <> (End:cb58fe07-ae24-4e73-0e84-08d8e40a189f)

---------

Co-authored-by: dotnet-maestro[bot] <dotnet-maestro[bot]@users.noreply.github.com>
Co-authored-by: Copilot <198982749+Copilot@users.noreply.github.com>
Co-authored-by: hoyosjs <19413848+hoyosjs@users.noreply.github.com>
@hoyosjs hoyosjs requested a review from a team as a code owner December 15, 2025 21:18
@hoyosjs hoyosjs enabled auto-merge December 15, 2025 21:18
@hoyosjs hoyosjs merged commit c5a74de into release/stable Dec 15, 2025
19 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.