- If frames show raw addresses, not symbols, say so and stop — ask for a symbolicated export or the
atoscommand. Do not guess at unsymbolicated frames. - Walk the crashing thread top-down; stop at the first frame in the user's own module (skip libswiftCore, UIKitCore, libobjc, libdispatch, Foundation, SwiftUI internals — note as skipped).
- Classify first:
SIGABRT+ "Unexpectedly found nil" -> force unwrap; + "Index out of range" -> bounds;EXC_BAD_ACCESS-> use-after-free/unsafe pointer/data race;EXC_BREAKPOINT/SIGTRAP-> runtime trap; NSException -> bad cast/KVC key; watchdog (0x8badf00d) -> main thread blocked at launch/transition, not a traditional crash. - Read only the crashing function (
rg -n "func <name>") plus its caller if the crashing value is passed in — not the file, not the module. - Check: force unwrap on a legitimately-nilable value, off-main-thread mutation, a closure capturing
selfstrongly across an async gap, Core Data used across contexts, uncheckedTaskcancellation. - Output: 2-4 sentence hypothesis,
file:line, and a fix or the concrete thing to verify. Reference frame numbers, never paste the full trace.
Crash Triage
Diagnose an Xcode/iOS crash log or stack trace to a root-cause hypothesis and file:line without a full-project read.
Crash Triage by Tristan-Hauber · 6b17d55
npx skillmds@latest add tristan-hauber/crash-triage File contents
---name: crash-triagedescription: Diagnose an Xcode/iOS crash log or stack trace to a root-cause hypothesis and file:line without a full-project read.---1. If frames show raw addresses, not symbols, say so and stop — ask for a symbolicated export or the `atos` command. Do not guess at unsymbolicated frames.2. Walk the crashing thread top-down; stop at the first frame in the user's own module (skip libswiftCore, UIKitCore, libobjc, libdispatch, Foundation, SwiftUI internals — note as skipped).3. Classify first: `SIGABRT` + "Unexpectedly found nil" -> force unwrap; + "Index out of range" -> bounds; `EXC_BAD_ACCESS` -> use-after-free/unsafe pointer/data race; `EXC_BREAKPOINT`/`SIGTRAP` -> runtime trap; NSException -> bad cast/KVC key; watchdog (0x8badf00d) -> main thread blocked at launch/transition, not a traditional crash.4. Read only the crashing function (`rg -n "func <name>"`) plus its caller if the crashing value is passed in — not the file, not the module.5. Check: force unwrap on a legitimately-nilable value, off-main-thread mutation, a closure capturing `self` strongly across an async gap, Core Data used across contexts, unchecked `Task` cancellation.6. Output: 2-4 sentence hypothesis, `file:line`, and a fix or the concrete thing to verify. Reference frame numbers, never paste the full trace.
Tristan-Hauber/agent-skills/tree/main/skills/crash-triage commit 6b17d55833
Frequently asked questions
Run npx skillmds@latest add tristan-hauber/crash-triage in your terminal (requires Node.js), paste this page's agent-chat prompt into Claude, Cursor, or any MCP-connected agent, or download the SKILL.md file and copy it into your agent's skills directory.
Diagnose an Xcode/iOS crash log or stack trace to a root-cause hypothesis and file:line without a full-project read. It is listed under Coding & Dev Tools on SkillMD.
This skill has not completed SkillMD's automated safety review yet. Capability flags: docs only. SkillMD never runs a skill's scripts for you; review the SKILL.md before installing.
This skill is tagged as working with Claude Code, Claude.ai, OpenAI Codex. SKILL.md is an open format, so most agents that read a skills directory can load it too.
Yes. Installing skills from SkillMD is free, and the skill stays under its author's original license.
Tristan-Hauber (@tristan-hauber) published this skill. Their other Agent Skills are listed on their SkillMD profile.