Publishing & Deployment Issues

Unity Cloud Diagnostics Symbol Upload Failed - dSYM and ProGuard Mapping Pipeline Fix

Fix Unity Cloud Diagnostics symbol upload failures by validating dSYM and ProGuard mapping generation, artifact paths, and CI upload ordering before release.

By GamineAI Team

If Unity Cloud Diagnostics keeps reporting symbol upload failed, the crash backend usually is not broken. The failure is typically a pipeline ordering or artifact-path issue where symbol files are missing, stale, or generated for a different build than the one you shipped.

This guide gives you a deterministic fix flow for iOS dSYM and Android ProGuard or R8 mapping uploads.

Problem summary

Common symptoms:

  • Unity dashboard shows symbol upload failed for recent builds
  • crashes appear only as raw addresses with no readable stack traces
  • iOS dSYM upload succeeds locally but fails in CI
  • Android mapping upload reports missing file or mismatched build ID

Impact:

  • incident triage slows down because stack traces are not symbolicated
  • release risk increases because regression ownership is unclear

Root causes

  1. Symbol artifacts are not produced for the shipped build Build settings changed and dSYM or mapping outputs were not generated in the release lane.

  2. Upload step runs before artifacts are finalized CI starts the upload phase before archive or Gradle outputs are complete.

  3. Wrong file path or stale artifact pickup Pipeline references a previous build folder or an incorrect export path.

  4. Build identity mismatch Uploaded symbol file does not match the app binary version or build number that reached testers.

Fix steps

Step 1 - Confirm symbol generation is enabled in release settings

For iOS:

  1. Ensure archive generation includes dSYM outputs for your target configuration.
  2. Keep release stripping settings stable across local and CI lanes.

For Android:

  1. Confirm ProGuard or R8 mapping generation is enabled for release builds.
  2. Verify minify settings match the lane where crashes occur.

Step 2 - Pin output paths and remove stale symbol folders

In CI:

  1. Define explicit artifact paths for dSYM zip and mapping txt outputs.
  2. Clear old symbol directories before each release build.
  3. Fail fast if expected symbol files do not exist after build.

This prevents old artifacts from being uploaded under new build labels.

Step 3 - Enforce upload order after build completion

Upload sequence should be:

  1. Build app binary
  2. Export symbol artifacts
  3. Validate file existence and size
  4. Upload symbols
  5. Publish release notes with symbol packet reference

Do not run uploads in parallel with archive export unless your pipeline guarantees artifact immutability.

Step 4 - Verify build identity alignment

Before upload, log:

  • app version
  • build number
  • commit SHA
  • symbol artifact filename and checksum

Store this as a release evidence row so symbol packets map to the exact shipped binary.

Step 5 - Re-run one clean symbol smoke

  1. Trigger a clean CI release candidate with cache bypass for symbol outputs.
  2. Upload symbols once from that run only.
  3. Validate a known test crash resolves to readable frames in Cloud Diagnostics.

Verification checklist

  • [ ] dSYM and mapping artifacts are generated in the same lane as shipped binaries.
  • [ ] CI upload step runs only after build and symbol export completion.
  • [ ] Symbol paths are explicit and stale folders are cleared before build.
  • [ ] Version, build number, and symbol packet metadata match release artifacts.
  • [ ] Cloud Diagnostics shows symbolicated stack traces for a fresh test crash.

Alternative fixes

  • If iOS symbols fail only on CI, compare archive export options between local and CI runner images.
  • If Android mapping works in one flavor but not another, check flavor-specific minify and output directory settings.
  • If upload intermittently fails, add retry with backoff only for transport errors, not for missing-file errors.

Prevention tips

  • Keep a symbol-packet validation gate in release CI that blocks promotion on missing artifacts.
  • Attach symbol checksums and build metadata to release notes for traceability.
  • Re-verify symbol upload whenever you change Unity version, Gradle plugin, Xcode image, or CI runner templates.

FAQ

Why do crashes show addresses even though upload says success

Upload success alone does not guarantee identity match. If build number or binary hash differs, symbolication can still fail.

Should we upload symbols from developer machines

Avoid that for release lanes. Use CI-generated symbols from the exact shipped artifact to preserve traceability.

Is mapping txt enough for Android

Only for the obfuscation path it represents. If flavor or build type differs, you need the mapping file generated for that exact variant.

Related links

Bookmark this fix for your release checklist so crash symbolication remains reliable during patch-week triage.