Uh oh!
There was an error while loading. Please reload this page.
[cDAC] GC stress verification framework + pipeline integration - #128872
Conversation
Tagging subscribers to this area: @steveisok, @tommcdon, @dotnet/dotnet-diag |
There was a problem hiding this comment.
Pull request overview
This PR adds an in-process cDAC GC-stress verification path (CoreCLR-side cdacstress), a managed stress-test harness with multiple debuggee apps, and wires the new stress tests into the runtime-diagnostics pipeline via a Helix stage. It also introduces a new FlushScope concept across the managed cDAC target/contracts APIs and updates the data generator to use a new LayoutSet helper.
Changes:
- Add CoreCLR
cdacstressinfrastructure and hook it into allocation paths, plus add a private DAC request opcode for target-state flush. - Add cDAC GC stress xUnit integration tests, debuggee apps, Helix payload orchestration, and pipeline stage integration.
- Introduce
FlushScopeand thread it throughTarget/ContractRegistry/IContractflush plumbing; refactor generator layout helper fromLayoutPairtoLayoutSet.
Reviewed changes
Copilot reviewed 73 out of 73 changed files in this pull request and generated 9 comments.
Show a summary per file
| File | Description |
|---|---|
| src/native/managed/cdac/tests/TestPlaceholderTarget.cs | Update test target Flush signature. |
| src/native/managed/cdac/tests/StressTests/StressTests.targets | Build/copy orchestration + Helix payload prep. |
| src/native/managed/cdac/tests/StressTests/RunStressTests.ps1 | Local runner updates + new options. |
| src/native/managed/cdac/tests/StressTests/README.md | Stress test docs + usage. |
| src/native/managed/cdac/tests/StressTests/Microsoft.Diagnostics.DataContractReader.StressTests.csproj | New stress test project. |
| src/native/managed/cdac/tests/StressTests/known-issues.md | Known-issues taxonomy + log format. |
| src/native/managed/cdac/tests/StressTests/Debuggees/StructScenarios/StructScenarios.csproj | New debuggee project. |
| src/native/managed/cdac/tests/StressTests/Debuggees/StructScenarios/Program.cs | New struct scenario debuggee. |
| src/native/managed/cdac/tests/StressTests/Debuggees/PInvoke/Program.cs | New P/Invoke debuggee. |
| src/native/managed/cdac/tests/StressTests/Debuggees/PInvoke/PInvoke.csproj | New debuggee project. |
| src/native/managed/cdac/tests/StressTests/Debuggees/MultiThread/Program.cs | New multithread debuggee. |
| src/native/managed/cdac/tests/StressTests/Debuggees/MultiThread/MultiThread.csproj | New debuggee project. |
| src/native/managed/cdac/tests/StressTests/Debuggees/Generics/Program.cs | New generics debuggee. |
| src/native/managed/cdac/tests/StressTests/Debuggees/Generics/Generics.csproj | New debuggee project. |
| src/native/managed/cdac/tests/StressTests/Debuggees/ExceptionHandling/Program.cs | New EH debuggee. |
| src/native/managed/cdac/tests/StressTests/Debuggees/ExceptionHandling/ExceptionHandling.csproj | New debuggee project. |
| src/native/managed/cdac/tests/StressTests/Debuggees/DynamicMethods/Program.cs | New DynamicMethod debuggee. |
| src/native/managed/cdac/tests/StressTests/Debuggees/DynamicMethods/DynamicMethods.csproj | New debuggee project. |
| src/native/managed/cdac/tests/StressTests/Debuggees/DeepStack/Program.cs | New deep stack debuggee. |
| src/native/managed/cdac/tests/StressTests/Debuggees/DeepStack/DeepStack.csproj | New debuggee project. |
| src/native/managed/cdac/tests/StressTests/CdacStressTestBase.cs | Test harness: launch corerun, parse logs. |
| src/native/managed/cdac/tests/StressTests/CdacStressResults.cs | Stress-log parser + analysis formatting. |
| src/native/managed/cdac/tests/StressTests/cdac-stress-helix.proj | Helix work item definition. |
| src/native/managed/cdac/tests/StressTests/BasicCdacStressTests.cs | Debuggee-driven xUnit tests. |
| src/native/managed/cdac/tests/README.md | Link to new stress tests. |
| src/native/managed/cdac/tests/DataGenerator/TestTarget.cs | Update generator test target Flush. |
| src/native/managed/cdac/README.md | Remove old GC-stress section (moved to tests). |
| src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader/ContractDescriptorTarget.cs | Flush now rebuilds descriptors post-flush. |
| src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader/CachingContractRegistry.cs | Scope-aware flush forwarding. |
| src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/SOSDacImpl.IXCLRDataProcess.cs | Scope-aware flush + private stress request. |
| src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/SOSDacImpl.cs | Propagate flush scope in legacy impl. |
| src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/Dbi/DacDbiImpl.cs | Propagate flush scope for DBI flush. |
| src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.DataGenerator/LayoutSetSource.cs | New generated helper: multi-source layout resolution. |
| src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.DataGenerator/LayoutPairSource.cs | Remove old layout helper. |
| src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.DataGenerator/Emitter.cs | Switch generator to LayoutSet. |
| src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.DataGenerator/CdacGenerator.cs | Emit LayoutSet helper conditionally. |
| src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/StackWalk/GC/GcScanner.cs | Scratch-slot filtering + deferred frame recording. |
| src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/StackWalk/GC/GcScanFlags.cs | Add deferred-frame sentinel flag. |
| src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/StackWalk/GC/GcScanContext.cs | Emit deferred-frame sentinel entries. |
| src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/Signature/Signature_1.cs | Scope-aware flush signature. |
| src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/RuntimeTypeSystem_1.cs | Scope-aware flush signature. |
| src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/ReJIT_1.cs | Avoid caching processed-data snapshot across flushes. |
| src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/PlatformMetadata_1.cs | Avoid caching processed-data snapshot across flushes. |
| src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/ManagedTypeSource_1.cs | Retain metadata caches for TargetState flush. |
| src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/GCInfo/PlatformTraits/IGCInfoTraits.cs | Remove per-trait scratch-slot logic. |
| src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/GCInfo/PlatformTraits/ARMGCInfoTraits.cs | Remove scratch-slot override. |
| src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/GCInfo/PlatformTraits/ARM64GCInfoTraits.cs | Remove scratch-slot override. |
| src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/GCInfo/PlatformTraits/AMD64GCInfoTraits.cs | Remove scratch-slot override. |
| src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/GCInfo/IGCInfoDecoder.cs | Expose scratch/outgoing area size. |
| src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/GCInfo/GCInfoDecoder.cs | Provide scratch/outgoing area size accessor. |
| src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/GCInfo/GCInfo_1.cs | Plumb new GCInfo API surface. |
| src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/ExecutionManager/ExecutionManagerCore.cs | Avoid holding processed-data snapshots across flushes. |
| src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/ExecutionManager/ExecutionManager_2.cs | Plumb scope-aware flush. |
| src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/ExecutionManager/ExecutionManager_1.cs | Plumb scope-aware flush. |
| src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/EcmaMetadata_1.cs | Scope-aware flush signature. |
| src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Abstractions/Target.cs | Scope-aware target flush behavior. |
| src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Abstractions/FlushScope.cs | New public flush-scope enum. |
| src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Abstractions/Contracts/IGCInfo.cs | Add stack-parameter-area size API. |
| src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Abstractions/Contracts/IContract.cs | Scope-aware flush signature. |
| src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Abstractions/ContractRegistry.cs | Scope-aware registry flush signature. |
| src/native/managed/cdac/IData.md | Update generator docs for LayoutSet. |
| src/coreclr/vm/gchelpers.cpp | Hook allocation-point verification call sites. |
| src/coreclr/vm/gccover.cpp | Remove instruction-level verification hook call sites. |
| src/coreclr/vm/eeconfig.h | Remove legacy GC-stress flag bit. |
| src/coreclr/vm/common.h | Include cdacstress.h from common header. |
| src/coreclr/vm/ceemain.cpp | Init/shutdown via CdacStressPolicy. |
| src/coreclr/vm/cdacstress.h | New template-based trigger surface (alloc only). |
| src/coreclr/vm/cdacstress.cpp | Major rewrite: RT-as-oracle compare + logging + flush op. |
| src/coreclr/inc/switches.h | Define CDAC_STRESS under _DEBUG. |
| src/coreclr/inc/dacprivate.h | Add private stress flush request opcode. |
| eng/Subsets.props | Add Tools.CdacStressTests subset. |
| eng/pipelines/runtime-diagnostics.yml | Add CdacStressTests stage + platform parameter. |
| eng/pipelines/cdac/prepare-cdac-stress-helix-steps.yml | New payload prep + queue selection steps. |
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
a4481c3 to
0fcd9aeComparemax-charlamb
commented
Jun 2, 2026
Closing temporarily to force GitHub to recompute merge state cache (stale DIRTY status). Will reopen immediately. |
max-charlamb
commented
Jun 2, 2026
Reopened. Merge state cache should now be re-evaluated. |
0fcd9ae to
908ae73CompareUh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
ec9f832 to
2acefabCompareUh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
cdfd45e to
5e033fcCompare0530fa6 to
cbb87d6CompareUh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
cbb87d6 to
1e6e255Compare…links - docs/design/datacontracts/StackWalk.md: replace stale ~55-line Signature-Based Scanning algorithm with current stub description + RecordDeferredFrame / CDAC_DEFERRED_FRAME sentinel mechanism. - tests/StressTests/known-issues.md: PromoteCallerStack no longer throws NotImplementedException; it records a deferred frame. - tests/UnitTests/README.md: fix relative paths to sibling READMEs and soften 'every GC stress trigger point' (only ALLOC is wired). Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
1e6e255 to
cc09ab7CompareUh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
max-charlamb
commented
Jun 9, 2026
/ba-g known issue on runtime-diagnostics pipeline (which has already fixed) |
Uh oh!
There was an error while loading. Please reload this page.
…d fix (#129244) > [!NOTE] > This PR was prepared with assistance from GitHub Copilot CLI. Consolidated follow-ups to #128872 covering the cDAC stages in `runtime-diagnostics.yml` plus a small datacontract doc cleanup. ## Commits (oldest first) 1. **`efe2cdeee14`** — `[cdac] StackWalk.md: drop stress-harness detail from datacontract` The new "Signature-Based Scanning (currently deferred)" section reads like stress-harness README content. Replaced with a one-sentence note + link to `tests/StressTests/known-issues.md` (which already documents the stub, the sentinel, and the ICallingConvention work needed to re-enable the scan). 2. **`0e4caf52fd5`** — `[cdac] Fix DataGeneratorTests build: override Target.ReadNInt` #128784 added `public abstract TargetNInt ReadNInt(ulong address)` to `Target` but didn't update the test-only `TestTarget` mock, so `DataGeneratorTests` no longer compiles. Adds the missing override, mirroring `ReadNUInt`. 3. **`ebc2c062fbf`** — `[cdac pipeline] Refactor runtime-diagnostics: share one build, run unit tests, parallelize per-platform` See the commit message for the full detail. Highlights: - **Shared `CdacBuild`** stage so coreclr+libs is built ONCE per platform (Checked) and consumed by Dump / Stress / XPlatDumpGen / XPlatDumpTest legs. - **Stress vs dump cDAC split**: stress uses the Release native cDAC shim (in the shared testhost); dumps use Debug managed cDAC assemblies, with libraries pinned at Release + pre-flight verification. - **Per-platform parallelism** via job-level `dependsOnGlobalBuilds: CdacBuild` (the canonical `runtime.yml` pattern). `CdacXPlatDumpTest` adds an explicit per-source-platform `dependsOn` so the whole thing fits in one stage. - **Stress tests now run on every trigger** (previously gated to not Schedule). - **`CdacUnitTests`** runs the cDAC managed-side unit tests + DataGeneratorTests on linux_x64 Debug using a minimal `-s tools.cdactests -test` (modeled after `eng/pipelines/coreclr/ilasm.yml:52`). Also adds the previously-unbuilt DataGeneratorTests project to the `tools.cdactests` subset. - **3 new reusable templates** (`sos-test-leg.yml`, `cdac-helix-test-leg.yml`, `download-cdac-build-artifact.yml`) compress ~250 lines of repeated boilerplate. - Top-of-file overview header summarizing every stage. `Build` -> `SOSTests`, `Cdac` -> `CdacTests`. - `runtime-diagnostics.yml` shrinks from 581 -> 351 lines. ## Files changed - `docs/design/datacontracts/StackWalk.md` - `eng/Subsets.props` - `eng/pipelines/runtime-diagnostics.yml` - `eng/pipelines/cdac/prepare-cdac-helix-steps.yml` - `eng/pipelines/cdac/cdac-helix-test-leg.yml` (new) - `eng/pipelines/cdac/download-cdac-build-artifact.yml` (new) - `eng/pipelines/diagnostics/sos-test-leg.yml` (new) - `src/native/managed/cdac/tests/DataGenerator/TestTarget.cs` ## Status Draft. Local YAML parses; needs an end-to-end pipeline run on this branch to validate per-platform parallelism + Debug cDAC payload prep + `CdacUnitTests` minimal-subset build all work as expected. Supersedes #129237 and #129241 (will close those). --------- Co-authored-by: Max Charlamb <maxcharlamb@microsoft.com> Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
> [!NOTE] > This PR was prepared with assistance from GitHub Copilot CLI. Adds an in-process cDAC GC stress verification framework that compares the cDAC's stack-reference enumeration against the runtime's own GC root reporting at every stress point. ### What's in this PR 1. **Native comparator** (`src/coreclr/vm/cdacstress.cpp`): loads `mscordaccore_universal` in-process at every allocation-trigger point, asks both the cDAC (`ISOSDacInterface::GetStackReferences`) and the runtime (`StackWalkFrames` + `GcStackCrawlCallBack` oracle) to enumerate the current thread's GC stack refs, normalizes both sides, and reports per-frame matches / mismatches / deferred-frame known-issues to a structured log. 2. **REGDISPLAY-aware `IsScratchStackSlot` parity fix** in the managed cDAC stack walker (port of the post-#119446 native unified filter). Removes now-dead per-trait implementations from 4 platform trait files. 3. **xUnit harness + 9 debuggees** (`src/native/managed/cdac/tests/StressTests/`) — BasicAlloc, Comprehensive, DeepStack, DynamicMethods, ExceptionHandling, Generics, MultiThread, PInvoke (Windows-only), StructScenarios. Each is a small allocation-heavy console app the harness runs under `corerun` with `DOTNET_CdacStress=0x001`, then parses the resulting log. 4. **Pipeline integration**: new `CdacStressTests` stage in `runtime-diagnostics.yml` that builds CoreCLR Checked + cDAC Release per platform, prepares a Helix payload (testhost + xunit + debuggees), and runs on Helix. Default matrix: `windows_x64`, `windows_arm64`, `linux_x64`, `linux_arm64`. Other platforms can opt in via the `cdacStressPlatforms` parameter. 5. **`process_vm_readv` for in-process reads on Linux** (`cdacstress.cpp`): the PAL signal handler refuses to dispatch AVs whose IP is in non-runtime code (see `IsSafeToHandleHardwareException`), so `PAL_TRY` around `memcpy` cannot catch a bad-address read on Linux. Replacing the inner copy with `process_vm_readv` lets the kernel return `EFAULT` cleanly. Same pattern used by `createdump`. ### Current results All cDAC stress jobs pass on Windows + Linux (windows-x64, windows-arm64, linux-x64, linux-arm64) on the CI run for the latest commit. The other diagnostics-pipeline stages (`CdacDumpTests`) are unaffected by this PR; their osx failures are pre-existing macOS infra flake. Known divergences are bucketed in `src/native/managed/cdac/tests/StressTests/known-issues.md`. Currently only one open bucket: `PromoteCallerStack` requires the `ICallingConvention` contract (deferred). The framework explicitly marks these and re-classifies them as `[KNOWN_ISSUE]` (not `[FAIL]`). ### Ready for review This is no longer a CI-validation draft — the framework is working as designed on all four CI platforms and the open bucket is documented. Ready for review and merge. --------- Co-authored-by: Max Charlamb <maxcharlamb@microsoft.com> Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
…d fix (#129244) > [!NOTE] > This PR was prepared with assistance from GitHub Copilot CLI. Consolidated follow-ups to #128872 covering the cDAC stages in `runtime-diagnostics.yml` plus a small datacontract doc cleanup. ## Commits (oldest first) 1. **`efe2cdeee14`** — `[cdac] StackWalk.md: drop stress-harness detail from datacontract` The new "Signature-Based Scanning (currently deferred)" section reads like stress-harness README content. Replaced with a one-sentence note + link to `tests/StressTests/known-issues.md` (which already documents the stub, the sentinel, and the ICallingConvention work needed to re-enable the scan). 2. **`0e4caf52fd5`** — `[cdac] Fix DataGeneratorTests build: override Target.ReadNInt` #128784 added `public abstract TargetNInt ReadNInt(ulong address)` to `Target` but didn't update the test-only `TestTarget` mock, so `DataGeneratorTests` no longer compiles. Adds the missing override, mirroring `ReadNUInt`. 3. **`ebc2c062fbf`** — `[cdac pipeline] Refactor runtime-diagnostics: share one build, run unit tests, parallelize per-platform` See the commit message for the full detail. Highlights: - **Shared `CdacBuild`** stage so coreclr+libs is built ONCE per platform (Checked) and consumed by Dump / Stress / XPlatDumpGen / XPlatDumpTest legs. - **Stress vs dump cDAC split**: stress uses the Release native cDAC shim (in the shared testhost); dumps use Debug managed cDAC assemblies, with libraries pinned at Release + pre-flight verification. - **Per-platform parallelism** via job-level `dependsOnGlobalBuilds: CdacBuild` (the canonical `runtime.yml` pattern). `CdacXPlatDumpTest` adds an explicit per-source-platform `dependsOn` so the whole thing fits in one stage. - **Stress tests now run on every trigger** (previously gated to not Schedule). - **`CdacUnitTests`** runs the cDAC managed-side unit tests + DataGeneratorTests on linux_x64 Debug using a minimal `-s tools.cdactests -test` (modeled after `eng/pipelines/coreclr/ilasm.yml:52`). Also adds the previously-unbuilt DataGeneratorTests project to the `tools.cdactests` subset. - **3 new reusable templates** (`sos-test-leg.yml`, `cdac-helix-test-leg.yml`, `download-cdac-build-artifact.yml`) compress ~250 lines of repeated boilerplate. - Top-of-file overview header summarizing every stage. `Build` -> `SOSTests`, `Cdac` -> `CdacTests`. - `runtime-diagnostics.yml` shrinks from 581 -> 351 lines. ## Files changed - `docs/design/datacontracts/StackWalk.md` - `eng/Subsets.props` - `eng/pipelines/runtime-diagnostics.yml` - `eng/pipelines/cdac/prepare-cdac-helix-steps.yml` - `eng/pipelines/cdac/cdac-helix-test-leg.yml` (new) - `eng/pipelines/cdac/download-cdac-build-artifact.yml` (new) - `eng/pipelines/diagnostics/sos-test-leg.yml` (new) - `src/native/managed/cdac/tests/DataGenerator/TestTarget.cs` ## Status Draft. Local YAML parses; needs an end-to-end pipeline run on this branch to validate per-platform parallelism + Debug cDAC payload prep + `CdacUnitTests` minimal-subset build all work as expected. Supersedes #129237 and #129241 (will close those). --------- Co-authored-by: Max Charlamb <maxcharlamb@microsoft.com> Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Note
This PR was prepared with assistance from GitHub Copilot CLI.
Adds an in-process cDAC GC stress verification framework that compares the cDAC's stack-reference enumeration against the runtime's own GC root reporting at every stress point.
What's in this PR
src/coreclr/vm/cdacstress.cpp): loadsmscordaccore_universalin-process at every allocation-trigger point, asks both the cDAC (ISOSDacInterface::GetStackReferences) and the runtime (StackWalkFrames+GcStackCrawlCallBackoracle) to enumerate the current thread's GC stack refs, normalizes both sides, and reports per-frame matches / mismatches / deferred-frame known-issues to a structured log.IsScratchStackSlotparity fix in the managed cDAC stack walker (port of the post-[clr-interp] Fix reporting for stack slots other than the locals/arguments #119446 native unified filter). Removes now-dead per-trait implementations from 4 platform trait files.src/native/managed/cdac/tests/StressTests/) — BasicAlloc, Comprehensive, DeepStack, DynamicMethods, ExceptionHandling, Generics, MultiThread, PInvoke (Windows-only), StructScenarios. Each is a small allocation-heavy console app the harness runs undercorerunwithDOTNET_CdacStress=0x001, then parses the resulting log.CdacStressTestsstage inruntime-diagnostics.ymlthat builds CoreCLR Checked + cDAC Release per platform, prepares a Helix payload (testhost + xunit + debuggees), and runs on Helix. Default matrix:windows_x64,windows_arm64,linux_x64,linux_arm64. Other platforms can opt in via thecdacStressPlatformsparameter.process_vm_readvfor in-process reads on Linux (cdacstress.cpp): the PAL signal handler refuses to dispatch AVs whose IP is in non-runtime code (seeIsSafeToHandleHardwareException), soPAL_TRYaroundmemcpycannot catch a bad-address read on Linux. Replacing the inner copy withprocess_vm_readvlets the kernel returnEFAULTcleanly. Same pattern used bycreatedump.Current results
All cDAC stress jobs pass on Windows + Linux (windows-x64, windows-arm64, linux-x64, linux-arm64) on the CI run for the latest commit. The other diagnostics-pipeline stages (
CdacDumpTests) are unaffected by this PR; their osx failures are pre-existing macOS infra flake.Known divergences are bucketed in
src/native/managed/cdac/tests/StressTests/known-issues.md. Currently only one open bucket:PromoteCallerStackrequires theICallingConventioncontract (deferred). The framework explicitly marks these and re-classifies them as[KNOWN_ISSUE](not[FAIL]).Ready for review
This is no longer a CI-validation draft — the framework is working as designed on all four CI platforms and the open bucket is documented. Ready for review and merge.