Skip to content

Report CoreCLR Write Barriers And Code-Heap Stubs In Traces - #132190

Merged
brianrob merged 15 commits into
dotnet:mainfrom
brianrob:brianrob-coreclr-etw-stub-reporting
Aug 28, 2026
Merged

Report CoreCLR Write Barriers And Code-Heap Stubs In Traces#132190
brianrob merged 15 commits into
dotnet:mainfrom
brianrob:brianrob-coreclr-etw-stub-reporting

Conversation

@brianrob

@brianrobbrianrob commented Aug 12, 2026

Copy link
Copy Markdown
Member

Summary

Improve symbol coverage for executable code generated outside normal JIT methods. This is in response to an internal customer that is capturing traces where large percentages of symbols are unresolvable and don't resolve to a module. Upon investigation, these symbols should resolve to the copied write barrier or one of several different kinds of stubs.

Coverage

Executable rangeLive ETW/EventPipeCapture state and rundownLive PerfMapOn-demand PerfMap
Copied write barriersExisting: emitted before tracing-provider initialization. This PR: moves reporting after initialization and preserves individual names and explicit sizes.This PR: reports individual ranges through MethodUnloadVerbose, MethodDCStartVerbose, and MethodDCEndVerbose.This PR: reports individual named ranges.This PR: replays individual named ranges.
EEJitManager jump/code-fragment blocksThis PR: reports blocks through MethodLoadVerbose.This PR: reports blocks through MethodUnloadVerbose, MethodDCStartVerbose, and MethodDCEndVerbose.Existing: reports blocks or individual allocations according to DOTNET_PerfMapStubGranularity.This PR: replays blocks regardless of live block/individual granularity.
Individual symbols within EEJitManager blocksExisting: no individual or block events. This PR: reports one event for the allocation block containing the stubs.Existing: no individual or block replay. This PR: replays the allocation block containing the stubs.Existing: reports individual symbols where instrumented. This PR: no change.Existing: no replay. This PR: reports the allocation block because individual symbols cannot be reconstructed.

On-demand PerfMap generation uses blocks because individual allocations cannot be reconstructed during enumeration.

All ETW/EventPipe entries use JitHelperMethod metadata.

Implementation Notes

CodeHeapIterator now snapshots each heap’s end and uses per-heap lookahead to produce bounded, non-overlapping stub ranges. Jump-stub sizes use their existing allocation metadata; other code-fragment blocks use the bounded allocation extent.

Copied write-barrier reporting derives targets from the configured JIT helper table.

This does not change stub layout, allocation size, alignment, CodeHeader adjacency, DAC contracts, or jump reachability.

Note

This pull request description was created with GitHub Copilot.

brianroband others added 3 commits August 6, 2026 13:19
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 8ec89d46-dd0a-4373-8c4b-9ccdabfdecc2
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 8ec89d46-dd0a-4373-8c4b-9ccdabfdecc2
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 8ec89d46-dd0a-4373-8c4b-9ccdabfdecc2

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 expands runtime symbol reporting for executable code that’s generated/allocated outside normal JITted methods, so tracing consumers can attribute those code ranges in ETW/EventPipe and PerfMap outputs. It does this by emitting helper-style method events for copied write barriers and code-heap stub/code-fragment blocks, and by improving CodeHeapIterator’s ability to surface bounded stub ranges during enumeration/rundown.

Changes:

  • Add reporting/enumeration of copied write-barrier code ranges for ETW enumeration and PerfMap (including replay during method enumeration).
  • Teach CodeHeapIterator to identify stub code blocks and provide bounded sizes + kinds for logging.
  • Extend the EventPipe rundown validation test to generate VSD activity and validate helper events appear in live + rundown streams.
Show a summary per file
FileDescription
src/tests/tracing/eventpipe/rundownvalidation/rundownvalidation.csGenerates VSD activity and validates helper-style stub/write-barrier events appear in live + rundown method events.
src/coreclr/vm/threads.hRenames/init entrypoint and adds declarations for copied write-barrier reporting helpers.
src/coreclr/vm/threads.cppImplements enumeration/reporting of copied write barriers to PerfMap and ETW enumeration.
src/coreclr/vm/perfmap.cppEmits copied write barriers and stub-block ranges when generating an on-demand PerfMap.
src/coreclr/vm/eventtrace.cppExtends helper event emission to support different enumeration event types and reports stub blocks + copied write barriers during enumeration.
src/coreclr/vm/dynamicmethod.cppEnsures heap list entries for host code heaps carry a loader allocator pointer for filtered iteration.
src/coreclr/vm/codeman.hAdds wide-string stub-kind names, stub-kind/size accessors on CodeHeapIterator, and moves small-block threshold to a shared constant.
src/coreclr/vm/codeman.cppUpdates CodeHeapIterator to snapshot heap ends, identify stub code blocks, and report stub blocks via PerfMap + ETW helper events.
src/coreclr/vm/ceemain.cppCalls the new tracing-data initializer during startup.
src/coreclr/inc/eventtracebase.hUpdates/moves SendHelperEvent declaration to support passing enumeration options.

Review details

  • Files reviewed: 10/10 changed files
  • Comments generated: 0
  • Review effort level: Lite

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 8ec89d46-dd0a-4373-8c4b-9ccdabfdecc2
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 8ec89d46-dd0a-4373-8c4b-9ccdabfdecc2
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 8ec89d46-dd0a-4373-8c4b-9ccdabfdecc2
CopilotAI review requested due to automatic review settings August 12, 2026 01:33

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Review details

  • Files reviewed: 10/10 changed files
  • Comments generated: 1
  • Review effort level: Lite

Comment threadsrc/coreclr/vm/codeman.cpp Outdated
@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.

brianroband others added 3 commits August 12, 2026 12:19
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 8ec89d46-dd0a-4373-8c4b-9ccdabfdecc2
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 8ec89d46-dd0a-4373-8c4b-9ccdabfdecc2
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 8ec89d46-dd0a-4373-8c4b-9ccdabfdecc2
CopilotAI review requested due to automatic review settings August 12, 2026 22:56

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.

Review details

  • Files reviewed: 11/11 changed files
  • Comments generated: 0 new
  • Review effort level: Lite

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 8ec89d46-dd0a-4373-8c4b-9ccdabfdecc2
CopilotAI review requested due to automatic review settings August 13, 2026 00:50

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.

Review details

  • Files reviewed: 11/11 changed files
  • Comments generated: 0 new
  • Review effort level: Lite

@brianrob

Copy link
Copy Markdown
MemberAuthor

/azp run runtime

Note

This rerun request was generated by GitHub Copilot after Build Analysis identified unrelated infrastructure timeouts and known test failures.

@azure-pipelines

Copy link
Copy Markdown
No pipelines are associated with this pull request.

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines:
Successfully started running 3 pipeline(s).
13 pipeline(s) were filtered out due to trigger conditions.
There may be pipelines that require an authorized user to comment /azp run to run.

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.

Review details

Suppressed comments (1)

src/tests/tracing/eventpipe/rundownvalidation/rundownvalidation.cs:111

  • The test currently requires write-barrier helper events to be present and valid (ValidateHelperEvents(rundownWriteBarriers)), but copied write barriers are not necessarily enabled. In CoreCLR, write-barrier copying is gated by CLRConfig::UNSUPPORTED_UseGCWriteBarrierCopy and defaults to disabled (src/coreclr/vm/eeconfig.cpp:110 sets fIsWriteBarrierCopyEnabled = false; src/coreclr/vm/eeconfig.cpp:531 sets it based on the config switch). When the copy is disabled, ReportCopiedWriteBarriers* won’t emit any helper events, rundownWriteBarriers stays empty, and this test will fail on otherwise-correct builds.

Consider validating write-barrier helpers only when the events are actually present (or otherwise gating the expectation on a detectable condition).

 bool hasValidCoreClrHelpers =
!PlatformDetection.IsCoreCLR ||
!RuntimeFeature.IsDynamicCodeCompiled ||
(ValidateHelperEvents(liveStubBlocks) &&
ValidateHelperEvents(rundownStubBlocks) &&
ValidateHelperEvents(rundownWriteBarriers) &&
HaveMatchingStubBlocks(liveStubBlocks, rundownStubBlocks));
  • Files reviewed: 11/11 changed files
  • Comments generated: 0 new
  • Review effort level: Lite

@davidwrighton

Copy link
Copy Markdown
Member

LGTM, but I want @hoyosjs to review as well before signoff.

@brianrob
brianrob requested a review from hoyosjsAugust 14, 2026 18:49
Comment threadsrc/coreclr/vm/codeman.cpp
Comment threadsrc/coreclr/vm/eventtrace.cpp
brianroband others added 2 commits August 14, 2026 16:28
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 8ec89d46-dd0a-4373-8c4b-9ccdabfdecc2
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 8ec89d46-dd0a-4373-8c4b-9ccdabfdecc2
CopilotAI review requested due to automatic review settings August 16, 2026 20:45

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.

Review details

  • Files reviewed: 11/11 changed files
  • Comments generated: 1
  • Review effort level: Lite

Comment threadsrc/tests/tracing/eventpipe/rundownvalidation/rundownvalidation.cs Outdated
@brianrob

Copy link
Copy Markdown
MemberAuthor

/ba-g Current failures are unrelated known test failures: HttpListener timeout #132336 on both Windows checked legs, browser-Wasm bestfit-finalize #132107, and browser-Wasm ContextualReflection preemptive-GC assertion #131925. The affected tests and subsystems are outside this PR's ETW/stub changes.

Note

This Build Analysis override rationale was generated by GitHub Copilot.

@brianrob

Copy link
Copy Markdown
MemberAuthor

@hoyosjs this one should be ready for review again. Thanks.

Comment threadsrc/coreclr/vm/codeman.cpp Outdated
Comment threadsrc/tests/tracing/eventpipe/rundownvalidation/rundownvalidation.cs Outdated
Comment threadsrc/coreclr/vm/threads.cpp Outdated
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 8ec89d46-dd0a-4373-8c4b-9ccdabfdecc2
CopilotAI review requested due to automatic review settings August 25, 2026 21:21

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.

Review details

Suppressed comments (2)

src/tests/tracing/eventpipe/rundownvalidation/rundownvalidation.cs:449

  • The EventSource events are defined as JumpStubCollectionStart/JumpStubCollectionStop, but the trace parsing looks for "JumpStubCollection/Start" (task/opcode-style naming). Without explicitly setting EventOpcode and/or EventAttribute.Name, this comparison likely never matches, leaving collectionStart as NaN and causing the unload-range validation to fail.
 if (eventData.EventName == "JumpStubCollection/Start")
{
collectionStart = eventData.TimeStampRelativeMSec;
}

src/tests/tracing/eventpipe/rundownvalidation/rundownvalidation.cs:453

  • Same issue as the Start event: the parser looks for "JumpStubCollection/Stop" but the EventSource event is JumpStubCollectionStop unless an explicit Stop opcode/name is set.
 else if (eventData.EventName == "JumpStubCollection/Stop")
{
collectionStop = eventData.TimeStampRelativeMSec;
}
  • Files reviewed: 11/11 changed files
  • Comments generated: 0 new
  • Review effort level: Lite

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

Other than the test issue this seems good (assuming we are ok with the rundown event being an approximation, which seems fair for a trace/profiling effort - I don't see the tradeoff in storing this information elsewhere).

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 8ec89d46-dd0a-4373-8c4b-9ccdabfdecc2
CopilotAI review requested due to automatic review settings August 27, 2026 19:25

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.

Copilot review overview

Review tier: Lite
Findings: None

Suppressed comments (1)

Previously missed (1) — in code that hasn't changed since the last review.

src/tests/tracing/eventpipe/rundownvalidation/rundownvalidation.cs:483

  • If the JumpStubCollection Start/Stop markers are missing (e.g., due to EventName differences) or Stop precedes Start, collectionStart/collectionStop remain NaN/invalid and GetEventsInRange will silently return an empty set, causing a failure that’s hard to diagnose. Add an explicit validation of the marker timestamps before filtering unload events and log a clear error when they’re missing/invalid.
 List<HelperEvent> reclaimedJumpStubBlocks =
GetEventsInRange(unloadedJumpStubBlocks, collectionStart, collectionStop);
Logger.logger.Log("LCG jump-stub loads: " + loadedJumpStubBlocks.Count);
Logger.logger.Log("LCG jump-stub unloads: " + reclaimedJumpStubBlocks.Count);
return HaveMatchingLoadForEveryUnload(loadedJumpStubBlocks, reclaimedJumpStubBlocks)

@brianrob
brianrob merged commit 933386a into dotnet:mainAug 28, 2026
112 checks passed
@brianrob
brianrob deleted the brianrob-coreclr-etw-stub-reporting branch August 28, 2026 00:22
@dotnet-milestone-botdotnet-milestone-botBot added this to the 12.0-preview1 milestone Aug 28, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants

@brianrob@davidwrighton@hoyosjs@jkotas
, '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" + '
Report CoreCLR Write Barriers And Code-Heap Stubs In Traces by brianrob · Pull Request #132190 · dotnet/runtime · GitHub
Skip to content

Report CoreCLR Write Barriers And Code-Heap Stubs In Traces - #132190

Merged
brianrob merged 15 commits into
dotnet:mainfrom
brianrob:brianrob-coreclr-etw-stub-reporting
Aug 28, 2026
Merged

Report CoreCLR Write Barriers And Code-Heap Stubs In Traces#132190
brianrob merged 15 commits into
dotnet:mainfrom
brianrob:brianrob-coreclr-etw-stub-reporting

Conversation

@brianrob

@brianrobbrianrob commented Aug 12, 2026

Copy link
Copy Markdown
Member

Summary

Improve symbol coverage for executable code generated outside normal JIT methods. This is in response to an internal customer that is capturing traces where large percentages of symbols are unresolvable and don't resolve to a module. Upon investigation, these symbols should resolve to the copied write barrier or one of several different kinds of stubs.

Coverage

Executable rangeLive ETW/EventPipeCapture state and rundownLive PerfMapOn-demand PerfMap
Copied write barriersExisting: emitted before tracing-provider initialization. This PR: moves reporting after initialization and preserves individual names and explicit sizes.This PR: reports individual ranges through MethodUnloadVerbose, MethodDCStartVerbose, and MethodDCEndVerbose.This PR: reports individual named ranges.This PR: replays individual named ranges.
EEJitManager jump/code-fragment blocksThis PR: reports blocks through MethodLoadVerbose.This PR: reports blocks through MethodUnloadVerbose, MethodDCStartVerbose, and MethodDCEndVerbose.Existing: reports blocks or individual allocations according to DOTNET_PerfMapStubGranularity.This PR: replays blocks regardless of live block/individual granularity.
Individual symbols within EEJitManager blocksExisting: no individual or block events. This PR: reports one event for the allocation block containing the stubs.Existing: no individual or block replay. This PR: replays the allocation block containing the stubs.Existing: reports individual symbols where instrumented. This PR: no change.Existing: no replay. This PR: reports the allocation block because individual symbols cannot be reconstructed.

On-demand PerfMap generation uses blocks because individual allocations cannot be reconstructed during enumeration.

All ETW/EventPipe entries use JitHelperMethod metadata.

Implementation Notes

CodeHeapIterator now snapshots each heap’s end and uses per-heap lookahead to produce bounded, non-overlapping stub ranges. Jump-stub sizes use their existing allocation metadata; other code-fragment blocks use the bounded allocation extent.

Copied write-barrier reporting derives targets from the configured JIT helper table.

This does not change stub layout, allocation size, alignment, CodeHeader adjacency, DAC contracts, or jump reachability.

Note

This pull request description was created with GitHub Copilot.

brianroband others added 3 commits August 6, 2026 13:19
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 8ec89d46-dd0a-4373-8c4b-9ccdabfdecc2
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 8ec89d46-dd0a-4373-8c4b-9ccdabfdecc2
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 8ec89d46-dd0a-4373-8c4b-9ccdabfdecc2

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 expands runtime symbol reporting for executable code that’s generated/allocated outside normal JITted methods, so tracing consumers can attribute those code ranges in ETW/EventPipe and PerfMap outputs. It does this by emitting helper-style method events for copied write barriers and code-heap stub/code-fragment blocks, and by improving CodeHeapIterator’s ability to surface bounded stub ranges during enumeration/rundown.

Changes:

  • Add reporting/enumeration of copied write-barrier code ranges for ETW enumeration and PerfMap (including replay during method enumeration).
  • Teach CodeHeapIterator to identify stub code blocks and provide bounded sizes + kinds for logging.
  • Extend the EventPipe rundown validation test to generate VSD activity and validate helper events appear in live + rundown streams.
Show a summary per file
FileDescription
src/tests/tracing/eventpipe/rundownvalidation/rundownvalidation.csGenerates VSD activity and validates helper-style stub/write-barrier events appear in live + rundown method events.
src/coreclr/vm/threads.hRenames/init entrypoint and adds declarations for copied write-barrier reporting helpers.
src/coreclr/vm/threads.cppImplements enumeration/reporting of copied write barriers to PerfMap and ETW enumeration.
src/coreclr/vm/perfmap.cppEmits copied write barriers and stub-block ranges when generating an on-demand PerfMap.
src/coreclr/vm/eventtrace.cppExtends helper event emission to support different enumeration event types and reports stub blocks + copied write barriers during enumeration.
src/coreclr/vm/dynamicmethod.cppEnsures heap list entries for host code heaps carry a loader allocator pointer for filtered iteration.
src/coreclr/vm/codeman.hAdds wide-string stub-kind names, stub-kind/size accessors on CodeHeapIterator, and moves small-block threshold to a shared constant.
src/coreclr/vm/codeman.cppUpdates CodeHeapIterator to snapshot heap ends, identify stub code blocks, and report stub blocks via PerfMap + ETW helper events.
src/coreclr/vm/ceemain.cppCalls the new tracing-data initializer during startup.
src/coreclr/inc/eventtracebase.hUpdates/moves SendHelperEvent declaration to support passing enumeration options.

Review details

  • Files reviewed: 10/10 changed files
  • Comments generated: 0
  • Review effort level: Lite

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 8ec89d46-dd0a-4373-8c4b-9ccdabfdecc2
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 8ec89d46-dd0a-4373-8c4b-9ccdabfdecc2
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 8ec89d46-dd0a-4373-8c4b-9ccdabfdecc2
CopilotAI review requested due to automatic review settings August 12, 2026 01:33

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Review details

  • Files reviewed: 10/10 changed files
  • Comments generated: 1
  • Review effort level: Lite

Comment threadsrc/coreclr/vm/codeman.cpp Outdated
@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.

brianroband others added 3 commits August 12, 2026 12:19
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 8ec89d46-dd0a-4373-8c4b-9ccdabfdecc2
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 8ec89d46-dd0a-4373-8c4b-9ccdabfdecc2
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 8ec89d46-dd0a-4373-8c4b-9ccdabfdecc2
CopilotAI review requested due to automatic review settings August 12, 2026 22:56

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.

Review details

  • Files reviewed: 11/11 changed files
  • Comments generated: 0 new
  • Review effort level: Lite

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 8ec89d46-dd0a-4373-8c4b-9ccdabfdecc2
CopilotAI review requested due to automatic review settings August 13, 2026 00:50

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.

Review details

  • Files reviewed: 11/11 changed files
  • Comments generated: 0 new
  • Review effort level: Lite

@brianrob

Copy link
Copy Markdown
MemberAuthor

/azp run runtime

Note

This rerun request was generated by GitHub Copilot after Build Analysis identified unrelated infrastructure timeouts and known test failures.

@azure-pipelines

Copy link
Copy Markdown
No pipelines are associated with this pull request.

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines:
Successfully started running 3 pipeline(s).
13 pipeline(s) were filtered out due to trigger conditions.
There may be pipelines that require an authorized user to comment /azp run to run.

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.

Review details

Suppressed comments (1)

src/tests/tracing/eventpipe/rundownvalidation/rundownvalidation.cs:111

  • The test currently requires write-barrier helper events to be present and valid (ValidateHelperEvents(rundownWriteBarriers)), but copied write barriers are not necessarily enabled. In CoreCLR, write-barrier copying is gated by CLRConfig::UNSUPPORTED_UseGCWriteBarrierCopy and defaults to disabled (src/coreclr/vm/eeconfig.cpp:110 sets fIsWriteBarrierCopyEnabled = false; src/coreclr/vm/eeconfig.cpp:531 sets it based on the config switch). When the copy is disabled, ReportCopiedWriteBarriers* won’t emit any helper events, rundownWriteBarriers stays empty, and this test will fail on otherwise-correct builds.

Consider validating write-barrier helpers only when the events are actually present (or otherwise gating the expectation on a detectable condition).

 bool hasValidCoreClrHelpers =
!PlatformDetection.IsCoreCLR ||
!RuntimeFeature.IsDynamicCodeCompiled ||
(ValidateHelperEvents(liveStubBlocks) &&
ValidateHelperEvents(rundownStubBlocks) &&
ValidateHelperEvents(rundownWriteBarriers) &&
HaveMatchingStubBlocks(liveStubBlocks, rundownStubBlocks));
  • Files reviewed: 11/11 changed files
  • Comments generated: 0 new
  • Review effort level: Lite

@davidwrighton

Copy link
Copy Markdown
Member

LGTM, but I want @hoyosjs to review as well before signoff.

@brianrob
brianrob requested a review from hoyosjsAugust 14, 2026 18:49
Comment threadsrc/coreclr/vm/codeman.cpp
Comment threadsrc/coreclr/vm/eventtrace.cpp
brianroband others added 2 commits August 14, 2026 16:28
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 8ec89d46-dd0a-4373-8c4b-9ccdabfdecc2
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 8ec89d46-dd0a-4373-8c4b-9ccdabfdecc2
CopilotAI review requested due to automatic review settings August 16, 2026 20:45

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.

Review details

  • Files reviewed: 11/11 changed files
  • Comments generated: 1
  • Review effort level: Lite

Comment threadsrc/tests/tracing/eventpipe/rundownvalidation/rundownvalidation.cs Outdated
@brianrob

Copy link
Copy Markdown
MemberAuthor

/ba-g Current failures are unrelated known test failures: HttpListener timeout #132336 on both Windows checked legs, browser-Wasm bestfit-finalize #132107, and browser-Wasm ContextualReflection preemptive-GC assertion #131925. The affected tests and subsystems are outside this PR's ETW/stub changes.

Note

This Build Analysis override rationale was generated by GitHub Copilot.

@brianrob

Copy link
Copy Markdown
MemberAuthor

@hoyosjs this one should be ready for review again. Thanks.

Comment threadsrc/coreclr/vm/codeman.cpp Outdated
Comment threadsrc/tests/tracing/eventpipe/rundownvalidation/rundownvalidation.cs Outdated
Comment threadsrc/coreclr/vm/threads.cpp Outdated
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 8ec89d46-dd0a-4373-8c4b-9ccdabfdecc2
CopilotAI review requested due to automatic review settings August 25, 2026 21:21

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.

Review details

Suppressed comments (2)

src/tests/tracing/eventpipe/rundownvalidation/rundownvalidation.cs:449

  • The EventSource events are defined as JumpStubCollectionStart/JumpStubCollectionStop, but the trace parsing looks for "JumpStubCollection/Start" (task/opcode-style naming). Without explicitly setting EventOpcode and/or EventAttribute.Name, this comparison likely never matches, leaving collectionStart as NaN and causing the unload-range validation to fail.
 if (eventData.EventName == "JumpStubCollection/Start")
{
collectionStart = eventData.TimeStampRelativeMSec;
}

src/tests/tracing/eventpipe/rundownvalidation/rundownvalidation.cs:453

  • Same issue as the Start event: the parser looks for "JumpStubCollection/Stop" but the EventSource event is JumpStubCollectionStop unless an explicit Stop opcode/name is set.
 else if (eventData.EventName == "JumpStubCollection/Stop")
{
collectionStop = eventData.TimeStampRelativeMSec;
}
  • Files reviewed: 11/11 changed files
  • Comments generated: 0 new
  • Review effort level: Lite

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

Other than the test issue this seems good (assuming we are ok with the rundown event being an approximation, which seems fair for a trace/profiling effort - I don't see the tradeoff in storing this information elsewhere).

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 8ec89d46-dd0a-4373-8c4b-9ccdabfdecc2
CopilotAI review requested due to automatic review settings August 27, 2026 19:25

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.

Copilot review overview

Review tier: Lite
Findings: None

Suppressed comments (1)

Previously missed (1) — in code that hasn't changed since the last review.

src/tests/tracing/eventpipe/rundownvalidation/rundownvalidation.cs:483

  • If the JumpStubCollection Start/Stop markers are missing (e.g., due to EventName differences) or Stop precedes Start, collectionStart/collectionStop remain NaN/invalid and GetEventsInRange will silently return an empty set, causing a failure that’s hard to diagnose. Add an explicit validation of the marker timestamps before filtering unload events and log a clear error when they’re missing/invalid.
 List<HelperEvent> reclaimedJumpStubBlocks =
GetEventsInRange(unloadedJumpStubBlocks, collectionStart, collectionStop);
Logger.logger.Log("LCG jump-stub loads: " + loadedJumpStubBlocks.Count);
Logger.logger.Log("LCG jump-stub unloads: " + reclaimedJumpStubBlocks.Count);
return HaveMatchingLoadForEveryUnload(loadedJumpStubBlocks, reclaimedJumpStubBlocks)

@brianrob
brianrob merged commit 933386a into dotnet:mainAug 28, 2026
112 checks passed
@brianrob
brianrob deleted the brianrob-coreclr-etw-stub-reporting branch August 28, 2026 00:22
@dotnet-milestone-botdotnet-milestone-botBot added this to the 12.0-preview1 milestone Aug 28, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants

@brianrob@davidwrighton@hoyosjs@jkotas
, '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('^' + ".*" + ' Report CoreCLR Write Barriers And Code-Heap Stubs In Traces by brianrob · Pull Request #132190 · dotnet/runtime · GitHub
Skip to content

Report CoreCLR Write Barriers And Code-Heap Stubs In Traces - #132190

Merged
brianrob merged 15 commits into
dotnet:mainfrom
brianrob:brianrob-coreclr-etw-stub-reporting
Aug 28, 2026
Merged

Report CoreCLR Write Barriers And Code-Heap Stubs In Traces#132190
brianrob merged 15 commits into
dotnet:mainfrom
brianrob:brianrob-coreclr-etw-stub-reporting

Conversation

@brianrob

@brianrobbrianrob commented Aug 12, 2026

Copy link
Copy Markdown
Member

Summary

Improve symbol coverage for executable code generated outside normal JIT methods. This is in response to an internal customer that is capturing traces where large percentages of symbols are unresolvable and don't resolve to a module. Upon investigation, these symbols should resolve to the copied write barrier or one of several different kinds of stubs.

Coverage

Executable rangeLive ETW/EventPipeCapture state and rundownLive PerfMapOn-demand PerfMap
Copied write barriersExisting: emitted before tracing-provider initialization. This PR: moves reporting after initialization and preserves individual names and explicit sizes.This PR: reports individual ranges through MethodUnloadVerbose, MethodDCStartVerbose, and MethodDCEndVerbose.This PR: reports individual named ranges.This PR: replays individual named ranges.
EEJitManager jump/code-fragment blocksThis PR: reports blocks through MethodLoadVerbose.This PR: reports blocks through MethodUnloadVerbose, MethodDCStartVerbose, and MethodDCEndVerbose.Existing: reports blocks or individual allocations according to DOTNET_PerfMapStubGranularity.This PR: replays blocks regardless of live block/individual granularity.
Individual symbols within EEJitManager blocksExisting: no individual or block events. This PR: reports one event for the allocation block containing the stubs.Existing: no individual or block replay. This PR: replays the allocation block containing the stubs.Existing: reports individual symbols where instrumented. This PR: no change.Existing: no replay. This PR: reports the allocation block because individual symbols cannot be reconstructed.

On-demand PerfMap generation uses blocks because individual allocations cannot be reconstructed during enumeration.

All ETW/EventPipe entries use JitHelperMethod metadata.

Implementation Notes

CodeHeapIterator now snapshots each heap’s end and uses per-heap lookahead to produce bounded, non-overlapping stub ranges. Jump-stub sizes use their existing allocation metadata; other code-fragment blocks use the bounded allocation extent.

Copied write-barrier reporting derives targets from the configured JIT helper table.

This does not change stub layout, allocation size, alignment, CodeHeader adjacency, DAC contracts, or jump reachability.

Note

This pull request description was created with GitHub Copilot.

brianroband others added 3 commits August 6, 2026 13:19
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 8ec89d46-dd0a-4373-8c4b-9ccdabfdecc2
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 8ec89d46-dd0a-4373-8c4b-9ccdabfdecc2
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 8ec89d46-dd0a-4373-8c4b-9ccdabfdecc2

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 expands runtime symbol reporting for executable code that’s generated/allocated outside normal JITted methods, so tracing consumers can attribute those code ranges in ETW/EventPipe and PerfMap outputs. It does this by emitting helper-style method events for copied write barriers and code-heap stub/code-fragment blocks, and by improving CodeHeapIterator’s ability to surface bounded stub ranges during enumeration/rundown.

Changes:

  • Add reporting/enumeration of copied write-barrier code ranges for ETW enumeration and PerfMap (including replay during method enumeration).
  • Teach CodeHeapIterator to identify stub code blocks and provide bounded sizes + kinds for logging.
  • Extend the EventPipe rundown validation test to generate VSD activity and validate helper events appear in live + rundown streams.
Show a summary per file
FileDescription
src/tests/tracing/eventpipe/rundownvalidation/rundownvalidation.csGenerates VSD activity and validates helper-style stub/write-barrier events appear in live + rundown method events.
src/coreclr/vm/threads.hRenames/init entrypoint and adds declarations for copied write-barrier reporting helpers.
src/coreclr/vm/threads.cppImplements enumeration/reporting of copied write barriers to PerfMap and ETW enumeration.
src/coreclr/vm/perfmap.cppEmits copied write barriers and stub-block ranges when generating an on-demand PerfMap.
src/coreclr/vm/eventtrace.cppExtends helper event emission to support different enumeration event types and reports stub blocks + copied write barriers during enumeration.
src/coreclr/vm/dynamicmethod.cppEnsures heap list entries for host code heaps carry a loader allocator pointer for filtered iteration.
src/coreclr/vm/codeman.hAdds wide-string stub-kind names, stub-kind/size accessors on CodeHeapIterator, and moves small-block threshold to a shared constant.
src/coreclr/vm/codeman.cppUpdates CodeHeapIterator to snapshot heap ends, identify stub code blocks, and report stub blocks via PerfMap + ETW helper events.
src/coreclr/vm/ceemain.cppCalls the new tracing-data initializer during startup.
src/coreclr/inc/eventtracebase.hUpdates/moves SendHelperEvent declaration to support passing enumeration options.

Review details

  • Files reviewed: 10/10 changed files
  • Comments generated: 0
  • Review effort level: Lite

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 8ec89d46-dd0a-4373-8c4b-9ccdabfdecc2
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 8ec89d46-dd0a-4373-8c4b-9ccdabfdecc2
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 8ec89d46-dd0a-4373-8c4b-9ccdabfdecc2
CopilotAI review requested due to automatic review settings August 12, 2026 01:33

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Review details

  • Files reviewed: 10/10 changed files
  • Comments generated: 1
  • Review effort level: Lite

Comment threadsrc/coreclr/vm/codeman.cpp Outdated
@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.

brianroband others added 3 commits August 12, 2026 12:19
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 8ec89d46-dd0a-4373-8c4b-9ccdabfdecc2
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 8ec89d46-dd0a-4373-8c4b-9ccdabfdecc2
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 8ec89d46-dd0a-4373-8c4b-9ccdabfdecc2
CopilotAI review requested due to automatic review settings August 12, 2026 22:56

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.

Review details

  • Files reviewed: 11/11 changed files
  • Comments generated: 0 new
  • Review effort level: Lite

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 8ec89d46-dd0a-4373-8c4b-9ccdabfdecc2
CopilotAI review requested due to automatic review settings August 13, 2026 00:50

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.

Review details

  • Files reviewed: 11/11 changed files
  • Comments generated: 0 new
  • Review effort level: Lite

@brianrob

Copy link
Copy Markdown
MemberAuthor

/azp run runtime

Note

This rerun request was generated by GitHub Copilot after Build Analysis identified unrelated infrastructure timeouts and known test failures.

@azure-pipelines

Copy link
Copy Markdown
No pipelines are associated with this pull request.

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines:
Successfully started running 3 pipeline(s).
13 pipeline(s) were filtered out due to trigger conditions.
There may be pipelines that require an authorized user to comment /azp run to run.

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.

Review details

Suppressed comments (1)

src/tests/tracing/eventpipe/rundownvalidation/rundownvalidation.cs:111

  • The test currently requires write-barrier helper events to be present and valid (ValidateHelperEvents(rundownWriteBarriers)), but copied write barriers are not necessarily enabled. In CoreCLR, write-barrier copying is gated by CLRConfig::UNSUPPORTED_UseGCWriteBarrierCopy and defaults to disabled (src/coreclr/vm/eeconfig.cpp:110 sets fIsWriteBarrierCopyEnabled = false; src/coreclr/vm/eeconfig.cpp:531 sets it based on the config switch). When the copy is disabled, ReportCopiedWriteBarriers* won’t emit any helper events, rundownWriteBarriers stays empty, and this test will fail on otherwise-correct builds.

Consider validating write-barrier helpers only when the events are actually present (or otherwise gating the expectation on a detectable condition).

 bool hasValidCoreClrHelpers =
!PlatformDetection.IsCoreCLR ||
!RuntimeFeature.IsDynamicCodeCompiled ||
(ValidateHelperEvents(liveStubBlocks) &&
ValidateHelperEvents(rundownStubBlocks) &&
ValidateHelperEvents(rundownWriteBarriers) &&
HaveMatchingStubBlocks(liveStubBlocks, rundownStubBlocks));
  • Files reviewed: 11/11 changed files
  • Comments generated: 0 new
  • Review effort level: Lite

@davidwrighton

Copy link
Copy Markdown
Member

LGTM, but I want @hoyosjs to review as well before signoff.

@brianrob
brianrob requested a review from hoyosjsAugust 14, 2026 18:49
Comment threadsrc/coreclr/vm/codeman.cpp
Comment threadsrc/coreclr/vm/eventtrace.cpp
brianroband others added 2 commits August 14, 2026 16:28
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 8ec89d46-dd0a-4373-8c4b-9ccdabfdecc2
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 8ec89d46-dd0a-4373-8c4b-9ccdabfdecc2
CopilotAI review requested due to automatic review settings August 16, 2026 20:45

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.

Review details

  • Files reviewed: 11/11 changed files
  • Comments generated: 1
  • Review effort level: Lite

Comment threadsrc/tests/tracing/eventpipe/rundownvalidation/rundownvalidation.cs Outdated
@brianrob

Copy link
Copy Markdown
MemberAuthor

/ba-g Current failures are unrelated known test failures: HttpListener timeout #132336 on both Windows checked legs, browser-Wasm bestfit-finalize #132107, and browser-Wasm ContextualReflection preemptive-GC assertion #131925. The affected tests and subsystems are outside this PR's ETW/stub changes.

Note

This Build Analysis override rationale was generated by GitHub Copilot.

@brianrob

Copy link
Copy Markdown
MemberAuthor

@hoyosjs this one should be ready for review again. Thanks.

Comment threadsrc/coreclr/vm/codeman.cpp Outdated
Comment threadsrc/tests/tracing/eventpipe/rundownvalidation/rundownvalidation.cs Outdated
Comment threadsrc/coreclr/vm/threads.cpp Outdated
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 8ec89d46-dd0a-4373-8c4b-9ccdabfdecc2
CopilotAI review requested due to automatic review settings August 25, 2026 21:21

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.

Review details

Suppressed comments (2)

src/tests/tracing/eventpipe/rundownvalidation/rundownvalidation.cs:449

  • The EventSource events are defined as JumpStubCollectionStart/JumpStubCollectionStop, but the trace parsing looks for "JumpStubCollection/Start" (task/opcode-style naming). Without explicitly setting EventOpcode and/or EventAttribute.Name, this comparison likely never matches, leaving collectionStart as NaN and causing the unload-range validation to fail.
 if (eventData.EventName == "JumpStubCollection/Start")
{
collectionStart = eventData.TimeStampRelativeMSec;
}

src/tests/tracing/eventpipe/rundownvalidation/rundownvalidation.cs:453

  • Same issue as the Start event: the parser looks for "JumpStubCollection/Stop" but the EventSource event is JumpStubCollectionStop unless an explicit Stop opcode/name is set.
 else if (eventData.EventName == "JumpStubCollection/Stop")
{
collectionStop = eventData.TimeStampRelativeMSec;
}
  • Files reviewed: 11/11 changed files
  • Comments generated: 0 new
  • Review effort level: Lite

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

Other than the test issue this seems good (assuming we are ok with the rundown event being an approximation, which seems fair for a trace/profiling effort - I don't see the tradeoff in storing this information elsewhere).

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 8ec89d46-dd0a-4373-8c4b-9ccdabfdecc2
CopilotAI review requested due to automatic review settings August 27, 2026 19:25

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.

Copilot review overview

Review tier: Lite
Findings: None

Suppressed comments (1)

Previously missed (1) — in code that hasn't changed since the last review.

src/tests/tracing/eventpipe/rundownvalidation/rundownvalidation.cs:483

  • If the JumpStubCollection Start/Stop markers are missing (e.g., due to EventName differences) or Stop precedes Start, collectionStart/collectionStop remain NaN/invalid and GetEventsInRange will silently return an empty set, causing a failure that’s hard to diagnose. Add an explicit validation of the marker timestamps before filtering unload events and log a clear error when they’re missing/invalid.
 List<HelperEvent> reclaimedJumpStubBlocks =
GetEventsInRange(unloadedJumpStubBlocks, collectionStart, collectionStop);
Logger.logger.Log("LCG jump-stub loads: " + loadedJumpStubBlocks.Count);
Logger.logger.Log("LCG jump-stub unloads: " + reclaimedJumpStubBlocks.Count);
return HaveMatchingLoadForEveryUnload(loadedJumpStubBlocks, reclaimedJumpStubBlocks)

@brianrob
brianrob merged commit 933386a into dotnet:mainAug 28, 2026
112 checks passed
@brianrob
brianrob deleted the brianrob-coreclr-etw-stub-reporting branch August 28, 2026 00:22
@dotnet-milestone-botdotnet-milestone-botBot added this to the 12.0-preview1 milestone Aug 28, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants

@brianrob@davidwrighton@hoyosjs@jkotas
, '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('^' + ".*" + ' Report CoreCLR Write Barriers And Code-Heap Stubs In Traces by brianrob · Pull Request #132190 · dotnet/runtime · GitHub
Skip to content

Report CoreCLR Write Barriers And Code-Heap Stubs In Traces - #132190

Merged
brianrob merged 15 commits into
dotnet:mainfrom
brianrob:brianrob-coreclr-etw-stub-reporting
Aug 28, 2026
Merged

Report CoreCLR Write Barriers And Code-Heap Stubs In Traces#132190
brianrob merged 15 commits into
dotnet:mainfrom
brianrob:brianrob-coreclr-etw-stub-reporting

Conversation

@brianrob

@brianrobbrianrob commented Aug 12, 2026

Copy link
Copy Markdown
Member

Summary

Improve symbol coverage for executable code generated outside normal JIT methods. This is in response to an internal customer that is capturing traces where large percentages of symbols are unresolvable and don't resolve to a module. Upon investigation, these symbols should resolve to the copied write barrier or one of several different kinds of stubs.

Coverage

Executable rangeLive ETW/EventPipeCapture state and rundownLive PerfMapOn-demand PerfMap
Copied write barriersExisting: emitted before tracing-provider initialization. This PR: moves reporting after initialization and preserves individual names and explicit sizes.This PR: reports individual ranges through MethodUnloadVerbose, MethodDCStartVerbose, and MethodDCEndVerbose.This PR: reports individual named ranges.This PR: replays individual named ranges.
EEJitManager jump/code-fragment blocksThis PR: reports blocks through MethodLoadVerbose.This PR: reports blocks through MethodUnloadVerbose, MethodDCStartVerbose, and MethodDCEndVerbose.Existing: reports blocks or individual allocations according to DOTNET_PerfMapStubGranularity.This PR: replays blocks regardless of live block/individual granularity.
Individual symbols within EEJitManager blocksExisting: no individual or block events. This PR: reports one event for the allocation block containing the stubs.Existing: no individual or block replay. This PR: replays the allocation block containing the stubs.Existing: reports individual symbols where instrumented. This PR: no change.Existing: no replay. This PR: reports the allocation block because individual symbols cannot be reconstructed.

On-demand PerfMap generation uses blocks because individual allocations cannot be reconstructed during enumeration.

All ETW/EventPipe entries use JitHelperMethod metadata.

Implementation Notes

CodeHeapIterator now snapshots each heap’s end and uses per-heap lookahead to produce bounded, non-overlapping stub ranges. Jump-stub sizes use their existing allocation metadata; other code-fragment blocks use the bounded allocation extent.

Copied write-barrier reporting derives targets from the configured JIT helper table.

This does not change stub layout, allocation size, alignment, CodeHeader adjacency, DAC contracts, or jump reachability.

Note

This pull request description was created with GitHub Copilot.

brianroband others added 3 commits August 6, 2026 13:19
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 8ec89d46-dd0a-4373-8c4b-9ccdabfdecc2
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 8ec89d46-dd0a-4373-8c4b-9ccdabfdecc2
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 8ec89d46-dd0a-4373-8c4b-9ccdabfdecc2

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 expands runtime symbol reporting for executable code that’s generated/allocated outside normal JITted methods, so tracing consumers can attribute those code ranges in ETW/EventPipe and PerfMap outputs. It does this by emitting helper-style method events for copied write barriers and code-heap stub/code-fragment blocks, and by improving CodeHeapIterator’s ability to surface bounded stub ranges during enumeration/rundown.

Changes:

  • Add reporting/enumeration of copied write-barrier code ranges for ETW enumeration and PerfMap (including replay during method enumeration).
  • Teach CodeHeapIterator to identify stub code blocks and provide bounded sizes + kinds for logging.
  • Extend the EventPipe rundown validation test to generate VSD activity and validate helper events appear in live + rundown streams.
Show a summary per file
FileDescription
src/tests/tracing/eventpipe/rundownvalidation/rundownvalidation.csGenerates VSD activity and validates helper-style stub/write-barrier events appear in live + rundown method events.
src/coreclr/vm/threads.hRenames/init entrypoint and adds declarations for copied write-barrier reporting helpers.
src/coreclr/vm/threads.cppImplements enumeration/reporting of copied write barriers to PerfMap and ETW enumeration.
src/coreclr/vm/perfmap.cppEmits copied write barriers and stub-block ranges when generating an on-demand PerfMap.
src/coreclr/vm/eventtrace.cppExtends helper event emission to support different enumeration event types and reports stub blocks + copied write barriers during enumeration.
src/coreclr/vm/dynamicmethod.cppEnsures heap list entries for host code heaps carry a loader allocator pointer for filtered iteration.
src/coreclr/vm/codeman.hAdds wide-string stub-kind names, stub-kind/size accessors on CodeHeapIterator, and moves small-block threshold to a shared constant.
src/coreclr/vm/codeman.cppUpdates CodeHeapIterator to snapshot heap ends, identify stub code blocks, and report stub blocks via PerfMap + ETW helper events.
src/coreclr/vm/ceemain.cppCalls the new tracing-data initializer during startup.
src/coreclr/inc/eventtracebase.hUpdates/moves SendHelperEvent declaration to support passing enumeration options.

Review details

  • Files reviewed: 10/10 changed files
  • Comments generated: 0
  • Review effort level: Lite

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 8ec89d46-dd0a-4373-8c4b-9ccdabfdecc2
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 8ec89d46-dd0a-4373-8c4b-9ccdabfdecc2
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 8ec89d46-dd0a-4373-8c4b-9ccdabfdecc2
CopilotAI review requested due to automatic review settings August 12, 2026 01:33

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Review details

  • Files reviewed: 10/10 changed files
  • Comments generated: 1
  • Review effort level: Lite

Comment threadsrc/coreclr/vm/codeman.cpp Outdated
@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.

brianroband others added 3 commits August 12, 2026 12:19
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 8ec89d46-dd0a-4373-8c4b-9ccdabfdecc2
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 8ec89d46-dd0a-4373-8c4b-9ccdabfdecc2
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 8ec89d46-dd0a-4373-8c4b-9ccdabfdecc2
CopilotAI review requested due to automatic review settings August 12, 2026 22:56

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.

Review details

  • Files reviewed: 11/11 changed files
  • Comments generated: 0 new
  • Review effort level: Lite

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 8ec89d46-dd0a-4373-8c4b-9ccdabfdecc2
CopilotAI review requested due to automatic review settings August 13, 2026 00:50

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.

Review details

  • Files reviewed: 11/11 changed files
  • Comments generated: 0 new
  • Review effort level: Lite

@brianrob

Copy link
Copy Markdown
MemberAuthor

/azp run runtime

Note

This rerun request was generated by GitHub Copilot after Build Analysis identified unrelated infrastructure timeouts and known test failures.

@azure-pipelines

Copy link
Copy Markdown
No pipelines are associated with this pull request.

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines:
Successfully started running 3 pipeline(s).
13 pipeline(s) were filtered out due to trigger conditions.
There may be pipelines that require an authorized user to comment /azp run to run.

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.

Review details

Suppressed comments (1)

src/tests/tracing/eventpipe/rundownvalidation/rundownvalidation.cs:111

  • The test currently requires write-barrier helper events to be present and valid (ValidateHelperEvents(rundownWriteBarriers)), but copied write barriers are not necessarily enabled. In CoreCLR, write-barrier copying is gated by CLRConfig::UNSUPPORTED_UseGCWriteBarrierCopy and defaults to disabled (src/coreclr/vm/eeconfig.cpp:110 sets fIsWriteBarrierCopyEnabled = false; src/coreclr/vm/eeconfig.cpp:531 sets it based on the config switch). When the copy is disabled, ReportCopiedWriteBarriers* won’t emit any helper events, rundownWriteBarriers stays empty, and this test will fail on otherwise-correct builds.

Consider validating write-barrier helpers only when the events are actually present (or otherwise gating the expectation on a detectable condition).

 bool hasValidCoreClrHelpers =
!PlatformDetection.IsCoreCLR ||
!RuntimeFeature.IsDynamicCodeCompiled ||
(ValidateHelperEvents(liveStubBlocks) &&
ValidateHelperEvents(rundownStubBlocks) &&
ValidateHelperEvents(rundownWriteBarriers) &&
HaveMatchingStubBlocks(liveStubBlocks, rundownStubBlocks));
  • Files reviewed: 11/11 changed files
  • Comments generated: 0 new
  • Review effort level: Lite

@davidwrighton

Copy link
Copy Markdown
Member

LGTM, but I want @hoyosjs to review as well before signoff.

@brianrob
brianrob requested a review from hoyosjsAugust 14, 2026 18:49
Comment threadsrc/coreclr/vm/codeman.cpp
Comment threadsrc/coreclr/vm/eventtrace.cpp
brianroband others added 2 commits August 14, 2026 16:28
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 8ec89d46-dd0a-4373-8c4b-9ccdabfdecc2
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 8ec89d46-dd0a-4373-8c4b-9ccdabfdecc2
CopilotAI review requested due to automatic review settings August 16, 2026 20:45

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.

Review details

  • Files reviewed: 11/11 changed files
  • Comments generated: 1
  • Review effort level: Lite

Comment threadsrc/tests/tracing/eventpipe/rundownvalidation/rundownvalidation.cs Outdated
@brianrob

Copy link
Copy Markdown
MemberAuthor

/ba-g Current failures are unrelated known test failures: HttpListener timeout #132336 on both Windows checked legs, browser-Wasm bestfit-finalize #132107, and browser-Wasm ContextualReflection preemptive-GC assertion #131925. The affected tests and subsystems are outside this PR's ETW/stub changes.

Note

This Build Analysis override rationale was generated by GitHub Copilot.

@brianrob

Copy link
Copy Markdown
MemberAuthor

@hoyosjs this one should be ready for review again. Thanks.

Comment threadsrc/coreclr/vm/codeman.cpp Outdated
Comment threadsrc/tests/tracing/eventpipe/rundownvalidation/rundownvalidation.cs Outdated
Comment threadsrc/coreclr/vm/threads.cpp Outdated
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 8ec89d46-dd0a-4373-8c4b-9ccdabfdecc2
CopilotAI review requested due to automatic review settings August 25, 2026 21:21

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.

Review details

Suppressed comments (2)

src/tests/tracing/eventpipe/rundownvalidation/rundownvalidation.cs:449

  • The EventSource events are defined as JumpStubCollectionStart/JumpStubCollectionStop, but the trace parsing looks for "JumpStubCollection/Start" (task/opcode-style naming). Without explicitly setting EventOpcode and/or EventAttribute.Name, this comparison likely never matches, leaving collectionStart as NaN and causing the unload-range validation to fail.
 if (eventData.EventName == "JumpStubCollection/Start")
{
collectionStart = eventData.TimeStampRelativeMSec;
}

src/tests/tracing/eventpipe/rundownvalidation/rundownvalidation.cs:453

  • Same issue as the Start event: the parser looks for "JumpStubCollection/Stop" but the EventSource event is JumpStubCollectionStop unless an explicit Stop opcode/name is set.
 else if (eventData.EventName == "JumpStubCollection/Stop")
{
collectionStop = eventData.TimeStampRelativeMSec;
}
  • Files reviewed: 11/11 changed files
  • Comments generated: 0 new
  • Review effort level: Lite

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

Other than the test issue this seems good (assuming we are ok with the rundown event being an approximation, which seems fair for a trace/profiling effort - I don't see the tradeoff in storing this information elsewhere).

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 8ec89d46-dd0a-4373-8c4b-9ccdabfdecc2
CopilotAI review requested due to automatic review settings August 27, 2026 19:25

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.

Copilot review overview

Review tier: Lite
Findings: None

Suppressed comments (1)

Previously missed (1) — in code that hasn't changed since the last review.

src/tests/tracing/eventpipe/rundownvalidation/rundownvalidation.cs:483

  • If the JumpStubCollection Start/Stop markers are missing (e.g., due to EventName differences) or Stop precedes Start, collectionStart/collectionStop remain NaN/invalid and GetEventsInRange will silently return an empty set, causing a failure that’s hard to diagnose. Add an explicit validation of the marker timestamps before filtering unload events and log a clear error when they’re missing/invalid.
 List<HelperEvent> reclaimedJumpStubBlocks =
GetEventsInRange(unloadedJumpStubBlocks, collectionStart, collectionStop);
Logger.logger.Log("LCG jump-stub loads: " + loadedJumpStubBlocks.Count);
Logger.logger.Log("LCG jump-stub unloads: " + reclaimedJumpStubBlocks.Count);
return HaveMatchingLoadForEveryUnload(loadedJumpStubBlocks, reclaimedJumpStubBlocks)

@brianrob
brianrob merged commit 933386a into dotnet:mainAug 28, 2026
112 checks passed
@brianrob
brianrob deleted the brianrob-coreclr-etw-stub-reporting branch August 28, 2026 00:22
@dotnet-milestone-botdotnet-milestone-botBot added this to the 12.0-preview1 milestone Aug 28, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants

@brianrob@davidwrighton@hoyosjs@jkotas
, '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" + ' Report CoreCLR Write Barriers And Code-Heap Stubs In Traces by brianrob · Pull Request #132190 · dotnet/runtime · GitHub
Skip to content

Report CoreCLR Write Barriers And Code-Heap Stubs In Traces - #132190

Merged
brianrob merged 15 commits into
dotnet:mainfrom
brianrob:brianrob-coreclr-etw-stub-reporting
Aug 28, 2026
Merged

Report CoreCLR Write Barriers And Code-Heap Stubs In Traces#132190
brianrob merged 15 commits into
dotnet:mainfrom
brianrob:brianrob-coreclr-etw-stub-reporting

Conversation

@brianrob

@brianrobbrianrob commented Aug 12, 2026

Copy link
Copy Markdown
Member

Summary

Improve symbol coverage for executable code generated outside normal JIT methods. This is in response to an internal customer that is capturing traces where large percentages of symbols are unresolvable and don't resolve to a module. Upon investigation, these symbols should resolve to the copied write barrier or one of several different kinds of stubs.

Coverage

Executable rangeLive ETW/EventPipeCapture state and rundownLive PerfMapOn-demand PerfMap
Copied write barriersExisting: emitted before tracing-provider initialization. This PR: moves reporting after initialization and preserves individual names and explicit sizes.This PR: reports individual ranges through MethodUnloadVerbose, MethodDCStartVerbose, and MethodDCEndVerbose.This PR: reports individual named ranges.This PR: replays individual named ranges.
EEJitManager jump/code-fragment blocksThis PR: reports blocks through MethodLoadVerbose.This PR: reports blocks through MethodUnloadVerbose, MethodDCStartVerbose, and MethodDCEndVerbose.Existing: reports blocks or individual allocations according to DOTNET_PerfMapStubGranularity.This PR: replays blocks regardless of live block/individual granularity.
Individual symbols within EEJitManager blocksExisting: no individual or block events. This PR: reports one event for the allocation block containing the stubs.Existing: no individual or block replay. This PR: replays the allocation block containing the stubs.Existing: reports individual symbols where instrumented. This PR: no change.Existing: no replay. This PR: reports the allocation block because individual symbols cannot be reconstructed.

On-demand PerfMap generation uses blocks because individual allocations cannot be reconstructed during enumeration.

All ETW/EventPipe entries use JitHelperMethod metadata.

Implementation Notes

CodeHeapIterator now snapshots each heap’s end and uses per-heap lookahead to produce bounded, non-overlapping stub ranges. Jump-stub sizes use their existing allocation metadata; other code-fragment blocks use the bounded allocation extent.

Copied write-barrier reporting derives targets from the configured JIT helper table.

This does not change stub layout, allocation size, alignment, CodeHeader adjacency, DAC contracts, or jump reachability.

Note

This pull request description was created with GitHub Copilot.

brianroband others added 3 commits August 6, 2026 13:19
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 8ec89d46-dd0a-4373-8c4b-9ccdabfdecc2
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 8ec89d46-dd0a-4373-8c4b-9ccdabfdecc2
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 8ec89d46-dd0a-4373-8c4b-9ccdabfdecc2

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 expands runtime symbol reporting for executable code that’s generated/allocated outside normal JITted methods, so tracing consumers can attribute those code ranges in ETW/EventPipe and PerfMap outputs. It does this by emitting helper-style method events for copied write barriers and code-heap stub/code-fragment blocks, and by improving CodeHeapIterator’s ability to surface bounded stub ranges during enumeration/rundown.

Changes:

  • Add reporting/enumeration of copied write-barrier code ranges for ETW enumeration and PerfMap (including replay during method enumeration).
  • Teach CodeHeapIterator to identify stub code blocks and provide bounded sizes + kinds for logging.
  • Extend the EventPipe rundown validation test to generate VSD activity and validate helper events appear in live + rundown streams.
Show a summary per file
FileDescription
src/tests/tracing/eventpipe/rundownvalidation/rundownvalidation.csGenerates VSD activity and validates helper-style stub/write-barrier events appear in live + rundown method events.
src/coreclr/vm/threads.hRenames/init entrypoint and adds declarations for copied write-barrier reporting helpers.
src/coreclr/vm/threads.cppImplements enumeration/reporting of copied write barriers to PerfMap and ETW enumeration.
src/coreclr/vm/perfmap.cppEmits copied write barriers and stub-block ranges when generating an on-demand PerfMap.
src/coreclr/vm/eventtrace.cppExtends helper event emission to support different enumeration event types and reports stub blocks + copied write barriers during enumeration.
src/coreclr/vm/dynamicmethod.cppEnsures heap list entries for host code heaps carry a loader allocator pointer for filtered iteration.
src/coreclr/vm/codeman.hAdds wide-string stub-kind names, stub-kind/size accessors on CodeHeapIterator, and moves small-block threshold to a shared constant.
src/coreclr/vm/codeman.cppUpdates CodeHeapIterator to snapshot heap ends, identify stub code blocks, and report stub blocks via PerfMap + ETW helper events.
src/coreclr/vm/ceemain.cppCalls the new tracing-data initializer during startup.
src/coreclr/inc/eventtracebase.hUpdates/moves SendHelperEvent declaration to support passing enumeration options.

Review details

  • Files reviewed: 10/10 changed files
  • Comments generated: 0
  • Review effort level: Lite

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 8ec89d46-dd0a-4373-8c4b-9ccdabfdecc2
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 8ec89d46-dd0a-4373-8c4b-9ccdabfdecc2
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 8ec89d46-dd0a-4373-8c4b-9ccdabfdecc2
CopilotAI review requested due to automatic review settings August 12, 2026 01:33

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Review details

  • Files reviewed: 10/10 changed files
  • Comments generated: 1
  • Review effort level: Lite

Comment threadsrc/coreclr/vm/codeman.cpp Outdated
@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.

brianroband others added 3 commits August 12, 2026 12:19
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 8ec89d46-dd0a-4373-8c4b-9ccdabfdecc2
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 8ec89d46-dd0a-4373-8c4b-9ccdabfdecc2
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 8ec89d46-dd0a-4373-8c4b-9ccdabfdecc2
CopilotAI review requested due to automatic review settings August 12, 2026 22:56

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.

Review details

  • Files reviewed: 11/11 changed files
  • Comments generated: 0 new
  • Review effort level: Lite

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 8ec89d46-dd0a-4373-8c4b-9ccdabfdecc2
CopilotAI review requested due to automatic review settings August 13, 2026 00:50

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.

Review details

  • Files reviewed: 11/11 changed files
  • Comments generated: 0 new
  • Review effort level: Lite

@brianrob

Copy link
Copy Markdown
MemberAuthor

/azp run runtime

Note

This rerun request was generated by GitHub Copilot after Build Analysis identified unrelated infrastructure timeouts and known test failures.

@azure-pipelines

Copy link
Copy Markdown
No pipelines are associated with this pull request.

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines:
Successfully started running 3 pipeline(s).
13 pipeline(s) were filtered out due to trigger conditions.
There may be pipelines that require an authorized user to comment /azp run to run.

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.

Review details

Suppressed comments (1)

src/tests/tracing/eventpipe/rundownvalidation/rundownvalidation.cs:111

  • The test currently requires write-barrier helper events to be present and valid (ValidateHelperEvents(rundownWriteBarriers)), but copied write barriers are not necessarily enabled. In CoreCLR, write-barrier copying is gated by CLRConfig::UNSUPPORTED_UseGCWriteBarrierCopy and defaults to disabled (src/coreclr/vm/eeconfig.cpp:110 sets fIsWriteBarrierCopyEnabled = false; src/coreclr/vm/eeconfig.cpp:531 sets it based on the config switch). When the copy is disabled, ReportCopiedWriteBarriers* won’t emit any helper events, rundownWriteBarriers stays empty, and this test will fail on otherwise-correct builds.

Consider validating write-barrier helpers only when the events are actually present (or otherwise gating the expectation on a detectable condition).

 bool hasValidCoreClrHelpers =
!PlatformDetection.IsCoreCLR ||
!RuntimeFeature.IsDynamicCodeCompiled ||
(ValidateHelperEvents(liveStubBlocks) &&
ValidateHelperEvents(rundownStubBlocks) &&
ValidateHelperEvents(rundownWriteBarriers) &&
HaveMatchingStubBlocks(liveStubBlocks, rundownStubBlocks));
  • Files reviewed: 11/11 changed files
  • Comments generated: 0 new
  • Review effort level: Lite

@davidwrighton

Copy link
Copy Markdown
Member

LGTM, but I want @hoyosjs to review as well before signoff.

@brianrob
brianrob requested a review from hoyosjsAugust 14, 2026 18:49
Comment threadsrc/coreclr/vm/codeman.cpp
Comment threadsrc/coreclr/vm/eventtrace.cpp
brianroband others added 2 commits August 14, 2026 16:28
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 8ec89d46-dd0a-4373-8c4b-9ccdabfdecc2
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 8ec89d46-dd0a-4373-8c4b-9ccdabfdecc2
CopilotAI review requested due to automatic review settings August 16, 2026 20:45

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.

Review details

  • Files reviewed: 11/11 changed files
  • Comments generated: 1
  • Review effort level: Lite

Comment threadsrc/tests/tracing/eventpipe/rundownvalidation/rundownvalidation.cs Outdated
@brianrob

Copy link
Copy Markdown
MemberAuthor

/ba-g Current failures are unrelated known test failures: HttpListener timeout #132336 on both Windows checked legs, browser-Wasm bestfit-finalize #132107, and browser-Wasm ContextualReflection preemptive-GC assertion #131925. The affected tests and subsystems are outside this PR's ETW/stub changes.

Note

This Build Analysis override rationale was generated by GitHub Copilot.

@brianrob

Copy link
Copy Markdown
MemberAuthor

@hoyosjs this one should be ready for review again. Thanks.

Comment threadsrc/coreclr/vm/codeman.cpp Outdated
Comment threadsrc/tests/tracing/eventpipe/rundownvalidation/rundownvalidation.cs Outdated
Comment threadsrc/coreclr/vm/threads.cpp Outdated
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 8ec89d46-dd0a-4373-8c4b-9ccdabfdecc2
CopilotAI review requested due to automatic review settings August 25, 2026 21:21

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.

Review details

Suppressed comments (2)

src/tests/tracing/eventpipe/rundownvalidation/rundownvalidation.cs:449

  • The EventSource events are defined as JumpStubCollectionStart/JumpStubCollectionStop, but the trace parsing looks for "JumpStubCollection/Start" (task/opcode-style naming). Without explicitly setting EventOpcode and/or EventAttribute.Name, this comparison likely never matches, leaving collectionStart as NaN and causing the unload-range validation to fail.
 if (eventData.EventName == "JumpStubCollection/Start")
{
collectionStart = eventData.TimeStampRelativeMSec;
}

src/tests/tracing/eventpipe/rundownvalidation/rundownvalidation.cs:453

  • Same issue as the Start event: the parser looks for "JumpStubCollection/Stop" but the EventSource event is JumpStubCollectionStop unless an explicit Stop opcode/name is set.
 else if (eventData.EventName == "JumpStubCollection/Stop")
{
collectionStop = eventData.TimeStampRelativeMSec;
}
  • Files reviewed: 11/11 changed files
  • Comments generated: 0 new
  • Review effort level: Lite

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

Other than the test issue this seems good (assuming we are ok with the rundown event being an approximation, which seems fair for a trace/profiling effort - I don't see the tradeoff in storing this information elsewhere).

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 8ec89d46-dd0a-4373-8c4b-9ccdabfdecc2
CopilotAI review requested due to automatic review settings August 27, 2026 19:25

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.

Copilot review overview

Review tier: Lite
Findings: None

Suppressed comments (1)

Previously missed (1) — in code that hasn't changed since the last review.

src/tests/tracing/eventpipe/rundownvalidation/rundownvalidation.cs:483

  • If the JumpStubCollection Start/Stop markers are missing (e.g., due to EventName differences) or Stop precedes Start, collectionStart/collectionStop remain NaN/invalid and GetEventsInRange will silently return an empty set, causing a failure that’s hard to diagnose. Add an explicit validation of the marker timestamps before filtering unload events and log a clear error when they’re missing/invalid.
 List<HelperEvent> reclaimedJumpStubBlocks =
GetEventsInRange(unloadedJumpStubBlocks, collectionStart, collectionStop);
Logger.logger.Log("LCG jump-stub loads: " + loadedJumpStubBlocks.Count);
Logger.logger.Log("LCG jump-stub unloads: " + reclaimedJumpStubBlocks.Count);
return HaveMatchingLoadForEveryUnload(loadedJumpStubBlocks, reclaimedJumpStubBlocks)

@brianrob
brianrob merged commit 933386a into dotnet:mainAug 28, 2026
112 checks passed
@brianrob
brianrob deleted the brianrob-coreclr-etw-stub-reporting branch August 28, 2026 00:22
@dotnet-milestone-botdotnet-milestone-botBot added this to the 12.0-preview1 milestone Aug 28, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants

@brianrob@davidwrighton@hoyosjs@jkotas
, '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('^' + ".*" + ' Report CoreCLR Write Barriers And Code-Heap Stubs In Traces by brianrob · Pull Request #132190 · dotnet/runtime · GitHub
Skip to content

Report CoreCLR Write Barriers And Code-Heap Stubs In Traces - #132190

Merged
brianrob merged 15 commits into
dotnet:mainfrom
brianrob:brianrob-coreclr-etw-stub-reporting
Aug 28, 2026
Merged

Report CoreCLR Write Barriers And Code-Heap Stubs In Traces#132190
brianrob merged 15 commits into
dotnet:mainfrom
brianrob:brianrob-coreclr-etw-stub-reporting

Conversation

@brianrob

@brianrobbrianrob commented Aug 12, 2026

Copy link
Copy Markdown
Member

Summary

Improve symbol coverage for executable code generated outside normal JIT methods. This is in response to an internal customer that is capturing traces where large percentages of symbols are unresolvable and don't resolve to a module. Upon investigation, these symbols should resolve to the copied write barrier or one of several different kinds of stubs.

Coverage

Executable rangeLive ETW/EventPipeCapture state and rundownLive PerfMapOn-demand PerfMap
Copied write barriersExisting: emitted before tracing-provider initialization. This PR: moves reporting after initialization and preserves individual names and explicit sizes.This PR: reports individual ranges through MethodUnloadVerbose, MethodDCStartVerbose, and MethodDCEndVerbose.This PR: reports individual named ranges.This PR: replays individual named ranges.
EEJitManager jump/code-fragment blocksThis PR: reports blocks through MethodLoadVerbose.This PR: reports blocks through MethodUnloadVerbose, MethodDCStartVerbose, and MethodDCEndVerbose.Existing: reports blocks or individual allocations according to DOTNET_PerfMapStubGranularity.This PR: replays blocks regardless of live block/individual granularity.
Individual symbols within EEJitManager blocksExisting: no individual or block events. This PR: reports one event for the allocation block containing the stubs.Existing: no individual or block replay. This PR: replays the allocation block containing the stubs.Existing: reports individual symbols where instrumented. This PR: no change.Existing: no replay. This PR: reports the allocation block because individual symbols cannot be reconstructed.

On-demand PerfMap generation uses blocks because individual allocations cannot be reconstructed during enumeration.

All ETW/EventPipe entries use JitHelperMethod metadata.

Implementation Notes

CodeHeapIterator now snapshots each heap’s end and uses per-heap lookahead to produce bounded, non-overlapping stub ranges. Jump-stub sizes use their existing allocation metadata; other code-fragment blocks use the bounded allocation extent.

Copied write-barrier reporting derives targets from the configured JIT helper table.

This does not change stub layout, allocation size, alignment, CodeHeader adjacency, DAC contracts, or jump reachability.

Note

This pull request description was created with GitHub Copilot.

brianroband others added 3 commits August 6, 2026 13:19
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 8ec89d46-dd0a-4373-8c4b-9ccdabfdecc2
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 8ec89d46-dd0a-4373-8c4b-9ccdabfdecc2
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 8ec89d46-dd0a-4373-8c4b-9ccdabfdecc2

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 expands runtime symbol reporting for executable code that’s generated/allocated outside normal JITted methods, so tracing consumers can attribute those code ranges in ETW/EventPipe and PerfMap outputs. It does this by emitting helper-style method events for copied write barriers and code-heap stub/code-fragment blocks, and by improving CodeHeapIterator’s ability to surface bounded stub ranges during enumeration/rundown.

Changes:

  • Add reporting/enumeration of copied write-barrier code ranges for ETW enumeration and PerfMap (including replay during method enumeration).
  • Teach CodeHeapIterator to identify stub code blocks and provide bounded sizes + kinds for logging.
  • Extend the EventPipe rundown validation test to generate VSD activity and validate helper events appear in live + rundown streams.
Show a summary per file
FileDescription
src/tests/tracing/eventpipe/rundownvalidation/rundownvalidation.csGenerates VSD activity and validates helper-style stub/write-barrier events appear in live + rundown method events.
src/coreclr/vm/threads.hRenames/init entrypoint and adds declarations for copied write-barrier reporting helpers.
src/coreclr/vm/threads.cppImplements enumeration/reporting of copied write barriers to PerfMap and ETW enumeration.
src/coreclr/vm/perfmap.cppEmits copied write barriers and stub-block ranges when generating an on-demand PerfMap.
src/coreclr/vm/eventtrace.cppExtends helper event emission to support different enumeration event types and reports stub blocks + copied write barriers during enumeration.
src/coreclr/vm/dynamicmethod.cppEnsures heap list entries for host code heaps carry a loader allocator pointer for filtered iteration.
src/coreclr/vm/codeman.hAdds wide-string stub-kind names, stub-kind/size accessors on CodeHeapIterator, and moves small-block threshold to a shared constant.
src/coreclr/vm/codeman.cppUpdates CodeHeapIterator to snapshot heap ends, identify stub code blocks, and report stub blocks via PerfMap + ETW helper events.
src/coreclr/vm/ceemain.cppCalls the new tracing-data initializer during startup.
src/coreclr/inc/eventtracebase.hUpdates/moves SendHelperEvent declaration to support passing enumeration options.

Review details

  • Files reviewed: 10/10 changed files
  • Comments generated: 0
  • Review effort level: Lite

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 8ec89d46-dd0a-4373-8c4b-9ccdabfdecc2
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 8ec89d46-dd0a-4373-8c4b-9ccdabfdecc2
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 8ec89d46-dd0a-4373-8c4b-9ccdabfdecc2
CopilotAI review requested due to automatic review settings August 12, 2026 01:33

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Review details

  • Files reviewed: 10/10 changed files
  • Comments generated: 1
  • Review effort level: Lite

Comment threadsrc/coreclr/vm/codeman.cpp Outdated
@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.

brianroband others added 3 commits August 12, 2026 12:19
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 8ec89d46-dd0a-4373-8c4b-9ccdabfdecc2
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 8ec89d46-dd0a-4373-8c4b-9ccdabfdecc2
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 8ec89d46-dd0a-4373-8c4b-9ccdabfdecc2
CopilotAI review requested due to automatic review settings August 12, 2026 22:56

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.

Review details

  • Files reviewed: 11/11 changed files
  • Comments generated: 0 new
  • Review effort level: Lite

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 8ec89d46-dd0a-4373-8c4b-9ccdabfdecc2
CopilotAI review requested due to automatic review settings August 13, 2026 00:50

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.

Review details

  • Files reviewed: 11/11 changed files
  • Comments generated: 0 new
  • Review effort level: Lite

@brianrob

Copy link
Copy Markdown
MemberAuthor

/azp run runtime

Note

This rerun request was generated by GitHub Copilot after Build Analysis identified unrelated infrastructure timeouts and known test failures.

@azure-pipelines

Copy link
Copy Markdown
No pipelines are associated with this pull request.

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines:
Successfully started running 3 pipeline(s).
13 pipeline(s) were filtered out due to trigger conditions.
There may be pipelines that require an authorized user to comment /azp run to run.

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.

Review details

Suppressed comments (1)

src/tests/tracing/eventpipe/rundownvalidation/rundownvalidation.cs:111

  • The test currently requires write-barrier helper events to be present and valid (ValidateHelperEvents(rundownWriteBarriers)), but copied write barriers are not necessarily enabled. In CoreCLR, write-barrier copying is gated by CLRConfig::UNSUPPORTED_UseGCWriteBarrierCopy and defaults to disabled (src/coreclr/vm/eeconfig.cpp:110 sets fIsWriteBarrierCopyEnabled = false; src/coreclr/vm/eeconfig.cpp:531 sets it based on the config switch). When the copy is disabled, ReportCopiedWriteBarriers* won’t emit any helper events, rundownWriteBarriers stays empty, and this test will fail on otherwise-correct builds.

Consider validating write-barrier helpers only when the events are actually present (or otherwise gating the expectation on a detectable condition).

 bool hasValidCoreClrHelpers =
!PlatformDetection.IsCoreCLR ||
!RuntimeFeature.IsDynamicCodeCompiled ||
(ValidateHelperEvents(liveStubBlocks) &&
ValidateHelperEvents(rundownStubBlocks) &&
ValidateHelperEvents(rundownWriteBarriers) &&
HaveMatchingStubBlocks(liveStubBlocks, rundownStubBlocks));
  • Files reviewed: 11/11 changed files
  • Comments generated: 0 new
  • Review effort level: Lite

@davidwrighton

Copy link
Copy Markdown
Member

LGTM, but I want @hoyosjs to review as well before signoff.

@brianrob
brianrob requested a review from hoyosjsAugust 14, 2026 18:49
Comment threadsrc/coreclr/vm/codeman.cpp
Comment threadsrc/coreclr/vm/eventtrace.cpp
brianroband others added 2 commits August 14, 2026 16:28
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 8ec89d46-dd0a-4373-8c4b-9ccdabfdecc2
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 8ec89d46-dd0a-4373-8c4b-9ccdabfdecc2
CopilotAI review requested due to automatic review settings August 16, 2026 20:45

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.

Review details

  • Files reviewed: 11/11 changed files
  • Comments generated: 1
  • Review effort level: Lite

Comment threadsrc/tests/tracing/eventpipe/rundownvalidation/rundownvalidation.cs Outdated
@brianrob

Copy link
Copy Markdown
MemberAuthor

/ba-g Current failures are unrelated known test failures: HttpListener timeout #132336 on both Windows checked legs, browser-Wasm bestfit-finalize #132107, and browser-Wasm ContextualReflection preemptive-GC assertion #131925. The affected tests and subsystems are outside this PR's ETW/stub changes.

Note

This Build Analysis override rationale was generated by GitHub Copilot.

@brianrob

Copy link
Copy Markdown
MemberAuthor

@hoyosjs this one should be ready for review again. Thanks.

Comment threadsrc/coreclr/vm/codeman.cpp Outdated
Comment threadsrc/tests/tracing/eventpipe/rundownvalidation/rundownvalidation.cs Outdated
Comment threadsrc/coreclr/vm/threads.cpp Outdated
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 8ec89d46-dd0a-4373-8c4b-9ccdabfdecc2
CopilotAI review requested due to automatic review settings August 25, 2026 21:21

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.

Review details

Suppressed comments (2)

src/tests/tracing/eventpipe/rundownvalidation/rundownvalidation.cs:449

  • The EventSource events are defined as JumpStubCollectionStart/JumpStubCollectionStop, but the trace parsing looks for "JumpStubCollection/Start" (task/opcode-style naming). Without explicitly setting EventOpcode and/or EventAttribute.Name, this comparison likely never matches, leaving collectionStart as NaN and causing the unload-range validation to fail.
 if (eventData.EventName == "JumpStubCollection/Start")
{
collectionStart = eventData.TimeStampRelativeMSec;
}

src/tests/tracing/eventpipe/rundownvalidation/rundownvalidation.cs:453

  • Same issue as the Start event: the parser looks for "JumpStubCollection/Stop" but the EventSource event is JumpStubCollectionStop unless an explicit Stop opcode/name is set.
 else if (eventData.EventName == "JumpStubCollection/Stop")
{
collectionStop = eventData.TimeStampRelativeMSec;
}
  • Files reviewed: 11/11 changed files
  • Comments generated: 0 new
  • Review effort level: Lite

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

Other than the test issue this seems good (assuming we are ok with the rundown event being an approximation, which seems fair for a trace/profiling effort - I don't see the tradeoff in storing this information elsewhere).

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 8ec89d46-dd0a-4373-8c4b-9ccdabfdecc2
CopilotAI review requested due to automatic review settings August 27, 2026 19:25

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.

Copilot review overview

Review tier: Lite
Findings: None

Suppressed comments (1)

Previously missed (1) — in code that hasn't changed since the last review.

src/tests/tracing/eventpipe/rundownvalidation/rundownvalidation.cs:483

  • If the JumpStubCollection Start/Stop markers are missing (e.g., due to EventName differences) or Stop precedes Start, collectionStart/collectionStop remain NaN/invalid and GetEventsInRange will silently return an empty set, causing a failure that’s hard to diagnose. Add an explicit validation of the marker timestamps before filtering unload events and log a clear error when they’re missing/invalid.
 List<HelperEvent> reclaimedJumpStubBlocks =
GetEventsInRange(unloadedJumpStubBlocks, collectionStart, collectionStop);
Logger.logger.Log("LCG jump-stub loads: " + loadedJumpStubBlocks.Count);
Logger.logger.Log("LCG jump-stub unloads: " + reclaimedJumpStubBlocks.Count);
return HaveMatchingLoadForEveryUnload(loadedJumpStubBlocks, reclaimedJumpStubBlocks)

@brianrob
brianrob merged commit 933386a into dotnet:mainAug 28, 2026
112 checks passed
@brianrob
brianrob deleted the brianrob-coreclr-etw-stub-reporting branch August 28, 2026 00:22
@dotnet-milestone-botdotnet-milestone-botBot added this to the 12.0-preview1 milestone Aug 28, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants

@brianrob@davidwrighton@hoyosjs@jkotas
, '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); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' Report CoreCLR Write Barriers And Code-Heap Stubs In Traces by brianrob · Pull Request #132190 · dotnet/runtime · GitHub
Skip to content

Report CoreCLR Write Barriers And Code-Heap Stubs In Traces - #132190

Merged
brianrob merged 15 commits into
dotnet:mainfrom
brianrob:brianrob-coreclr-etw-stub-reporting
Aug 28, 2026
Merged

Report CoreCLR Write Barriers And Code-Heap Stubs In Traces#132190
brianrob merged 15 commits into
dotnet:mainfrom
brianrob:brianrob-coreclr-etw-stub-reporting

Conversation

@brianrob

@brianrobbrianrob commented Aug 12, 2026

Copy link
Copy Markdown
Member

Summary

Improve symbol coverage for executable code generated outside normal JIT methods. This is in response to an internal customer that is capturing traces where large percentages of symbols are unresolvable and don't resolve to a module. Upon investigation, these symbols should resolve to the copied write barrier or one of several different kinds of stubs.

Coverage

Executable rangeLive ETW/EventPipeCapture state and rundownLive PerfMapOn-demand PerfMap
Copied write barriersExisting: emitted before tracing-provider initialization. This PR: moves reporting after initialization and preserves individual names and explicit sizes.This PR: reports individual ranges through MethodUnloadVerbose, MethodDCStartVerbose, and MethodDCEndVerbose.This PR: reports individual named ranges.This PR: replays individual named ranges.
EEJitManager jump/code-fragment blocksThis PR: reports blocks through MethodLoadVerbose.This PR: reports blocks through MethodUnloadVerbose, MethodDCStartVerbose, and MethodDCEndVerbose.Existing: reports blocks or individual allocations according to DOTNET_PerfMapStubGranularity.This PR: replays blocks regardless of live block/individual granularity.
Individual symbols within EEJitManager blocksExisting: no individual or block events. This PR: reports one event for the allocation block containing the stubs.Existing: no individual or block replay. This PR: replays the allocation block containing the stubs.Existing: reports individual symbols where instrumented. This PR: no change.Existing: no replay. This PR: reports the allocation block because individual symbols cannot be reconstructed.

On-demand PerfMap generation uses blocks because individual allocations cannot be reconstructed during enumeration.

All ETW/EventPipe entries use JitHelperMethod metadata.

Implementation Notes

CodeHeapIterator now snapshots each heap’s end and uses per-heap lookahead to produce bounded, non-overlapping stub ranges. Jump-stub sizes use their existing allocation metadata; other code-fragment blocks use the bounded allocation extent.

Copied write-barrier reporting derives targets from the configured JIT helper table.

This does not change stub layout, allocation size, alignment, CodeHeader adjacency, DAC contracts, or jump reachability.

Note

This pull request description was created with GitHub Copilot.

brianroband others added 3 commits August 6, 2026 13:19
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 8ec89d46-dd0a-4373-8c4b-9ccdabfdecc2
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 8ec89d46-dd0a-4373-8c4b-9ccdabfdecc2
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 8ec89d46-dd0a-4373-8c4b-9ccdabfdecc2

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 expands runtime symbol reporting for executable code that’s generated/allocated outside normal JITted methods, so tracing consumers can attribute those code ranges in ETW/EventPipe and PerfMap outputs. It does this by emitting helper-style method events for copied write barriers and code-heap stub/code-fragment blocks, and by improving CodeHeapIterator’s ability to surface bounded stub ranges during enumeration/rundown.

Changes:

  • Add reporting/enumeration of copied write-barrier code ranges for ETW enumeration and PerfMap (including replay during method enumeration).
  • Teach CodeHeapIterator to identify stub code blocks and provide bounded sizes + kinds for logging.
  • Extend the EventPipe rundown validation test to generate VSD activity and validate helper events appear in live + rundown streams.
Show a summary per file
FileDescription
src/tests/tracing/eventpipe/rundownvalidation/rundownvalidation.csGenerates VSD activity and validates helper-style stub/write-barrier events appear in live + rundown method events.
src/coreclr/vm/threads.hRenames/init entrypoint and adds declarations for copied write-barrier reporting helpers.
src/coreclr/vm/threads.cppImplements enumeration/reporting of copied write barriers to PerfMap and ETW enumeration.
src/coreclr/vm/perfmap.cppEmits copied write barriers and stub-block ranges when generating an on-demand PerfMap.
src/coreclr/vm/eventtrace.cppExtends helper event emission to support different enumeration event types and reports stub blocks + copied write barriers during enumeration.
src/coreclr/vm/dynamicmethod.cppEnsures heap list entries for host code heaps carry a loader allocator pointer for filtered iteration.
src/coreclr/vm/codeman.hAdds wide-string stub-kind names, stub-kind/size accessors on CodeHeapIterator, and moves small-block threshold to a shared constant.
src/coreclr/vm/codeman.cppUpdates CodeHeapIterator to snapshot heap ends, identify stub code blocks, and report stub blocks via PerfMap + ETW helper events.
src/coreclr/vm/ceemain.cppCalls the new tracing-data initializer during startup.
src/coreclr/inc/eventtracebase.hUpdates/moves SendHelperEvent declaration to support passing enumeration options.

Review details

  • Files reviewed: 10/10 changed files
  • Comments generated: 0
  • Review effort level: Lite

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 8ec89d46-dd0a-4373-8c4b-9ccdabfdecc2
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 8ec89d46-dd0a-4373-8c4b-9ccdabfdecc2
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 8ec89d46-dd0a-4373-8c4b-9ccdabfdecc2
CopilotAI review requested due to automatic review settings August 12, 2026 01:33

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Review details

  • Files reviewed: 10/10 changed files
  • Comments generated: 1
  • Review effort level: Lite

Comment threadsrc/coreclr/vm/codeman.cpp Outdated
@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.

brianroband others added 3 commits August 12, 2026 12:19
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 8ec89d46-dd0a-4373-8c4b-9ccdabfdecc2
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 8ec89d46-dd0a-4373-8c4b-9ccdabfdecc2
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 8ec89d46-dd0a-4373-8c4b-9ccdabfdecc2
CopilotAI review requested due to automatic review settings August 12, 2026 22:56

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.

Review details

  • Files reviewed: 11/11 changed files
  • Comments generated: 0 new
  • Review effort level: Lite

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 8ec89d46-dd0a-4373-8c4b-9ccdabfdecc2
CopilotAI review requested due to automatic review settings August 13, 2026 00:50

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.

Review details

  • Files reviewed: 11/11 changed files
  • Comments generated: 0 new
  • Review effort level: Lite

@brianrob

Copy link
Copy Markdown
MemberAuthor

/azp run runtime

Note

This rerun request was generated by GitHub Copilot after Build Analysis identified unrelated infrastructure timeouts and known test failures.

@azure-pipelines

Copy link
Copy Markdown
No pipelines are associated with this pull request.

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines:
Successfully started running 3 pipeline(s).
13 pipeline(s) were filtered out due to trigger conditions.
There may be pipelines that require an authorized user to comment /azp run to run.

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.

Review details

Suppressed comments (1)

src/tests/tracing/eventpipe/rundownvalidation/rundownvalidation.cs:111

  • The test currently requires write-barrier helper events to be present and valid (ValidateHelperEvents(rundownWriteBarriers)), but copied write barriers are not necessarily enabled. In CoreCLR, write-barrier copying is gated by CLRConfig::UNSUPPORTED_UseGCWriteBarrierCopy and defaults to disabled (src/coreclr/vm/eeconfig.cpp:110 sets fIsWriteBarrierCopyEnabled = false; src/coreclr/vm/eeconfig.cpp:531 sets it based on the config switch). When the copy is disabled, ReportCopiedWriteBarriers* won’t emit any helper events, rundownWriteBarriers stays empty, and this test will fail on otherwise-correct builds.

Consider validating write-barrier helpers only when the events are actually present (or otherwise gating the expectation on a detectable condition).

 bool hasValidCoreClrHelpers =
!PlatformDetection.IsCoreCLR ||
!RuntimeFeature.IsDynamicCodeCompiled ||
(ValidateHelperEvents(liveStubBlocks) &&
ValidateHelperEvents(rundownStubBlocks) &&
ValidateHelperEvents(rundownWriteBarriers) &&
HaveMatchingStubBlocks(liveStubBlocks, rundownStubBlocks));
  • Files reviewed: 11/11 changed files
  • Comments generated: 0 new
  • Review effort level: Lite

@davidwrighton

Copy link
Copy Markdown
Member

LGTM, but I want @hoyosjs to review as well before signoff.

@brianrob
brianrob requested a review from hoyosjsAugust 14, 2026 18:49
Comment threadsrc/coreclr/vm/codeman.cpp
Comment threadsrc/coreclr/vm/eventtrace.cpp
brianroband others added 2 commits August 14, 2026 16:28
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 8ec89d46-dd0a-4373-8c4b-9ccdabfdecc2
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 8ec89d46-dd0a-4373-8c4b-9ccdabfdecc2
CopilotAI review requested due to automatic review settings August 16, 2026 20:45

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.

Review details

  • Files reviewed: 11/11 changed files
  • Comments generated: 1
  • Review effort level: Lite

Comment threadsrc/tests/tracing/eventpipe/rundownvalidation/rundownvalidation.cs Outdated
@brianrob

Copy link
Copy Markdown
MemberAuthor

/ba-g Current failures are unrelated known test failures: HttpListener timeout #132336 on both Windows checked legs, browser-Wasm bestfit-finalize #132107, and browser-Wasm ContextualReflection preemptive-GC assertion #131925. The affected tests and subsystems are outside this PR's ETW/stub changes.

Note

This Build Analysis override rationale was generated by GitHub Copilot.

@brianrob

Copy link
Copy Markdown
MemberAuthor

@hoyosjs this one should be ready for review again. Thanks.

Comment threadsrc/coreclr/vm/codeman.cpp Outdated
Comment threadsrc/tests/tracing/eventpipe/rundownvalidation/rundownvalidation.cs Outdated
Comment threadsrc/coreclr/vm/threads.cpp Outdated
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 8ec89d46-dd0a-4373-8c4b-9ccdabfdecc2
CopilotAI review requested due to automatic review settings August 25, 2026 21:21

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.

Review details

Suppressed comments (2)

src/tests/tracing/eventpipe/rundownvalidation/rundownvalidation.cs:449

  • The EventSource events are defined as JumpStubCollectionStart/JumpStubCollectionStop, but the trace parsing looks for "JumpStubCollection/Start" (task/opcode-style naming). Without explicitly setting EventOpcode and/or EventAttribute.Name, this comparison likely never matches, leaving collectionStart as NaN and causing the unload-range validation to fail.
 if (eventData.EventName == "JumpStubCollection/Start")
{
collectionStart = eventData.TimeStampRelativeMSec;
}

src/tests/tracing/eventpipe/rundownvalidation/rundownvalidation.cs:453

  • Same issue as the Start event: the parser looks for "JumpStubCollection/Stop" but the EventSource event is JumpStubCollectionStop unless an explicit Stop opcode/name is set.
 else if (eventData.EventName == "JumpStubCollection/Stop")
{
collectionStop = eventData.TimeStampRelativeMSec;
}
  • Files reviewed: 11/11 changed files
  • Comments generated: 0 new
  • Review effort level: Lite

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

Other than the test issue this seems good (assuming we are ok with the rundown event being an approximation, which seems fair for a trace/profiling effort - I don't see the tradeoff in storing this information elsewhere).

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 8ec89d46-dd0a-4373-8c4b-9ccdabfdecc2
CopilotAI review requested due to automatic review settings August 27, 2026 19:25

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.

Copilot review overview

Review tier: Lite
Findings: None

Suppressed comments (1)

Previously missed (1) — in code that hasn't changed since the last review.

src/tests/tracing/eventpipe/rundownvalidation/rundownvalidation.cs:483

  • If the JumpStubCollection Start/Stop markers are missing (e.g., due to EventName differences) or Stop precedes Start, collectionStart/collectionStop remain NaN/invalid and GetEventsInRange will silently return an empty set, causing a failure that’s hard to diagnose. Add an explicit validation of the marker timestamps before filtering unload events and log a clear error when they’re missing/invalid.
 List<HelperEvent> reclaimedJumpStubBlocks =
GetEventsInRange(unloadedJumpStubBlocks, collectionStart, collectionStop);
Logger.logger.Log("LCG jump-stub loads: " + loadedJumpStubBlocks.Count);
Logger.logger.Log("LCG jump-stub unloads: " + reclaimedJumpStubBlocks.Count);
return HaveMatchingLoadForEveryUnload(loadedJumpStubBlocks, reclaimedJumpStubBlocks)

@brianrob
brianrob merged commit 933386a into dotnet:mainAug 28, 2026
112 checks passed
@brianrob
brianrob deleted the brianrob-coreclr-etw-stub-reporting branch August 28, 2026 00:22
@dotnet-milestone-botdotnet-milestone-botBot added this to the 12.0-preview1 milestone Aug 28, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants

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

Report CoreCLR Write Barriers And Code-Heap Stubs In Traces - #132190

Merged
brianrob merged 15 commits into
dotnet:mainfrom
brianrob:brianrob-coreclr-etw-stub-reporting
Aug 28, 2026
Merged

Report CoreCLR Write Barriers And Code-Heap Stubs In Traces#132190
brianrob merged 15 commits into
dotnet:mainfrom
brianrob:brianrob-coreclr-etw-stub-reporting

Conversation

@brianrob

@brianrobbrianrob commented Aug 12, 2026

Copy link
Copy Markdown
Member

Summary

Improve symbol coverage for executable code generated outside normal JIT methods. This is in response to an internal customer that is capturing traces where large percentages of symbols are unresolvable and don't resolve to a module. Upon investigation, these symbols should resolve to the copied write barrier or one of several different kinds of stubs.

Coverage

Executable rangeLive ETW/EventPipeCapture state and rundownLive PerfMapOn-demand PerfMap
Copied write barriersExisting: emitted before tracing-provider initialization. This PR: moves reporting after initialization and preserves individual names and explicit sizes.This PR: reports individual ranges through MethodUnloadVerbose, MethodDCStartVerbose, and MethodDCEndVerbose.This PR: reports individual named ranges.This PR: replays individual named ranges.
EEJitManager jump/code-fragment blocksThis PR: reports blocks through MethodLoadVerbose.This PR: reports blocks through MethodUnloadVerbose, MethodDCStartVerbose, and MethodDCEndVerbose.Existing: reports blocks or individual allocations according to DOTNET_PerfMapStubGranularity.This PR: replays blocks regardless of live block/individual granularity.
Individual symbols within EEJitManager blocksExisting: no individual or block events. This PR: reports one event for the allocation block containing the stubs.Existing: no individual or block replay. This PR: replays the allocation block containing the stubs.Existing: reports individual symbols where instrumented. This PR: no change.Existing: no replay. This PR: reports the allocation block because individual symbols cannot be reconstructed.

On-demand PerfMap generation uses blocks because individual allocations cannot be reconstructed during enumeration.

All ETW/EventPipe entries use JitHelperMethod metadata.

Implementation Notes

CodeHeapIterator now snapshots each heap’s end and uses per-heap lookahead to produce bounded, non-overlapping stub ranges. Jump-stub sizes use their existing allocation metadata; other code-fragment blocks use the bounded allocation extent.

Copied write-barrier reporting derives targets from the configured JIT helper table.

This does not change stub layout, allocation size, alignment, CodeHeader adjacency, DAC contracts, or jump reachability.

Note

This pull request description was created with GitHub Copilot.

brianroband others added 3 commits August 6, 2026 13:19
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 8ec89d46-dd0a-4373-8c4b-9ccdabfdecc2
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 8ec89d46-dd0a-4373-8c4b-9ccdabfdecc2
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 8ec89d46-dd0a-4373-8c4b-9ccdabfdecc2

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 expands runtime symbol reporting for executable code that’s generated/allocated outside normal JITted methods, so tracing consumers can attribute those code ranges in ETW/EventPipe and PerfMap outputs. It does this by emitting helper-style method events for copied write barriers and code-heap stub/code-fragment blocks, and by improving CodeHeapIterator’s ability to surface bounded stub ranges during enumeration/rundown.

Changes:

  • Add reporting/enumeration of copied write-barrier code ranges for ETW enumeration and PerfMap (including replay during method enumeration).
  • Teach CodeHeapIterator to identify stub code blocks and provide bounded sizes + kinds for logging.
  • Extend the EventPipe rundown validation test to generate VSD activity and validate helper events appear in live + rundown streams.
Show a summary per file
FileDescription
src/tests/tracing/eventpipe/rundownvalidation/rundownvalidation.csGenerates VSD activity and validates helper-style stub/write-barrier events appear in live + rundown method events.
src/coreclr/vm/threads.hRenames/init entrypoint and adds declarations for copied write-barrier reporting helpers.
src/coreclr/vm/threads.cppImplements enumeration/reporting of copied write barriers to PerfMap and ETW enumeration.
src/coreclr/vm/perfmap.cppEmits copied write barriers and stub-block ranges when generating an on-demand PerfMap.
src/coreclr/vm/eventtrace.cppExtends helper event emission to support different enumeration event types and reports stub blocks + copied write barriers during enumeration.
src/coreclr/vm/dynamicmethod.cppEnsures heap list entries for host code heaps carry a loader allocator pointer for filtered iteration.
src/coreclr/vm/codeman.hAdds wide-string stub-kind names, stub-kind/size accessors on CodeHeapIterator, and moves small-block threshold to a shared constant.
src/coreclr/vm/codeman.cppUpdates CodeHeapIterator to snapshot heap ends, identify stub code blocks, and report stub blocks via PerfMap + ETW helper events.
src/coreclr/vm/ceemain.cppCalls the new tracing-data initializer during startup.
src/coreclr/inc/eventtracebase.hUpdates/moves SendHelperEvent declaration to support passing enumeration options.

Review details

  • Files reviewed: 10/10 changed files
  • Comments generated: 0
  • Review effort level: Lite

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 8ec89d46-dd0a-4373-8c4b-9ccdabfdecc2
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 8ec89d46-dd0a-4373-8c4b-9ccdabfdecc2
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 8ec89d46-dd0a-4373-8c4b-9ccdabfdecc2
CopilotAI review requested due to automatic review settings August 12, 2026 01:33

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Review details

  • Files reviewed: 10/10 changed files
  • Comments generated: 1
  • Review effort level: Lite

Comment threadsrc/coreclr/vm/codeman.cpp Outdated
@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.

brianroband others added 3 commits August 12, 2026 12:19
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 8ec89d46-dd0a-4373-8c4b-9ccdabfdecc2
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 8ec89d46-dd0a-4373-8c4b-9ccdabfdecc2
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 8ec89d46-dd0a-4373-8c4b-9ccdabfdecc2
CopilotAI review requested due to automatic review settings August 12, 2026 22:56

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.

Review details

  • Files reviewed: 11/11 changed files
  • Comments generated: 0 new
  • Review effort level: Lite

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 8ec89d46-dd0a-4373-8c4b-9ccdabfdecc2
CopilotAI review requested due to automatic review settings August 13, 2026 00:50

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.

Review details

  • Files reviewed: 11/11 changed files
  • Comments generated: 0 new
  • Review effort level: Lite

@brianrob

Copy link
Copy Markdown
MemberAuthor

/azp run runtime

Note

This rerun request was generated by GitHub Copilot after Build Analysis identified unrelated infrastructure timeouts and known test failures.

@azure-pipelines

Copy link
Copy Markdown
No pipelines are associated with this pull request.

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines:
Successfully started running 3 pipeline(s).
13 pipeline(s) were filtered out due to trigger conditions.
There may be pipelines that require an authorized user to comment /azp run to run.

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.

Review details

Suppressed comments (1)

src/tests/tracing/eventpipe/rundownvalidation/rundownvalidation.cs:111

  • The test currently requires write-barrier helper events to be present and valid (ValidateHelperEvents(rundownWriteBarriers)), but copied write barriers are not necessarily enabled. In CoreCLR, write-barrier copying is gated by CLRConfig::UNSUPPORTED_UseGCWriteBarrierCopy and defaults to disabled (src/coreclr/vm/eeconfig.cpp:110 sets fIsWriteBarrierCopyEnabled = false; src/coreclr/vm/eeconfig.cpp:531 sets it based on the config switch). When the copy is disabled, ReportCopiedWriteBarriers* won’t emit any helper events, rundownWriteBarriers stays empty, and this test will fail on otherwise-correct builds.

Consider validating write-barrier helpers only when the events are actually present (or otherwise gating the expectation on a detectable condition).

 bool hasValidCoreClrHelpers =
!PlatformDetection.IsCoreCLR ||
!RuntimeFeature.IsDynamicCodeCompiled ||
(ValidateHelperEvents(liveStubBlocks) &&
ValidateHelperEvents(rundownStubBlocks) &&
ValidateHelperEvents(rundownWriteBarriers) &&
HaveMatchingStubBlocks(liveStubBlocks, rundownStubBlocks));
  • Files reviewed: 11/11 changed files
  • Comments generated: 0 new
  • Review effort level: Lite

@davidwrighton

Copy link
Copy Markdown
Member

LGTM, but I want @hoyosjs to review as well before signoff.

@brianrob
brianrob requested a review from hoyosjsAugust 14, 2026 18:49
Comment threadsrc/coreclr/vm/codeman.cpp
Comment threadsrc/coreclr/vm/eventtrace.cpp
brianroband others added 2 commits August 14, 2026 16:28
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 8ec89d46-dd0a-4373-8c4b-9ccdabfdecc2
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 8ec89d46-dd0a-4373-8c4b-9ccdabfdecc2
CopilotAI review requested due to automatic review settings August 16, 2026 20:45

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.

Review details

  • Files reviewed: 11/11 changed files
  • Comments generated: 1
  • Review effort level: Lite

Comment threadsrc/tests/tracing/eventpipe/rundownvalidation/rundownvalidation.cs Outdated
@brianrob

Copy link
Copy Markdown
MemberAuthor

/ba-g Current failures are unrelated known test failures: HttpListener timeout #132336 on both Windows checked legs, browser-Wasm bestfit-finalize #132107, and browser-Wasm ContextualReflection preemptive-GC assertion #131925. The affected tests and subsystems are outside this PR's ETW/stub changes.

Note

This Build Analysis override rationale was generated by GitHub Copilot.

@brianrob

Copy link
Copy Markdown
MemberAuthor

@hoyosjs this one should be ready for review again. Thanks.

Comment threadsrc/coreclr/vm/codeman.cpp Outdated
Comment threadsrc/tests/tracing/eventpipe/rundownvalidation/rundownvalidation.cs Outdated
Comment threadsrc/coreclr/vm/threads.cpp Outdated
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 8ec89d46-dd0a-4373-8c4b-9ccdabfdecc2
CopilotAI review requested due to automatic review settings August 25, 2026 21:21

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.

Review details

Suppressed comments (2)

src/tests/tracing/eventpipe/rundownvalidation/rundownvalidation.cs:449

  • The EventSource events are defined as JumpStubCollectionStart/JumpStubCollectionStop, but the trace parsing looks for "JumpStubCollection/Start" (task/opcode-style naming). Without explicitly setting EventOpcode and/or EventAttribute.Name, this comparison likely never matches, leaving collectionStart as NaN and causing the unload-range validation to fail.
 if (eventData.EventName == "JumpStubCollection/Start")
{
collectionStart = eventData.TimeStampRelativeMSec;
}

src/tests/tracing/eventpipe/rundownvalidation/rundownvalidation.cs:453

  • Same issue as the Start event: the parser looks for "JumpStubCollection/Stop" but the EventSource event is JumpStubCollectionStop unless an explicit Stop opcode/name is set.
 else if (eventData.EventName == "JumpStubCollection/Stop")
{
collectionStop = eventData.TimeStampRelativeMSec;
}
  • Files reviewed: 11/11 changed files
  • Comments generated: 0 new
  • Review effort level: Lite

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

Other than the test issue this seems good (assuming we are ok with the rundown event being an approximation, which seems fair for a trace/profiling effort - I don't see the tradeoff in storing this information elsewhere).

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 8ec89d46-dd0a-4373-8c4b-9ccdabfdecc2
CopilotAI review requested due to automatic review settings August 27, 2026 19:25

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.

Copilot review overview

Review tier: Lite
Findings: None

Suppressed comments (1)

Previously missed (1) — in code that hasn't changed since the last review.

src/tests/tracing/eventpipe/rundownvalidation/rundownvalidation.cs:483

  • If the JumpStubCollection Start/Stop markers are missing (e.g., due to EventName differences) or Stop precedes Start, collectionStart/collectionStop remain NaN/invalid and GetEventsInRange will silently return an empty set, causing a failure that’s hard to diagnose. Add an explicit validation of the marker timestamps before filtering unload events and log a clear error when they’re missing/invalid.
 List<HelperEvent> reclaimedJumpStubBlocks =
GetEventsInRange(unloadedJumpStubBlocks, collectionStart, collectionStop);
Logger.logger.Log("LCG jump-stub loads: " + loadedJumpStubBlocks.Count);
Logger.logger.Log("LCG jump-stub unloads: " + reclaimedJumpStubBlocks.Count);
return HaveMatchingLoadForEveryUnload(loadedJumpStubBlocks, reclaimedJumpStubBlocks)

@brianrob
brianrob merged commit 933386a into dotnet:mainAug 28, 2026
112 checks passed
@brianrob
brianrob deleted the brianrob-coreclr-etw-stub-reporting branch August 28, 2026 00:22
@dotnet-milestone-botdotnet-milestone-botBot added this to the 12.0-preview1 milestone Aug 28, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants

@brianrob@davidwrighton@hoyosjs@jkotas