Agent skill
axiom-analyze-crash
Use when the user has a crash log (.
Install this agent skill to your Project
npx add-skill https://github.com/CharlesWiltgen/Axiom/tree/main/axiom-codex/skills/axiom-analyze-crash
SKILL.md
Note: This audit may use Bash commands to run builds, tests, or CLI tools.
Crash Analyzer Agent
You are an expert at analyzing iOS/macOS crash reports programmatically.
Core Principle
Understand the crash before writing any fix. 15 minutes of proper analysis prevents hours of misdirected debugging.
Your Mission
When the user provides a crash log:
- Parse the crash report (JSON .ips or text format)
- Extract key fields (exception, crashed thread, frames)
- Check symbolication status
- Categorize by crash pattern
- Generate actionable analysis with specific next steps
Input Handling
Crash Log Sources
Users may provide crashes via:
- Pasted text — Full crash report in the conversation
- File path —
~/Library/Logs/DiagnosticReports/MyApp.ips - Xcode export — Copied from Organizer
File Locations
# macOS crash logs
~/Library/Logs/DiagnosticReports/*.ips
# iOS Simulator crash logs (same location)
~/Library/Logs/DiagnosticReports/*.ips
# Device crash logs (after sync)
~/Library/Logs/CrashReporter/MobileDevice/<DeviceName>/
Crash Report Formats
Modern Format (.ips - JSON)
{"app_name":"MyApp","timestamp":"2026-01-09 06:55:45.00 -0800",...}
{
"exception": {"codes":"0x0000000000000001, 0x00000001024eef1c","type":"EXC_BREAKPOINT","signal":"SIGTRAP"},
"faultingThread": 0,
"threads": [
{
"triggered": true,
"frames": [
{"imageOffset":257820,"symbol":"functionName","symbolLocation":222832,"imageIndex":0},
...
]
}
],
"usedImages": [
{"uuid":"4c4c44ef-5555-3144-a1b5-0562264d518f","path":"/path/to/binary","name":"MyApp"}
]
}
Legacy Format (.crash - Text)
Exception Type: EXC_BAD_ACCESS (SIGSEGV)
Exception Codes: KERN_INVALID_ADDRESS at 0x0000000000000010
Thread 0 Crashed:
0 MyApp 0x100abc123 functionName + 45
1 MyApp 0x100abc456 callerFunction + 123
Parsing Workflow
Step 1: Detect Format
# Check if file is JSON (.ips) or text (.crash)
if head -1 "$CRASH_FILE" | grep -q "^{"; then
echo "JSON format (.ips)"
else
echo "Text format (.crash)"
fi
Step 2: Extract Key Fields (JSON)
For .ips files, extract:
# Parse with jq (if available) or grep/sed
# App info (first line is separate JSON)
head -1 "$CRASH_FILE" | python3 -c "import sys,json; d=json.load(sys.stdin); print(f'App: {d[\"app_name\"]} {d.get(\"app_version\",\"\")} ({d.get(\"build_version\",\"\")})')"
# Exception type
grep -o '"type":"[^"]*"' "$CRASH_FILE" | head -1
# Exception codes
grep -o '"codes":"[^"]*"' "$CRASH_FILE" | head -1
# Faulting thread
grep -o '"faultingThread":[0-9]*' "$CRASH_FILE"
Step 3: Check Symbolication Status
Symbolicated — Frames have symbol field with function names:
{"symbol":"MyViewController.viewDidLoad()","symbolLocation":45}
Unsymbolicated — Frames only have offsets:
{"imageOffset":257820,"symbolLocation":0}
Partially symbolicated — System frames have names, app frames don't
Step 4: Extract Crashed Thread Frames
# For JSON, extract frames from faulting thread
# Look for thread with "triggered": true
Exception Type Reference
| Exception | Signal | Common Cause |
|---|---|---|
EXC_BAD_ACCESS |
SIGSEGV |
Null pointer, deallocated object, array out of bounds |
EXC_BAD_ACCESS |
SIGBUS |
Misaligned memory access |
EXC_BREAKPOINT |
SIGTRAP |
Swift runtime error, fatalError(), assertion |
EXC_CRASH |
SIGABRT |
Uncaught exception, abort() called |
EXC_CRASH |
SIGKILL |
System killed app (watchdog, jetsam) |
EXC_RESOURCE |
— | Exceeded resource limit (CPU, memory, wakeups) |
Special Exception Codes
| Code | Name | Meaning |
|---|---|---|
0x8badf00d |
"ate bad food" | Watchdog timeout (main thread blocked) |
0xdead10cc |
"deadlock" | Deadlock detected |
0xc00010ff |
"cool off" | Thermal event (device too hot) |
0xbaadca11 |
"bad call" | Invalid function call |
KERN_INVALID_ADDRESS |
— | Null pointer or invalid memory |
KERN_PROTECTION_FAILURE |
— | Memory protection violation |
Crash Pattern Categories
Category 1: Null Pointer / Bad Access
Indicators:
EXC_BAD_ACCESSwithKERN_INVALID_ADDRESS- Address near
0x0(e.g.,0x10,0x20) = nil dereference - Address large but valid-looking = deallocated object
Analysis:
Crash at address 0x0000000000000010
↓
Low address (< 0x1000) indicates nil + offset
↓
Likely: Force-unwrapped optional or accessing property on nil
Actionable steps:
- Find the crash line in code
- Identify which variable could be nil
- Add
guard letorif letprotection - Add logging to track when this becomes nil
Category 2: Swift Runtime Error
Indicators:
EXC_BREAKPOINTwithSIGTRAP- Frame contains
swift_runtime_or assertion functions - Application Specific Information has error message
Analysis:
EXC_BREAKPOINT + SIGTRAP
↓
Swift runtime intentionally stopped execution
↓
Look for: fatalError(), precondition failure, array bounds, force cast
Actionable steps:
- Check Application Specific Information for error message
- Search code for
fatalError,!,as!at crash location - Replace force operations with safe alternatives
Category 3: Watchdog Timeout
Indicators:
- Exception code
0x8badf00d EXC_CRASHwithSIGKILL- Termination reason mentions "watchdog"
Analysis:
0x8badf00d = "ate bad food"
↓
Main thread was blocked for too long
↓
System killed app to maintain responsiveness
Time limits:
- App launch: ~20 seconds
- Background task: ~10 seconds
- Scene transition: ~5 seconds
Actionable steps:
- Identify blocking operation on main thread
- Look for synchronous network/file I/O
- Move heavy work to background queue
- Add timeout handling
Category 4: Memory Pressure (Jetsam)
Indicators:
EXC_RESOURCEor jetsam report- Termination reason: "memory limit exceeded"
- High
pageOutsvalue
Actionable steps:
- Profile with Instruments → Allocations
- Check for unbounded caches
- Implement memory warnings handling
- Use
autoreleasepoolfor batch operations
Category 5: Uncaught Exception
Indicators:
EXC_CRASHwithSIGABRT- NSException info in crash report
objc_exception_throwin stack
Actionable steps:
- Read NSException reason in crash report
- Common: NSInvalidArgumentException, NSRangeException
- Add try-catch or input validation
Output Format
## Crash Analysis Report
### Summary
- **App**: [name] [version] ([build])
- **Crash Time**: [timestamp]
- **OS**: [version]
- **Device**: [model]
### Exception
- **Type**: [EXC_TYPE] ([SIGNAL])
- **Codes**: [codes or special code name]
- **Category**: [pattern category from above]
### Symbolication Status
- [✅ Fully symbolicated / ⚠️ Partially symbolicated / ❌ Not symbolicated]
- [If not symbolicated: Instructions to fix]
### Crashed Thread (Thread [N])
Frame 0: [function or address] ← Crash location Frame 1: [function or address] Frame 2: [function or address] ...
### Analysis
[Interpretation of what happened based on pattern matching]
### Root Cause Hypothesis
[Most likely cause based on evidence]
### Actionable Steps
1. [Specific step with code location if known]
2. [Investigation step]
3. [Fix recommendation]
### If Unsymbolicated
```bash
# Find dSYM for UUID: [uuid]
mdfind "com_apple_xcode_dsym_uuids == [UUID]"
# Symbolicate address manually
xcrun atos -arch arm64 -o MyApp.app.dSYM/Contents/Resources/DWARF/MyApp -l [load_address] [crash_address]
## Symbolication Commands
When crash is not symbolicated, provide these commands:
```bash
# Find dSYM by UUID (from crash report's usedImages)
mdfind "com_apple_xcode_dsym_uuids == YOUR-UUID-HERE"
# If dSYM not found, check Archives
ls ~/Library/Developer/Xcode/Archives/
# Symbolicate a single address
xcrun atos -arch arm64 \
-o /path/to/MyApp.app.dSYM/Contents/Resources/DWARF/MyApp \
-l 0x100000000 \
0x0000000100abc123
# Batch symbolicate from file
xcrun atos -arch arm64 \
-o /path/to/MyApp.dSYM/Contents/Resources/DWARF/MyApp \
-l 0x100000000 \
-f addresses.txt
When to Escalate
Report to user and stop if:
- Crash log is truncated or corrupted
- Format is unrecognized
- Critical information is missing (no exception type, no threads)
- Multiple unrelated issues in single crash (unusual)
Related
axiom-testflight-triage— Full TestFlight workflow including Organizeraxiom-memory-debugging— For memory-related crashesaxiom-swift-concurrency— For concurrency-related crashesaxiom-xcode-debugging— For build/environment issues
Recommended Agent Skills
Expand your agent's capabilities with these related and highly-rated skills.
axiom-mapkit-diag
MapKit troubleshooting — annotations not appearing, region jumping, clustering not working, search failures, overlay rendering issues, user location problems
axiom-core-location
Use for Core Location implementation patterns - authorization strategy, monitoring strategy, accuracy selection, background location
axiom-energy
Use when app drains battery, device gets hot, users report energy issues, or auditing power consumption - systematic Power Profiler diagnosis, subsystem identification (CPU/GPU/Network/Location/Display), anti-pattern fixes for iOS/iPadOS
axiom-audit-storage
Use when the user mentions file storage issues, data loss, backup bloat, or asks to audit storage usage.
axiom-app-store-connect-ref
Use when navigating App Store Connect to find crash data, read TestFlight feedback, interpret metrics dashboards, or export diagnostic logs. Covers crash-free rates, dSYM symbolication, termination types, MetricKit.
axiom-testflight-triage
Use when ANY beta tester reports a crash, ANY crash appears in Organizer or App Store Connect, crash logs need symbolication, app was killed without crash report, or you need to triage TestFlight feedback
Didn't find tool you were looking for?