Skip to content

Publish dSYMs alongside the XCFramework releases #158

Description

@dev-sharifi

Thanks for maintaining these builds — the SPM distribution has saved us a lot of work.

One gap that costs us on production crash triage: the released XCFramework contains no debug
symbols, so WebRTC frames in real crash reports cannot be symbolicated.

What we observe

Using WebRTC 125.0.0 via SPM in SweChat, a production iOS messaging app
with voice and video calling:

  1. No .dSYM (or .bcsymbolmap) is present in WebRTC-M*.xcframework.zip, nor anywhere in the
    SPM artifact directory that Xcode unpacks it to.

  2. The shipped ios-arm64 binary is stripped. It exposes 194 symbols, and they are all Objective-C
    class symbols (_OBJC_CLASS_$_RTCAudioSession, _OBJC_CLASS_$_RTCCVPixelBuffer, …) — no C++
    function symbols, which is where crashes in the media/ICE internals actually land.

  3. Consequently atos against the shipped binary returns raw addresses only:

    atos -o WebRTC.framework/WebRTC -arch arm64 -l 0x100000000 0x1000e1164
    → 0x000e1164 (in WebRTC) + 596
    

Since bitcode was removed in M103, Apple no longer recompiles uploaded binaries, so App Store
Connect has no dSYM to hand back either. That makes the build-time dSYM the only copy that can ever
exist — and it is currently discarded.

Where it comes from

scripts/build.sh, in COMMON_GN_ARGS:

enable_dsyms=false
enable_stripping=true

symbol_level is not set, so it takes the default for the is_debug=false configuration.

The request

Set enable_dsyms=true, and publish the resulting .dSYM bundles as a separate release asset
(e.g. WebRTC-M151.dSYMs.zip) rather than inside the framework zip.

A couple of notes that may make this cheaper than it sounds:

  • enable_stripping=true can stay exactly as it is. A stripped binary plus a separate dSYM is
    the standard Apple release configuration — it is how Chrome itself ships — so the artifact that
    everyone links against would be byte-for-byte unchanged in size and content.
  • Shipping the symbols as a separate asset means only the people who need them pay the download
    cost, and the Package.swift checksum for the framework zip is unaffected.

Once published, symbolication works with no further tooling: Spotlight indexes dSYMs by UUID
(com_apple_xcode_dsym_uuids), so Xcode, atos and symbolicatecrash locate them automatically.

Happy to test a pre-release build against real crash reports if that would help.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions