Skip to content

Implement out-of-process SetThreadContext support for debugger detach - #118849

Merged
tommcdon merged 16 commits into
dotnet:mainfrom
tommcdon:dev/tommcdon/fix_cet_detach
Sep 19, 2025
Merged

Implement out-of-process SetThreadContext support for debugger detach#118849
tommcdon merged 16 commits into
dotnet:mainfrom
tommcdon:dev/tommcdon/fix_cet_detach

Conversation

@tommcdon

@tommcdontommcdon commented Aug 18, 2025

Copy link
Copy Markdown
Member

This change handles a race between debugger detach and Debugger::SendSetThreadContextNeeded notifications. When the debugger calls ICorDebugController::Detach, we either delete or mark in-flight controllers for deletion which allows for further processing of in-flight breakpoint/single-step exceptions. If out-of-process SetThreadContext is needed is enabled, we could cause the debuggee to crash with an unhandled breakpoint exception while sending SetThreadContextNeeded flares after we detached. This change causes the detach operation to track SetThreadContextNeeded operations before signaling completion. Note the change only takes affect if CET debugging is enabled, and it only tracks notification count and state if we are in the process of detaching. This change handles early process exit during attach as well.
Fixes#116870

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 implements support for out-of-process SetThreadContext operations during debugger detach to handle a race condition between debugger detach and SetThreadContextNeeded notifications. The key issue addressed is preventing debuggee crashes from unhandled breakpoint exceptions when these notifications are sent after the debugger has already detached.

Key changes include:

  • Introduction of tracking mechanisms for SetThreadContext operations during detach
  • New IPC event type for detach completion with flare count information
  • Synchronization logic to ensure all pending SetThreadContext operations complete before detach finishes

Reviewed Changes

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

Show a summary per file
FileDescription
src/coreclr/debug/shared/dbgtransportsession.cppAdds size calculation for new DETACH_FROM_PROCESS_RESULT event type
src/coreclr/debug/inc/dbgipceventtypes.hDefines new DB_IPCE_DETACH_FROM_PROCESS_RESULT event type and updates RUNTIME_LAST marker
src/coreclr/debug/inc/dbgipcevents.hAdds DetachFromProcessResult structure with cDispatchedFlares field
src/coreclr/debug/ee/debugger.cppImplements tracking logic for SetThreadContext operations during detach
src/coreclr/debug/ee/controller.hAdds static variables and methods for tracking detach state and dispatched exceptions
src/coreclr/debug/ee/controller.cppImplements controller counting and detach cleanup logic
src/coreclr/debug/di/rspriv.hAdds DetachNotifications helper class and detach-related member variables
src/coreclr/debug/di/process.cppImplements detach synchronization logic and event handling

You can also share your feedback on Copilot code review for a chance to win a $100 gift card. Take the survey.

Comment threadsrc/coreclr/debug/ee/controller.cpp Outdated
Comment threadsrc/coreclr/debug/ee/controller.h Outdated
Comment threadsrc/coreclr/debug/di/process.cpp Outdated
Comment threadsrc/coreclr/debug/ee/debugger.cpp Outdated
@dotnet-policy-service

Copy link
Copy Markdown
Contributor

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

@thaystgthaystg 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

…er creation and desctruction and DispatchPatchOrSingleStep
Comment threadsrc/coreclr/debug/ee/controller.h Outdated
…Controller creation and desctruction and DispatchPatchOrSingleStep"
This reverts commit 367c638.
This reverts commit 240b372.
Debugger events are tracked out of process to determine which threads have outstanding SetThreadContextNeeded flares

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

Yeah, this is getting much easier to reason about. I put a few suggestions inline but overall looks good!

Comment threadsrc/coreclr/debug/ee/debugger.cpp Outdated
Comment threadsrc/coreclr/debug/di/process.cpp Outdated
Refactor HandleSetThreadContextNeeded for improved readability
Comment threadsrc/coreclr/debug/di/rspriv.h Outdated
@tommcdon
tommcdon enabled auto-merge (squash) September 19, 2025 16:49
@tommcdon
tommcdon merged commit 2db45f1 into dotnet:mainSep 19, 2025
98 checks passed
@tommcdon

Copy link
Copy Markdown
MemberAuthor

/backport to release/10.0

@github-actions

Copy link
Copy Markdown
Contributor

Started backporting to release/10.0: https://github.com/dotnet/runtime/actions/runs/17866298253

xtqqczze pushed a commit to xtqqczze/dotnet-runtime that referenced this pull request Sep 20, 2025
…dotnet#118849)
* Implement out-of-process detach support
* Fix build break
* Handle early process termination during detach in out-of-process debugging
* Track active controller ref count for detach through DebuggerController creation and desctruction and DispatchPatchOrSingleStep
* Continuously track active dispatched exceptions and flares sent
* Revert "Continuously track active dispatched exceptions and flares sent"
This reverts commit dd6d28c.
* Revert "Track active controller ref count for detach through DebuggerController creation and desctruction and DispatchPatchOrSingleStep"
This reverts commit 367c638.
* Revert "Fix build break"
This reverts commit 240b372.
* Revert "Implement out-of-process detach support"
This reverts commit d80b6c4.
* Out-of-process detach support for CET
Debugger events are tracked out of process to determine which threads have outstanding SetThreadContextNeeded flares
* Remove unused enum
* Break out of detach if timed out or process exited
* Add ClearSetIP to SetThreadContextNeeded event,
Refactor HandleSetThreadContextNeeded for improved readability
* Handle case when out of process setthreadcontext is oped-out but available on the platform
* PR feedback on code comment
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Oct 20, 2025
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.

Detaching from a .Net9 debuggee can crash the application

4 participants

@tommcdon@thaystg@noahfalk
, 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
 blocks
(function() {
function addCopyButtons() {
document.querySelectorAll('pre code').forEach(function(codeBlock) {
if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
codeBlock.parentElement.setAttribute('data-copy-added', 'true');
var btn = document.createElement('button');
btn.textContent = 'Copy';
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;';
btn.onmouseover = function() { this.style.opacity = '1'; };
btn.onmouseout = function() { this.style.opacity = '0.7'; };
btn.onclick = function() {
navigator.clipboard.writeText(codeBlock.textContent).then(function() {
btn.textContent = 'Copied!';
setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
});
};
codeBlock.parentElement.style.position = 'relative';
codeBlock.parentElement.appendChild(btn);
});
}
addCopyButtons();
// Re-run on dynamic content
var observer = new MutationObserver(addCopyButtons);
observer.observe(document.body, { childList: true, subtree: true });
})();
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Implement out-of-process SetThreadContext support for debugger detach by tommcdon · Pull Request #118849 · dotnet/runtime · GitHub
Skip to content

Implement out-of-process SetThreadContext support for debugger detach - #118849

Merged
tommcdon merged 16 commits into
dotnet:mainfrom
tommcdon:dev/tommcdon/fix_cet_detach
Sep 19, 2025
Merged

Implement out-of-process SetThreadContext support for debugger detach#118849
tommcdon merged 16 commits into
dotnet:mainfrom
tommcdon:dev/tommcdon/fix_cet_detach

Conversation

@tommcdon

@tommcdontommcdon commented Aug 18, 2025

Copy link
Copy Markdown
Member

This change handles a race between debugger detach and Debugger::SendSetThreadContextNeeded notifications. When the debugger calls ICorDebugController::Detach, we either delete or mark in-flight controllers for deletion which allows for further processing of in-flight breakpoint/single-step exceptions. If out-of-process SetThreadContext is needed is enabled, we could cause the debuggee to crash with an unhandled breakpoint exception while sending SetThreadContextNeeded flares after we detached. This change causes the detach operation to track SetThreadContextNeeded operations before signaling completion. Note the change only takes affect if CET debugging is enabled, and it only tracks notification count and state if we are in the process of detaching. This change handles early process exit during attach as well.
Fixes#116870

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 implements support for out-of-process SetThreadContext operations during debugger detach to handle a race condition between debugger detach and SetThreadContextNeeded notifications. The key issue addressed is preventing debuggee crashes from unhandled breakpoint exceptions when these notifications are sent after the debugger has already detached.

Key changes include:

  • Introduction of tracking mechanisms for SetThreadContext operations during detach
  • New IPC event type for detach completion with flare count information
  • Synchronization logic to ensure all pending SetThreadContext operations complete before detach finishes

Reviewed Changes

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

Show a summary per file
FileDescription
src/coreclr/debug/shared/dbgtransportsession.cppAdds size calculation for new DETACH_FROM_PROCESS_RESULT event type
src/coreclr/debug/inc/dbgipceventtypes.hDefines new DB_IPCE_DETACH_FROM_PROCESS_RESULT event type and updates RUNTIME_LAST marker
src/coreclr/debug/inc/dbgipcevents.hAdds DetachFromProcessResult structure with cDispatchedFlares field
src/coreclr/debug/ee/debugger.cppImplements tracking logic for SetThreadContext operations during detach
src/coreclr/debug/ee/controller.hAdds static variables and methods for tracking detach state and dispatched exceptions
src/coreclr/debug/ee/controller.cppImplements controller counting and detach cleanup logic
src/coreclr/debug/di/rspriv.hAdds DetachNotifications helper class and detach-related member variables
src/coreclr/debug/di/process.cppImplements detach synchronization logic and event handling

You can also share your feedback on Copilot code review for a chance to win a $100 gift card. Take the survey.

Comment threadsrc/coreclr/debug/ee/controller.cpp Outdated
Comment threadsrc/coreclr/debug/ee/controller.h Outdated
Comment threadsrc/coreclr/debug/di/process.cpp Outdated
Comment threadsrc/coreclr/debug/ee/debugger.cpp Outdated
@dotnet-policy-service

Copy link
Copy Markdown
Contributor

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

@thaystgthaystg 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

…er creation and desctruction and DispatchPatchOrSingleStep
Comment threadsrc/coreclr/debug/ee/controller.h Outdated
…Controller creation and desctruction and DispatchPatchOrSingleStep"
This reverts commit 367c638.
This reverts commit 240b372.
Debugger events are tracked out of process to determine which threads have outstanding SetThreadContextNeeded flares

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

Yeah, this is getting much easier to reason about. I put a few suggestions inline but overall looks good!

Comment threadsrc/coreclr/debug/ee/debugger.cpp Outdated
Comment threadsrc/coreclr/debug/di/process.cpp Outdated
Refactor HandleSetThreadContextNeeded for improved readability
Comment threadsrc/coreclr/debug/di/rspriv.h Outdated
@tommcdon
tommcdon enabled auto-merge (squash) September 19, 2025 16:49
@tommcdon
tommcdon merged commit 2db45f1 into dotnet:mainSep 19, 2025
98 checks passed
@tommcdon

Copy link
Copy Markdown
MemberAuthor

/backport to release/10.0

@github-actions

Copy link
Copy Markdown
Contributor

Started backporting to release/10.0: https://github.com/dotnet/runtime/actions/runs/17866298253

xtqqczze pushed a commit to xtqqczze/dotnet-runtime that referenced this pull request Sep 20, 2025
…dotnet#118849)
* Implement out-of-process detach support
* Fix build break
* Handle early process termination during detach in out-of-process debugging
* Track active controller ref count for detach through DebuggerController creation and desctruction and DispatchPatchOrSingleStep
* Continuously track active dispatched exceptions and flares sent
* Revert "Continuously track active dispatched exceptions and flares sent"
This reverts commit dd6d28c.
* Revert "Track active controller ref count for detach through DebuggerController creation and desctruction and DispatchPatchOrSingleStep"
This reverts commit 367c638.
* Revert "Fix build break"
This reverts commit 240b372.
* Revert "Implement out-of-process detach support"
This reverts commit d80b6c4.
* Out-of-process detach support for CET
Debugger events are tracked out of process to determine which threads have outstanding SetThreadContextNeeded flares
* Remove unused enum
* Break out of detach if timed out or process exited
* Add ClearSetIP to SetThreadContextNeeded event,
Refactor HandleSetThreadContextNeeded for improved readability
* Handle case when out of process setthreadcontext is oped-out but available on the platform
* PR feedback on code comment
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Oct 20, 2025
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.

Detaching from a .Net9 debuggee can crash the application

4 participants

@tommcdon@thaystg@noahfalk
, 'i'); if (__m === '*' || __re.test(location.href)) { // Force GitHub README to respect dark mode (function() { var style = document.createElement('style'); style.textContent = ' .markdown-body { color-scheme: dark light; } .markdown-body pre { background: #161b22 !important; } .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; } .markdown-body table th, .markdown-body table td { border-color: #30363d !important; } .markdown-body img { background: #0d1117; } .markdown-body blockquote { border-left-color: #8b949e; } .markdown-body hr { border-color: #30363d; } '; document.head.appendChild(style); })(); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' Implement out-of-process SetThreadContext support for debugger detach by tommcdon · Pull Request #118849 · dotnet/runtime · GitHub
Skip to content

Implement out-of-process SetThreadContext support for debugger detach - #118849

Merged
tommcdon merged 16 commits into
dotnet:mainfrom
tommcdon:dev/tommcdon/fix_cet_detach
Sep 19, 2025
Merged

Implement out-of-process SetThreadContext support for debugger detach#118849
tommcdon merged 16 commits into
dotnet:mainfrom
tommcdon:dev/tommcdon/fix_cet_detach

Conversation

@tommcdon

@tommcdontommcdon commented Aug 18, 2025

Copy link
Copy Markdown
Member

This change handles a race between debugger detach and Debugger::SendSetThreadContextNeeded notifications. When the debugger calls ICorDebugController::Detach, we either delete or mark in-flight controllers for deletion which allows for further processing of in-flight breakpoint/single-step exceptions. If out-of-process SetThreadContext is needed is enabled, we could cause the debuggee to crash with an unhandled breakpoint exception while sending SetThreadContextNeeded flares after we detached. This change causes the detach operation to track SetThreadContextNeeded operations before signaling completion. Note the change only takes affect if CET debugging is enabled, and it only tracks notification count and state if we are in the process of detaching. This change handles early process exit during attach as well.
Fixes#116870

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 implements support for out-of-process SetThreadContext operations during debugger detach to handle a race condition between debugger detach and SetThreadContextNeeded notifications. The key issue addressed is preventing debuggee crashes from unhandled breakpoint exceptions when these notifications are sent after the debugger has already detached.

Key changes include:

  • Introduction of tracking mechanisms for SetThreadContext operations during detach
  • New IPC event type for detach completion with flare count information
  • Synchronization logic to ensure all pending SetThreadContext operations complete before detach finishes

Reviewed Changes

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

Show a summary per file
FileDescription
src/coreclr/debug/shared/dbgtransportsession.cppAdds size calculation for new DETACH_FROM_PROCESS_RESULT event type
src/coreclr/debug/inc/dbgipceventtypes.hDefines new DB_IPCE_DETACH_FROM_PROCESS_RESULT event type and updates RUNTIME_LAST marker
src/coreclr/debug/inc/dbgipcevents.hAdds DetachFromProcessResult structure with cDispatchedFlares field
src/coreclr/debug/ee/debugger.cppImplements tracking logic for SetThreadContext operations during detach
src/coreclr/debug/ee/controller.hAdds static variables and methods for tracking detach state and dispatched exceptions
src/coreclr/debug/ee/controller.cppImplements controller counting and detach cleanup logic
src/coreclr/debug/di/rspriv.hAdds DetachNotifications helper class and detach-related member variables
src/coreclr/debug/di/process.cppImplements detach synchronization logic and event handling

You can also share your feedback on Copilot code review for a chance to win a $100 gift card. Take the survey.

Comment threadsrc/coreclr/debug/ee/controller.cpp Outdated
Comment threadsrc/coreclr/debug/ee/controller.h Outdated
Comment threadsrc/coreclr/debug/di/process.cpp Outdated
Comment threadsrc/coreclr/debug/ee/debugger.cpp Outdated
@dotnet-policy-service

Copy link
Copy Markdown
Contributor

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

@thaystgthaystg 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

…er creation and desctruction and DispatchPatchOrSingleStep
Comment threadsrc/coreclr/debug/ee/controller.h Outdated
…Controller creation and desctruction and DispatchPatchOrSingleStep"
This reverts commit 367c638.
This reverts commit 240b372.
Debugger events are tracked out of process to determine which threads have outstanding SetThreadContextNeeded flares

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

Yeah, this is getting much easier to reason about. I put a few suggestions inline but overall looks good!

Comment threadsrc/coreclr/debug/ee/debugger.cpp Outdated
Comment threadsrc/coreclr/debug/di/process.cpp Outdated
Refactor HandleSetThreadContextNeeded for improved readability
Comment threadsrc/coreclr/debug/di/rspriv.h Outdated
@tommcdon
tommcdon enabled auto-merge (squash) September 19, 2025 16:49
@tommcdon
tommcdon merged commit 2db45f1 into dotnet:mainSep 19, 2025
98 checks passed
@tommcdon

Copy link
Copy Markdown
MemberAuthor

/backport to release/10.0

@github-actions

Copy link
Copy Markdown
Contributor

Started backporting to release/10.0: https://github.com/dotnet/runtime/actions/runs/17866298253

xtqqczze pushed a commit to xtqqczze/dotnet-runtime that referenced this pull request Sep 20, 2025
…dotnet#118849)
* Implement out-of-process detach support
* Fix build break
* Handle early process termination during detach in out-of-process debugging
* Track active controller ref count for detach through DebuggerController creation and desctruction and DispatchPatchOrSingleStep
* Continuously track active dispatched exceptions and flares sent
* Revert "Continuously track active dispatched exceptions and flares sent"
This reverts commit dd6d28c.
* Revert "Track active controller ref count for detach through DebuggerController creation and desctruction and DispatchPatchOrSingleStep"
This reverts commit 367c638.
* Revert "Fix build break"
This reverts commit 240b372.
* Revert "Implement out-of-process detach support"
This reverts commit d80b6c4.
* Out-of-process detach support for CET
Debugger events are tracked out of process to determine which threads have outstanding SetThreadContextNeeded flares
* Remove unused enum
* Break out of detach if timed out or process exited
* Add ClearSetIP to SetThreadContextNeeded event,
Refactor HandleSetThreadContextNeeded for improved readability
* Handle case when out of process setthreadcontext is oped-out but available on the platform
* PR feedback on code comment
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Oct 20, 2025
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.

Detaching from a .Net9 debuggee can crash the application

4 participants

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

Implement out-of-process SetThreadContext support for debugger detach - #118849

Merged
tommcdon merged 16 commits into
dotnet:mainfrom
tommcdon:dev/tommcdon/fix_cet_detach
Sep 19, 2025
Merged

Implement out-of-process SetThreadContext support for debugger detach#118849
tommcdon merged 16 commits into
dotnet:mainfrom
tommcdon:dev/tommcdon/fix_cet_detach

Conversation

@tommcdon

@tommcdontommcdon commented Aug 18, 2025

Copy link
Copy Markdown
Member

This change handles a race between debugger detach and Debugger::SendSetThreadContextNeeded notifications. When the debugger calls ICorDebugController::Detach, we either delete or mark in-flight controllers for deletion which allows for further processing of in-flight breakpoint/single-step exceptions. If out-of-process SetThreadContext is needed is enabled, we could cause the debuggee to crash with an unhandled breakpoint exception while sending SetThreadContextNeeded flares after we detached. This change causes the detach operation to track SetThreadContextNeeded operations before signaling completion. Note the change only takes affect if CET debugging is enabled, and it only tracks notification count and state if we are in the process of detaching. This change handles early process exit during attach as well.
Fixes#116870

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 implements support for out-of-process SetThreadContext operations during debugger detach to handle a race condition between debugger detach and SetThreadContextNeeded notifications. The key issue addressed is preventing debuggee crashes from unhandled breakpoint exceptions when these notifications are sent after the debugger has already detached.

Key changes include:

  • Introduction of tracking mechanisms for SetThreadContext operations during detach
  • New IPC event type for detach completion with flare count information
  • Synchronization logic to ensure all pending SetThreadContext operations complete before detach finishes

Reviewed Changes

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

Show a summary per file
FileDescription
src/coreclr/debug/shared/dbgtransportsession.cppAdds size calculation for new DETACH_FROM_PROCESS_RESULT event type
src/coreclr/debug/inc/dbgipceventtypes.hDefines new DB_IPCE_DETACH_FROM_PROCESS_RESULT event type and updates RUNTIME_LAST marker
src/coreclr/debug/inc/dbgipcevents.hAdds DetachFromProcessResult structure with cDispatchedFlares field
src/coreclr/debug/ee/debugger.cppImplements tracking logic for SetThreadContext operations during detach
src/coreclr/debug/ee/controller.hAdds static variables and methods for tracking detach state and dispatched exceptions
src/coreclr/debug/ee/controller.cppImplements controller counting and detach cleanup logic
src/coreclr/debug/di/rspriv.hAdds DetachNotifications helper class and detach-related member variables
src/coreclr/debug/di/process.cppImplements detach synchronization logic and event handling

You can also share your feedback on Copilot code review for a chance to win a $100 gift card. Take the survey.

Comment threadsrc/coreclr/debug/ee/controller.cpp Outdated
Comment threadsrc/coreclr/debug/ee/controller.h Outdated
Comment threadsrc/coreclr/debug/di/process.cpp Outdated
Comment threadsrc/coreclr/debug/ee/debugger.cpp Outdated
@dotnet-policy-service

Copy link
Copy Markdown
Contributor

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

@thaystgthaystg 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

…er creation and desctruction and DispatchPatchOrSingleStep
Comment threadsrc/coreclr/debug/ee/controller.h Outdated
…Controller creation and desctruction and DispatchPatchOrSingleStep"
This reverts commit 367c638.
This reverts commit 240b372.
Debugger events are tracked out of process to determine which threads have outstanding SetThreadContextNeeded flares

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

Yeah, this is getting much easier to reason about. I put a few suggestions inline but overall looks good!

Comment threadsrc/coreclr/debug/ee/debugger.cpp Outdated
Comment threadsrc/coreclr/debug/di/process.cpp Outdated
Refactor HandleSetThreadContextNeeded for improved readability
Comment threadsrc/coreclr/debug/di/rspriv.h Outdated
@tommcdon
tommcdon enabled auto-merge (squash) September 19, 2025 16:49
@tommcdon
tommcdon merged commit 2db45f1 into dotnet:mainSep 19, 2025
98 checks passed
@tommcdon

Copy link
Copy Markdown
MemberAuthor

/backport to release/10.0

@github-actions

Copy link
Copy Markdown
Contributor

Started backporting to release/10.0: https://github.com/dotnet/runtime/actions/runs/17866298253

xtqqczze pushed a commit to xtqqczze/dotnet-runtime that referenced this pull request Sep 20, 2025
…dotnet#118849)
* Implement out-of-process detach support
* Fix build break
* Handle early process termination during detach in out-of-process debugging
* Track active controller ref count for detach through DebuggerController creation and desctruction and DispatchPatchOrSingleStep
* Continuously track active dispatched exceptions and flares sent
* Revert "Continuously track active dispatched exceptions and flares sent"
This reverts commit dd6d28c.
* Revert "Track active controller ref count for detach through DebuggerController creation and desctruction and DispatchPatchOrSingleStep"
This reverts commit 367c638.
* Revert "Fix build break"
This reverts commit 240b372.
* Revert "Implement out-of-process detach support"
This reverts commit d80b6c4.
* Out-of-process detach support for CET
Debugger events are tracked out of process to determine which threads have outstanding SetThreadContextNeeded flares
* Remove unused enum
* Break out of detach if timed out or process exited
* Add ClearSetIP to SetThreadContextNeeded event,
Refactor HandleSetThreadContextNeeded for improved readability
* Handle case when out of process setthreadcontext is oped-out but available on the platform
* PR feedback on code comment
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Oct 20, 2025
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.

Detaching from a .Net9 debuggee can crash the application

4 participants

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

Implement out-of-process SetThreadContext support for debugger detach - #118849

Merged
tommcdon merged 16 commits into
dotnet:mainfrom
tommcdon:dev/tommcdon/fix_cet_detach
Sep 19, 2025
Merged

Implement out-of-process SetThreadContext support for debugger detach#118849
tommcdon merged 16 commits into
dotnet:mainfrom
tommcdon:dev/tommcdon/fix_cet_detach

Conversation

@tommcdon

@tommcdontommcdon commented Aug 18, 2025

Copy link
Copy Markdown
Member

This change handles a race between debugger detach and Debugger::SendSetThreadContextNeeded notifications. When the debugger calls ICorDebugController::Detach, we either delete or mark in-flight controllers for deletion which allows for further processing of in-flight breakpoint/single-step exceptions. If out-of-process SetThreadContext is needed is enabled, we could cause the debuggee to crash with an unhandled breakpoint exception while sending SetThreadContextNeeded flares after we detached. This change causes the detach operation to track SetThreadContextNeeded operations before signaling completion. Note the change only takes affect if CET debugging is enabled, and it only tracks notification count and state if we are in the process of detaching. This change handles early process exit during attach as well.
Fixes#116870

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 implements support for out-of-process SetThreadContext operations during debugger detach to handle a race condition between debugger detach and SetThreadContextNeeded notifications. The key issue addressed is preventing debuggee crashes from unhandled breakpoint exceptions when these notifications are sent after the debugger has already detached.

Key changes include:

  • Introduction of tracking mechanisms for SetThreadContext operations during detach
  • New IPC event type for detach completion with flare count information
  • Synchronization logic to ensure all pending SetThreadContext operations complete before detach finishes

Reviewed Changes

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

Show a summary per file
FileDescription
src/coreclr/debug/shared/dbgtransportsession.cppAdds size calculation for new DETACH_FROM_PROCESS_RESULT event type
src/coreclr/debug/inc/dbgipceventtypes.hDefines new DB_IPCE_DETACH_FROM_PROCESS_RESULT event type and updates RUNTIME_LAST marker
src/coreclr/debug/inc/dbgipcevents.hAdds DetachFromProcessResult structure with cDispatchedFlares field
src/coreclr/debug/ee/debugger.cppImplements tracking logic for SetThreadContext operations during detach
src/coreclr/debug/ee/controller.hAdds static variables and methods for tracking detach state and dispatched exceptions
src/coreclr/debug/ee/controller.cppImplements controller counting and detach cleanup logic
src/coreclr/debug/di/rspriv.hAdds DetachNotifications helper class and detach-related member variables
src/coreclr/debug/di/process.cppImplements detach synchronization logic and event handling

You can also share your feedback on Copilot code review for a chance to win a $100 gift card. Take the survey.

Comment threadsrc/coreclr/debug/ee/controller.cpp Outdated
Comment threadsrc/coreclr/debug/ee/controller.h Outdated
Comment threadsrc/coreclr/debug/di/process.cpp Outdated
Comment threadsrc/coreclr/debug/ee/debugger.cpp Outdated
@dotnet-policy-service

Copy link
Copy Markdown
Contributor

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

@thaystgthaystg 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

…er creation and desctruction and DispatchPatchOrSingleStep
Comment threadsrc/coreclr/debug/ee/controller.h Outdated
…Controller creation and desctruction and DispatchPatchOrSingleStep"
This reverts commit 367c638.
This reverts commit 240b372.
Debugger events are tracked out of process to determine which threads have outstanding SetThreadContextNeeded flares

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

Yeah, this is getting much easier to reason about. I put a few suggestions inline but overall looks good!

Comment threadsrc/coreclr/debug/ee/debugger.cpp Outdated
Comment threadsrc/coreclr/debug/di/process.cpp Outdated
Refactor HandleSetThreadContextNeeded for improved readability
Comment threadsrc/coreclr/debug/di/rspriv.h Outdated
@tommcdon
tommcdon enabled auto-merge (squash) September 19, 2025 16:49
@tommcdon
tommcdon merged commit 2db45f1 into dotnet:mainSep 19, 2025
98 checks passed
@tommcdon

Copy link
Copy Markdown
MemberAuthor

/backport to release/10.0

@github-actions

Copy link
Copy Markdown
Contributor

Started backporting to release/10.0: https://github.com/dotnet/runtime/actions/runs/17866298253

xtqqczze pushed a commit to xtqqczze/dotnet-runtime that referenced this pull request Sep 20, 2025
…dotnet#118849)
* Implement out-of-process detach support
* Fix build break
* Handle early process termination during detach in out-of-process debugging
* Track active controller ref count for detach through DebuggerController creation and desctruction and DispatchPatchOrSingleStep
* Continuously track active dispatched exceptions and flares sent
* Revert "Continuously track active dispatched exceptions and flares sent"
This reverts commit dd6d28c.
* Revert "Track active controller ref count for detach through DebuggerController creation and desctruction and DispatchPatchOrSingleStep"
This reverts commit 367c638.
* Revert "Fix build break"
This reverts commit 240b372.
* Revert "Implement out-of-process detach support"
This reverts commit d80b6c4.
* Out-of-process detach support for CET
Debugger events are tracked out of process to determine which threads have outstanding SetThreadContextNeeded flares
* Remove unused enum
* Break out of detach if timed out or process exited
* Add ClearSetIP to SetThreadContextNeeded event,
Refactor HandleSetThreadContextNeeded for improved readability
* Handle case when out of process setthreadcontext is oped-out but available on the platform
* PR feedback on code comment
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Oct 20, 2025
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.

Detaching from a .Net9 debuggee can crash the application

4 participants

@tommcdon@thaystg@noahfalk
, 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' Implement out-of-process SetThreadContext support for debugger detach by tommcdon · Pull Request #118849 · dotnet/runtime · GitHub
Skip to content

Implement out-of-process SetThreadContext support for debugger detach - #118849

Merged
tommcdon merged 16 commits into
dotnet:mainfrom
tommcdon:dev/tommcdon/fix_cet_detach
Sep 19, 2025
Merged

Implement out-of-process SetThreadContext support for debugger detach#118849
tommcdon merged 16 commits into
dotnet:mainfrom
tommcdon:dev/tommcdon/fix_cet_detach

Conversation

@tommcdon

@tommcdontommcdon commented Aug 18, 2025

Copy link
Copy Markdown
Member

This change handles a race between debugger detach and Debugger::SendSetThreadContextNeeded notifications. When the debugger calls ICorDebugController::Detach, we either delete or mark in-flight controllers for deletion which allows for further processing of in-flight breakpoint/single-step exceptions. If out-of-process SetThreadContext is needed is enabled, we could cause the debuggee to crash with an unhandled breakpoint exception while sending SetThreadContextNeeded flares after we detached. This change causes the detach operation to track SetThreadContextNeeded operations before signaling completion. Note the change only takes affect if CET debugging is enabled, and it only tracks notification count and state if we are in the process of detaching. This change handles early process exit during attach as well.
Fixes#116870

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 implements support for out-of-process SetThreadContext operations during debugger detach to handle a race condition between debugger detach and SetThreadContextNeeded notifications. The key issue addressed is preventing debuggee crashes from unhandled breakpoint exceptions when these notifications are sent after the debugger has already detached.

Key changes include:

  • Introduction of tracking mechanisms for SetThreadContext operations during detach
  • New IPC event type for detach completion with flare count information
  • Synchronization logic to ensure all pending SetThreadContext operations complete before detach finishes

Reviewed Changes

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

Show a summary per file
FileDescription
src/coreclr/debug/shared/dbgtransportsession.cppAdds size calculation for new DETACH_FROM_PROCESS_RESULT event type
src/coreclr/debug/inc/dbgipceventtypes.hDefines new DB_IPCE_DETACH_FROM_PROCESS_RESULT event type and updates RUNTIME_LAST marker
src/coreclr/debug/inc/dbgipcevents.hAdds DetachFromProcessResult structure with cDispatchedFlares field
src/coreclr/debug/ee/debugger.cppImplements tracking logic for SetThreadContext operations during detach
src/coreclr/debug/ee/controller.hAdds static variables and methods for tracking detach state and dispatched exceptions
src/coreclr/debug/ee/controller.cppImplements controller counting and detach cleanup logic
src/coreclr/debug/di/rspriv.hAdds DetachNotifications helper class and detach-related member variables
src/coreclr/debug/di/process.cppImplements detach synchronization logic and event handling

You can also share your feedback on Copilot code review for a chance to win a $100 gift card. Take the survey.

Comment threadsrc/coreclr/debug/ee/controller.cpp Outdated
Comment threadsrc/coreclr/debug/ee/controller.h Outdated
Comment threadsrc/coreclr/debug/di/process.cpp Outdated
Comment threadsrc/coreclr/debug/ee/debugger.cpp Outdated
@dotnet-policy-service

Copy link
Copy Markdown
Contributor

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

@thaystgthaystg 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

…er creation and desctruction and DispatchPatchOrSingleStep
Comment threadsrc/coreclr/debug/ee/controller.h Outdated
…Controller creation and desctruction and DispatchPatchOrSingleStep"
This reverts commit 367c638.
This reverts commit 240b372.
Debugger events are tracked out of process to determine which threads have outstanding SetThreadContextNeeded flares

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

Yeah, this is getting much easier to reason about. I put a few suggestions inline but overall looks good!

Comment threadsrc/coreclr/debug/ee/debugger.cpp Outdated
Comment threadsrc/coreclr/debug/di/process.cpp Outdated
Refactor HandleSetThreadContextNeeded for improved readability
Comment threadsrc/coreclr/debug/di/rspriv.h Outdated
@tommcdon
tommcdon enabled auto-merge (squash) September 19, 2025 16:49
@tommcdon
tommcdon merged commit 2db45f1 into dotnet:mainSep 19, 2025
98 checks passed
@tommcdon

Copy link
Copy Markdown
MemberAuthor

/backport to release/10.0

@github-actions

Copy link
Copy Markdown
Contributor

Started backporting to release/10.0: https://github.com/dotnet/runtime/actions/runs/17866298253

xtqqczze pushed a commit to xtqqczze/dotnet-runtime that referenced this pull request Sep 20, 2025
…dotnet#118849)
* Implement out-of-process detach support
* Fix build break
* Handle early process termination during detach in out-of-process debugging
* Track active controller ref count for detach through DebuggerController creation and desctruction and DispatchPatchOrSingleStep
* Continuously track active dispatched exceptions and flares sent
* Revert "Continuously track active dispatched exceptions and flares sent"
This reverts commit dd6d28c.
* Revert "Track active controller ref count for detach through DebuggerController creation and desctruction and DispatchPatchOrSingleStep"
This reverts commit 367c638.
* Revert "Fix build break"
This reverts commit 240b372.
* Revert "Implement out-of-process detach support"
This reverts commit d80b6c4.
* Out-of-process detach support for CET
Debugger events are tracked out of process to determine which threads have outstanding SetThreadContextNeeded flares
* Remove unused enum
* Break out of detach if timed out or process exited
* Add ClearSetIP to SetThreadContextNeeded event,
Refactor HandleSetThreadContextNeeded for improved readability
* Handle case when out of process setthreadcontext is oped-out but available on the platform
* PR feedback on code comment
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Oct 20, 2025
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.

Detaching from a .Net9 debuggee can crash the application

4 participants

@tommcdon@thaystg@noahfalk
, 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); })(); Implement out-of-process SetThreadContext support for debugger detach by tommcdon · Pull Request #118849 · dotnet/runtime · GitHub
Skip to content

Implement out-of-process SetThreadContext support for debugger detach - #118849

Merged
tommcdon merged 16 commits into
dotnet:mainfrom
tommcdon:dev/tommcdon/fix_cet_detach
Sep 19, 2025
Merged

Implement out-of-process SetThreadContext support for debugger detach#118849
tommcdon merged 16 commits into
dotnet:mainfrom
tommcdon:dev/tommcdon/fix_cet_detach

Conversation

@tommcdon

@tommcdontommcdon commented Aug 18, 2025

Copy link
Copy Markdown
Member

This change handles a race between debugger detach and Debugger::SendSetThreadContextNeeded notifications. When the debugger calls ICorDebugController::Detach, we either delete or mark in-flight controllers for deletion which allows for further processing of in-flight breakpoint/single-step exceptions. If out-of-process SetThreadContext is needed is enabled, we could cause the debuggee to crash with an unhandled breakpoint exception while sending SetThreadContextNeeded flares after we detached. This change causes the detach operation to track SetThreadContextNeeded operations before signaling completion. Note the change only takes affect if CET debugging is enabled, and it only tracks notification count and state if we are in the process of detaching. This change handles early process exit during attach as well.
Fixes#116870

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 implements support for out-of-process SetThreadContext operations during debugger detach to handle a race condition between debugger detach and SetThreadContextNeeded notifications. The key issue addressed is preventing debuggee crashes from unhandled breakpoint exceptions when these notifications are sent after the debugger has already detached.

Key changes include:

  • Introduction of tracking mechanisms for SetThreadContext operations during detach
  • New IPC event type for detach completion with flare count information
  • Synchronization logic to ensure all pending SetThreadContext operations complete before detach finishes

Reviewed Changes

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

Show a summary per file
FileDescription
src/coreclr/debug/shared/dbgtransportsession.cppAdds size calculation for new DETACH_FROM_PROCESS_RESULT event type
src/coreclr/debug/inc/dbgipceventtypes.hDefines new DB_IPCE_DETACH_FROM_PROCESS_RESULT event type and updates RUNTIME_LAST marker
src/coreclr/debug/inc/dbgipcevents.hAdds DetachFromProcessResult structure with cDispatchedFlares field
src/coreclr/debug/ee/debugger.cppImplements tracking logic for SetThreadContext operations during detach
src/coreclr/debug/ee/controller.hAdds static variables and methods for tracking detach state and dispatched exceptions
src/coreclr/debug/ee/controller.cppImplements controller counting and detach cleanup logic
src/coreclr/debug/di/rspriv.hAdds DetachNotifications helper class and detach-related member variables
src/coreclr/debug/di/process.cppImplements detach synchronization logic and event handling

You can also share your feedback on Copilot code review for a chance to win a $100 gift card. Take the survey.

Comment threadsrc/coreclr/debug/ee/controller.cpp Outdated
Comment threadsrc/coreclr/debug/ee/controller.h Outdated
Comment threadsrc/coreclr/debug/di/process.cpp Outdated
Comment threadsrc/coreclr/debug/ee/debugger.cpp Outdated
@dotnet-policy-service

Copy link
Copy Markdown
Contributor

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

@thaystgthaystg 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

…er creation and desctruction and DispatchPatchOrSingleStep
Comment threadsrc/coreclr/debug/ee/controller.h Outdated
…Controller creation and desctruction and DispatchPatchOrSingleStep"
This reverts commit 367c638.
This reverts commit 240b372.
Debugger events are tracked out of process to determine which threads have outstanding SetThreadContextNeeded flares

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

Yeah, this is getting much easier to reason about. I put a few suggestions inline but overall looks good!

Comment threadsrc/coreclr/debug/ee/debugger.cpp Outdated
Comment threadsrc/coreclr/debug/di/process.cpp Outdated
Refactor HandleSetThreadContextNeeded for improved readability
Comment threadsrc/coreclr/debug/di/rspriv.h Outdated
@tommcdon
tommcdon enabled auto-merge (squash) September 19, 2025 16:49
@tommcdon
tommcdon merged commit 2db45f1 into dotnet:mainSep 19, 2025
98 checks passed
@tommcdon

Copy link
Copy Markdown
MemberAuthor

/backport to release/10.0

@github-actions

Copy link
Copy Markdown
Contributor

Started backporting to release/10.0: https://github.com/dotnet/runtime/actions/runs/17866298253

xtqqczze pushed a commit to xtqqczze/dotnet-runtime that referenced this pull request Sep 20, 2025
…dotnet#118849)
* Implement out-of-process detach support
* Fix build break
* Handle early process termination during detach in out-of-process debugging
* Track active controller ref count for detach through DebuggerController creation and desctruction and DispatchPatchOrSingleStep
* Continuously track active dispatched exceptions and flares sent
* Revert "Continuously track active dispatched exceptions and flares sent"
This reverts commit dd6d28c.
* Revert "Track active controller ref count for detach through DebuggerController creation and desctruction and DispatchPatchOrSingleStep"
This reverts commit 367c638.
* Revert "Fix build break"
This reverts commit 240b372.
* Revert "Implement out-of-process detach support"
This reverts commit d80b6c4.
* Out-of-process detach support for CET
Debugger events are tracked out of process to determine which threads have outstanding SetThreadContextNeeded flares
* Remove unused enum
* Break out of detach if timed out or process exited
* Add ClearSetIP to SetThreadContextNeeded event,
Refactor HandleSetThreadContextNeeded for improved readability
* Handle case when out of process setthreadcontext is oped-out but available on the platform
* PR feedback on code comment
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Oct 20, 2025
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.

Detaching from a .Net9 debuggee can crash the application

4 participants

@tommcdon@thaystg@noahfalk