iOS dSYMs

Upload your dSYMs and native sentry-cocoa crashes resolve to function, file and line. Swift names come back demangled.

1. Make a token

Settings → API tokens → new token with the write scope. A project-scoped token can only upload to its own project. Read-only tokens get 403.

2. Add a build phase

In Xcode, add a Run Script build phase to your app target. Run it for Release only. Put the token in OPENFAULT_TOKEN.

cd "$DWARF_DSYM_FOLDER_PATH" && for d in *.dSYM; do
  zip -qr "/tmp/$d.zip" "$d"
  curl -fsS -H "Authorization: Bearer $OPENFAULT_TOKEN" -F "file=@/tmp/$d.zip" \
    "https://errors.example.com/api/0/projects/<org>/<project-slug>/files/dsyms/"
done

One dSYM per request keeps each upload under the 20 MiB request cap.

With sentry-cli

sentry-cli debug-files upload works too. It uploads in chunks, so there is no size cap per dSYM. Use the write token from step 1.

export SENTRY_URL=https://errors.example.com
export SENTRY_ORG=openfault        # any value; one install is one org
export SENTRY_PROJECT=ios          # your project's slug
export SENTRY_AUTH_TOKEN=of_...    # the write token
sentry-cli debug-files upload "$DWARF_DSYM_FOLDER_PATH"

Leave off --include-sources; sources are not stored.

Uploaded dSYMs are listed under the project’s Settings, where you can delete them.

The endpoint

POST /api/0/projects/<org>/<project-slug>/files/dsyms/
Authorization: Bearer of_...
Content-Type: multipart/form-data
FieldValue
fileA zip of one or more .dSYM bundles, or a single Mach-O file.

<org> can be any value; one install is one org. <project-slug> is your project’s slug. Uploading the same debug ID again replaces it.

The response lists each debug file it stored, with its debug ID, architecture and object name. A missing file field or an unreadable upload gets 400. An unknown project gets 404.

How resolution works

On ingest, each frame with platform cocoa is matched by address to a Mach-O image in the event’s debug_meta, then by that image’s debug ID to an uploaded dSYM. Matched frames get:

Inlined frames are expanded: the Symbolicated view shows the innermost function on top, and the Raw view shows the frames as the client sent them.

The original frame is kept in raw. Symbolication is best effort: a missing dSYM or a bad frame leaves that frame as it was, and never fails ingest.

Limits

Keyboard shortcuts

c
Copy the install command
t
Toggle theme
g d
Open the docs
?
Show this list