Skip to content

[net11.0] Strip CoreCLR/R2R frameworks in Debug on devices#25360

Open
kotlarmilos wants to merge 1 commit intonet11.0from
dev/strip-coreclr-r2r-debug
Open

[net11.0] Strip CoreCLR/R2R frameworks in Debug on devices#25360
kotlarmilos wants to merge 1 commit intonet11.0from
dev/strip-coreclr-r2r-debug

Conversation

@kotlarmilos
Copy link
Copy Markdown
Member

@kotlarmilos kotlarmilos commented May 7, 2026

Description

PR #24678 enabled stripping of R2R composite framework, which took effect for Release device builds. In Debug device builds the strip was bypassed because the Debug-default in Xamarin.Shared.props set the global $(NoSymbolStrip)=true, which then propagated onto every `_PostProcessingItem.

This PR removes the Debug-default rule entirely. iOS/tvOS device builds now always strip native binaries and a dSYM bundle is generated for symbolication, regardless of configuration. Simulator builds remain unstripped.

Size saving in Debug on a device is ~50% of the overall app bundle.

Behavior

Configuration Target Stripped? dSYM?
Debug Device yes yes
Release Device yes yes
Debug Simulator no no
Release Simulator no no

@kotlarmilos kotlarmilos force-pushed the dev/strip-coreclr-r2r-debug branch 3 times, most recently from 5a65c1c to b74dd00 Compare May 7, 2026 11:30
Follow-up to #24678. PR #24678 added the CoreCLR runtime frameworks
and the R2R composite framework to @(_PostProcessingItem) so they
would be stripped, which took effect for Release device builds. In
Debug device builds the strip was bypassed because the Debug-default
in Xamarin.Shared.props set the global $(NoSymbolStrip)=true, which
then propagated onto every _PostProcessingItem with empty
%(NoSymbolStrip) metadata, causing _NativeStripItems to filter all
items out.

Remove the Debug-default rule entirely. iOS/tvOS device builds now
always strip native binaries and a dSYM bundle is generated for
post-mortem symbolication, regardless of Configuration. Simulator
builds remain unstripped so the live debugger keeps symbols on disk.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@kotlarmilos kotlarmilos force-pushed the dev/strip-coreclr-r2r-debug branch from b74dd00 to 281f423 Compare May 7, 2026 11:33
@kotlarmilos kotlarmilos added this to the .NET 11 milestone May 7, 2026
@kotlarmilos kotlarmilos self-assigned this May 7, 2026
@vs-mobiletools-engineering-service2

This comment has been minimized.

@kotlarmilos kotlarmilos marked this pull request as ready for review May 7, 2026 11:39
@kotlarmilos kotlarmilos requested a review from mauroa as a code owner May 7, 2026 11:39
Copilot AI review requested due to automatic review settings May 7, 2026 11:39
@kotlarmilos kotlarmilos requested a review from rolfbjarne as a code owner May 7, 2026 11:39
@vs-mobiletools-engineering-service2

This comment has been minimized.

Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

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

Pull request overview

Removes the MSBuild default that disabled native symbol stripping in Debug configurations, so iOS/tvOS device builds strip CoreCLR/R2R frameworks (and other native binaries collected for post-processing) consistently across Debug/Release while keeping simulator builds unstripped.

Changes:

  • Remove the Debug-configuration default that set $(NoSymbolStrip)=true.
Show a summary per file
File Description
msbuild/Xamarin.Shared/Xamarin.Shared.props Drops the Debug default for NoSymbolStrip, allowing post-processing strip/dSYM behavior to apply in Debug device builds.

Copilot's findings

Comments suppressed due to low confidence (1)

msbuild/Xamarin.Shared/Xamarin.Shared.props:146

  • PR title says stripping affects “simulator builds”, but this file still explicitly disables stripping for simulator builds via the ComputedPlatform != iPhone condition. If simulator builds are intended to remain unstripped (as described), consider updating the PR title to avoid confusion; otherwise adjust the simulator default here.
		<!-- Disable stripping for simulator builds by default -->
		<NoSymbolStrip Condition="'$(NoSymbolStrip)' == '' And ('$(_PlatformName)' == 'iOS' Or '$(_PlatformName)' == 'tvOS' Or '$(_PlatformName)' == 'watchOS') And '$(ComputedPlatform)' != 'iPhone'">true</NoSymbolStrip>
		<NoSymbolStrip Condition="'$(NoSymbolStrip)' == ''">false</NoSymbolStrip>
  • Files reviewed: 1/1 changed files
  • Comments generated: 0

@vs-mobiletools-engineering-service2

This comment has been minimized.

@vs-mobiletools-engineering-service2

This comment has been minimized.

@vs-mobiletools-engineering-service2

This comment has been minimized.

@vs-mobiletools-engineering-service2

This comment has been minimized.

@vs-mobiletools-engineering-service2

This comment has been minimized.

@vs-mobiletools-engineering-service2

This comment has been minimized.

@vs-mobiletools-engineering-service2

This comment has been minimized.

@vs-mobiletools-engineering-service2

This comment has been minimized.

@vs-mobiletools-engineering-service2

This comment has been minimized.

@vs-mobiletools-engineering-service2

This comment has been minimized.

@vs-mobiletools-engineering-service2

This comment has been minimized.

@vs-mobiletools-engineering-service2

This comment has been minimized.

@vs-mobiletools-engineering-service2

This comment has been minimized.

@kotlarmilos kotlarmilos changed the title [net11.0] Strip CoreCLR/R2R frameworks in Debug and simulator builds [net11.0] Strip CoreCLR/R2R frameworks in Debug on devices May 7, 2026
@vs-mobiletools-engineering-service2

This comment has been minimized.

@vs-mobiletools-engineering-service2
Copy link
Copy Markdown
Collaborator

✅ [PR Build #281f423] Build passed (Detect API changes) ✅

Pipeline on Agent
Hash: 281f423756efcaceeb4ed59610f19b98a5973236 [PR build]

@vs-mobiletools-engineering-service2

This comment has been minimized.

@vs-mobiletools-engineering-service2

This comment has been minimized.

@vs-mobiletools-engineering-service2

This comment has been minimized.

@vs-mobiletools-engineering-service2

This comment has been minimized.

@vs-mobiletools-engineering-service2

This comment has been minimized.

@vs-mobiletools-engineering-service2
Copy link
Copy Markdown
Collaborator

✅ [PR Build #281f423] Build passed (Build packages) ✅

Pipeline on Agent
Hash: 281f423756efcaceeb4ed59610f19b98a5973236 [PR build]

@vs-mobiletools-engineering-service2

This comment has been minimized.

@vs-mobiletools-engineering-service2

This comment has been minimized.

@rolfbjarne
Copy link
Copy Markdown
Member

@kotlarmilos is there a build speed difference between stripping and not stripping?

Also there's a reason stripping is off by default: #20235 - but we could always enable it for CoreCLR and see if we get fewer struggling customers or not.

@vs-mobiletools-engineering-service2

This comment has been minimized.

@vs-mobiletools-engineering-service2

This comment has been minimized.

@vs-mobiletools-engineering-service2
Copy link
Copy Markdown
Collaborator

✅ API diff for current PR / commit

NET (empty diffs)

✅ API diff vs stable

NET (empty diffs)

ℹ️ Generator diff

Generator Diff: vsdrops (html) vsdrops (raw diff) gist (raw diff) - Please review changes)

Pipeline on Agent
Hash: 281f423756efcaceeb4ed59610f19b98a5973236 [PR build]

@vs-mobiletools-engineering-service2

This comment has been minimized.

@vs-mobiletools-engineering-service2
Copy link
Copy Markdown
Collaborator

✅ [PR Build #281f423] Build passed (Build macOS tests) ✅

Pipeline on Agent
Hash: 281f423756efcaceeb4ed59610f19b98a5973236 [PR build]

@kotlarmilos
Copy link
Copy Markdown
Member Author

@kotlarmilos is there a build speed difference between stripping and not stripping?

Also there's a reason stripping is off by default: #20235 - but we could always enable it for CoreCLR and see if we get fewer struggling customers or not.

Native strip binaries target is around 500ms, but the signing is 100ms faster due to smaller libaries. There is a significant size saving, about 50% of the overall app bundle. Regarding symbols, I understand it was a problem before. Could we just point to https://github.com/dotnet/skills/tree/main/tests/dotnet-diag/apple-crash-symbolication?

@vs-mobiletools-engineering-service2

This comment has been minimized.

@vs-mobiletools-engineering-service2

This comment has been minimized.

@vs-mobiletools-engineering-service2

This comment has been minimized.

@vs-mobiletools-engineering-service2

This comment has been minimized.

@vs-mobiletools-engineering-service2

This comment has been minimized.

@vs-mobiletools-engineering-service2
Copy link
Copy Markdown
Collaborator

🔥 [CI Build #281f423] Test results 🔥

Test results

❌ Tests failed on VSTS: test results

1 tests crashed, 7 tests failed, 171 tests passed.

Failures

❌ dotnettests tests (macOS)

1 tests failed, 0 tests passed.

Failed tests

  • DotNet tests: Failed (Execution failed with exit code 1)
    • Xamarin.Tests.DotNetProjectTest.BuildAndExecuteAppWithNativeDyna...: 'dotnet build' failed with exit code 1
      Full command: /Users/builder/azdo/_work/1/s/macios/builds/downloads/dotnet-sdk-11.0.100-p...

Html Report (VSDrops) Download

❌ introspection tests

6 tests failed, 3 tests passed.

Failed tests

  • introspection/iOS - simulator/Debug: LaunchTimedOut
  • introspection/iOS - simulator/CoreCLR: LaunchTimedOut
  • introspection/iOS - simulator/Debug (ARM64): LaunchTimedOut
  • introspection/tvOS - simulator/Debug: LaunchTimedOut
  • introspection/tvOS - simulator/CoreCLR: LaunchTimedOut
  • introspection/tvOS - simulator/Debug (ARM64): LaunchTimedOut

Html Report (VSDrops) Download

❌ windows tests

🔥 Failed catastrophically on VSTS: test results - windows (no summary found).

Html Report (VSDrops) Download

Successes

✅ cecil: All 1 tests passed. Html Report (VSDrops) Download
✅ dotnettests (iOS): All 1 tests passed. Html Report (VSDrops) Download
✅ dotnettests (MacCatalyst): All 1 tests passed. Html Report (VSDrops) Download
✅ dotnettests (Multiple platforms): All 1 tests passed. Html Report (VSDrops) Download
✅ dotnettests (tvOS): All 1 tests passed. Html Report (VSDrops) Download
✅ framework: All 2 tests passed. Html Report (VSDrops) Download
✅ fsharp: All 4 tests passed. Html Report (VSDrops) Download
✅ generator: All 5 tests passed. Html Report (VSDrops) Download
✅ interdependent-binding-projects: All 4 tests passed. Html Report (VSDrops) Download
✅ linker: All 44 tests passed. Html Report (VSDrops) Download
✅ monotouch (iOS): All 19 tests passed. Html Report (VSDrops) Download
✅ monotouch (MacCatalyst): All 25 tests passed. Html Report (VSDrops) Download
✅ monotouch (macOS): All 18 tests passed. Html Report (VSDrops) Download
✅ monotouch (tvOS): All 19 tests passed. Html Report (VSDrops) Download
✅ msbuild: All 2 tests passed. Html Report (VSDrops) Download
✅ sharpie: All 1 tests passed. Html Report (VSDrops) Download
✅ xcframework: All 4 tests passed. Html Report (VSDrops) Download
✅ xtro: All 1 tests passed. Html Report (VSDrops) Download

macOS tests

✅ Tests on macOS Sonoma (14): All 5 tests passed. Html Report (VSDrops) Download
✅ Tests on macOS Sequoia (15): All 5 tests passed. Html Report (VSDrops) Download
✅ Tests on macOS Tahoe (26): All 5 tests passed. Html Report (VSDrops) Download

Linux Build Verification

Linux build succeeded

Pipeline on Agent
Hash: 281f423756efcaceeb4ed59610f19b98a5973236 [PR build]

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants