Skip to content

[Diagnostics] Avoid resolving IL offsets for framed crash frames - #131481

Open
mdh1418 wants to merge 2 commits into
dotnet:mainfrom
mdh1418:inproc_crash_reporter_skip_il_offset_for_framed_frames
Open

[Diagnostics] Avoid resolving IL offsets for framed crash frames#131481
mdh1418 wants to merge 2 commits into
dotnet:mainfrom
mdh1418:inproc_crash_reporter_skip_il_offset_for_framed_frames

Conversation

@mdh1418

@mdh1418 mdh1418 commented Jul 28, 2026

Copy link
Copy Markdown
Member

FIxes 131517

#131273 avoided calling CrawlFrame::GetRelOffset() for framed crash-report stack frames. However, the reporter still attempted to resolve an IL offset for those frames.

A native SIGSEGV during a managed P/Invoke transition produced a framed CrawlFrame where:

• the MethodDesc represented the managed P/Invoke method;
• the instruction pointer was inside the native function that faulted.

Passing that pair to GetILOffsetFromNative triggered this Checked-build assertion:

g_pEEInterface->GetNativeCodeMethodDesc(startAddr) == fd

This change only resolves native and IL offsets for non-faulted, frameless frames whose instruction pointer represents JIT-generated managed code. Framed transition frames still retain their method, module, and token information, but report an IL offset of zero.

Testing

Validated real macOS arm64 in-proc crash reports in both Checked and Release builds, including a native SIGSEGV triggered through P/Invoke.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

Copilot-Session: 4e8cbca3-06b0-4e48-9159-71608830cb0d
@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.

@dotnet-policy-service

Copy link
Copy Markdown
Contributor

Tagging subscribers to this area: @agocke
See info in area-owners.md if you want to be subscribed.

Copilot AI 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 tightens in-proc crash reporter stack-walk frame processing so native and IL offset resolution is only attempted when the CrawlFrame represents non-faulted, frameless managed code, avoiding offset-resolution asserts for framed transition/crash frames.

Changes:

  • Introduces a single gate (hasManagedNativeCode) to decide whether GetRelOffset() is safe/meaningful for the current frame.
  • Uses the same gate to skip GetILOffsetFromNative(...) for frames that don’t represent JIT-managed code at the current IP.

Comment thread src/coreclr/vm/crashreportstackwalker.cpp Outdated
Copilot AI review requested due to automatic review settings July 28, 2026 17:33

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

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

@@ -260,7 +260,8 @@ FrameCallbackAdapter(

Module* pModule = pMD->GetModule();

uint32_t nativeOffset = (pCF->HasFaulted() || !pCF->IsFrameless()) ? 0 : pCF->GetRelOffset();
bool canResolveOffsets = !pCF->HasFaulted() && pCF->IsFrameless();

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.

Why are we skipping the offset resolution for HasFaulted?

I would expect that we can resolve the offset for any frameless method (ie method that has valid EECodeInfo).

Sign up for free to 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.

3 participants