From 08894da8143c9d36c19dd7f6ec162f91cc1535d6 Mon Sep 17 00:00:00 2001 From: Chris Anderson Date: Wed, 10 Jun 2026 10:04:15 -0700 Subject: [PATCH 1/5] Fix Optional ClearValue stress crash (0xC0000409) in spec-050 fixtures CI Stress runs (selftest + AOT) on main fail-fast with exit 0xC0000409 (STATUS_STACK_BUFFER_OVERRUN, notOk=False) concentrated in spec-050 Optional fixtures - 6/10 selftest shards crash inside ControlledOptionalTextInputFamily (which runs AutoSuggestBox). Root cause (per #539's dump-backed analysis): the Optional .OneWay(dp:) ClearValue path forces a native style/theme re-eval that, combined with AutoSuggestBox popup machinery left in the visual tree, races the next fixture's render under load. #539 hardened only OneWayClearValuePropEntry.Mount and isolated only OptionalThemeInteraction; the other Optional fixtures stayed exposed. Fixes: (1) OneWayClearValuePropEntry.Update now gates ClearValue on ReadLocalValue(_dp) != UnsetValue, mirroring #539's Mount guard (closes the Update(Of->Unset) crash site). (2) ControlledOptionalTextInputFamily + OptionalEchoStrandRegression fixtures now drain (SetContent(null)+Render) in finally, generalizing #539's per-fixture isolation to the AutoSuggestBox-bearing fixtures. Validated: host build clean; --self-test --filter Optional EXIT=0 0 failures; PropEntryOptional unit tests 7/7. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- .../Core/V1Protocol/Descriptor/PropEntry.cs | 9 +++++++- ...ontrolledOptionalTextInputFamilyFixture.cs | 22 +++++++++++++++---- .../OptionalEchoStrandRegressionFixture.cs | 14 +++++++++++- 3 files changed, 39 insertions(+), 6 deletions(-) diff --git a/src/Reactor/Core/V1Protocol/Descriptor/PropEntry.cs b/src/Reactor/Core/V1Protocol/Descriptor/PropEntry.cs index 31f3ada81..b8e86435e 100644 --- a/src/Reactor/Core/V1Protocol/Descriptor/PropEntry.cs +++ b/src/Reactor/Core/V1Protocol/Descriptor/PropEntry.cs @@ -147,7 +147,14 @@ public override void Update(TControl ctrl, TElement oldEl, TElement newEl) var nvOpt = _get(newEl); if (!nvOpt.HasValue) { - if (ovOpt.HasValue) + // Mirror the Mount-path guard (#539): only clear when a local value + // is actually present. Issuing ClearValue on a property that already + // holds DependencyProperty.UnsetValue forces an unnecessary native + // re-evaluation of the style/theme precedence chain — the path + // implicated in the low-rate STATUS_STACK_BUFFER_OVERRUN (0xC0000409) + // stress crashes on the Update(Of → Unset) edge. + if (ovOpt.HasValue + && !ReferenceEquals(ctrl.ReadLocalValue(_dp), DependencyProperty.UnsetValue)) ctrl.ClearValue(_dp); return; } diff --git a/tests/Reactor.AppTests.Host/SelfTest/Fixtures/ControlledOptionalTextInputFamilyFixture.cs b/tests/Reactor.AppTests.Host/SelfTest/Fixtures/ControlledOptionalTextInputFamilyFixture.cs index c2e7d9041..e4ac462fc 100644 --- a/tests/Reactor.AppTests.Host/SelfTest/Fixtures/ControlledOptionalTextInputFamilyFixture.cs +++ b/tests/Reactor.AppTests.Host/SelfTest/Fixtures/ControlledOptionalTextInputFamilyFixture.cs @@ -12,10 +12,24 @@ internal class Execution(Harness h) : SelfTestFixtureBase(h) { public override async Task RunAsync() { - await Run(TextBoxScenario()); - await Run(PasswordBoxScenario()); - await Run(RichEditBoxScenario()); - await Run(AutoSuggestBoxScenario()); + try + { + await Run(TextBoxScenario()); + await Run(PasswordBoxScenario()); + await Run(RichEditBoxScenario()); + await Run(AutoSuggestBoxScenario()); + } + finally + { + // #539 isolation, generalized: this fixture's AutoSuggestBox + // scenario leaves popup / template-part machinery in the visual + // tree. Drain it (detach + pump a render) so the next fixture + // does not install + ClearValue-churn atop a half-torn-down + // popup — the STATUS_STACK_BUFFER_OVERRUN (0xC0000409) stress + // crash documented in #539. + H.SetContent(null); + await Harness.Render(); + } } private async Task Run(ControlledOptionalSelfTestHelpers.Scenario scenario) diff --git a/tests/Reactor.AppTests.Host/SelfTest/Fixtures/OptionalEchoStrandRegressionFixture.cs b/tests/Reactor.AppTests.Host/SelfTest/Fixtures/OptionalEchoStrandRegressionFixture.cs index dfef8bd99..29da2e44e 100644 --- a/tests/Reactor.AppTests.Host/SelfTest/Fixtures/OptionalEchoStrandRegressionFixture.cs +++ b/tests/Reactor.AppTests.Host/SelfTest/Fixtures/OptionalEchoStrandRegressionFixture.cs @@ -8,7 +8,9 @@ internal class Execution(Harness h) : SelfTestFixtureBase(h) { public override async Task RunAsync() { - await Run(ControlledOptionalSelectionFamilyFixture.ComboBoxScenario()); + try + { + await Run(ControlledOptionalSelectionFamilyFixture.ComboBoxScenario()); await Run(ControlledOptionalSelectionFamilyFixture.ListBoxScenario()); await Run(ControlledOptionalSelectionFamilyFixture.ListViewScenario()); await Run(ControlledOptionalSelectionFamilyFixture.GridViewScenario()); @@ -39,6 +41,16 @@ public override async Task RunAsync() await Run(ControlledOptionalTextInputFamilyFixture.PasswordBoxScenario()); await Run(ControlledOptionalTextInputFamilyFixture.RichEditBoxScenario()); await Run(ControlledOptionalTextInputFamilyFixture.AutoSuggestBoxScenario()); + } + finally + { + // #539 isolation, generalized: drain the AutoSuggestBox popup / + // template-part machinery before the next fixture renders, to + // avoid the 0xC0000409 (STATUS_STACK_BUFFER_OVERRUN) stress + // crash documented in #539. + H.SetContent(null); + await Harness.Render(); + } } private Task Run(ControlledOptionalSelfTestHelpers.Scenario scenario) From 909b299faa487c636a433e359024b26d70fd0091 Mon Sep 17 00:00:00 2001 From: Chris Anderson Date: Thu, 11 Jun 2026 12:23:22 -0700 Subject: [PATCH 2/5] ci(stress): capture crash dumps on selftest/AOT shards Add WER LocalDumps (mini) + CLR createdump (DOTNET_DbgEnableMiniDump) on the selftests and aot-selftests stress jobs, and upload the dumps as an artifact on failure. Captures the faulting native stack for the recurring 0xC0000409 (STATUS_STACK_BUFFER_OVERRUN) fail-fast in the spawned Reactor.AppTests.Host.exe so the crash can be root-caused from a real dump. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- .github/workflows/ci-stress.yml | 52 +++++++++++++++++++++++++++++++++ 1 file changed, 52 insertions(+) diff --git a/.github/workflows/ci-stress.yml b/.github/workflows/ci-stress.yml index f722041d1..0575cdf45 100644 --- a/.github/workflows/ci-stress.yml +++ b/.github/workflows/ci-stress.yml @@ -141,12 +141,32 @@ jobs: - name: Build (once) run: dotnet build tests/Reactor.SelfTests/Reactor.SelfTests.csproj --no-restore --configuration Debug -p:Platform=x64 + - name: Configure crash dump capture + shell: pwsh + run: | + $dir = "${{ runner.temp }}\crashdumps" + New-Item -ItemType Directory -Force -Path $dir | Out-Null + # WER LocalDumps catches native fail-fasts / AVs (e.g. the 0xC0000409 + # STATUS_STACK_BUFFER_OVERRUN crash) that bypass the CLR's createdump + # handler. Global key => applies to the spawned Reactor.AppTests.Host.exe. + $wer = 'HKLM:\SOFTWARE\Microsoft\Windows\Windows Error Reporting\LocalDumps' + New-Item -Path $wer -Force | Out-Null + New-ItemProperty -Path $wer -Name DumpFolder -Value $dir -PropertyType ExpandString -Force | Out-Null + New-ItemProperty -Path $wer -Name DumpType -Value 1 -PropertyType DWord -Force | Out-Null + New-ItemProperty -Path $wer -Name DumpCount -Value 25 -PropertyType DWord -Force | Out-Null + Write-Host "Crash dumps -> $dir (WER mini + CLR createdump heap)" + - name: Stress loop shell: pwsh env: PER_SHARD: ${{ needs.plan.outputs.per-shard }} REMAINDER: ${{ needs.plan.outputs.remainder }} SHARD_INDEX: ${{ matrix.shard }} + # CLR createdump for the spawned host subprocess (env is inherited). + DOTNET_DbgEnableMiniDump: "1" + COMPlus_DbgEnableMiniDump: "1" + DOTNET_DbgMiniDumpType: "2" + DOTNET_DbgMiniDumpName: ${{ runner.temp }}\crashdumps\coreclr.%p.dmp run: | $per = [int]$env:PER_SHARD $rem = [int]$env:REMAINDER @@ -170,6 +190,14 @@ jobs: } Write-Host "Shard ${idx}: $count iterations passed." + - name: Upload crash dumps + if: ${{ failure() }} + uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 + with: + name: selftest-crashdumps-shard-${{ matrix.shard }} + path: ${{ runner.temp }}/crashdumps/* + if-no-files-found: ignore + integration-tests: name: Integration (shard ${{ matrix.shard }}) needs: plan @@ -252,6 +280,18 @@ jobs: -o ${{ runner.temp }}/aot-publish --nologo + - name: Configure crash dump capture + shell: pwsh + run: | + $dir = "${{ runner.temp }}\crashdumps" + New-Item -ItemType Directory -Force -Path $dir | Out-Null + $wer = 'HKLM:\SOFTWARE\Microsoft\Windows\Windows Error Reporting\LocalDumps' + New-Item -Path $wer -Force | Out-Null + New-ItemProperty -Path $wer -Name DumpFolder -Value $dir -PropertyType ExpandString -Force | Out-Null + New-ItemProperty -Path $wer -Name DumpType -Value 1 -PropertyType DWord -Force | Out-Null + New-ItemProperty -Path $wer -Name DumpCount -Value 25 -PropertyType DWord -Force | Out-Null + Write-Host "Crash dumps -> $dir (WER mini + CLR createdump heap)" + - name: Stress loop shell: pwsh env: @@ -259,6 +299,10 @@ jobs: REMAINDER: ${{ needs.plan.outputs.remainder }} SHARD_INDEX: ${{ matrix.shard }} FILTER: ${{ inputs.filter }} + DOTNET_DbgEnableMiniDump: "1" + COMPlus_DbgEnableMiniDump: "1" + DOTNET_DbgMiniDumpType: "2" + DOTNET_DbgMiniDumpName: ${{ runner.temp }}\crashdumps\coreclr.%p.dmp run: | $exe = Join-Path '${{ runner.temp }}/aot-publish' 'Reactor.AppTests.Host.exe' if (-not (Test-Path $exe)) { Write-Host "::error::AOT host not found at $exe"; exit 1 } @@ -296,6 +340,14 @@ jobs: path: aot-*.tap if-no-files-found: ignore + - name: Upload crash dumps + if: ${{ failure() }} + uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 + with: + name: aot-crashdumps-shard-${{ matrix.shard }} + path: ${{ runner.temp }}/crashdumps/* + if-no-files-found: ignore + summary: name: Stress summary needs: [plan, unit-tests, selftests, aot-selftests, integration-tests] From 83611ada338f46c26f080511d0477d5530c931c6 Mon Sep 17 00:00:00 2001 From: Chris Anderson Date: Mon, 22 Jun 2026 06:25:36 +0200 Subject: [PATCH 3/5] ci(stress): full dumps + on-runner SOS analysis for selftest crashes Switch WER LocalDumps to full (DumpType=2) so SOS can read managed stacks/heap, and add a post-failure step that runs dotnet-dump analyze (clrthreads, clrstack -all, pe -nested, dumpheap Exception) on each selftest crash dump and uploads the text. Goal: recover the managed throwing frame behind the 0xC000027B stowed-exception (E_NOINTERFACE/E_POINTER) fail-fast. AOT job keeps native dumps only (NativeAOT has no DAC for SOS). Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- .github/workflows/ci-stress.yml | 33 +++++++++++++++++++++++++++------ 1 file changed, 27 insertions(+), 6 deletions(-) diff --git a/.github/workflows/ci-stress.yml b/.github/workflows/ci-stress.yml index 0575cdf45..8ee16a622 100644 --- a/.github/workflows/ci-stress.yml +++ b/.github/workflows/ci-stress.yml @@ -152,9 +152,9 @@ jobs: $wer = 'HKLM:\SOFTWARE\Microsoft\Windows\Windows Error Reporting\LocalDumps' New-Item -Path $wer -Force | Out-Null New-ItemProperty -Path $wer -Name DumpFolder -Value $dir -PropertyType ExpandString -Force | Out-Null - New-ItemProperty -Path $wer -Name DumpType -Value 1 -PropertyType DWord -Force | Out-Null - New-ItemProperty -Path $wer -Name DumpCount -Value 25 -PropertyType DWord -Force | Out-Null - Write-Host "Crash dumps -> $dir (WER mini + CLR createdump heap)" + New-ItemProperty -Path $wer -Name DumpType -Value 2 -PropertyType DWord -Force | Out-Null + New-ItemProperty -Path $wer -Name DumpCount -Value 10 -PropertyType DWord -Force | Out-Null + Write-Host "Crash dumps -> $dir (WER full + CLR createdump heap)" - name: Stress loop shell: pwsh @@ -190,6 +190,27 @@ jobs: } Write-Host "Shard ${idx}: $count iterations passed." + - name: Analyze crash dumps (SOS) + if: ${{ failure() }} + shell: pwsh + run: | + $dir = "${{ runner.temp }}\crashdumps" + $dumps = Get-ChildItem $dir -Filter *.dmp -ErrorAction SilentlyContinue + if (-not $dumps) { Write-Host "No dumps to analyze."; exit 0 } + dotnet tool install --global dotnet-dump 2>&1 | Out-Host + $tool = Join-Path $env:USERPROFILE ".dotnet\tools\dotnet-dump.exe" + foreach ($d in $dumps) { + $txt = "$($d.FullName).sos.txt" + Write-Host "::group::SOS analyze $($d.Name)" + & $tool analyze $d.FullName ` + -c "clrthreads" ` + -c "clrstack -all" ` + -c "pe -nested" ` + -c "dumpheap -stat -type Exception" ` + -c "exit" 2>&1 | Tee-Object -FilePath $txt | Out-Host + Write-Host "::endgroup::" + } + - name: Upload crash dumps if: ${{ failure() }} uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 @@ -288,9 +309,9 @@ jobs: $wer = 'HKLM:\SOFTWARE\Microsoft\Windows\Windows Error Reporting\LocalDumps' New-Item -Path $wer -Force | Out-Null New-ItemProperty -Path $wer -Name DumpFolder -Value $dir -PropertyType ExpandString -Force | Out-Null - New-ItemProperty -Path $wer -Name DumpType -Value 1 -PropertyType DWord -Force | Out-Null - New-ItemProperty -Path $wer -Name DumpCount -Value 25 -PropertyType DWord -Force | Out-Null - Write-Host "Crash dumps -> $dir (WER mini + CLR createdump heap)" + New-ItemProperty -Path $wer -Name DumpType -Value 2 -PropertyType DWord -Force | Out-Null + New-ItemProperty -Path $wer -Name DumpCount -Value 10 -PropertyType DWord -Force | Out-Null + Write-Host "Crash dumps -> $dir (WER full + CLR createdump heap)" - name: Stress loop shell: pwsh From 682bf2f06aaf0947b051d452a7df4590b0bf3730 Mon Sep 17 00:00:00 2001 From: Chris Anderson Date: Mon, 22 Jun 2026 22:28:23 +0200 Subject: [PATCH 4/5] Fix SwipeControl Execute-mode stress crash (root cause of 0xC0000409 fail-fast) Dump analysis of the CI Stress 0xC0000409 crashes (full WER dump + SOS on the x64 runner) showed the faulting path is a WinUI stowed-exception fail-fast (DirectUI::ErrorHelper::ProcessUnhandledError). The captured managed exception is: System.ArgumentException 'Execute items should only have one item', thrown from Microsoft.UI.Xaml.Controls.SwipeItems.Add inside SwipeControlDescriptor.CreateSwipeItems. WinUI requires an Execute-mode SwipeItems to contain exactly one SwipeItem; CreateSwipeItems blindly added every item regardless of mode. The RBC_SwipeControlItemsSwap selftest deterministically builds LeftItemsMode=Execute with two items, so the throw escapes the imperative reconciler into the XAML dispatcher; ~1/1000 it escalates to a process fail-fast that lands on whichever fixture is running (explaining the apparent randomness across Optional fixtures). Fix: CreateSwipeItems caps Execute-mode collections to a single item so invalid authoring can never crash the host. Validated: build clean; Swipe selftests 40x with 0 crashes; SwipeControl unit tests 3/3. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- .../Descriptor/Descriptors/SwipeControlDescriptor.cs | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/Reactor/Core/V1Protocol/Descriptor/Descriptors/SwipeControlDescriptor.cs b/src/Reactor/Core/V1Protocol/Descriptor/Descriptors/SwipeControlDescriptor.cs index e24bd7de4..14edadf64 100644 --- a/src/Reactor/Core/V1Protocol/Descriptor/Descriptors/SwipeControlDescriptor.cs +++ b/src/Reactor/Core/V1Protocol/Descriptor/Descriptors/SwipeControlDescriptor.cs @@ -43,7 +43,14 @@ private static void ApplySwipeItems(WinUI.SwipeControl control, SwipeControlElem { if (data is not { Length: > 0 }) return null; var items = new WinUI.SwipeItems { Mode = mode }; - foreach (var entry in data) items.Add(CreateSwipeItem(entry)); + // WinUI constraint: an Execute-mode SwipeItems may contain only ONE item. + // Adding a second throws ArgumentException ("Execute items should only have + // one item") from native WinUI; that exception escapes the imperative + // reconciler into the XAML dispatcher and the framework fail-fasts the + // whole process with a stowed exception (0xC000027B / exit 0xC0000409). + // Honor the constraint here so invalid authoring can never crash the host. + var count = mode == WinUI.SwipeMode.Execute ? 1 : data.Length; + for (var i = 0; i < count; i++) items.Add(CreateSwipeItem(data[i])); return items; } From 0eaf4b8d767d26d640c433aa5386b9f049b09cb5 Mon Sep 17 00:00:00 2001 From: Chris Anderson Date: Thu, 25 Jun 2026 08:27:31 +0200 Subject: [PATCH 5/5] Revert disproven Optional ClearValue/echo-isolation changes Dump analysis proved the stress crash is the SwipeControl Execute-mode bug, not an Optional ClearValue or popup-isolation issue. Revert the OneWayClearValuePropEntry.Update ReadLocalValue gate and the ControlledOptionalTextInputFamily / OptionalEchoStrandRegression fixture drains, which were based on the disproven theory. Keeps the SwipeControl fix and the CI crash-dump capture infrastructure. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- .../Core/V1Protocol/Descriptor/PropEntry.cs | 9 +------- ...ontrolledOptionalTextInputFamilyFixture.cs | 22 ++++--------------- .../OptionalEchoStrandRegressionFixture.cs | 14 +----------- 3 files changed, 6 insertions(+), 39 deletions(-) diff --git a/src/Reactor/Core/V1Protocol/Descriptor/PropEntry.cs b/src/Reactor/Core/V1Protocol/Descriptor/PropEntry.cs index b8e86435e..31f3ada81 100644 --- a/src/Reactor/Core/V1Protocol/Descriptor/PropEntry.cs +++ b/src/Reactor/Core/V1Protocol/Descriptor/PropEntry.cs @@ -147,14 +147,7 @@ public override void Update(TControl ctrl, TElement oldEl, TElement newEl) var nvOpt = _get(newEl); if (!nvOpt.HasValue) { - // Mirror the Mount-path guard (#539): only clear when a local value - // is actually present. Issuing ClearValue on a property that already - // holds DependencyProperty.UnsetValue forces an unnecessary native - // re-evaluation of the style/theme precedence chain — the path - // implicated in the low-rate STATUS_STACK_BUFFER_OVERRUN (0xC0000409) - // stress crashes on the Update(Of → Unset) edge. - if (ovOpt.HasValue - && !ReferenceEquals(ctrl.ReadLocalValue(_dp), DependencyProperty.UnsetValue)) + if (ovOpt.HasValue) ctrl.ClearValue(_dp); return; } diff --git a/tests/Reactor.AppTests.Host/SelfTest/Fixtures/ControlledOptionalTextInputFamilyFixture.cs b/tests/Reactor.AppTests.Host/SelfTest/Fixtures/ControlledOptionalTextInputFamilyFixture.cs index e4ac462fc..c2e7d9041 100644 --- a/tests/Reactor.AppTests.Host/SelfTest/Fixtures/ControlledOptionalTextInputFamilyFixture.cs +++ b/tests/Reactor.AppTests.Host/SelfTest/Fixtures/ControlledOptionalTextInputFamilyFixture.cs @@ -12,24 +12,10 @@ internal class Execution(Harness h) : SelfTestFixtureBase(h) { public override async Task RunAsync() { - try - { - await Run(TextBoxScenario()); - await Run(PasswordBoxScenario()); - await Run(RichEditBoxScenario()); - await Run(AutoSuggestBoxScenario()); - } - finally - { - // #539 isolation, generalized: this fixture's AutoSuggestBox - // scenario leaves popup / template-part machinery in the visual - // tree. Drain it (detach + pump a render) so the next fixture - // does not install + ClearValue-churn atop a half-torn-down - // popup — the STATUS_STACK_BUFFER_OVERRUN (0xC0000409) stress - // crash documented in #539. - H.SetContent(null); - await Harness.Render(); - } + await Run(TextBoxScenario()); + await Run(PasswordBoxScenario()); + await Run(RichEditBoxScenario()); + await Run(AutoSuggestBoxScenario()); } private async Task Run(ControlledOptionalSelfTestHelpers.Scenario scenario) diff --git a/tests/Reactor.AppTests.Host/SelfTest/Fixtures/OptionalEchoStrandRegressionFixture.cs b/tests/Reactor.AppTests.Host/SelfTest/Fixtures/OptionalEchoStrandRegressionFixture.cs index 29da2e44e..dfef8bd99 100644 --- a/tests/Reactor.AppTests.Host/SelfTest/Fixtures/OptionalEchoStrandRegressionFixture.cs +++ b/tests/Reactor.AppTests.Host/SelfTest/Fixtures/OptionalEchoStrandRegressionFixture.cs @@ -8,9 +8,7 @@ internal class Execution(Harness h) : SelfTestFixtureBase(h) { public override async Task RunAsync() { - try - { - await Run(ControlledOptionalSelectionFamilyFixture.ComboBoxScenario()); + await Run(ControlledOptionalSelectionFamilyFixture.ComboBoxScenario()); await Run(ControlledOptionalSelectionFamilyFixture.ListBoxScenario()); await Run(ControlledOptionalSelectionFamilyFixture.ListViewScenario()); await Run(ControlledOptionalSelectionFamilyFixture.GridViewScenario()); @@ -41,16 +39,6 @@ public override async Task RunAsync() await Run(ControlledOptionalTextInputFamilyFixture.PasswordBoxScenario()); await Run(ControlledOptionalTextInputFamilyFixture.RichEditBoxScenario()); await Run(ControlledOptionalTextInputFamilyFixture.AutoSuggestBoxScenario()); - } - finally - { - // #539 isolation, generalized: drain the AutoSuggestBox popup / - // template-part machinery before the next fixture renders, to - // avoid the 0xC0000409 (STATUS_STACK_BUFFER_OVERRUN) stress - // crash documented in #539. - H.SetContent(null); - await Harness.Render(); - } } private Task Run(ControlledOptionalSelfTestHelpers.Scenario scenario)