[cDAC] Relax HRESULT validation to allow divergent failure codes - #125236

Merged
max-charlamb merged 1 commit into
dotnet:mainfrom
max-charlamb:cdac-divergent-failure-verification
Mar 6, 2026
Merged

[cDAC] Relax HRESULT validation to allow divergent failure codes#125236
max-charlamb merged 1 commit into
dotnet:mainfrom
max-charlamb:cdac-divergent-failure-verification

Conversation

@max-charlamb

Copy link
Copy Markdown
Member

Summary

The cDAC's DEBUG validation asserts compare HRESULTs between the cDAC and legacy DAC using exact equality (Debug.Assert(hrLocal == hr)). This causes the debugger process to crash when the cDAC and native DAC return different failure HRESULTs for the same invalid input.

For example, when GetMethodTableData is called with a garbage method table pointer, the cDAC may throw InvalidOperationException (0x80131C49) while the native DAC returns E_INVALIDARG (0x80070057). Both correctly reject the input, but the exact HRESULT comparison fires a fatal Debug.Assert that terminates the debugger mid-command — causing flaky CI failures like SOS.VarargPInvokeInteropMD in the cDAC_windows_x64_release job.

No consumer (ClrMD, SOS, managed debugger) branches on specific failure codes from these APIs — they only check success vs failure.

Changes

New file: DebugExtensions.cs — adds Debug.ValidateHResult() as a C# 14 static extension method on System.Diagnostics.Debug:

Debug.ValidateHResult(hr,hrLocal);

With two validation modes via HResultValidationMode:

  • Exact — HRESULTs must match exactly (available for APIs where the specific code matters)
  • AllowDivergentFailures (default) — success HRESULTs (S_OK, S_FALSE) must match exactly, but any two failing HRESULTs (negative values) are considered equivalent

Converted all 113 call sites across 5 files from:

Debug.Assert(hrLocal==hr,$"cDAC: {hr:x}, DAC: {hrLocal:x}");

to:

Debug.ValidateHResult(hr,hrLocal);

CopilotAI review requested due to automatic review settings March 5, 2026 20:53
@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 updates the cDAC Legacy layer’s DEBUG cross-validation to stop asserting on exact HRESULT equality when both the cDAC and legacy/native DAC correctly fail, but return different failure codes. This avoids debugger-process termination and associated test flakiness while still preserving strict validation for success results.

Changes:

  • Introduces Debug.ValidateHResult() (with HResultValidationMode) to centralize HRESULT comparison rules.
  • Replaces ~113 Debug.Assert(hrLocal == hr, ...) call sites with Debug.ValidateHResult(hr, hrLocal) across the Legacy implementation.
  • Preserves strict matching for success HRESULTs while allowing divergent failure HRESULTs by default.

Reviewed changes

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

Show a summary per file
FileDescription
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/SOSDacImpl.csReplaces legacy-vs-cDAC HRESULT equality asserts with Debug.ValidateHResult.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/SOSDacImpl.IXCLRDataProcess.csSame replacement for IXCLRDataProcess-related validation asserts.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/ClrDataStackWalk.csUses Debug.ValidateHResult when cross-validating stack-walk HRESULTs in DEBUG.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/ClrDataMethodInstance.csReplaces per-site “allow any failing HRESULT” logic with the shared validator.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/ClrDataFrame.csUpdates frame HRESULT validation to use the shared validator.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/DebugExtensions.csAdds centralized HRESULT validation helper and mode enum.

rcj1
rcj1 approved these changes Mar 5, 2026

@rcj1rcj1 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.

As long as none of these callers differentiate between failures, then looks good to me

@max-charlamb
max-charlamb merged commit dd20361 into dotnet:mainMar 6, 2026
58 checks passed
@max-charlamb
max-charlamb deleted the cdac-divergent-failure-verification branch March 6, 2026 14:17
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Apr 6, 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.

4 participants

@max-charlamb@noahfalk@rcj1
, '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] Relax HRESULT validation to allow divergent failure codes - #125236

Merged
max-charlamb merged 1 commit into
dotnet:mainfrom
max-charlamb:cdac-divergent-failure-verification
Mar 6, 2026
Merged

[cDAC] Relax HRESULT validation to allow divergent failure codes#125236
max-charlamb merged 1 commit into
dotnet:mainfrom
max-charlamb:cdac-divergent-failure-verification

Conversation

@max-charlamb

Copy link
Copy Markdown
Member

Summary

The cDAC's DEBUG validation asserts compare HRESULTs between the cDAC and legacy DAC using exact equality (Debug.Assert(hrLocal == hr)). This causes the debugger process to crash when the cDAC and native DAC return different failure HRESULTs for the same invalid input.

For example, when GetMethodTableData is called with a garbage method table pointer, the cDAC may throw InvalidOperationException (0x80131C49) while the native DAC returns E_INVALIDARG (0x80070057). Both correctly reject the input, but the exact HRESULT comparison fires a fatal Debug.Assert that terminates the debugger mid-command — causing flaky CI failures like SOS.VarargPInvokeInteropMD in the cDAC_windows_x64_release job.

No consumer (ClrMD, SOS, managed debugger) branches on specific failure codes from these APIs — they only check success vs failure.

Changes

New file: DebugExtensions.cs — adds Debug.ValidateHResult() as a C# 14 static extension method on System.Diagnostics.Debug:

Debug.ValidateHResult(hr,hrLocal);

With two validation modes via HResultValidationMode:

  • Exact — HRESULTs must match exactly (available for APIs where the specific code matters)
  • AllowDivergentFailures (default) — success HRESULTs (S_OK, S_FALSE) must match exactly, but any two failing HRESULTs (negative values) are considered equivalent

Converted all 113 call sites across 5 files from:

Debug.Assert(hrLocal==hr,$"cDAC: {hr:x}, DAC: {hrLocal:x}");

to:

Debug.ValidateHResult(hr,hrLocal);

CopilotAI review requested due to automatic review settings March 5, 2026 20:53
@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 updates the cDAC Legacy layer’s DEBUG cross-validation to stop asserting on exact HRESULT equality when both the cDAC and legacy/native DAC correctly fail, but return different failure codes. This avoids debugger-process termination and associated test flakiness while still preserving strict validation for success results.

Changes:

  • Introduces Debug.ValidateHResult() (with HResultValidationMode) to centralize HRESULT comparison rules.
  • Replaces ~113 Debug.Assert(hrLocal == hr, ...) call sites with Debug.ValidateHResult(hr, hrLocal) across the Legacy implementation.
  • Preserves strict matching for success HRESULTs while allowing divergent failure HRESULTs by default.

Reviewed changes

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

Show a summary per file
FileDescription
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/SOSDacImpl.csReplaces legacy-vs-cDAC HRESULT equality asserts with Debug.ValidateHResult.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/SOSDacImpl.IXCLRDataProcess.csSame replacement for IXCLRDataProcess-related validation asserts.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/ClrDataStackWalk.csUses Debug.ValidateHResult when cross-validating stack-walk HRESULTs in DEBUG.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/ClrDataMethodInstance.csReplaces per-site “allow any failing HRESULT” logic with the shared validator.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/ClrDataFrame.csUpdates frame HRESULT validation to use the shared validator.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/DebugExtensions.csAdds centralized HRESULT validation helper and mode enum.

rcj1
rcj1 approved these changes Mar 5, 2026

@rcj1rcj1 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.

As long as none of these callers differentiate between failures, then looks good to me

@max-charlamb
max-charlamb merged commit dd20361 into dotnet:mainMar 6, 2026
58 checks passed
@max-charlamb
max-charlamb deleted the cdac-divergent-failure-verification branch March 6, 2026 14:17
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Apr 6, 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.

4 participants

@max-charlamb@noahfalk@rcj1
, '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] Relax HRESULT validation to allow divergent failure codes - #125236

Merged
max-charlamb merged 1 commit into
dotnet:mainfrom
max-charlamb:cdac-divergent-failure-verification
Mar 6, 2026
Merged

[cDAC] Relax HRESULT validation to allow divergent failure codes#125236
max-charlamb merged 1 commit into
dotnet:mainfrom
max-charlamb:cdac-divergent-failure-verification

Conversation

@max-charlamb

Copy link
Copy Markdown
Member

Summary

The cDAC's DEBUG validation asserts compare HRESULTs between the cDAC and legacy DAC using exact equality (Debug.Assert(hrLocal == hr)). This causes the debugger process to crash when the cDAC and native DAC return different failure HRESULTs for the same invalid input.

For example, when GetMethodTableData is called with a garbage method table pointer, the cDAC may throw InvalidOperationException (0x80131C49) while the native DAC returns E_INVALIDARG (0x80070057). Both correctly reject the input, but the exact HRESULT comparison fires a fatal Debug.Assert that terminates the debugger mid-command — causing flaky CI failures like SOS.VarargPInvokeInteropMD in the cDAC_windows_x64_release job.

No consumer (ClrMD, SOS, managed debugger) branches on specific failure codes from these APIs — they only check success vs failure.

Changes

New file: DebugExtensions.cs — adds Debug.ValidateHResult() as a C# 14 static extension method on System.Diagnostics.Debug:

Debug.ValidateHResult(hr,hrLocal);

With two validation modes via HResultValidationMode:

  • Exact — HRESULTs must match exactly (available for APIs where the specific code matters)
  • AllowDivergentFailures (default) — success HRESULTs (S_OK, S_FALSE) must match exactly, but any two failing HRESULTs (negative values) are considered equivalent

Converted all 113 call sites across 5 files from:

Debug.Assert(hrLocal==hr,$"cDAC: {hr:x}, DAC: {hrLocal:x}");

to:

Debug.ValidateHResult(hr,hrLocal);

CopilotAI review requested due to automatic review settings March 5, 2026 20:53
@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 updates the cDAC Legacy layer’s DEBUG cross-validation to stop asserting on exact HRESULT equality when both the cDAC and legacy/native DAC correctly fail, but return different failure codes. This avoids debugger-process termination and associated test flakiness while still preserving strict validation for success results.

Changes:

  • Introduces Debug.ValidateHResult() (with HResultValidationMode) to centralize HRESULT comparison rules.
  • Replaces ~113 Debug.Assert(hrLocal == hr, ...) call sites with Debug.ValidateHResult(hr, hrLocal) across the Legacy implementation.
  • Preserves strict matching for success HRESULTs while allowing divergent failure HRESULTs by default.

Reviewed changes

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

Show a summary per file
FileDescription
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/SOSDacImpl.csReplaces legacy-vs-cDAC HRESULT equality asserts with Debug.ValidateHResult.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/SOSDacImpl.IXCLRDataProcess.csSame replacement for IXCLRDataProcess-related validation asserts.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/ClrDataStackWalk.csUses Debug.ValidateHResult when cross-validating stack-walk HRESULTs in DEBUG.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/ClrDataMethodInstance.csReplaces per-site “allow any failing HRESULT” logic with the shared validator.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/ClrDataFrame.csUpdates frame HRESULT validation to use the shared validator.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/DebugExtensions.csAdds centralized HRESULT validation helper and mode enum.

rcj1
rcj1 approved these changes Mar 5, 2026

@rcj1rcj1 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.

As long as none of these callers differentiate between failures, then looks good to me

@max-charlamb
max-charlamb merged commit dd20361 into dotnet:mainMar 6, 2026
58 checks passed
@max-charlamb
max-charlamb deleted the cdac-divergent-failure-verification branch March 6, 2026 14:17
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Apr 6, 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.

4 participants

@max-charlamb@noahfalk@rcj1
, '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] Relax HRESULT validation to allow divergent failure codes - #125236

Merged
max-charlamb merged 1 commit into
dotnet:mainfrom
max-charlamb:cdac-divergent-failure-verification
Mar 6, 2026
Merged

[cDAC] Relax HRESULT validation to allow divergent failure codes#125236
max-charlamb merged 1 commit into
dotnet:mainfrom
max-charlamb:cdac-divergent-failure-verification

Conversation

@max-charlamb

Copy link
Copy Markdown
Member

Summary

The cDAC's DEBUG validation asserts compare HRESULTs between the cDAC and legacy DAC using exact equality (Debug.Assert(hrLocal == hr)). This causes the debugger process to crash when the cDAC and native DAC return different failure HRESULTs for the same invalid input.

For example, when GetMethodTableData is called with a garbage method table pointer, the cDAC may throw InvalidOperationException (0x80131C49) while the native DAC returns E_INVALIDARG (0x80070057). Both correctly reject the input, but the exact HRESULT comparison fires a fatal Debug.Assert that terminates the debugger mid-command — causing flaky CI failures like SOS.VarargPInvokeInteropMD in the cDAC_windows_x64_release job.

No consumer (ClrMD, SOS, managed debugger) branches on specific failure codes from these APIs — they only check success vs failure.

Changes

New file: DebugExtensions.cs — adds Debug.ValidateHResult() as a C# 14 static extension method on System.Diagnostics.Debug:

Debug.ValidateHResult(hr,hrLocal);

With two validation modes via HResultValidationMode:

  • Exact — HRESULTs must match exactly (available for APIs where the specific code matters)
  • AllowDivergentFailures (default) — success HRESULTs (S_OK, S_FALSE) must match exactly, but any two failing HRESULTs (negative values) are considered equivalent

Converted all 113 call sites across 5 files from:

Debug.Assert(hrLocal==hr,$"cDAC: {hr:x}, DAC: {hrLocal:x}");

to:

Debug.ValidateHResult(hr,hrLocal);

CopilotAI review requested due to automatic review settings March 5, 2026 20:53
@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 updates the cDAC Legacy layer’s DEBUG cross-validation to stop asserting on exact HRESULT equality when both the cDAC and legacy/native DAC correctly fail, but return different failure codes. This avoids debugger-process termination and associated test flakiness while still preserving strict validation for success results.

Changes:

  • Introduces Debug.ValidateHResult() (with HResultValidationMode) to centralize HRESULT comparison rules.
  • Replaces ~113 Debug.Assert(hrLocal == hr, ...) call sites with Debug.ValidateHResult(hr, hrLocal) across the Legacy implementation.
  • Preserves strict matching for success HRESULTs while allowing divergent failure HRESULTs by default.

Reviewed changes

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

Show a summary per file
FileDescription
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/SOSDacImpl.csReplaces legacy-vs-cDAC HRESULT equality asserts with Debug.ValidateHResult.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/SOSDacImpl.IXCLRDataProcess.csSame replacement for IXCLRDataProcess-related validation asserts.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/ClrDataStackWalk.csUses Debug.ValidateHResult when cross-validating stack-walk HRESULTs in DEBUG.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/ClrDataMethodInstance.csReplaces per-site “allow any failing HRESULT” logic with the shared validator.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/ClrDataFrame.csUpdates frame HRESULT validation to use the shared validator.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/DebugExtensions.csAdds centralized HRESULT validation helper and mode enum.

rcj1
rcj1 approved these changes Mar 5, 2026

@rcj1rcj1 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.

As long as none of these callers differentiate between failures, then looks good to me

@max-charlamb
max-charlamb merged commit dd20361 into dotnet:mainMar 6, 2026
58 checks passed
@max-charlamb
max-charlamb deleted the cdac-divergent-failure-verification branch March 6, 2026 14:17
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Apr 6, 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.

4 participants

@max-charlamb@noahfalk@rcj1
, '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] Relax HRESULT validation to allow divergent failure codes - #125236

Merged
max-charlamb merged 1 commit into
dotnet:mainfrom
max-charlamb:cdac-divergent-failure-verification
Mar 6, 2026
Merged

[cDAC] Relax HRESULT validation to allow divergent failure codes#125236
max-charlamb merged 1 commit into
dotnet:mainfrom
max-charlamb:cdac-divergent-failure-verification

Conversation

@max-charlamb

Copy link
Copy Markdown
Member

Summary

The cDAC's DEBUG validation asserts compare HRESULTs between the cDAC and legacy DAC using exact equality (Debug.Assert(hrLocal == hr)). This causes the debugger process to crash when the cDAC and native DAC return different failure HRESULTs for the same invalid input.

For example, when GetMethodTableData is called with a garbage method table pointer, the cDAC may throw InvalidOperationException (0x80131C49) while the native DAC returns E_INVALIDARG (0x80070057). Both correctly reject the input, but the exact HRESULT comparison fires a fatal Debug.Assert that terminates the debugger mid-command — causing flaky CI failures like SOS.VarargPInvokeInteropMD in the cDAC_windows_x64_release job.

No consumer (ClrMD, SOS, managed debugger) branches on specific failure codes from these APIs — they only check success vs failure.

Changes

New file: DebugExtensions.cs — adds Debug.ValidateHResult() as a C# 14 static extension method on System.Diagnostics.Debug:

Debug.ValidateHResult(hr,hrLocal);

With two validation modes via HResultValidationMode:

  • Exact — HRESULTs must match exactly (available for APIs where the specific code matters)
  • AllowDivergentFailures (default) — success HRESULTs (S_OK, S_FALSE) must match exactly, but any two failing HRESULTs (negative values) are considered equivalent

Converted all 113 call sites across 5 files from:

Debug.Assert(hrLocal==hr,$"cDAC: {hr:x}, DAC: {hrLocal:x}");

to:

Debug.ValidateHResult(hr,hrLocal);

CopilotAI review requested due to automatic review settings March 5, 2026 20:53
@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 updates the cDAC Legacy layer’s DEBUG cross-validation to stop asserting on exact HRESULT equality when both the cDAC and legacy/native DAC correctly fail, but return different failure codes. This avoids debugger-process termination and associated test flakiness while still preserving strict validation for success results.

Changes:

  • Introduces Debug.ValidateHResult() (with HResultValidationMode) to centralize HRESULT comparison rules.
  • Replaces ~113 Debug.Assert(hrLocal == hr, ...) call sites with Debug.ValidateHResult(hr, hrLocal) across the Legacy implementation.
  • Preserves strict matching for success HRESULTs while allowing divergent failure HRESULTs by default.

Reviewed changes

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

Show a summary per file
FileDescription
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/SOSDacImpl.csReplaces legacy-vs-cDAC HRESULT equality asserts with Debug.ValidateHResult.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/SOSDacImpl.IXCLRDataProcess.csSame replacement for IXCLRDataProcess-related validation asserts.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/ClrDataStackWalk.csUses Debug.ValidateHResult when cross-validating stack-walk HRESULTs in DEBUG.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/ClrDataMethodInstance.csReplaces per-site “allow any failing HRESULT” logic with the shared validator.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/ClrDataFrame.csUpdates frame HRESULT validation to use the shared validator.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/DebugExtensions.csAdds centralized HRESULT validation helper and mode enum.

rcj1
rcj1 approved these changes Mar 5, 2026

@rcj1rcj1 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.

As long as none of these callers differentiate between failures, then looks good to me

@max-charlamb
max-charlamb merged commit dd20361 into dotnet:mainMar 6, 2026
58 checks passed
@max-charlamb
max-charlamb deleted the cdac-divergent-failure-verification branch March 6, 2026 14:17
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Apr 6, 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.

4 participants

@max-charlamb@noahfalk@rcj1
, '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] Relax HRESULT validation to allow divergent failure codes - #125236

Merged
max-charlamb merged 1 commit into
dotnet:mainfrom
max-charlamb:cdac-divergent-failure-verification
Mar 6, 2026
Merged

[cDAC] Relax HRESULT validation to allow divergent failure codes#125236
max-charlamb merged 1 commit into
dotnet:mainfrom
max-charlamb:cdac-divergent-failure-verification

Conversation

@max-charlamb

Copy link
Copy Markdown
Member

Summary

The cDAC's DEBUG validation asserts compare HRESULTs between the cDAC and legacy DAC using exact equality (Debug.Assert(hrLocal == hr)). This causes the debugger process to crash when the cDAC and native DAC return different failure HRESULTs for the same invalid input.

For example, when GetMethodTableData is called with a garbage method table pointer, the cDAC may throw InvalidOperationException (0x80131C49) while the native DAC returns E_INVALIDARG (0x80070057). Both correctly reject the input, but the exact HRESULT comparison fires a fatal Debug.Assert that terminates the debugger mid-command — causing flaky CI failures like SOS.VarargPInvokeInteropMD in the cDAC_windows_x64_release job.

No consumer (ClrMD, SOS, managed debugger) branches on specific failure codes from these APIs — they only check success vs failure.

Changes

New file: DebugExtensions.cs — adds Debug.ValidateHResult() as a C# 14 static extension method on System.Diagnostics.Debug:

Debug.ValidateHResult(hr,hrLocal);

With two validation modes via HResultValidationMode:

  • Exact — HRESULTs must match exactly (available for APIs where the specific code matters)
  • AllowDivergentFailures (default) — success HRESULTs (S_OK, S_FALSE) must match exactly, but any two failing HRESULTs (negative values) are considered equivalent

Converted all 113 call sites across 5 files from:

Debug.Assert(hrLocal==hr,$"cDAC: {hr:x}, DAC: {hrLocal:x}");

to:

Debug.ValidateHResult(hr,hrLocal);

CopilotAI review requested due to automatic review settings March 5, 2026 20:53
@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 updates the cDAC Legacy layer’s DEBUG cross-validation to stop asserting on exact HRESULT equality when both the cDAC and legacy/native DAC correctly fail, but return different failure codes. This avoids debugger-process termination and associated test flakiness while still preserving strict validation for success results.

Changes:

  • Introduces Debug.ValidateHResult() (with HResultValidationMode) to centralize HRESULT comparison rules.
  • Replaces ~113 Debug.Assert(hrLocal == hr, ...) call sites with Debug.ValidateHResult(hr, hrLocal) across the Legacy implementation.
  • Preserves strict matching for success HRESULTs while allowing divergent failure HRESULTs by default.

Reviewed changes

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

Show a summary per file
FileDescription
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/SOSDacImpl.csReplaces legacy-vs-cDAC HRESULT equality asserts with Debug.ValidateHResult.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/SOSDacImpl.IXCLRDataProcess.csSame replacement for IXCLRDataProcess-related validation asserts.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/ClrDataStackWalk.csUses Debug.ValidateHResult when cross-validating stack-walk HRESULTs in DEBUG.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/ClrDataMethodInstance.csReplaces per-site “allow any failing HRESULT” logic with the shared validator.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/ClrDataFrame.csUpdates frame HRESULT validation to use the shared validator.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/DebugExtensions.csAdds centralized HRESULT validation helper and mode enum.

rcj1
rcj1 approved these changes Mar 5, 2026

@rcj1rcj1 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.

As long as none of these callers differentiate between failures, then looks good to me

@max-charlamb
max-charlamb merged commit dd20361 into dotnet:mainMar 6, 2026
58 checks passed
@max-charlamb
max-charlamb deleted the cdac-divergent-failure-verification branch March 6, 2026 14:17
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Apr 6, 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.

4 participants

@max-charlamb@noahfalk@rcj1
, '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] Relax HRESULT validation to allow divergent failure codes - #125236

Merged
max-charlamb merged 1 commit into
dotnet:mainfrom
max-charlamb:cdac-divergent-failure-verification
Mar 6, 2026
Merged

[cDAC] Relax HRESULT validation to allow divergent failure codes#125236
max-charlamb merged 1 commit into
dotnet:mainfrom
max-charlamb:cdac-divergent-failure-verification

Conversation

@max-charlamb

Copy link
Copy Markdown
Member

Summary

The cDAC's DEBUG validation asserts compare HRESULTs between the cDAC and legacy DAC using exact equality (Debug.Assert(hrLocal == hr)). This causes the debugger process to crash when the cDAC and native DAC return different failure HRESULTs for the same invalid input.

For example, when GetMethodTableData is called with a garbage method table pointer, the cDAC may throw InvalidOperationException (0x80131C49) while the native DAC returns E_INVALIDARG (0x80070057). Both correctly reject the input, but the exact HRESULT comparison fires a fatal Debug.Assert that terminates the debugger mid-command — causing flaky CI failures like SOS.VarargPInvokeInteropMD in the cDAC_windows_x64_release job.

No consumer (ClrMD, SOS, managed debugger) branches on specific failure codes from these APIs — they only check success vs failure.

Changes

New file: DebugExtensions.cs — adds Debug.ValidateHResult() as a C# 14 static extension method on System.Diagnostics.Debug:

Debug.ValidateHResult(hr,hrLocal);

With two validation modes via HResultValidationMode:

  • Exact — HRESULTs must match exactly (available for APIs where the specific code matters)
  • AllowDivergentFailures (default) — success HRESULTs (S_OK, S_FALSE) must match exactly, but any two failing HRESULTs (negative values) are considered equivalent

Converted all 113 call sites across 5 files from:

Debug.Assert(hrLocal==hr,$"cDAC: {hr:x}, DAC: {hrLocal:x}");

to:

Debug.ValidateHResult(hr,hrLocal);

CopilotAI review requested due to automatic review settings March 5, 2026 20:53
@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 updates the cDAC Legacy layer’s DEBUG cross-validation to stop asserting on exact HRESULT equality when both the cDAC and legacy/native DAC correctly fail, but return different failure codes. This avoids debugger-process termination and associated test flakiness while still preserving strict validation for success results.

Changes:

  • Introduces Debug.ValidateHResult() (with HResultValidationMode) to centralize HRESULT comparison rules.
  • Replaces ~113 Debug.Assert(hrLocal == hr, ...) call sites with Debug.ValidateHResult(hr, hrLocal) across the Legacy implementation.
  • Preserves strict matching for success HRESULTs while allowing divergent failure HRESULTs by default.

Reviewed changes

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

Show a summary per file
FileDescription
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/SOSDacImpl.csReplaces legacy-vs-cDAC HRESULT equality asserts with Debug.ValidateHResult.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/SOSDacImpl.IXCLRDataProcess.csSame replacement for IXCLRDataProcess-related validation asserts.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/ClrDataStackWalk.csUses Debug.ValidateHResult when cross-validating stack-walk HRESULTs in DEBUG.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/ClrDataMethodInstance.csReplaces per-site “allow any failing HRESULT” logic with the shared validator.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/ClrDataFrame.csUpdates frame HRESULT validation to use the shared validator.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/DebugExtensions.csAdds centralized HRESULT validation helper and mode enum.

rcj1
rcj1 approved these changes Mar 5, 2026

@rcj1rcj1 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.

As long as none of these callers differentiate between failures, then looks good to me

@max-charlamb
max-charlamb merged commit dd20361 into dotnet:mainMar 6, 2026
58 checks passed
@max-charlamb
max-charlamb deleted the cdac-divergent-failure-verification branch March 6, 2026 14:17
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Apr 6, 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.

4 participants

@max-charlamb@noahfalk@rcj1
, '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] Relax HRESULT validation to allow divergent failure codes - #125236

Merged
max-charlamb merged 1 commit into
dotnet:mainfrom
max-charlamb:cdac-divergent-failure-verification
Mar 6, 2026
Merged

[cDAC] Relax HRESULT validation to allow divergent failure codes#125236
max-charlamb merged 1 commit into
dotnet:mainfrom
max-charlamb:cdac-divergent-failure-verification

Conversation

@max-charlamb

Copy link
Copy Markdown
Member

Summary

The cDAC's DEBUG validation asserts compare HRESULTs between the cDAC and legacy DAC using exact equality (Debug.Assert(hrLocal == hr)). This causes the debugger process to crash when the cDAC and native DAC return different failure HRESULTs for the same invalid input.

For example, when GetMethodTableData is called with a garbage method table pointer, the cDAC may throw InvalidOperationException (0x80131C49) while the native DAC returns E_INVALIDARG (0x80070057). Both correctly reject the input, but the exact HRESULT comparison fires a fatal Debug.Assert that terminates the debugger mid-command — causing flaky CI failures like SOS.VarargPInvokeInteropMD in the cDAC_windows_x64_release job.

No consumer (ClrMD, SOS, managed debugger) branches on specific failure codes from these APIs — they only check success vs failure.

Changes

New file: DebugExtensions.cs — adds Debug.ValidateHResult() as a C# 14 static extension method on System.Diagnostics.Debug:

Debug.ValidateHResult(hr,hrLocal);

With two validation modes via HResultValidationMode:

  • Exact — HRESULTs must match exactly (available for APIs where the specific code matters)
  • AllowDivergentFailures (default) — success HRESULTs (S_OK, S_FALSE) must match exactly, but any two failing HRESULTs (negative values) are considered equivalent

Converted all 113 call sites across 5 files from:

Debug.Assert(hrLocal==hr,$"cDAC: {hr:x}, DAC: {hrLocal:x}");

to:

Debug.ValidateHResult(hr,hrLocal);

CopilotAI review requested due to automatic review settings March 5, 2026 20:53
@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 updates the cDAC Legacy layer’s DEBUG cross-validation to stop asserting on exact HRESULT equality when both the cDAC and legacy/native DAC correctly fail, but return different failure codes. This avoids debugger-process termination and associated test flakiness while still preserving strict validation for success results.

Changes:

  • Introduces Debug.ValidateHResult() (with HResultValidationMode) to centralize HRESULT comparison rules.
  • Replaces ~113 Debug.Assert(hrLocal == hr, ...) call sites with Debug.ValidateHResult(hr, hrLocal) across the Legacy implementation.
  • Preserves strict matching for success HRESULTs while allowing divergent failure HRESULTs by default.

Reviewed changes

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

Show a summary per file
FileDescription
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/SOSDacImpl.csReplaces legacy-vs-cDAC HRESULT equality asserts with Debug.ValidateHResult.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/SOSDacImpl.IXCLRDataProcess.csSame replacement for IXCLRDataProcess-related validation asserts.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/ClrDataStackWalk.csUses Debug.ValidateHResult when cross-validating stack-walk HRESULTs in DEBUG.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/ClrDataMethodInstance.csReplaces per-site “allow any failing HRESULT” logic with the shared validator.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/ClrDataFrame.csUpdates frame HRESULT validation to use the shared validator.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/DebugExtensions.csAdds centralized HRESULT validation helper and mode enum.

rcj1
rcj1 approved these changes Mar 5, 2026

@rcj1rcj1 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.

As long as none of these callers differentiate between failures, then looks good to me

@max-charlamb
max-charlamb merged commit dd20361 into dotnet:mainMar 6, 2026
58 checks passed
@max-charlamb
max-charlamb deleted the cdac-divergent-failure-verification branch March 6, 2026 14:17
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Apr 6, 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.

4 participants

@max-charlamb@noahfalk@rcj1