[cDAC] GC stress verification framework + pipeline integration - #128872

Merged
max-charlamb merged 6 commits into
dotnet:mainfrom
max-charlamb:cdac-gc-stress-framework-v2
Jun 9, 2026
Merged

[cDAC] GC stress verification framework + pipeline integration#128872
max-charlamb merged 6 commits into
dotnet:mainfrom
max-charlamb:cdac-gc-stress-framework-v2

Conversation

@max-charlamb

@max-charlambmax-charlamb commented Jun 1, 2026

Copy link
Copy Markdown
Member

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-[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.
  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.

@dotnet-policy-service

Copy link
Copy Markdown
Contributor

Tagging subscribers to this area: @steveisok, @tommcdon, @dotnet/dotnet-diag
See info in area-owners.md if you want to be subscribed.

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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 cdacstress infrastructure 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 FlushScope and thread it through Target/ContractRegistry/IContract flush plumbing; refactor generator layout helper from LayoutPair to LayoutSet.

Reviewed changes

Copilot reviewed 73 out of 73 changed files in this pull request and generated 9 comments.

Show a summary per file
FileDescription
src/native/managed/cdac/tests/TestPlaceholderTarget.csUpdate test target Flush signature.
src/native/managed/cdac/tests/StressTests/StressTests.targetsBuild/copy orchestration + Helix payload prep.
src/native/managed/cdac/tests/StressTests/RunStressTests.ps1Local runner updates + new options.
src/native/managed/cdac/tests/StressTests/README.mdStress test docs + usage.
src/native/managed/cdac/tests/StressTests/Microsoft.Diagnostics.DataContractReader.StressTests.csprojNew stress test project.
src/native/managed/cdac/tests/StressTests/known-issues.mdKnown-issues taxonomy + log format.
src/native/managed/cdac/tests/StressTests/Debuggees/StructScenarios/StructScenarios.csprojNew debuggee project.
src/native/managed/cdac/tests/StressTests/Debuggees/StructScenarios/Program.csNew struct scenario debuggee.
src/native/managed/cdac/tests/StressTests/Debuggees/PInvoke/Program.csNew P/Invoke debuggee.
src/native/managed/cdac/tests/StressTests/Debuggees/PInvoke/PInvoke.csprojNew debuggee project.
src/native/managed/cdac/tests/StressTests/Debuggees/MultiThread/Program.csNew multithread debuggee.
src/native/managed/cdac/tests/StressTests/Debuggees/MultiThread/MultiThread.csprojNew debuggee project.
src/native/managed/cdac/tests/StressTests/Debuggees/Generics/Program.csNew generics debuggee.
src/native/managed/cdac/tests/StressTests/Debuggees/Generics/Generics.csprojNew debuggee project.
src/native/managed/cdac/tests/StressTests/Debuggees/ExceptionHandling/Program.csNew EH debuggee.
src/native/managed/cdac/tests/StressTests/Debuggees/ExceptionHandling/ExceptionHandling.csprojNew debuggee project.
src/native/managed/cdac/tests/StressTests/Debuggees/DynamicMethods/Program.csNew DynamicMethod debuggee.
src/native/managed/cdac/tests/StressTests/Debuggees/DynamicMethods/DynamicMethods.csprojNew debuggee project.
src/native/managed/cdac/tests/StressTests/Debuggees/DeepStack/Program.csNew deep stack debuggee.
src/native/managed/cdac/tests/StressTests/Debuggees/DeepStack/DeepStack.csprojNew debuggee project.
src/native/managed/cdac/tests/StressTests/CdacStressTestBase.csTest harness: launch corerun, parse logs.
src/native/managed/cdac/tests/StressTests/CdacStressResults.csStress-log parser + analysis formatting.
src/native/managed/cdac/tests/StressTests/cdac-stress-helix.projHelix work item definition.
src/native/managed/cdac/tests/StressTests/BasicCdacStressTests.csDebuggee-driven xUnit tests.
src/native/managed/cdac/tests/README.mdLink to new stress tests.
src/native/managed/cdac/tests/DataGenerator/TestTarget.csUpdate generator test target Flush.
src/native/managed/cdac/README.mdRemove old GC-stress section (moved to tests).
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader/ContractDescriptorTarget.csFlush now rebuilds descriptors post-flush.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader/CachingContractRegistry.csScope-aware flush forwarding.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/SOSDacImpl.IXCLRDataProcess.csScope-aware flush + private stress request.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/SOSDacImpl.csPropagate flush scope in legacy impl.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/Dbi/DacDbiImpl.csPropagate flush scope for DBI flush.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.DataGenerator/LayoutSetSource.csNew generated helper: multi-source layout resolution.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.DataGenerator/LayoutPairSource.csRemove old layout helper.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.DataGenerator/Emitter.csSwitch generator to LayoutSet.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.DataGenerator/CdacGenerator.csEmit LayoutSet helper conditionally.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/StackWalk/GC/GcScanner.csScratch-slot filtering + deferred frame recording.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/StackWalk/GC/GcScanFlags.csAdd deferred-frame sentinel flag.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/StackWalk/GC/GcScanContext.csEmit deferred-frame sentinel entries.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/Signature/Signature_1.csScope-aware flush signature.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/RuntimeTypeSystem_1.csScope-aware flush signature.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/ReJIT_1.csAvoid caching processed-data snapshot across flushes.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/PlatformMetadata_1.csAvoid caching processed-data snapshot across flushes.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/ManagedTypeSource_1.csRetain metadata caches for TargetState flush.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/GCInfo/PlatformTraits/IGCInfoTraits.csRemove per-trait scratch-slot logic.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/GCInfo/PlatformTraits/ARMGCInfoTraits.csRemove scratch-slot override.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/GCInfo/PlatformTraits/ARM64GCInfoTraits.csRemove scratch-slot override.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/GCInfo/PlatformTraits/AMD64GCInfoTraits.csRemove scratch-slot override.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/GCInfo/IGCInfoDecoder.csExpose scratch/outgoing area size.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/GCInfo/GCInfoDecoder.csProvide scratch/outgoing area size accessor.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/GCInfo/GCInfo_1.csPlumb new GCInfo API surface.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/ExecutionManager/ExecutionManagerCore.csAvoid holding processed-data snapshots across flushes.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/ExecutionManager/ExecutionManager_2.csPlumb scope-aware flush.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/ExecutionManager/ExecutionManager_1.csPlumb scope-aware flush.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/EcmaMetadata_1.csScope-aware flush signature.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Abstractions/Target.csScope-aware target flush behavior.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Abstractions/FlushScope.csNew public flush-scope enum.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Abstractions/Contracts/IGCInfo.csAdd stack-parameter-area size API.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Abstractions/Contracts/IContract.csScope-aware flush signature.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Abstractions/ContractRegistry.csScope-aware registry flush signature.
src/native/managed/cdac/IData.mdUpdate generator docs for LayoutSet.
src/coreclr/vm/gchelpers.cppHook allocation-point verification call sites.
src/coreclr/vm/gccover.cppRemove instruction-level verification hook call sites.
src/coreclr/vm/eeconfig.hRemove legacy GC-stress flag bit.
src/coreclr/vm/common.hInclude cdacstress.h from common header.
src/coreclr/vm/ceemain.cppInit/shutdown via CdacStressPolicy.
src/coreclr/vm/cdacstress.hNew template-based trigger surface (alloc only).
src/coreclr/vm/cdacstress.cppMajor rewrite: RT-as-oracle compare + logging + flush op.
src/coreclr/inc/switches.hDefine CDAC_STRESS under _DEBUG.
src/coreclr/inc/dacprivate.hAdd private stress flush request opcode.
eng/Subsets.propsAdd Tools.CdacStressTests subset.
eng/pipelines/runtime-diagnostics.ymlAdd CdacStressTests stage + platform parameter.
eng/pipelines/cdac/prepare-cdac-stress-helix-steps.ymlNew payload prep + queue selection steps.

Comment threadsrc/coreclr/vm/cdacstress.cpp Outdated
Comment threadsrc/native/managed/cdac/tests/StressTests/RunStressTests.ps1
Comment threadsrc/native/managed/cdac/tests/StressTests/RunStressTests.ps1 Outdated
Comment threadsrc/native/managed/cdac/tests/StressTests/CdacStressTestBase.cs Outdated
Comment threadsrc/native/managed/cdac/tests/StressTests/CdacStressResults.cs Outdated
Comment threadsrc/native/managed/cdac/tests/StressTests/README.md Outdated
@max-charlamb

Copy link
Copy Markdown
MemberAuthor

Closing temporarily to force GitHub to recompute merge state cache (stale DIRTY status). Will reopen immediately.

@max-charlamb

Copy link
Copy Markdown
MemberAuthor

Reopened. Merge state cache should now be re-evaluated.

@max-charlamb
max-charlambforce-pushed the cdac-gc-stress-framework-v2 branch from 0fcd9ae to 908ae73CompareJune 2, 2026 13:10

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 73 out of 73 changed files in this pull request and generated 18 comments.

Comment threadsrc/coreclr/vm/cdacstress.cpp
Comment threadsrc/coreclr/vm/cdacstress.cpp Outdated
Comment threadsrc/coreclr/vm/cdacstress.cpp
Comment threadsrc/coreclr/vm/cdacstress.cpp Outdated
Comment threadsrc/native/managed/cdac/tests/StressTests/RunStressTests.ps1
Comment threadsrc/coreclr/inc/switches.h
Comment threadeng/pipelines/runtime-diagnostics.yml
CopilotAI review requested due to automatic review settings June 2, 2026 17:38

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 73 out of 73 changed files in this pull request and generated 6 comments.

Comment threadsrc/coreclr/vm/cdacstress.cpp
Comment threadsrc/native/managed/cdac/tests/StressTests/BasicCdacStressTests.cs Outdated
Comment threadsrc/native/managed/cdac/tests/StressTests/CdacStressResults.cs Outdated
@max-charlamb
max-charlambforce-pushed the cdac-gc-stress-framework-v2 branch from ec9f832 to 2acefabCompareJune 2, 2026 18:02
CopilotAI review requested due to automatic review settings June 2, 2026 20:02

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 49 out of 49 changed files in this pull request and generated 13 comments.

Comment threadsrc/coreclr/inc/switches.h
Comment threadeng/pipelines/runtime-diagnostics.yml
Comment threadeng/pipelines/cdac/prepare-cdac-stress-helix-steps.yml Outdated
Comment threadsrc/coreclr/vm/cdacstress.cpp
Comment threadsrc/native/managed/cdac/tests/StressTests/RunStressTests.ps1
Comment threadsrc/native/managed/cdac/tests/StressTests/CdacStressResults.cs Outdated
Comment threadsrc/native/managed/cdac/tests/StressTests/CdacStressTestBase.cs Outdated
@max-charlamb
max-charlambforce-pushed the cdac-gc-stress-framework-v2 branch from 0530fa6 to cbb87d6CompareJune 4, 2026 20:33

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 50 out of 50 changed files in this pull request and generated 6 comments.

Comment threadsrc/coreclr/vm/cdacstress.cpp
Comment threadsrc/coreclr/vm/cdacstress.cpp
Comment threadsrc/coreclr/vm/cdacstress.cpp
Comment threadsrc/coreclr/vm/cdacstress.h
…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>
CopilotAI review requested due to automatic review settings June 8, 2026 16:00
@max-charlamb
max-charlambforce-pushed the cdac-gc-stress-framework-v2 branch from 1e6e255 to cc09ab7CompareJune 8, 2026 16:00

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 51 out of 51 changed files in this pull request and generated 4 comments.

Comment threadsrc/coreclr/vm/cdacstress.cpp
Comment threadsrc/coreclr/vm/cdacstress.cpp

@noahfalknoahfalk left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM!

Comment threaddocs/design/datacontracts/StackWalk.md
@max-charlamb

Copy link
Copy Markdown
MemberAuthor

/ba-g known issue on runtime-diagnostics pipeline (which has already fixed)

@max-charlamb
max-charlamb merged commit bba72ce into dotnet:mainJun 9, 2026
194 of 199 checks passed
@max-charlamb
max-charlamb deleted the cdac-gc-stress-framework-v2 branch June 9, 2026 18:59
max-charlamb added a commit that referenced this pull request Jun 14, 2026
…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>
@dotnet-milestone-botdotnet-milestone-botBot added this to the 11.0-preview6 milestone Jun 17, 2026
eiriktsarpalis pushed a commit that referenced this pull request Jul 15, 2026
> [!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>
eiriktsarpalis pushed a commit that referenced this pull request Jul 15, 2026
…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>
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Jul 18, 2026
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants

@max-charlamb@steveisok@noahfalk
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

[cDAC] GC stress verification framework + pipeline integration - #128872

Merged
max-charlamb merged 6 commits into
dotnet:mainfrom
max-charlamb:cdac-gc-stress-framework-v2
Jun 9, 2026
Merged

[cDAC] GC stress verification framework + pipeline integration#128872
max-charlamb merged 6 commits into
dotnet:mainfrom
max-charlamb:cdac-gc-stress-framework-v2

Conversation

@max-charlamb

@max-charlambmax-charlamb commented Jun 1, 2026

Copy link
Copy Markdown
Member

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-[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.
  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.

@dotnet-policy-service

Copy link
Copy Markdown
Contributor

Tagging subscribers to this area: @steveisok, @tommcdon, @dotnet/dotnet-diag
See info in area-owners.md if you want to be subscribed.

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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 cdacstress infrastructure 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 FlushScope and thread it through Target/ContractRegistry/IContract flush plumbing; refactor generator layout helper from LayoutPair to LayoutSet.

Reviewed changes

Copilot reviewed 73 out of 73 changed files in this pull request and generated 9 comments.

Show a summary per file
FileDescription
src/native/managed/cdac/tests/TestPlaceholderTarget.csUpdate test target Flush signature.
src/native/managed/cdac/tests/StressTests/StressTests.targetsBuild/copy orchestration + Helix payload prep.
src/native/managed/cdac/tests/StressTests/RunStressTests.ps1Local runner updates + new options.
src/native/managed/cdac/tests/StressTests/README.mdStress test docs + usage.
src/native/managed/cdac/tests/StressTests/Microsoft.Diagnostics.DataContractReader.StressTests.csprojNew stress test project.
src/native/managed/cdac/tests/StressTests/known-issues.mdKnown-issues taxonomy + log format.
src/native/managed/cdac/tests/StressTests/Debuggees/StructScenarios/StructScenarios.csprojNew debuggee project.
src/native/managed/cdac/tests/StressTests/Debuggees/StructScenarios/Program.csNew struct scenario debuggee.
src/native/managed/cdac/tests/StressTests/Debuggees/PInvoke/Program.csNew P/Invoke debuggee.
src/native/managed/cdac/tests/StressTests/Debuggees/PInvoke/PInvoke.csprojNew debuggee project.
src/native/managed/cdac/tests/StressTests/Debuggees/MultiThread/Program.csNew multithread debuggee.
src/native/managed/cdac/tests/StressTests/Debuggees/MultiThread/MultiThread.csprojNew debuggee project.
src/native/managed/cdac/tests/StressTests/Debuggees/Generics/Program.csNew generics debuggee.
src/native/managed/cdac/tests/StressTests/Debuggees/Generics/Generics.csprojNew debuggee project.
src/native/managed/cdac/tests/StressTests/Debuggees/ExceptionHandling/Program.csNew EH debuggee.
src/native/managed/cdac/tests/StressTests/Debuggees/ExceptionHandling/ExceptionHandling.csprojNew debuggee project.
src/native/managed/cdac/tests/StressTests/Debuggees/DynamicMethods/Program.csNew DynamicMethod debuggee.
src/native/managed/cdac/tests/StressTests/Debuggees/DynamicMethods/DynamicMethods.csprojNew debuggee project.
src/native/managed/cdac/tests/StressTests/Debuggees/DeepStack/Program.csNew deep stack debuggee.
src/native/managed/cdac/tests/StressTests/Debuggees/DeepStack/DeepStack.csprojNew debuggee project.
src/native/managed/cdac/tests/StressTests/CdacStressTestBase.csTest harness: launch corerun, parse logs.
src/native/managed/cdac/tests/StressTests/CdacStressResults.csStress-log parser + analysis formatting.
src/native/managed/cdac/tests/StressTests/cdac-stress-helix.projHelix work item definition.
src/native/managed/cdac/tests/StressTests/BasicCdacStressTests.csDebuggee-driven xUnit tests.
src/native/managed/cdac/tests/README.mdLink to new stress tests.
src/native/managed/cdac/tests/DataGenerator/TestTarget.csUpdate generator test target Flush.
src/native/managed/cdac/README.mdRemove old GC-stress section (moved to tests).
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader/ContractDescriptorTarget.csFlush now rebuilds descriptors post-flush.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader/CachingContractRegistry.csScope-aware flush forwarding.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/SOSDacImpl.IXCLRDataProcess.csScope-aware flush + private stress request.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/SOSDacImpl.csPropagate flush scope in legacy impl.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/Dbi/DacDbiImpl.csPropagate flush scope for DBI flush.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.DataGenerator/LayoutSetSource.csNew generated helper: multi-source layout resolution.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.DataGenerator/LayoutPairSource.csRemove old layout helper.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.DataGenerator/Emitter.csSwitch generator to LayoutSet.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.DataGenerator/CdacGenerator.csEmit LayoutSet helper conditionally.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/StackWalk/GC/GcScanner.csScratch-slot filtering + deferred frame recording.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/StackWalk/GC/GcScanFlags.csAdd deferred-frame sentinel flag.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/StackWalk/GC/GcScanContext.csEmit deferred-frame sentinel entries.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/Signature/Signature_1.csScope-aware flush signature.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/RuntimeTypeSystem_1.csScope-aware flush signature.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/ReJIT_1.csAvoid caching processed-data snapshot across flushes.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/PlatformMetadata_1.csAvoid caching processed-data snapshot across flushes.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/ManagedTypeSource_1.csRetain metadata caches for TargetState flush.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/GCInfo/PlatformTraits/IGCInfoTraits.csRemove per-trait scratch-slot logic.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/GCInfo/PlatformTraits/ARMGCInfoTraits.csRemove scratch-slot override.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/GCInfo/PlatformTraits/ARM64GCInfoTraits.csRemove scratch-slot override.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/GCInfo/PlatformTraits/AMD64GCInfoTraits.csRemove scratch-slot override.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/GCInfo/IGCInfoDecoder.csExpose scratch/outgoing area size.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/GCInfo/GCInfoDecoder.csProvide scratch/outgoing area size accessor.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/GCInfo/GCInfo_1.csPlumb new GCInfo API surface.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/ExecutionManager/ExecutionManagerCore.csAvoid holding processed-data snapshots across flushes.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/ExecutionManager/ExecutionManager_2.csPlumb scope-aware flush.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/ExecutionManager/ExecutionManager_1.csPlumb scope-aware flush.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/EcmaMetadata_1.csScope-aware flush signature.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Abstractions/Target.csScope-aware target flush behavior.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Abstractions/FlushScope.csNew public flush-scope enum.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Abstractions/Contracts/IGCInfo.csAdd stack-parameter-area size API.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Abstractions/Contracts/IContract.csScope-aware flush signature.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Abstractions/ContractRegistry.csScope-aware registry flush signature.
src/native/managed/cdac/IData.mdUpdate generator docs for LayoutSet.
src/coreclr/vm/gchelpers.cppHook allocation-point verification call sites.
src/coreclr/vm/gccover.cppRemove instruction-level verification hook call sites.
src/coreclr/vm/eeconfig.hRemove legacy GC-stress flag bit.
src/coreclr/vm/common.hInclude cdacstress.h from common header.
src/coreclr/vm/ceemain.cppInit/shutdown via CdacStressPolicy.
src/coreclr/vm/cdacstress.hNew template-based trigger surface (alloc only).
src/coreclr/vm/cdacstress.cppMajor rewrite: RT-as-oracle compare + logging + flush op.
src/coreclr/inc/switches.hDefine CDAC_STRESS under _DEBUG.
src/coreclr/inc/dacprivate.hAdd private stress flush request opcode.
eng/Subsets.propsAdd Tools.CdacStressTests subset.
eng/pipelines/runtime-diagnostics.ymlAdd CdacStressTests stage + platform parameter.
eng/pipelines/cdac/prepare-cdac-stress-helix-steps.ymlNew payload prep + queue selection steps.

Comment threadsrc/coreclr/vm/cdacstress.cpp Outdated
Comment threadsrc/native/managed/cdac/tests/StressTests/RunStressTests.ps1
Comment threadsrc/native/managed/cdac/tests/StressTests/RunStressTests.ps1 Outdated
Comment threadsrc/native/managed/cdac/tests/StressTests/CdacStressTestBase.cs Outdated
Comment threadsrc/native/managed/cdac/tests/StressTests/CdacStressResults.cs Outdated
Comment threadsrc/native/managed/cdac/tests/StressTests/README.md Outdated
@max-charlamb

Copy link
Copy Markdown
MemberAuthor

Closing temporarily to force GitHub to recompute merge state cache (stale DIRTY status). Will reopen immediately.

@max-charlamb

Copy link
Copy Markdown
MemberAuthor

Reopened. Merge state cache should now be re-evaluated.

@max-charlamb
max-charlambforce-pushed the cdac-gc-stress-framework-v2 branch from 0fcd9ae to 908ae73CompareJune 2, 2026 13:10

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 73 out of 73 changed files in this pull request and generated 18 comments.

Comment threadsrc/coreclr/vm/cdacstress.cpp
Comment threadsrc/coreclr/vm/cdacstress.cpp Outdated
Comment threadsrc/coreclr/vm/cdacstress.cpp
Comment threadsrc/coreclr/vm/cdacstress.cpp Outdated
Comment threadsrc/native/managed/cdac/tests/StressTests/RunStressTests.ps1
Comment threadsrc/coreclr/inc/switches.h
Comment threadeng/pipelines/runtime-diagnostics.yml
CopilotAI review requested due to automatic review settings June 2, 2026 17:38

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 73 out of 73 changed files in this pull request and generated 6 comments.

Comment threadsrc/coreclr/vm/cdacstress.cpp
Comment threadsrc/native/managed/cdac/tests/StressTests/BasicCdacStressTests.cs Outdated
Comment threadsrc/native/managed/cdac/tests/StressTests/CdacStressResults.cs Outdated
@max-charlamb
max-charlambforce-pushed the cdac-gc-stress-framework-v2 branch from ec9f832 to 2acefabCompareJune 2, 2026 18:02
CopilotAI review requested due to automatic review settings June 2, 2026 20:02

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 49 out of 49 changed files in this pull request and generated 13 comments.

Comment threadsrc/coreclr/inc/switches.h
Comment threadeng/pipelines/runtime-diagnostics.yml
Comment threadeng/pipelines/cdac/prepare-cdac-stress-helix-steps.yml Outdated
Comment threadsrc/coreclr/vm/cdacstress.cpp
Comment threadsrc/native/managed/cdac/tests/StressTests/RunStressTests.ps1
Comment threadsrc/native/managed/cdac/tests/StressTests/CdacStressResults.cs Outdated
Comment threadsrc/native/managed/cdac/tests/StressTests/CdacStressTestBase.cs Outdated
@max-charlamb
max-charlambforce-pushed the cdac-gc-stress-framework-v2 branch from 0530fa6 to cbb87d6CompareJune 4, 2026 20:33

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 50 out of 50 changed files in this pull request and generated 6 comments.

Comment threadsrc/coreclr/vm/cdacstress.cpp
Comment threadsrc/coreclr/vm/cdacstress.cpp
Comment threadsrc/coreclr/vm/cdacstress.cpp
Comment threadsrc/coreclr/vm/cdacstress.h
…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>
CopilotAI review requested due to automatic review settings June 8, 2026 16:00
@max-charlamb
max-charlambforce-pushed the cdac-gc-stress-framework-v2 branch from 1e6e255 to cc09ab7CompareJune 8, 2026 16:00

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 51 out of 51 changed files in this pull request and generated 4 comments.

Comment threadsrc/coreclr/vm/cdacstress.cpp
Comment threadsrc/coreclr/vm/cdacstress.cpp

@noahfalknoahfalk left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM!

Comment threaddocs/design/datacontracts/StackWalk.md
@max-charlamb

Copy link
Copy Markdown
MemberAuthor

/ba-g known issue on runtime-diagnostics pipeline (which has already fixed)

@max-charlamb
max-charlamb merged commit bba72ce into dotnet:mainJun 9, 2026
194 of 199 checks passed
@max-charlamb
max-charlamb deleted the cdac-gc-stress-framework-v2 branch June 9, 2026 18:59
max-charlamb added a commit that referenced this pull request Jun 14, 2026
…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>
@dotnet-milestone-botdotnet-milestone-botBot added this to the 11.0-preview6 milestone Jun 17, 2026
eiriktsarpalis pushed a commit that referenced this pull request Jul 15, 2026
> [!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>
eiriktsarpalis pushed a commit that referenced this pull request Jul 15, 2026
…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>
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Jul 18, 2026
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants

@max-charlamb@steveisok@noahfalk
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

[cDAC] GC stress verification framework + pipeline integration - #128872

Merged
max-charlamb merged 6 commits into
dotnet:mainfrom
max-charlamb:cdac-gc-stress-framework-v2
Jun 9, 2026
Merged

[cDAC] GC stress verification framework + pipeline integration#128872
max-charlamb merged 6 commits into
dotnet:mainfrom
max-charlamb:cdac-gc-stress-framework-v2

Conversation

@max-charlamb

@max-charlambmax-charlamb commented Jun 1, 2026

Copy link
Copy Markdown
Member

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-[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.
  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.

@dotnet-policy-service

Copy link
Copy Markdown
Contributor

Tagging subscribers to this area: @steveisok, @tommcdon, @dotnet/dotnet-diag
See info in area-owners.md if you want to be subscribed.

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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 cdacstress infrastructure 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 FlushScope and thread it through Target/ContractRegistry/IContract flush plumbing; refactor generator layout helper from LayoutPair to LayoutSet.

Reviewed changes

Copilot reviewed 73 out of 73 changed files in this pull request and generated 9 comments.

Show a summary per file
FileDescription
src/native/managed/cdac/tests/TestPlaceholderTarget.csUpdate test target Flush signature.
src/native/managed/cdac/tests/StressTests/StressTests.targetsBuild/copy orchestration + Helix payload prep.
src/native/managed/cdac/tests/StressTests/RunStressTests.ps1Local runner updates + new options.
src/native/managed/cdac/tests/StressTests/README.mdStress test docs + usage.
src/native/managed/cdac/tests/StressTests/Microsoft.Diagnostics.DataContractReader.StressTests.csprojNew stress test project.
src/native/managed/cdac/tests/StressTests/known-issues.mdKnown-issues taxonomy + log format.
src/native/managed/cdac/tests/StressTests/Debuggees/StructScenarios/StructScenarios.csprojNew debuggee project.
src/native/managed/cdac/tests/StressTests/Debuggees/StructScenarios/Program.csNew struct scenario debuggee.
src/native/managed/cdac/tests/StressTests/Debuggees/PInvoke/Program.csNew P/Invoke debuggee.
src/native/managed/cdac/tests/StressTests/Debuggees/PInvoke/PInvoke.csprojNew debuggee project.
src/native/managed/cdac/tests/StressTests/Debuggees/MultiThread/Program.csNew multithread debuggee.
src/native/managed/cdac/tests/StressTests/Debuggees/MultiThread/MultiThread.csprojNew debuggee project.
src/native/managed/cdac/tests/StressTests/Debuggees/Generics/Program.csNew generics debuggee.
src/native/managed/cdac/tests/StressTests/Debuggees/Generics/Generics.csprojNew debuggee project.
src/native/managed/cdac/tests/StressTests/Debuggees/ExceptionHandling/Program.csNew EH debuggee.
src/native/managed/cdac/tests/StressTests/Debuggees/ExceptionHandling/ExceptionHandling.csprojNew debuggee project.
src/native/managed/cdac/tests/StressTests/Debuggees/DynamicMethods/Program.csNew DynamicMethod debuggee.
src/native/managed/cdac/tests/StressTests/Debuggees/DynamicMethods/DynamicMethods.csprojNew debuggee project.
src/native/managed/cdac/tests/StressTests/Debuggees/DeepStack/Program.csNew deep stack debuggee.
src/native/managed/cdac/tests/StressTests/Debuggees/DeepStack/DeepStack.csprojNew debuggee project.
src/native/managed/cdac/tests/StressTests/CdacStressTestBase.csTest harness: launch corerun, parse logs.
src/native/managed/cdac/tests/StressTests/CdacStressResults.csStress-log parser + analysis formatting.
src/native/managed/cdac/tests/StressTests/cdac-stress-helix.projHelix work item definition.
src/native/managed/cdac/tests/StressTests/BasicCdacStressTests.csDebuggee-driven xUnit tests.
src/native/managed/cdac/tests/README.mdLink to new stress tests.
src/native/managed/cdac/tests/DataGenerator/TestTarget.csUpdate generator test target Flush.
src/native/managed/cdac/README.mdRemove old GC-stress section (moved to tests).
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader/ContractDescriptorTarget.csFlush now rebuilds descriptors post-flush.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader/CachingContractRegistry.csScope-aware flush forwarding.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/SOSDacImpl.IXCLRDataProcess.csScope-aware flush + private stress request.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/SOSDacImpl.csPropagate flush scope in legacy impl.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/Dbi/DacDbiImpl.csPropagate flush scope for DBI flush.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.DataGenerator/LayoutSetSource.csNew generated helper: multi-source layout resolution.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.DataGenerator/LayoutPairSource.csRemove old layout helper.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.DataGenerator/Emitter.csSwitch generator to LayoutSet.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.DataGenerator/CdacGenerator.csEmit LayoutSet helper conditionally.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/StackWalk/GC/GcScanner.csScratch-slot filtering + deferred frame recording.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/StackWalk/GC/GcScanFlags.csAdd deferred-frame sentinel flag.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/StackWalk/GC/GcScanContext.csEmit deferred-frame sentinel entries.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/Signature/Signature_1.csScope-aware flush signature.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/RuntimeTypeSystem_1.csScope-aware flush signature.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/ReJIT_1.csAvoid caching processed-data snapshot across flushes.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/PlatformMetadata_1.csAvoid caching processed-data snapshot across flushes.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/ManagedTypeSource_1.csRetain metadata caches for TargetState flush.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/GCInfo/PlatformTraits/IGCInfoTraits.csRemove per-trait scratch-slot logic.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/GCInfo/PlatformTraits/ARMGCInfoTraits.csRemove scratch-slot override.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/GCInfo/PlatformTraits/ARM64GCInfoTraits.csRemove scratch-slot override.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/GCInfo/PlatformTraits/AMD64GCInfoTraits.csRemove scratch-slot override.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/GCInfo/IGCInfoDecoder.csExpose scratch/outgoing area size.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/GCInfo/GCInfoDecoder.csProvide scratch/outgoing area size accessor.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/GCInfo/GCInfo_1.csPlumb new GCInfo API surface.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/ExecutionManager/ExecutionManagerCore.csAvoid holding processed-data snapshots across flushes.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/ExecutionManager/ExecutionManager_2.csPlumb scope-aware flush.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/ExecutionManager/ExecutionManager_1.csPlumb scope-aware flush.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/EcmaMetadata_1.csScope-aware flush signature.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Abstractions/Target.csScope-aware target flush behavior.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Abstractions/FlushScope.csNew public flush-scope enum.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Abstractions/Contracts/IGCInfo.csAdd stack-parameter-area size API.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Abstractions/Contracts/IContract.csScope-aware flush signature.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Abstractions/ContractRegistry.csScope-aware registry flush signature.
src/native/managed/cdac/IData.mdUpdate generator docs for LayoutSet.
src/coreclr/vm/gchelpers.cppHook allocation-point verification call sites.
src/coreclr/vm/gccover.cppRemove instruction-level verification hook call sites.
src/coreclr/vm/eeconfig.hRemove legacy GC-stress flag bit.
src/coreclr/vm/common.hInclude cdacstress.h from common header.
src/coreclr/vm/ceemain.cppInit/shutdown via CdacStressPolicy.
src/coreclr/vm/cdacstress.hNew template-based trigger surface (alloc only).
src/coreclr/vm/cdacstress.cppMajor rewrite: RT-as-oracle compare + logging + flush op.
src/coreclr/inc/switches.hDefine CDAC_STRESS under _DEBUG.
src/coreclr/inc/dacprivate.hAdd private stress flush request opcode.
eng/Subsets.propsAdd Tools.CdacStressTests subset.
eng/pipelines/runtime-diagnostics.ymlAdd CdacStressTests stage + platform parameter.
eng/pipelines/cdac/prepare-cdac-stress-helix-steps.ymlNew payload prep + queue selection steps.

Comment threadsrc/coreclr/vm/cdacstress.cpp Outdated
Comment threadsrc/native/managed/cdac/tests/StressTests/RunStressTests.ps1
Comment threadsrc/native/managed/cdac/tests/StressTests/RunStressTests.ps1 Outdated
Comment threadsrc/native/managed/cdac/tests/StressTests/CdacStressTestBase.cs Outdated
Comment threadsrc/native/managed/cdac/tests/StressTests/CdacStressResults.cs Outdated
Comment threadsrc/native/managed/cdac/tests/StressTests/README.md Outdated
@max-charlamb

Copy link
Copy Markdown
MemberAuthor

Closing temporarily to force GitHub to recompute merge state cache (stale DIRTY status). Will reopen immediately.

@max-charlamb

Copy link
Copy Markdown
MemberAuthor

Reopened. Merge state cache should now be re-evaluated.

@max-charlamb
max-charlambforce-pushed the cdac-gc-stress-framework-v2 branch from 0fcd9ae to 908ae73CompareJune 2, 2026 13:10

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 73 out of 73 changed files in this pull request and generated 18 comments.

Comment threadsrc/coreclr/vm/cdacstress.cpp
Comment threadsrc/coreclr/vm/cdacstress.cpp Outdated
Comment threadsrc/coreclr/vm/cdacstress.cpp
Comment threadsrc/coreclr/vm/cdacstress.cpp Outdated
Comment threadsrc/native/managed/cdac/tests/StressTests/RunStressTests.ps1
Comment threadsrc/coreclr/inc/switches.h
Comment threadeng/pipelines/runtime-diagnostics.yml
CopilotAI review requested due to automatic review settings June 2, 2026 17:38

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 73 out of 73 changed files in this pull request and generated 6 comments.

Comment threadsrc/coreclr/vm/cdacstress.cpp
Comment threadsrc/native/managed/cdac/tests/StressTests/BasicCdacStressTests.cs Outdated
Comment threadsrc/native/managed/cdac/tests/StressTests/CdacStressResults.cs Outdated
@max-charlamb
max-charlambforce-pushed the cdac-gc-stress-framework-v2 branch from ec9f832 to 2acefabCompareJune 2, 2026 18:02
CopilotAI review requested due to automatic review settings June 2, 2026 20:02

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 49 out of 49 changed files in this pull request and generated 13 comments.

Comment threadsrc/coreclr/inc/switches.h
Comment threadeng/pipelines/runtime-diagnostics.yml
Comment threadeng/pipelines/cdac/prepare-cdac-stress-helix-steps.yml Outdated
Comment threadsrc/coreclr/vm/cdacstress.cpp
Comment threadsrc/native/managed/cdac/tests/StressTests/RunStressTests.ps1
Comment threadsrc/native/managed/cdac/tests/StressTests/CdacStressResults.cs Outdated
Comment threadsrc/native/managed/cdac/tests/StressTests/CdacStressTestBase.cs Outdated
@max-charlamb
max-charlambforce-pushed the cdac-gc-stress-framework-v2 branch from 0530fa6 to cbb87d6CompareJune 4, 2026 20:33

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 50 out of 50 changed files in this pull request and generated 6 comments.

Comment threadsrc/coreclr/vm/cdacstress.cpp
Comment threadsrc/coreclr/vm/cdacstress.cpp
Comment threadsrc/coreclr/vm/cdacstress.cpp
Comment threadsrc/coreclr/vm/cdacstress.h
…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>
CopilotAI review requested due to automatic review settings June 8, 2026 16:00
@max-charlamb
max-charlambforce-pushed the cdac-gc-stress-framework-v2 branch from 1e6e255 to cc09ab7CompareJune 8, 2026 16:00

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 51 out of 51 changed files in this pull request and generated 4 comments.

Comment threadsrc/coreclr/vm/cdacstress.cpp
Comment threadsrc/coreclr/vm/cdacstress.cpp

@noahfalknoahfalk left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM!

Comment threaddocs/design/datacontracts/StackWalk.md
@max-charlamb

Copy link
Copy Markdown
MemberAuthor

/ba-g known issue on runtime-diagnostics pipeline (which has already fixed)

@max-charlamb
max-charlamb merged commit bba72ce into dotnet:mainJun 9, 2026
194 of 199 checks passed
@max-charlamb
max-charlamb deleted the cdac-gc-stress-framework-v2 branch June 9, 2026 18:59
max-charlamb added a commit that referenced this pull request Jun 14, 2026
…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>
@dotnet-milestone-botdotnet-milestone-botBot added this to the 11.0-preview6 milestone Jun 17, 2026
eiriktsarpalis pushed a commit that referenced this pull request Jul 15, 2026
> [!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>
eiriktsarpalis pushed a commit that referenced this pull request Jul 15, 2026
…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>
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Jul 18, 2026
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants

@max-charlamb@steveisok@noahfalk
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

[cDAC] GC stress verification framework + pipeline integration - #128872

Merged
max-charlamb merged 6 commits into
dotnet:mainfrom
max-charlamb:cdac-gc-stress-framework-v2
Jun 9, 2026
Merged

[cDAC] GC stress verification framework + pipeline integration#128872
max-charlamb merged 6 commits into
dotnet:mainfrom
max-charlamb:cdac-gc-stress-framework-v2

Conversation

@max-charlamb

@max-charlambmax-charlamb commented Jun 1, 2026

Copy link
Copy Markdown
Member

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-[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.
  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.

@dotnet-policy-service

Copy link
Copy Markdown
Contributor

Tagging subscribers to this area: @steveisok, @tommcdon, @dotnet/dotnet-diag
See info in area-owners.md if you want to be subscribed.

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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 cdacstress infrastructure 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 FlushScope and thread it through Target/ContractRegistry/IContract flush plumbing; refactor generator layout helper from LayoutPair to LayoutSet.

Reviewed changes

Copilot reviewed 73 out of 73 changed files in this pull request and generated 9 comments.

Show a summary per file
FileDescription
src/native/managed/cdac/tests/TestPlaceholderTarget.csUpdate test target Flush signature.
src/native/managed/cdac/tests/StressTests/StressTests.targetsBuild/copy orchestration + Helix payload prep.
src/native/managed/cdac/tests/StressTests/RunStressTests.ps1Local runner updates + new options.
src/native/managed/cdac/tests/StressTests/README.mdStress test docs + usage.
src/native/managed/cdac/tests/StressTests/Microsoft.Diagnostics.DataContractReader.StressTests.csprojNew stress test project.
src/native/managed/cdac/tests/StressTests/known-issues.mdKnown-issues taxonomy + log format.
src/native/managed/cdac/tests/StressTests/Debuggees/StructScenarios/StructScenarios.csprojNew debuggee project.
src/native/managed/cdac/tests/StressTests/Debuggees/StructScenarios/Program.csNew struct scenario debuggee.
src/native/managed/cdac/tests/StressTests/Debuggees/PInvoke/Program.csNew P/Invoke debuggee.
src/native/managed/cdac/tests/StressTests/Debuggees/PInvoke/PInvoke.csprojNew debuggee project.
src/native/managed/cdac/tests/StressTests/Debuggees/MultiThread/Program.csNew multithread debuggee.
src/native/managed/cdac/tests/StressTests/Debuggees/MultiThread/MultiThread.csprojNew debuggee project.
src/native/managed/cdac/tests/StressTests/Debuggees/Generics/Program.csNew generics debuggee.
src/native/managed/cdac/tests/StressTests/Debuggees/Generics/Generics.csprojNew debuggee project.
src/native/managed/cdac/tests/StressTests/Debuggees/ExceptionHandling/Program.csNew EH debuggee.
src/native/managed/cdac/tests/StressTests/Debuggees/ExceptionHandling/ExceptionHandling.csprojNew debuggee project.
src/native/managed/cdac/tests/StressTests/Debuggees/DynamicMethods/Program.csNew DynamicMethod debuggee.
src/native/managed/cdac/tests/StressTests/Debuggees/DynamicMethods/DynamicMethods.csprojNew debuggee project.
src/native/managed/cdac/tests/StressTests/Debuggees/DeepStack/Program.csNew deep stack debuggee.
src/native/managed/cdac/tests/StressTests/Debuggees/DeepStack/DeepStack.csprojNew debuggee project.
src/native/managed/cdac/tests/StressTests/CdacStressTestBase.csTest harness: launch corerun, parse logs.
src/native/managed/cdac/tests/StressTests/CdacStressResults.csStress-log parser + analysis formatting.
src/native/managed/cdac/tests/StressTests/cdac-stress-helix.projHelix work item definition.
src/native/managed/cdac/tests/StressTests/BasicCdacStressTests.csDebuggee-driven xUnit tests.
src/native/managed/cdac/tests/README.mdLink to new stress tests.
src/native/managed/cdac/tests/DataGenerator/TestTarget.csUpdate generator test target Flush.
src/native/managed/cdac/README.mdRemove old GC-stress section (moved to tests).
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader/ContractDescriptorTarget.csFlush now rebuilds descriptors post-flush.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader/CachingContractRegistry.csScope-aware flush forwarding.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/SOSDacImpl.IXCLRDataProcess.csScope-aware flush + private stress request.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/SOSDacImpl.csPropagate flush scope in legacy impl.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/Dbi/DacDbiImpl.csPropagate flush scope for DBI flush.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.DataGenerator/LayoutSetSource.csNew generated helper: multi-source layout resolution.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.DataGenerator/LayoutPairSource.csRemove old layout helper.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.DataGenerator/Emitter.csSwitch generator to LayoutSet.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.DataGenerator/CdacGenerator.csEmit LayoutSet helper conditionally.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/StackWalk/GC/GcScanner.csScratch-slot filtering + deferred frame recording.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/StackWalk/GC/GcScanFlags.csAdd deferred-frame sentinel flag.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/StackWalk/GC/GcScanContext.csEmit deferred-frame sentinel entries.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/Signature/Signature_1.csScope-aware flush signature.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/RuntimeTypeSystem_1.csScope-aware flush signature.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/ReJIT_1.csAvoid caching processed-data snapshot across flushes.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/PlatformMetadata_1.csAvoid caching processed-data snapshot across flushes.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/ManagedTypeSource_1.csRetain metadata caches for TargetState flush.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/GCInfo/PlatformTraits/IGCInfoTraits.csRemove per-trait scratch-slot logic.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/GCInfo/PlatformTraits/ARMGCInfoTraits.csRemove scratch-slot override.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/GCInfo/PlatformTraits/ARM64GCInfoTraits.csRemove scratch-slot override.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/GCInfo/PlatformTraits/AMD64GCInfoTraits.csRemove scratch-slot override.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/GCInfo/IGCInfoDecoder.csExpose scratch/outgoing area size.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/GCInfo/GCInfoDecoder.csProvide scratch/outgoing area size accessor.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/GCInfo/GCInfo_1.csPlumb new GCInfo API surface.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/ExecutionManager/ExecutionManagerCore.csAvoid holding processed-data snapshots across flushes.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/ExecutionManager/ExecutionManager_2.csPlumb scope-aware flush.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/ExecutionManager/ExecutionManager_1.csPlumb scope-aware flush.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/EcmaMetadata_1.csScope-aware flush signature.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Abstractions/Target.csScope-aware target flush behavior.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Abstractions/FlushScope.csNew public flush-scope enum.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Abstractions/Contracts/IGCInfo.csAdd stack-parameter-area size API.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Abstractions/Contracts/IContract.csScope-aware flush signature.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Abstractions/ContractRegistry.csScope-aware registry flush signature.
src/native/managed/cdac/IData.mdUpdate generator docs for LayoutSet.
src/coreclr/vm/gchelpers.cppHook allocation-point verification call sites.
src/coreclr/vm/gccover.cppRemove instruction-level verification hook call sites.
src/coreclr/vm/eeconfig.hRemove legacy GC-stress flag bit.
src/coreclr/vm/common.hInclude cdacstress.h from common header.
src/coreclr/vm/ceemain.cppInit/shutdown via CdacStressPolicy.
src/coreclr/vm/cdacstress.hNew template-based trigger surface (alloc only).
src/coreclr/vm/cdacstress.cppMajor rewrite: RT-as-oracle compare + logging + flush op.
src/coreclr/inc/switches.hDefine CDAC_STRESS under _DEBUG.
src/coreclr/inc/dacprivate.hAdd private stress flush request opcode.
eng/Subsets.propsAdd Tools.CdacStressTests subset.
eng/pipelines/runtime-diagnostics.ymlAdd CdacStressTests stage + platform parameter.
eng/pipelines/cdac/prepare-cdac-stress-helix-steps.ymlNew payload prep + queue selection steps.

Comment threadsrc/coreclr/vm/cdacstress.cpp Outdated
Comment threadsrc/native/managed/cdac/tests/StressTests/RunStressTests.ps1
Comment threadsrc/native/managed/cdac/tests/StressTests/RunStressTests.ps1 Outdated
Comment threadsrc/native/managed/cdac/tests/StressTests/CdacStressTestBase.cs Outdated
Comment threadsrc/native/managed/cdac/tests/StressTests/CdacStressResults.cs Outdated
Comment threadsrc/native/managed/cdac/tests/StressTests/README.md Outdated
@max-charlamb

Copy link
Copy Markdown
MemberAuthor

Closing temporarily to force GitHub to recompute merge state cache (stale DIRTY status). Will reopen immediately.

@max-charlamb

Copy link
Copy Markdown
MemberAuthor

Reopened. Merge state cache should now be re-evaluated.

@max-charlamb
max-charlambforce-pushed the cdac-gc-stress-framework-v2 branch from 0fcd9ae to 908ae73CompareJune 2, 2026 13:10

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 73 out of 73 changed files in this pull request and generated 18 comments.

Comment threadsrc/coreclr/vm/cdacstress.cpp
Comment threadsrc/coreclr/vm/cdacstress.cpp Outdated
Comment threadsrc/coreclr/vm/cdacstress.cpp
Comment threadsrc/coreclr/vm/cdacstress.cpp Outdated
Comment threadsrc/native/managed/cdac/tests/StressTests/RunStressTests.ps1
Comment threadsrc/coreclr/inc/switches.h
Comment threadeng/pipelines/runtime-diagnostics.yml
CopilotAI review requested due to automatic review settings June 2, 2026 17:38

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 73 out of 73 changed files in this pull request and generated 6 comments.

Comment threadsrc/coreclr/vm/cdacstress.cpp
Comment threadsrc/native/managed/cdac/tests/StressTests/BasicCdacStressTests.cs Outdated
Comment threadsrc/native/managed/cdac/tests/StressTests/CdacStressResults.cs Outdated
@max-charlamb
max-charlambforce-pushed the cdac-gc-stress-framework-v2 branch from ec9f832 to 2acefabCompareJune 2, 2026 18:02
CopilotAI review requested due to automatic review settings June 2, 2026 20:02

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 49 out of 49 changed files in this pull request and generated 13 comments.

Comment threadsrc/coreclr/inc/switches.h
Comment threadeng/pipelines/runtime-diagnostics.yml
Comment threadeng/pipelines/cdac/prepare-cdac-stress-helix-steps.yml Outdated
Comment threadsrc/coreclr/vm/cdacstress.cpp
Comment threadsrc/native/managed/cdac/tests/StressTests/RunStressTests.ps1
Comment threadsrc/native/managed/cdac/tests/StressTests/CdacStressResults.cs Outdated
Comment threadsrc/native/managed/cdac/tests/StressTests/CdacStressTestBase.cs Outdated
@max-charlamb
max-charlambforce-pushed the cdac-gc-stress-framework-v2 branch from 0530fa6 to cbb87d6CompareJune 4, 2026 20:33

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 50 out of 50 changed files in this pull request and generated 6 comments.

Comment threadsrc/coreclr/vm/cdacstress.cpp
Comment threadsrc/coreclr/vm/cdacstress.cpp
Comment threadsrc/coreclr/vm/cdacstress.cpp
Comment threadsrc/coreclr/vm/cdacstress.h
…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>
CopilotAI review requested due to automatic review settings June 8, 2026 16:00
@max-charlamb
max-charlambforce-pushed the cdac-gc-stress-framework-v2 branch from 1e6e255 to cc09ab7CompareJune 8, 2026 16:00

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 51 out of 51 changed files in this pull request and generated 4 comments.

Comment threadsrc/coreclr/vm/cdacstress.cpp
Comment threadsrc/coreclr/vm/cdacstress.cpp

@noahfalknoahfalk left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM!

Comment threaddocs/design/datacontracts/StackWalk.md
@max-charlamb

Copy link
Copy Markdown
MemberAuthor

/ba-g known issue on runtime-diagnostics pipeline (which has already fixed)

@max-charlamb
max-charlamb merged commit bba72ce into dotnet:mainJun 9, 2026
194 of 199 checks passed
@max-charlamb
max-charlamb deleted the cdac-gc-stress-framework-v2 branch June 9, 2026 18:59
max-charlamb added a commit that referenced this pull request Jun 14, 2026
…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>
@dotnet-milestone-botdotnet-milestone-botBot added this to the 11.0-preview6 milestone Jun 17, 2026
eiriktsarpalis pushed a commit that referenced this pull request Jul 15, 2026
> [!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>
eiriktsarpalis pushed a commit that referenced this pull request Jul 15, 2026
…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>
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Jul 18, 2026
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants

@max-charlamb@steveisok@noahfalk
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

[cDAC] GC stress verification framework + pipeline integration - #128872

Merged
max-charlamb merged 6 commits into
dotnet:mainfrom
max-charlamb:cdac-gc-stress-framework-v2
Jun 9, 2026
Merged

[cDAC] GC stress verification framework + pipeline integration#128872
max-charlamb merged 6 commits into
dotnet:mainfrom
max-charlamb:cdac-gc-stress-framework-v2

Conversation

@max-charlamb

@max-charlambmax-charlamb commented Jun 1, 2026

Copy link
Copy Markdown
Member

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-[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.
  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.

@dotnet-policy-service

Copy link
Copy Markdown
Contributor

Tagging subscribers to this area: @steveisok, @tommcdon, @dotnet/dotnet-diag
See info in area-owners.md if you want to be subscribed.

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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 cdacstress infrastructure 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 FlushScope and thread it through Target/ContractRegistry/IContract flush plumbing; refactor generator layout helper from LayoutPair to LayoutSet.

Reviewed changes

Copilot reviewed 73 out of 73 changed files in this pull request and generated 9 comments.

Show a summary per file
FileDescription
src/native/managed/cdac/tests/TestPlaceholderTarget.csUpdate test target Flush signature.
src/native/managed/cdac/tests/StressTests/StressTests.targetsBuild/copy orchestration + Helix payload prep.
src/native/managed/cdac/tests/StressTests/RunStressTests.ps1Local runner updates + new options.
src/native/managed/cdac/tests/StressTests/README.mdStress test docs + usage.
src/native/managed/cdac/tests/StressTests/Microsoft.Diagnostics.DataContractReader.StressTests.csprojNew stress test project.
src/native/managed/cdac/tests/StressTests/known-issues.mdKnown-issues taxonomy + log format.
src/native/managed/cdac/tests/StressTests/Debuggees/StructScenarios/StructScenarios.csprojNew debuggee project.
src/native/managed/cdac/tests/StressTests/Debuggees/StructScenarios/Program.csNew struct scenario debuggee.
src/native/managed/cdac/tests/StressTests/Debuggees/PInvoke/Program.csNew P/Invoke debuggee.
src/native/managed/cdac/tests/StressTests/Debuggees/PInvoke/PInvoke.csprojNew debuggee project.
src/native/managed/cdac/tests/StressTests/Debuggees/MultiThread/Program.csNew multithread debuggee.
src/native/managed/cdac/tests/StressTests/Debuggees/MultiThread/MultiThread.csprojNew debuggee project.
src/native/managed/cdac/tests/StressTests/Debuggees/Generics/Program.csNew generics debuggee.
src/native/managed/cdac/tests/StressTests/Debuggees/Generics/Generics.csprojNew debuggee project.
src/native/managed/cdac/tests/StressTests/Debuggees/ExceptionHandling/Program.csNew EH debuggee.
src/native/managed/cdac/tests/StressTests/Debuggees/ExceptionHandling/ExceptionHandling.csprojNew debuggee project.
src/native/managed/cdac/tests/StressTests/Debuggees/DynamicMethods/Program.csNew DynamicMethod debuggee.
src/native/managed/cdac/tests/StressTests/Debuggees/DynamicMethods/DynamicMethods.csprojNew debuggee project.
src/native/managed/cdac/tests/StressTests/Debuggees/DeepStack/Program.csNew deep stack debuggee.
src/native/managed/cdac/tests/StressTests/Debuggees/DeepStack/DeepStack.csprojNew debuggee project.
src/native/managed/cdac/tests/StressTests/CdacStressTestBase.csTest harness: launch corerun, parse logs.
src/native/managed/cdac/tests/StressTests/CdacStressResults.csStress-log parser + analysis formatting.
src/native/managed/cdac/tests/StressTests/cdac-stress-helix.projHelix work item definition.
src/native/managed/cdac/tests/StressTests/BasicCdacStressTests.csDebuggee-driven xUnit tests.
src/native/managed/cdac/tests/README.mdLink to new stress tests.
src/native/managed/cdac/tests/DataGenerator/TestTarget.csUpdate generator test target Flush.
src/native/managed/cdac/README.mdRemove old GC-stress section (moved to tests).
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader/ContractDescriptorTarget.csFlush now rebuilds descriptors post-flush.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader/CachingContractRegistry.csScope-aware flush forwarding.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/SOSDacImpl.IXCLRDataProcess.csScope-aware flush + private stress request.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/SOSDacImpl.csPropagate flush scope in legacy impl.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/Dbi/DacDbiImpl.csPropagate flush scope for DBI flush.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.DataGenerator/LayoutSetSource.csNew generated helper: multi-source layout resolution.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.DataGenerator/LayoutPairSource.csRemove old layout helper.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.DataGenerator/Emitter.csSwitch generator to LayoutSet.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.DataGenerator/CdacGenerator.csEmit LayoutSet helper conditionally.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/StackWalk/GC/GcScanner.csScratch-slot filtering + deferred frame recording.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/StackWalk/GC/GcScanFlags.csAdd deferred-frame sentinel flag.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/StackWalk/GC/GcScanContext.csEmit deferred-frame sentinel entries.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/Signature/Signature_1.csScope-aware flush signature.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/RuntimeTypeSystem_1.csScope-aware flush signature.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/ReJIT_1.csAvoid caching processed-data snapshot across flushes.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/PlatformMetadata_1.csAvoid caching processed-data snapshot across flushes.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/ManagedTypeSource_1.csRetain metadata caches for TargetState flush.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/GCInfo/PlatformTraits/IGCInfoTraits.csRemove per-trait scratch-slot logic.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/GCInfo/PlatformTraits/ARMGCInfoTraits.csRemove scratch-slot override.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/GCInfo/PlatformTraits/ARM64GCInfoTraits.csRemove scratch-slot override.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/GCInfo/PlatformTraits/AMD64GCInfoTraits.csRemove scratch-slot override.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/GCInfo/IGCInfoDecoder.csExpose scratch/outgoing area size.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/GCInfo/GCInfoDecoder.csProvide scratch/outgoing area size accessor.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/GCInfo/GCInfo_1.csPlumb new GCInfo API surface.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/ExecutionManager/ExecutionManagerCore.csAvoid holding processed-data snapshots across flushes.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/ExecutionManager/ExecutionManager_2.csPlumb scope-aware flush.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/ExecutionManager/ExecutionManager_1.csPlumb scope-aware flush.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/EcmaMetadata_1.csScope-aware flush signature.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Abstractions/Target.csScope-aware target flush behavior.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Abstractions/FlushScope.csNew public flush-scope enum.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Abstractions/Contracts/IGCInfo.csAdd stack-parameter-area size API.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Abstractions/Contracts/IContract.csScope-aware flush signature.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Abstractions/ContractRegistry.csScope-aware registry flush signature.
src/native/managed/cdac/IData.mdUpdate generator docs for LayoutSet.
src/coreclr/vm/gchelpers.cppHook allocation-point verification call sites.
src/coreclr/vm/gccover.cppRemove instruction-level verification hook call sites.
src/coreclr/vm/eeconfig.hRemove legacy GC-stress flag bit.
src/coreclr/vm/common.hInclude cdacstress.h from common header.
src/coreclr/vm/ceemain.cppInit/shutdown via CdacStressPolicy.
src/coreclr/vm/cdacstress.hNew template-based trigger surface (alloc only).
src/coreclr/vm/cdacstress.cppMajor rewrite: RT-as-oracle compare + logging + flush op.
src/coreclr/inc/switches.hDefine CDAC_STRESS under _DEBUG.
src/coreclr/inc/dacprivate.hAdd private stress flush request opcode.
eng/Subsets.propsAdd Tools.CdacStressTests subset.
eng/pipelines/runtime-diagnostics.ymlAdd CdacStressTests stage + platform parameter.
eng/pipelines/cdac/prepare-cdac-stress-helix-steps.ymlNew payload prep + queue selection steps.

Comment threadsrc/coreclr/vm/cdacstress.cpp Outdated
Comment threadsrc/native/managed/cdac/tests/StressTests/RunStressTests.ps1
Comment threadsrc/native/managed/cdac/tests/StressTests/RunStressTests.ps1 Outdated
Comment threadsrc/native/managed/cdac/tests/StressTests/CdacStressTestBase.cs Outdated
Comment threadsrc/native/managed/cdac/tests/StressTests/CdacStressResults.cs Outdated
Comment threadsrc/native/managed/cdac/tests/StressTests/README.md Outdated
@max-charlamb

Copy link
Copy Markdown
MemberAuthor

Closing temporarily to force GitHub to recompute merge state cache (stale DIRTY status). Will reopen immediately.

@max-charlamb

Copy link
Copy Markdown
MemberAuthor

Reopened. Merge state cache should now be re-evaluated.

@max-charlamb
max-charlambforce-pushed the cdac-gc-stress-framework-v2 branch from 0fcd9ae to 908ae73CompareJune 2, 2026 13:10

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 73 out of 73 changed files in this pull request and generated 18 comments.

Comment threadsrc/coreclr/vm/cdacstress.cpp
Comment threadsrc/coreclr/vm/cdacstress.cpp Outdated
Comment threadsrc/coreclr/vm/cdacstress.cpp
Comment threadsrc/coreclr/vm/cdacstress.cpp Outdated
Comment threadsrc/native/managed/cdac/tests/StressTests/RunStressTests.ps1
Comment threadsrc/coreclr/inc/switches.h
Comment threadeng/pipelines/runtime-diagnostics.yml
CopilotAI review requested due to automatic review settings June 2, 2026 17:38

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 73 out of 73 changed files in this pull request and generated 6 comments.

Comment threadsrc/coreclr/vm/cdacstress.cpp
Comment threadsrc/native/managed/cdac/tests/StressTests/BasicCdacStressTests.cs Outdated
Comment threadsrc/native/managed/cdac/tests/StressTests/CdacStressResults.cs Outdated
@max-charlamb
max-charlambforce-pushed the cdac-gc-stress-framework-v2 branch from ec9f832 to 2acefabCompareJune 2, 2026 18:02
CopilotAI review requested due to automatic review settings June 2, 2026 20:02

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 49 out of 49 changed files in this pull request and generated 13 comments.

Comment threadsrc/coreclr/inc/switches.h
Comment threadeng/pipelines/runtime-diagnostics.yml
Comment threadeng/pipelines/cdac/prepare-cdac-stress-helix-steps.yml Outdated
Comment threadsrc/coreclr/vm/cdacstress.cpp
Comment threadsrc/native/managed/cdac/tests/StressTests/RunStressTests.ps1
Comment threadsrc/native/managed/cdac/tests/StressTests/CdacStressResults.cs Outdated
Comment threadsrc/native/managed/cdac/tests/StressTests/CdacStressTestBase.cs Outdated
@max-charlamb
max-charlambforce-pushed the cdac-gc-stress-framework-v2 branch from 0530fa6 to cbb87d6CompareJune 4, 2026 20:33

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 50 out of 50 changed files in this pull request and generated 6 comments.

Comment threadsrc/coreclr/vm/cdacstress.cpp
Comment threadsrc/coreclr/vm/cdacstress.cpp
Comment threadsrc/coreclr/vm/cdacstress.cpp
Comment threadsrc/coreclr/vm/cdacstress.h
…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>
CopilotAI review requested due to automatic review settings June 8, 2026 16:00
@max-charlamb
max-charlambforce-pushed the cdac-gc-stress-framework-v2 branch from 1e6e255 to cc09ab7CompareJune 8, 2026 16:00

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 51 out of 51 changed files in this pull request and generated 4 comments.

Comment threadsrc/coreclr/vm/cdacstress.cpp
Comment threadsrc/coreclr/vm/cdacstress.cpp

@noahfalknoahfalk left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM!

Comment threaddocs/design/datacontracts/StackWalk.md
@max-charlamb

Copy link
Copy Markdown
MemberAuthor

/ba-g known issue on runtime-diagnostics pipeline (which has already fixed)

@max-charlamb
max-charlamb merged commit bba72ce into dotnet:mainJun 9, 2026
194 of 199 checks passed
@max-charlamb
max-charlamb deleted the cdac-gc-stress-framework-v2 branch June 9, 2026 18:59
max-charlamb added a commit that referenced this pull request Jun 14, 2026
…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>
@dotnet-milestone-botdotnet-milestone-botBot added this to the 11.0-preview6 milestone Jun 17, 2026
eiriktsarpalis pushed a commit that referenced this pull request Jul 15, 2026
> [!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>
eiriktsarpalis pushed a commit that referenced this pull request Jul 15, 2026
…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>
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Jul 18, 2026
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants

@max-charlamb@steveisok@noahfalk
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

[cDAC] GC stress verification framework + pipeline integration - #128872

Merged
max-charlamb merged 6 commits into
dotnet:mainfrom
max-charlamb:cdac-gc-stress-framework-v2
Jun 9, 2026
Merged

[cDAC] GC stress verification framework + pipeline integration#128872
max-charlamb merged 6 commits into
dotnet:mainfrom
max-charlamb:cdac-gc-stress-framework-v2

Conversation

@max-charlamb

@max-charlambmax-charlamb commented Jun 1, 2026

Copy link
Copy Markdown
Member

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-[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.
  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.

@dotnet-policy-service

Copy link
Copy Markdown
Contributor

Tagging subscribers to this area: @steveisok, @tommcdon, @dotnet/dotnet-diag
See info in area-owners.md if you want to be subscribed.

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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 cdacstress infrastructure 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 FlushScope and thread it through Target/ContractRegistry/IContract flush plumbing; refactor generator layout helper from LayoutPair to LayoutSet.

Reviewed changes

Copilot reviewed 73 out of 73 changed files in this pull request and generated 9 comments.

Show a summary per file
FileDescription
src/native/managed/cdac/tests/TestPlaceholderTarget.csUpdate test target Flush signature.
src/native/managed/cdac/tests/StressTests/StressTests.targetsBuild/copy orchestration + Helix payload prep.
src/native/managed/cdac/tests/StressTests/RunStressTests.ps1Local runner updates + new options.
src/native/managed/cdac/tests/StressTests/README.mdStress test docs + usage.
src/native/managed/cdac/tests/StressTests/Microsoft.Diagnostics.DataContractReader.StressTests.csprojNew stress test project.
src/native/managed/cdac/tests/StressTests/known-issues.mdKnown-issues taxonomy + log format.
src/native/managed/cdac/tests/StressTests/Debuggees/StructScenarios/StructScenarios.csprojNew debuggee project.
src/native/managed/cdac/tests/StressTests/Debuggees/StructScenarios/Program.csNew struct scenario debuggee.
src/native/managed/cdac/tests/StressTests/Debuggees/PInvoke/Program.csNew P/Invoke debuggee.
src/native/managed/cdac/tests/StressTests/Debuggees/PInvoke/PInvoke.csprojNew debuggee project.
src/native/managed/cdac/tests/StressTests/Debuggees/MultiThread/Program.csNew multithread debuggee.
src/native/managed/cdac/tests/StressTests/Debuggees/MultiThread/MultiThread.csprojNew debuggee project.
src/native/managed/cdac/tests/StressTests/Debuggees/Generics/Program.csNew generics debuggee.
src/native/managed/cdac/tests/StressTests/Debuggees/Generics/Generics.csprojNew debuggee project.
src/native/managed/cdac/tests/StressTests/Debuggees/ExceptionHandling/Program.csNew EH debuggee.
src/native/managed/cdac/tests/StressTests/Debuggees/ExceptionHandling/ExceptionHandling.csprojNew debuggee project.
src/native/managed/cdac/tests/StressTests/Debuggees/DynamicMethods/Program.csNew DynamicMethod debuggee.
src/native/managed/cdac/tests/StressTests/Debuggees/DynamicMethods/DynamicMethods.csprojNew debuggee project.
src/native/managed/cdac/tests/StressTests/Debuggees/DeepStack/Program.csNew deep stack debuggee.
src/native/managed/cdac/tests/StressTests/Debuggees/DeepStack/DeepStack.csprojNew debuggee project.
src/native/managed/cdac/tests/StressTests/CdacStressTestBase.csTest harness: launch corerun, parse logs.
src/native/managed/cdac/tests/StressTests/CdacStressResults.csStress-log parser + analysis formatting.
src/native/managed/cdac/tests/StressTests/cdac-stress-helix.projHelix work item definition.
src/native/managed/cdac/tests/StressTests/BasicCdacStressTests.csDebuggee-driven xUnit tests.
src/native/managed/cdac/tests/README.mdLink to new stress tests.
src/native/managed/cdac/tests/DataGenerator/TestTarget.csUpdate generator test target Flush.
src/native/managed/cdac/README.mdRemove old GC-stress section (moved to tests).
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader/ContractDescriptorTarget.csFlush now rebuilds descriptors post-flush.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader/CachingContractRegistry.csScope-aware flush forwarding.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/SOSDacImpl.IXCLRDataProcess.csScope-aware flush + private stress request.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/SOSDacImpl.csPropagate flush scope in legacy impl.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/Dbi/DacDbiImpl.csPropagate flush scope for DBI flush.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.DataGenerator/LayoutSetSource.csNew generated helper: multi-source layout resolution.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.DataGenerator/LayoutPairSource.csRemove old layout helper.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.DataGenerator/Emitter.csSwitch generator to LayoutSet.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.DataGenerator/CdacGenerator.csEmit LayoutSet helper conditionally.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/StackWalk/GC/GcScanner.csScratch-slot filtering + deferred frame recording.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/StackWalk/GC/GcScanFlags.csAdd deferred-frame sentinel flag.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/StackWalk/GC/GcScanContext.csEmit deferred-frame sentinel entries.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/Signature/Signature_1.csScope-aware flush signature.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/RuntimeTypeSystem_1.csScope-aware flush signature.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/ReJIT_1.csAvoid caching processed-data snapshot across flushes.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/PlatformMetadata_1.csAvoid caching processed-data snapshot across flushes.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/ManagedTypeSource_1.csRetain metadata caches for TargetState flush.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/GCInfo/PlatformTraits/IGCInfoTraits.csRemove per-trait scratch-slot logic.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/GCInfo/PlatformTraits/ARMGCInfoTraits.csRemove scratch-slot override.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/GCInfo/PlatformTraits/ARM64GCInfoTraits.csRemove scratch-slot override.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/GCInfo/PlatformTraits/AMD64GCInfoTraits.csRemove scratch-slot override.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/GCInfo/IGCInfoDecoder.csExpose scratch/outgoing area size.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/GCInfo/GCInfoDecoder.csProvide scratch/outgoing area size accessor.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/GCInfo/GCInfo_1.csPlumb new GCInfo API surface.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/ExecutionManager/ExecutionManagerCore.csAvoid holding processed-data snapshots across flushes.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/ExecutionManager/ExecutionManager_2.csPlumb scope-aware flush.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/ExecutionManager/ExecutionManager_1.csPlumb scope-aware flush.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/EcmaMetadata_1.csScope-aware flush signature.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Abstractions/Target.csScope-aware target flush behavior.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Abstractions/FlushScope.csNew public flush-scope enum.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Abstractions/Contracts/IGCInfo.csAdd stack-parameter-area size API.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Abstractions/Contracts/IContract.csScope-aware flush signature.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Abstractions/ContractRegistry.csScope-aware registry flush signature.
src/native/managed/cdac/IData.mdUpdate generator docs for LayoutSet.
src/coreclr/vm/gchelpers.cppHook allocation-point verification call sites.
src/coreclr/vm/gccover.cppRemove instruction-level verification hook call sites.
src/coreclr/vm/eeconfig.hRemove legacy GC-stress flag bit.
src/coreclr/vm/common.hInclude cdacstress.h from common header.
src/coreclr/vm/ceemain.cppInit/shutdown via CdacStressPolicy.
src/coreclr/vm/cdacstress.hNew template-based trigger surface (alloc only).
src/coreclr/vm/cdacstress.cppMajor rewrite: RT-as-oracle compare + logging + flush op.
src/coreclr/inc/switches.hDefine CDAC_STRESS under _DEBUG.
src/coreclr/inc/dacprivate.hAdd private stress flush request opcode.
eng/Subsets.propsAdd Tools.CdacStressTests subset.
eng/pipelines/runtime-diagnostics.ymlAdd CdacStressTests stage + platform parameter.
eng/pipelines/cdac/prepare-cdac-stress-helix-steps.ymlNew payload prep + queue selection steps.

Comment threadsrc/coreclr/vm/cdacstress.cpp Outdated
Comment threadsrc/native/managed/cdac/tests/StressTests/RunStressTests.ps1
Comment threadsrc/native/managed/cdac/tests/StressTests/RunStressTests.ps1 Outdated
Comment threadsrc/native/managed/cdac/tests/StressTests/CdacStressTestBase.cs Outdated
Comment threadsrc/native/managed/cdac/tests/StressTests/CdacStressResults.cs Outdated
Comment threadsrc/native/managed/cdac/tests/StressTests/README.md Outdated
@max-charlamb

Copy link
Copy Markdown
MemberAuthor

Closing temporarily to force GitHub to recompute merge state cache (stale DIRTY status). Will reopen immediately.

@max-charlamb

Copy link
Copy Markdown
MemberAuthor

Reopened. Merge state cache should now be re-evaluated.

@max-charlamb
max-charlambforce-pushed the cdac-gc-stress-framework-v2 branch from 0fcd9ae to 908ae73CompareJune 2, 2026 13:10

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 73 out of 73 changed files in this pull request and generated 18 comments.

Comment threadsrc/coreclr/vm/cdacstress.cpp
Comment threadsrc/coreclr/vm/cdacstress.cpp Outdated
Comment threadsrc/coreclr/vm/cdacstress.cpp
Comment threadsrc/coreclr/vm/cdacstress.cpp Outdated
Comment threadsrc/native/managed/cdac/tests/StressTests/RunStressTests.ps1
Comment threadsrc/coreclr/inc/switches.h
Comment threadeng/pipelines/runtime-diagnostics.yml
CopilotAI review requested due to automatic review settings June 2, 2026 17:38

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 73 out of 73 changed files in this pull request and generated 6 comments.

Comment threadsrc/coreclr/vm/cdacstress.cpp
Comment threadsrc/native/managed/cdac/tests/StressTests/BasicCdacStressTests.cs Outdated
Comment threadsrc/native/managed/cdac/tests/StressTests/CdacStressResults.cs Outdated
@max-charlamb
max-charlambforce-pushed the cdac-gc-stress-framework-v2 branch from ec9f832 to 2acefabCompareJune 2, 2026 18:02
CopilotAI review requested due to automatic review settings June 2, 2026 20:02

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 49 out of 49 changed files in this pull request and generated 13 comments.

Comment threadsrc/coreclr/inc/switches.h
Comment threadeng/pipelines/runtime-diagnostics.yml
Comment threadeng/pipelines/cdac/prepare-cdac-stress-helix-steps.yml Outdated
Comment threadsrc/coreclr/vm/cdacstress.cpp
Comment threadsrc/native/managed/cdac/tests/StressTests/RunStressTests.ps1
Comment threadsrc/native/managed/cdac/tests/StressTests/CdacStressResults.cs Outdated
Comment threadsrc/native/managed/cdac/tests/StressTests/CdacStressTestBase.cs Outdated
@max-charlamb
max-charlambforce-pushed the cdac-gc-stress-framework-v2 branch from 0530fa6 to cbb87d6CompareJune 4, 2026 20:33

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 50 out of 50 changed files in this pull request and generated 6 comments.

Comment threadsrc/coreclr/vm/cdacstress.cpp
Comment threadsrc/coreclr/vm/cdacstress.cpp
Comment threadsrc/coreclr/vm/cdacstress.cpp
Comment threadsrc/coreclr/vm/cdacstress.h
…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>
CopilotAI review requested due to automatic review settings June 8, 2026 16:00
@max-charlamb
max-charlambforce-pushed the cdac-gc-stress-framework-v2 branch from 1e6e255 to cc09ab7CompareJune 8, 2026 16:00

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 51 out of 51 changed files in this pull request and generated 4 comments.

Comment threadsrc/coreclr/vm/cdacstress.cpp
Comment threadsrc/coreclr/vm/cdacstress.cpp

@noahfalknoahfalk left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM!

Comment threaddocs/design/datacontracts/StackWalk.md
@max-charlamb

Copy link
Copy Markdown
MemberAuthor

/ba-g known issue on runtime-diagnostics pipeline (which has already fixed)

@max-charlamb
max-charlamb merged commit bba72ce into dotnet:mainJun 9, 2026
194 of 199 checks passed
@max-charlamb
max-charlamb deleted the cdac-gc-stress-framework-v2 branch June 9, 2026 18:59
max-charlamb added a commit that referenced this pull request Jun 14, 2026
…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>
@dotnet-milestone-botdotnet-milestone-botBot added this to the 11.0-preview6 milestone Jun 17, 2026
eiriktsarpalis pushed a commit that referenced this pull request Jul 15, 2026
> [!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>
eiriktsarpalis pushed a commit that referenced this pull request Jul 15, 2026
…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>
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Jul 18, 2026
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants

@max-charlamb@steveisok@noahfalk
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

[cDAC] GC stress verification framework + pipeline integration - #128872

Merged
max-charlamb merged 6 commits into
dotnet:mainfrom
max-charlamb:cdac-gc-stress-framework-v2
Jun 9, 2026
Merged

[cDAC] GC stress verification framework + pipeline integration#128872
max-charlamb merged 6 commits into
dotnet:mainfrom
max-charlamb:cdac-gc-stress-framework-v2

Conversation

@max-charlamb

@max-charlambmax-charlamb commented Jun 1, 2026

Copy link
Copy Markdown
Member

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-[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.
  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.

@dotnet-policy-service

Copy link
Copy Markdown
Contributor

Tagging subscribers to this area: @steveisok, @tommcdon, @dotnet/dotnet-diag
See info in area-owners.md if you want to be subscribed.

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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 cdacstress infrastructure 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 FlushScope and thread it through Target/ContractRegistry/IContract flush plumbing; refactor generator layout helper from LayoutPair to LayoutSet.

Reviewed changes

Copilot reviewed 73 out of 73 changed files in this pull request and generated 9 comments.

Show a summary per file
FileDescription
src/native/managed/cdac/tests/TestPlaceholderTarget.csUpdate test target Flush signature.
src/native/managed/cdac/tests/StressTests/StressTests.targetsBuild/copy orchestration + Helix payload prep.
src/native/managed/cdac/tests/StressTests/RunStressTests.ps1Local runner updates + new options.
src/native/managed/cdac/tests/StressTests/README.mdStress test docs + usage.
src/native/managed/cdac/tests/StressTests/Microsoft.Diagnostics.DataContractReader.StressTests.csprojNew stress test project.
src/native/managed/cdac/tests/StressTests/known-issues.mdKnown-issues taxonomy + log format.
src/native/managed/cdac/tests/StressTests/Debuggees/StructScenarios/StructScenarios.csprojNew debuggee project.
src/native/managed/cdac/tests/StressTests/Debuggees/StructScenarios/Program.csNew struct scenario debuggee.
src/native/managed/cdac/tests/StressTests/Debuggees/PInvoke/Program.csNew P/Invoke debuggee.
src/native/managed/cdac/tests/StressTests/Debuggees/PInvoke/PInvoke.csprojNew debuggee project.
src/native/managed/cdac/tests/StressTests/Debuggees/MultiThread/Program.csNew multithread debuggee.
src/native/managed/cdac/tests/StressTests/Debuggees/MultiThread/MultiThread.csprojNew debuggee project.
src/native/managed/cdac/tests/StressTests/Debuggees/Generics/Program.csNew generics debuggee.
src/native/managed/cdac/tests/StressTests/Debuggees/Generics/Generics.csprojNew debuggee project.
src/native/managed/cdac/tests/StressTests/Debuggees/ExceptionHandling/Program.csNew EH debuggee.
src/native/managed/cdac/tests/StressTests/Debuggees/ExceptionHandling/ExceptionHandling.csprojNew debuggee project.
src/native/managed/cdac/tests/StressTests/Debuggees/DynamicMethods/Program.csNew DynamicMethod debuggee.
src/native/managed/cdac/tests/StressTests/Debuggees/DynamicMethods/DynamicMethods.csprojNew debuggee project.
src/native/managed/cdac/tests/StressTests/Debuggees/DeepStack/Program.csNew deep stack debuggee.
src/native/managed/cdac/tests/StressTests/Debuggees/DeepStack/DeepStack.csprojNew debuggee project.
src/native/managed/cdac/tests/StressTests/CdacStressTestBase.csTest harness: launch corerun, parse logs.
src/native/managed/cdac/tests/StressTests/CdacStressResults.csStress-log parser + analysis formatting.
src/native/managed/cdac/tests/StressTests/cdac-stress-helix.projHelix work item definition.
src/native/managed/cdac/tests/StressTests/BasicCdacStressTests.csDebuggee-driven xUnit tests.
src/native/managed/cdac/tests/README.mdLink to new stress tests.
src/native/managed/cdac/tests/DataGenerator/TestTarget.csUpdate generator test target Flush.
src/native/managed/cdac/README.mdRemove old GC-stress section (moved to tests).
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader/ContractDescriptorTarget.csFlush now rebuilds descriptors post-flush.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader/CachingContractRegistry.csScope-aware flush forwarding.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/SOSDacImpl.IXCLRDataProcess.csScope-aware flush + private stress request.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/SOSDacImpl.csPropagate flush scope in legacy impl.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/Dbi/DacDbiImpl.csPropagate flush scope for DBI flush.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.DataGenerator/LayoutSetSource.csNew generated helper: multi-source layout resolution.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.DataGenerator/LayoutPairSource.csRemove old layout helper.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.DataGenerator/Emitter.csSwitch generator to LayoutSet.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.DataGenerator/CdacGenerator.csEmit LayoutSet helper conditionally.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/StackWalk/GC/GcScanner.csScratch-slot filtering + deferred frame recording.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/StackWalk/GC/GcScanFlags.csAdd deferred-frame sentinel flag.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/StackWalk/GC/GcScanContext.csEmit deferred-frame sentinel entries.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/Signature/Signature_1.csScope-aware flush signature.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/RuntimeTypeSystem_1.csScope-aware flush signature.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/ReJIT_1.csAvoid caching processed-data snapshot across flushes.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/PlatformMetadata_1.csAvoid caching processed-data snapshot across flushes.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/ManagedTypeSource_1.csRetain metadata caches for TargetState flush.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/GCInfo/PlatformTraits/IGCInfoTraits.csRemove per-trait scratch-slot logic.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/GCInfo/PlatformTraits/ARMGCInfoTraits.csRemove scratch-slot override.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/GCInfo/PlatformTraits/ARM64GCInfoTraits.csRemove scratch-slot override.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/GCInfo/PlatformTraits/AMD64GCInfoTraits.csRemove scratch-slot override.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/GCInfo/IGCInfoDecoder.csExpose scratch/outgoing area size.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/GCInfo/GCInfoDecoder.csProvide scratch/outgoing area size accessor.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/GCInfo/GCInfo_1.csPlumb new GCInfo API surface.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/ExecutionManager/ExecutionManagerCore.csAvoid holding processed-data snapshots across flushes.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/ExecutionManager/ExecutionManager_2.csPlumb scope-aware flush.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/ExecutionManager/ExecutionManager_1.csPlumb scope-aware flush.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/EcmaMetadata_1.csScope-aware flush signature.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Abstractions/Target.csScope-aware target flush behavior.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Abstractions/FlushScope.csNew public flush-scope enum.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Abstractions/Contracts/IGCInfo.csAdd stack-parameter-area size API.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Abstractions/Contracts/IContract.csScope-aware flush signature.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Abstractions/ContractRegistry.csScope-aware registry flush signature.
src/native/managed/cdac/IData.mdUpdate generator docs for LayoutSet.
src/coreclr/vm/gchelpers.cppHook allocation-point verification call sites.
src/coreclr/vm/gccover.cppRemove instruction-level verification hook call sites.
src/coreclr/vm/eeconfig.hRemove legacy GC-stress flag bit.
src/coreclr/vm/common.hInclude cdacstress.h from common header.
src/coreclr/vm/ceemain.cppInit/shutdown via CdacStressPolicy.
src/coreclr/vm/cdacstress.hNew template-based trigger surface (alloc only).
src/coreclr/vm/cdacstress.cppMajor rewrite: RT-as-oracle compare + logging + flush op.
src/coreclr/inc/switches.hDefine CDAC_STRESS under _DEBUG.
src/coreclr/inc/dacprivate.hAdd private stress flush request opcode.
eng/Subsets.propsAdd Tools.CdacStressTests subset.
eng/pipelines/runtime-diagnostics.ymlAdd CdacStressTests stage + platform parameter.
eng/pipelines/cdac/prepare-cdac-stress-helix-steps.ymlNew payload prep + queue selection steps.

Comment threadsrc/coreclr/vm/cdacstress.cpp Outdated
Comment threadsrc/native/managed/cdac/tests/StressTests/RunStressTests.ps1
Comment threadsrc/native/managed/cdac/tests/StressTests/RunStressTests.ps1 Outdated
Comment threadsrc/native/managed/cdac/tests/StressTests/CdacStressTestBase.cs Outdated
Comment threadsrc/native/managed/cdac/tests/StressTests/CdacStressResults.cs Outdated
Comment threadsrc/native/managed/cdac/tests/StressTests/README.md Outdated
@max-charlamb

Copy link
Copy Markdown
MemberAuthor

Closing temporarily to force GitHub to recompute merge state cache (stale DIRTY status). Will reopen immediately.

@max-charlamb

Copy link
Copy Markdown
MemberAuthor

Reopened. Merge state cache should now be re-evaluated.

@max-charlamb
max-charlambforce-pushed the cdac-gc-stress-framework-v2 branch from 0fcd9ae to 908ae73CompareJune 2, 2026 13:10

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 73 out of 73 changed files in this pull request and generated 18 comments.

Comment threadsrc/coreclr/vm/cdacstress.cpp
Comment threadsrc/coreclr/vm/cdacstress.cpp Outdated
Comment threadsrc/coreclr/vm/cdacstress.cpp
Comment threadsrc/coreclr/vm/cdacstress.cpp Outdated
Comment threadsrc/native/managed/cdac/tests/StressTests/RunStressTests.ps1
Comment threadsrc/coreclr/inc/switches.h
Comment threadeng/pipelines/runtime-diagnostics.yml
CopilotAI review requested due to automatic review settings June 2, 2026 17:38

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 73 out of 73 changed files in this pull request and generated 6 comments.

Comment threadsrc/coreclr/vm/cdacstress.cpp
Comment threadsrc/native/managed/cdac/tests/StressTests/BasicCdacStressTests.cs Outdated
Comment threadsrc/native/managed/cdac/tests/StressTests/CdacStressResults.cs Outdated
@max-charlamb
max-charlambforce-pushed the cdac-gc-stress-framework-v2 branch from ec9f832 to 2acefabCompareJune 2, 2026 18:02
CopilotAI review requested due to automatic review settings June 2, 2026 20:02

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 49 out of 49 changed files in this pull request and generated 13 comments.

Comment threadsrc/coreclr/inc/switches.h
Comment threadeng/pipelines/runtime-diagnostics.yml
Comment threadeng/pipelines/cdac/prepare-cdac-stress-helix-steps.yml Outdated
Comment threadsrc/coreclr/vm/cdacstress.cpp
Comment threadsrc/native/managed/cdac/tests/StressTests/RunStressTests.ps1
Comment threadsrc/native/managed/cdac/tests/StressTests/CdacStressResults.cs Outdated
Comment threadsrc/native/managed/cdac/tests/StressTests/CdacStressTestBase.cs Outdated
@max-charlamb
max-charlambforce-pushed the cdac-gc-stress-framework-v2 branch from 0530fa6 to cbb87d6CompareJune 4, 2026 20:33

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 50 out of 50 changed files in this pull request and generated 6 comments.

Comment threadsrc/coreclr/vm/cdacstress.cpp
Comment threadsrc/coreclr/vm/cdacstress.cpp
Comment threadsrc/coreclr/vm/cdacstress.cpp
Comment threadsrc/coreclr/vm/cdacstress.h
…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>
CopilotAI review requested due to automatic review settings June 8, 2026 16:00
@max-charlamb
max-charlambforce-pushed the cdac-gc-stress-framework-v2 branch from 1e6e255 to cc09ab7CompareJune 8, 2026 16:00

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 51 out of 51 changed files in this pull request and generated 4 comments.

Comment threadsrc/coreclr/vm/cdacstress.cpp
Comment threadsrc/coreclr/vm/cdacstress.cpp

@noahfalknoahfalk left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM!

Comment threaddocs/design/datacontracts/StackWalk.md
@max-charlamb

Copy link
Copy Markdown
MemberAuthor

/ba-g known issue on runtime-diagnostics pipeline (which has already fixed)

@max-charlamb
max-charlamb merged commit bba72ce into dotnet:mainJun 9, 2026
194 of 199 checks passed
@max-charlamb
max-charlamb deleted the cdac-gc-stress-framework-v2 branch June 9, 2026 18:59
max-charlamb added a commit that referenced this pull request Jun 14, 2026
…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>
@dotnet-milestone-botdotnet-milestone-botBot added this to the 11.0-preview6 milestone Jun 17, 2026
eiriktsarpalis pushed a commit that referenced this pull request Jul 15, 2026
> [!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>
eiriktsarpalis pushed a commit that referenced this pull request Jul 15, 2026
…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>
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Jul 18, 2026
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants

@max-charlamb@steveisok@noahfalk
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

[cDAC] GC stress verification framework + pipeline integration - #128872

Merged
max-charlamb merged 6 commits into
dotnet:mainfrom
max-charlamb:cdac-gc-stress-framework-v2
Jun 9, 2026
Merged

[cDAC] GC stress verification framework + pipeline integration#128872
max-charlamb merged 6 commits into
dotnet:mainfrom
max-charlamb:cdac-gc-stress-framework-v2

Conversation

@max-charlamb

@max-charlambmax-charlamb commented Jun 1, 2026

Copy link
Copy Markdown
Member

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-[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.
  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.

@dotnet-policy-service

Copy link
Copy Markdown
Contributor

Tagging subscribers to this area: @steveisok, @tommcdon, @dotnet/dotnet-diag
See info in area-owners.md if you want to be subscribed.

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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 cdacstress infrastructure 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 FlushScope and thread it through Target/ContractRegistry/IContract flush plumbing; refactor generator layout helper from LayoutPair to LayoutSet.

Reviewed changes

Copilot reviewed 73 out of 73 changed files in this pull request and generated 9 comments.

Show a summary per file
FileDescription
src/native/managed/cdac/tests/TestPlaceholderTarget.csUpdate test target Flush signature.
src/native/managed/cdac/tests/StressTests/StressTests.targetsBuild/copy orchestration + Helix payload prep.
src/native/managed/cdac/tests/StressTests/RunStressTests.ps1Local runner updates + new options.
src/native/managed/cdac/tests/StressTests/README.mdStress test docs + usage.
src/native/managed/cdac/tests/StressTests/Microsoft.Diagnostics.DataContractReader.StressTests.csprojNew stress test project.
src/native/managed/cdac/tests/StressTests/known-issues.mdKnown-issues taxonomy + log format.
src/native/managed/cdac/tests/StressTests/Debuggees/StructScenarios/StructScenarios.csprojNew debuggee project.
src/native/managed/cdac/tests/StressTests/Debuggees/StructScenarios/Program.csNew struct scenario debuggee.
src/native/managed/cdac/tests/StressTests/Debuggees/PInvoke/Program.csNew P/Invoke debuggee.
src/native/managed/cdac/tests/StressTests/Debuggees/PInvoke/PInvoke.csprojNew debuggee project.
src/native/managed/cdac/tests/StressTests/Debuggees/MultiThread/Program.csNew multithread debuggee.
src/native/managed/cdac/tests/StressTests/Debuggees/MultiThread/MultiThread.csprojNew debuggee project.
src/native/managed/cdac/tests/StressTests/Debuggees/Generics/Program.csNew generics debuggee.
src/native/managed/cdac/tests/StressTests/Debuggees/Generics/Generics.csprojNew debuggee project.
src/native/managed/cdac/tests/StressTests/Debuggees/ExceptionHandling/Program.csNew EH debuggee.
src/native/managed/cdac/tests/StressTests/Debuggees/ExceptionHandling/ExceptionHandling.csprojNew debuggee project.
src/native/managed/cdac/tests/StressTests/Debuggees/DynamicMethods/Program.csNew DynamicMethod debuggee.
src/native/managed/cdac/tests/StressTests/Debuggees/DynamicMethods/DynamicMethods.csprojNew debuggee project.
src/native/managed/cdac/tests/StressTests/Debuggees/DeepStack/Program.csNew deep stack debuggee.
src/native/managed/cdac/tests/StressTests/Debuggees/DeepStack/DeepStack.csprojNew debuggee project.
src/native/managed/cdac/tests/StressTests/CdacStressTestBase.csTest harness: launch corerun, parse logs.
src/native/managed/cdac/tests/StressTests/CdacStressResults.csStress-log parser + analysis formatting.
src/native/managed/cdac/tests/StressTests/cdac-stress-helix.projHelix work item definition.
src/native/managed/cdac/tests/StressTests/BasicCdacStressTests.csDebuggee-driven xUnit tests.
src/native/managed/cdac/tests/README.mdLink to new stress tests.
src/native/managed/cdac/tests/DataGenerator/TestTarget.csUpdate generator test target Flush.
src/native/managed/cdac/README.mdRemove old GC-stress section (moved to tests).
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader/ContractDescriptorTarget.csFlush now rebuilds descriptors post-flush.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader/CachingContractRegistry.csScope-aware flush forwarding.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/SOSDacImpl.IXCLRDataProcess.csScope-aware flush + private stress request.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/SOSDacImpl.csPropagate flush scope in legacy impl.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/Dbi/DacDbiImpl.csPropagate flush scope for DBI flush.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.DataGenerator/LayoutSetSource.csNew generated helper: multi-source layout resolution.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.DataGenerator/LayoutPairSource.csRemove old layout helper.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.DataGenerator/Emitter.csSwitch generator to LayoutSet.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.DataGenerator/CdacGenerator.csEmit LayoutSet helper conditionally.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/StackWalk/GC/GcScanner.csScratch-slot filtering + deferred frame recording.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/StackWalk/GC/GcScanFlags.csAdd deferred-frame sentinel flag.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/StackWalk/GC/GcScanContext.csEmit deferred-frame sentinel entries.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/Signature/Signature_1.csScope-aware flush signature.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/RuntimeTypeSystem_1.csScope-aware flush signature.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/ReJIT_1.csAvoid caching processed-data snapshot across flushes.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/PlatformMetadata_1.csAvoid caching processed-data snapshot across flushes.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/ManagedTypeSource_1.csRetain metadata caches for TargetState flush.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/GCInfo/PlatformTraits/IGCInfoTraits.csRemove per-trait scratch-slot logic.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/GCInfo/PlatformTraits/ARMGCInfoTraits.csRemove scratch-slot override.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/GCInfo/PlatformTraits/ARM64GCInfoTraits.csRemove scratch-slot override.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/GCInfo/PlatformTraits/AMD64GCInfoTraits.csRemove scratch-slot override.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/GCInfo/IGCInfoDecoder.csExpose scratch/outgoing area size.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/GCInfo/GCInfoDecoder.csProvide scratch/outgoing area size accessor.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/GCInfo/GCInfo_1.csPlumb new GCInfo API surface.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/ExecutionManager/ExecutionManagerCore.csAvoid holding processed-data snapshots across flushes.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/ExecutionManager/ExecutionManager_2.csPlumb scope-aware flush.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/ExecutionManager/ExecutionManager_1.csPlumb scope-aware flush.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/EcmaMetadata_1.csScope-aware flush signature.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Abstractions/Target.csScope-aware target flush behavior.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Abstractions/FlushScope.csNew public flush-scope enum.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Abstractions/Contracts/IGCInfo.csAdd stack-parameter-area size API.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Abstractions/Contracts/IContract.csScope-aware flush signature.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Abstractions/ContractRegistry.csScope-aware registry flush signature.
src/native/managed/cdac/IData.mdUpdate generator docs for LayoutSet.
src/coreclr/vm/gchelpers.cppHook allocation-point verification call sites.
src/coreclr/vm/gccover.cppRemove instruction-level verification hook call sites.
src/coreclr/vm/eeconfig.hRemove legacy GC-stress flag bit.
src/coreclr/vm/common.hInclude cdacstress.h from common header.
src/coreclr/vm/ceemain.cppInit/shutdown via CdacStressPolicy.
src/coreclr/vm/cdacstress.hNew template-based trigger surface (alloc only).
src/coreclr/vm/cdacstress.cppMajor rewrite: RT-as-oracle compare + logging + flush op.
src/coreclr/inc/switches.hDefine CDAC_STRESS under _DEBUG.
src/coreclr/inc/dacprivate.hAdd private stress flush request opcode.
eng/Subsets.propsAdd Tools.CdacStressTests subset.
eng/pipelines/runtime-diagnostics.ymlAdd CdacStressTests stage + platform parameter.
eng/pipelines/cdac/prepare-cdac-stress-helix-steps.ymlNew payload prep + queue selection steps.

Comment threadsrc/coreclr/vm/cdacstress.cpp Outdated
Comment threadsrc/native/managed/cdac/tests/StressTests/RunStressTests.ps1
Comment threadsrc/native/managed/cdac/tests/StressTests/RunStressTests.ps1 Outdated
Comment threadsrc/native/managed/cdac/tests/StressTests/CdacStressTestBase.cs Outdated
Comment threadsrc/native/managed/cdac/tests/StressTests/CdacStressResults.cs Outdated
Comment threadsrc/native/managed/cdac/tests/StressTests/README.md Outdated
@max-charlamb

Copy link
Copy Markdown
MemberAuthor

Closing temporarily to force GitHub to recompute merge state cache (stale DIRTY status). Will reopen immediately.

@max-charlamb

Copy link
Copy Markdown
MemberAuthor

Reopened. Merge state cache should now be re-evaluated.

@max-charlamb
max-charlambforce-pushed the cdac-gc-stress-framework-v2 branch from 0fcd9ae to 908ae73CompareJune 2, 2026 13:10

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 73 out of 73 changed files in this pull request and generated 18 comments.

Comment threadsrc/coreclr/vm/cdacstress.cpp
Comment threadsrc/coreclr/vm/cdacstress.cpp Outdated
Comment threadsrc/coreclr/vm/cdacstress.cpp
Comment threadsrc/coreclr/vm/cdacstress.cpp Outdated
Comment threadsrc/native/managed/cdac/tests/StressTests/RunStressTests.ps1
Comment threadsrc/coreclr/inc/switches.h
Comment threadeng/pipelines/runtime-diagnostics.yml
CopilotAI review requested due to automatic review settings June 2, 2026 17:38

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 73 out of 73 changed files in this pull request and generated 6 comments.

Comment threadsrc/coreclr/vm/cdacstress.cpp
Comment threadsrc/native/managed/cdac/tests/StressTests/BasicCdacStressTests.cs Outdated
Comment threadsrc/native/managed/cdac/tests/StressTests/CdacStressResults.cs Outdated
@max-charlamb
max-charlambforce-pushed the cdac-gc-stress-framework-v2 branch from ec9f832 to 2acefabCompareJune 2, 2026 18:02
CopilotAI review requested due to automatic review settings June 2, 2026 20:02

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 49 out of 49 changed files in this pull request and generated 13 comments.

Comment threadsrc/coreclr/inc/switches.h
Comment threadeng/pipelines/runtime-diagnostics.yml
Comment threadeng/pipelines/cdac/prepare-cdac-stress-helix-steps.yml Outdated
Comment threadsrc/coreclr/vm/cdacstress.cpp
Comment threadsrc/native/managed/cdac/tests/StressTests/RunStressTests.ps1
Comment threadsrc/native/managed/cdac/tests/StressTests/CdacStressResults.cs Outdated
Comment threadsrc/native/managed/cdac/tests/StressTests/CdacStressTestBase.cs Outdated
@max-charlamb
max-charlambforce-pushed the cdac-gc-stress-framework-v2 branch from 0530fa6 to cbb87d6CompareJune 4, 2026 20:33

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 50 out of 50 changed files in this pull request and generated 6 comments.

Comment threadsrc/coreclr/vm/cdacstress.cpp
Comment threadsrc/coreclr/vm/cdacstress.cpp
Comment threadsrc/coreclr/vm/cdacstress.cpp
Comment threadsrc/coreclr/vm/cdacstress.h
…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>
CopilotAI review requested due to automatic review settings June 8, 2026 16:00
@max-charlamb
max-charlambforce-pushed the cdac-gc-stress-framework-v2 branch from 1e6e255 to cc09ab7CompareJune 8, 2026 16:00

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 51 out of 51 changed files in this pull request and generated 4 comments.

Comment threadsrc/coreclr/vm/cdacstress.cpp
Comment threadsrc/coreclr/vm/cdacstress.cpp

@noahfalknoahfalk left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM!

Comment threaddocs/design/datacontracts/StackWalk.md
@max-charlamb

Copy link
Copy Markdown
MemberAuthor

/ba-g known issue on runtime-diagnostics pipeline (which has already fixed)

@max-charlamb
max-charlamb merged commit bba72ce into dotnet:mainJun 9, 2026
194 of 199 checks passed
@max-charlamb
max-charlamb deleted the cdac-gc-stress-framework-v2 branch June 9, 2026 18:59
max-charlamb added a commit that referenced this pull request Jun 14, 2026
…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>
@dotnet-milestone-botdotnet-milestone-botBot added this to the 11.0-preview6 milestone Jun 17, 2026
eiriktsarpalis pushed a commit that referenced this pull request Jul 15, 2026
> [!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>
eiriktsarpalis pushed a commit that referenced this pull request Jul 15, 2026
…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>
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Jul 18, 2026
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants

@max-charlamb@steveisok@noahfalk