Crash Instrumentation
Capture crashes with the context needed to debug them.
Core Principle
A crash report without context is useless. Every crash should include:
| Context | Why | Example |
|---------|-----|---------|
| screen | Where it happened | "CheckoutScreen" |
| job_name | What user was doing | "checkout" |
| job_step | Where in the flow | "payment" |
| breadcrumbs | What led here | Last 20 user actions |
| app_version | Release correlation | "1.2.3" |
| user_segment | Who's affected | "premium", "trial" |
Breadcrumb Strategy
Breadcrumbs are the trail leading to a crash. Capture:
| Category | What to Log | Example |
|----------|-------------|---------|
| navigation | Screen transitions | "HomeScreen → CartScreen" |
| user | Taps, inputs, gestures | "Tapped checkout button" |
| network | API calls (not payloads) | "POST /api/orders started" |
| state | Key state changes | "Cart updated: 3 items" |
| error | Non-fatal errors | "Retry #2 for payment" |
Limit: Keep last 20-50 breadcrumbs. More is noise.
Error Boundaries
Catch errors before they crash the app:
// iOS - capture context before crash
func captureError(_ error: Error, screen: String, job: String?) {
Observability.captureError(error, context: [
"screen": screen,
"job_name": job ?? "unknown",
"session_duration": sessionDuration(),
"memory_pressure": memoryPressure()
])
}
// Android - uncaught exception handler
Thread.setDefaultUncaughtExceptionHandler { thread, throwable ->
Observability.captureError(throwable, mapOf(
"thread" to thread.name,
"screen" to currentScreen,
"job_name" to currentJob
))
previousHandler?.uncaughtException(thread, throwable)
}
What NOT to Attach
| Don't | Why | |-------|-----| | Full stack traces in breadcrumbs | Redundant, SDK captures this | | User input text | PII risk | | Full request/response bodies | Size limits, PII | | Entire app state | Unbounded, noise |
Crash Types to Handle
| Platform | Type | Instrumentation |
|----------|------|-----------------|
| iOS | EXC_BAD_ACCESS | Breadcrumbs, memory context |
| iOS | SIGKILL (watchdog) | Background task tracking |
| Android | ANR | Main thread breadcrumbs |
| Android | OutOfMemoryError | Memory tracking |
| React Native | JS exceptions | Error boundaries |
Implementation
See references/crash-reporting.md for:
- Platform-specific crash capture setup
- Breadcrumb implementation patterns
- Vendor SDK configuration
See skills/symbolication-setup for readable stack traces.