Skip to content
Mobile
Skill

/symbolication-setup

Configure crash symbolication for readable stack traces. Use when setting up dSYMs (iOS), ProGuard/R8 mappings (Android), or source maps (React Native).

BOOST
From plugin
mobile-observability
1168 skills2 agents2 commands
Install
$ npx -y skills add nexus-labs-automation/mobile-observability --skill symbolication-setup --agent claude-code

How it fires

How this skill gets triggered: by you, by Claude, or both.

  • Fires itselfAuto-invocation. Claude auto-loads it when your prompt matches the work.Auto-invocation is when the right skill fires by itself at the right moment, driven by a FLOW.md router and a hook, instead of you invoking it by name. It is the difference between a skill being installed and a skill actually getting used.Read the full definition →
  • You can call itInvoke it directly when you want it.
  • Slash command/symbolication-setup

Context preview

The summary Claude sees to decide when to auto-load this skill.

Configure crash symbolication for readable stack traces. Use when setting up dSYMs (iOS), ProGuard/R8 mappings (Android), or source maps (React Native).

SKILL.md

symbolication-setup.SKILL.md
name: symbolication-setup
description: Configure crash symbolication for readable stack traces. Use when setting up dSYMs (iOS), ProGuard/R8 mappings (Android), or source maps (React Native).
triggers:
  - "configure dSYMs"
  - "crash symbols"
  - "ProGuard mappings"
  - "readable stack traces"
  - "set up symbolication"
  - "source maps upload"
priority: 1

Symbolication Setup

Make crash stack traces readable instead of memory addresses or minified code.

Why It Matters

Without symbolication:

0x104a3b2c8 <redacted> + 123

With symbolication:

PaymentViewController.processPayment() line 47

**Unsymbolicated crashes are useless for debugging.**

Platform Setup

iOS (dSYMs)

**Xcode Build Phase Script:**

# Add to Build Phases → New Run Script Phase
if [ "${CONFIGURATION}" = "Release" ]; then
    # Sentry
    sentry-cli upload-dif --include-sources "${DWARF_DSYM_FOLDER_PATH}"

    # Or Crashlytics
    "${PODS_ROOT}/FirebaseCrashlytics/upload-symbols" \
        -gsp "${PROJECT_DIR}/GoogleService-Info.plist" \
        -p ios "${DWARF_DSYM_FOLDER_PATH}"
fi

**Find missing dSYMs:**

# Recent archives
find ~/Library/Developer/Xcode/Archives -name "*.dSYM" -mtime -7

# Verify UUID matches
dwarfdump --uuid MyApp.app.dSYM

Android (ProGuard/R8)

**build.gradle.kts:**

android {
    buildTypes {
        release {
            isMinifyEnabled = true
            proguardFiles(
                getDefaultProguardFile("proguard-android-optimize.txt"),
                "proguard-rules.pro"
            )
        }
    }
}

// Sentry auto-upload
sentry {
    autoUploadProguardMapping.set(true)
    uploadNativeSymbols.set(true)
}

// Or manual upload in CI
// sentry-cli upload-proguard --android-manifest app/build/.../AndroidManifest.xml mapping.txt

**Keep rules for crash reporting:**

# proguard-rules.pro
-keepattributes SourceFile,LineNumberTable
-renamesourcefileattribute SourceFile

# Keep Sentry classes
-keep class io.sentry.** { *; }

React Native (Source Maps)

**Expo (app.json):**

{
  "expo": {
    "plugins": [
      ["@sentry/react-native/expo", {
        "organization": "your-org",
        "project": "your-project"
      }]
    ],
    "hooks": {
      "postPublish": [{
        "file": "sentry-expo/upload-sourcemaps"
      }]
    }
  }
}

**Bare React Native (CI):**

# After build
sentry-cli releases files $VERSION upload-sourcemaps \
    --dist $BUILD_NUMBER \
    ./build/sourcemaps

**Hermes bytecode:**

# Hermes requires source maps - verify with:
sentry-cli sourcemaps explain <event-id>

Verification Checklist

  • [ ] Release builds upload symbols automatically
  • [ ] CI pipeline includes symbol upload step
  • [ ] Test crash shows readable stack trace
  • [ ] Source maps include original source (not just line numbers)
  • [ ] Build numbers match between app and uploaded symbols

Common Issues

| Symptom | Cause | Fix | |---------|-------|-----| | `<redacted>` in stack | Missing dSYM | Upload dSYM for that build | | Line numbers wrong | Source map mismatch | Verify release/dist strings match | | Only framework symbols | App dSYM missing | Check archive includes app dSYM | | `<unknown>` in RN | Hermes without source maps | Configure Hermes source map generation |

Vendor Commands

| Vendor | Verify Upload | |--------|---------------| | Sentry | `sentry-cli debug-files check <UUID>` | | Crashlytics | Firebase Console → Crashlytics → Missing dSYMs | | Bugsnag | `bugsnag-cli upload` with `--dry-run` | | Datadog | Dashboard → Error Tracking → Symbol Files | | bitdrift | Dashboard or CLI for dSYM, Gradle plugin for ProGuard | | New Relic | iOS dSYM via build script or `newrelic-cli`; Android ProGuard auto-uploaded by NR Gradle plugin |

Related Skills

  • See `skills/crash-instrumentation` for breadcrumb strategies and crash context
  • Symbolication is Tier 1 in `skills/instrumentation-planning`
Read more
Ships withmobile-observability

Teaches Claude how to instrument mobile apps correctly — what to measure, what context to attach, and what mistakes to avoid.

Get the whole plugin

Other skills on mobile-observability.