Crashlytics 收件箱周末新增了 40 个 issue。大多是重复,三个真问题,一个在烧。修问题不是成本,成本是周一站会前那 45 分钟读堆栈、对人。AI 干第一遍这件事很在行:读堆栈、定位区域、推荐负责人。
这篇给你一个可直接复制的 Prompt,把任何符号化后的堆栈变成 3 行 triage 卡片;再把”通用对话模型”和”Crashlytics / Sentry 内置 AI”摊开对比,讲清各自适合什么场景。
TL;DR
- 贴顶帧加周围 5 到 8 帧,别贴 1200 行完整 log。崩溃点很少是根因。
- 给模型一份代码区域 map(
路径前缀 -> 负责人)和一份严重级规则。少了它们,AI 会按方法名瞎猜负责人,还会高估严重级。 - 强制固定 3 行卡片:严重级加摘要、区域加负责人加理由、第一步排查(要点名 file / line / method)。
- 一旦每周超过约 50 个 issue,带代码访问权的工具(Sentry Seer Autofix、Crashlytics MCP)就比裸对话框更好用。截至 2026 年 6 月,Seer 自报根因命中率 94.5%。
- 负责人这一步永远要人审。AI 不懂团队政治,也不知道谁在休假。
这个任务
把一份原始 crash log(Crashlytics、Sentry、Firebase)转成 3 行 triage 卡片:严重级、归属区域、建议负责人。一个 issue 一张卡,不废话。目标是走进站会时卡片已经拟好,会议变成”复核”而不是”现场读堆栈”。
什么时候适合让 AI 做
- 你有现成的代码区域 map(“payments 在
/billing”、“auth 在/session”)。 - 团队有按区域划分的明确负责人,不是”全员负责”。
- 你能贴顶帧加往下 5 到 8 帧,而不是完整 log。
- 你愿意复核负责人推荐。AI 不懂团队政治。
如果这几条都没有,先把它们补上。没有区域 map、没有规则的 triage Prompt,只会产出”自信但错”的卡片。
要给 AI 喂什么
- 顶帧加周围 5 到 8 帧(要符号化过,见下方 FAQ)。
- 首次出现的 App 版本,以及当前版本。
- 受影响的会话 / 用户 / 设备数(Crashlytics 或 Sentry 给什么就贴什么)。
- 代码区域 map:路径前缀到负责人。
- 严重级规则:什么算 P0、P1、P2、P3。
- 与最近改动的关联(“4.2.0 重写了 receipt 解析”)。
可直接复制的 Prompt
粘进 Claude Opus 4.7、GPT-5.5 或 Gemini 3.1 Pro 都行。单条堆栈三者都轻松搞定;批量 5 到 10 条时,Opus 4.7、Sonnet 4.6、Gemini 3.1 Pro 的 100 万 token 上下文意味着一次性全粘进去也没问题。
You are triaging an iOS crash for a 4-engineer team.
Stack (top 8 frames):
0 CRASH __exceptionPreprocess
1 objc_exception_throw
2 -[NSDictionary getObjects:andKeys:count:]
3 -[BillingCoordinator _hydratePurchaseRecords:] (BillingCoordinator.swift:218)
4 -[BillingCoordinator restorePurchases] (BillingCoordinator.swift:74)
5 -[SettingsViewController didTapRestore:] (SettingsViewController.swift:312)
6 UIControlEventInvocation
7 UIApplicationMain
First seen: app version 4.2.0 (current is 4.2.1).
Affected: 218 sessions across 41 users in the last 24 hours.
Device skew: 89% iPhone 14/15, 11% older.
iOS skew: 92% iOS 17+, 8% iOS 16.
Code-area map:
- /billing -> owner: Sara
- /session -> owner: Jin
- /ui -> owner: Mei
- /core, /storage -> owner: Ravi
Recent changes:
- 4.2.0 shipped a refactor of BillingCoordinator (Sara): receipt parsing rewrite.
- 4.2.0 also bumped minimum iOS to 16.
Severity rubric:
- P0: crash-on-launch OR more than 1% of sessions OR blocks revenue path.
- P1: revenue path or auth path, less than 1% of sessions.
- P2: non-blocking, less than 0.2% of sessions.
- P3: cosmetic / log-only.
Output: a 3-line triage card.
Line 1: Severity + one-sentence summary of what crashed.
Line 2: Area (which file / subsystem) + suggested owner + WHY them.
Line 3: First debug step they should take, in one sentence. Be specific (file, line, method).
Rules:
- Do not invent line numbers I did not give you.
- If you cannot tell who the owner is from the area map, say "owner unclear" and propose Sara as escalation point.
- If the severity is ambiguous, default UP one level and explain.
示例输出
P1 — BillingCoordinator 在 restorePurchases 时崩溃;receipt 水合阶段在空 / 部分字典上强解或越界计数。 区域:
/billing-> 负责人 Sara。她在 4.2.0 重写了 receipt 解析,崩溃方法_hydratePurchaseRecords:在 BillingCoordinator.swift:218,正是她那次 diff 改动的位置。 第一步:在 BillingCoordinator.swift:218 的getObjects:andKeys:count:调用处加 guard 或 unwrap-with-default;在 sandbox 用空 restore response 复现。
这里定 P1 而非 P0,是因为 218 个会话相对于一个每天几万会话的 App 还在 1% 这条线以下;但它落在付费路径上,规则把它兜底到 P1。
通用对话 vs. 内置 AI:该用哪个
裸对话框上手最快,但 Crashlytics 和 Sentry 现在都内置了能直接读 issue(接 MCP 后还能读你仓库)的 AI。用下表决定:
| 选项 | 代码访问 | 适合 | 成本(截至 2026 年 6 月) |
|---|---|---|---|
| 对话模型 + 本 Prompt(Opus 4.7 / GPT-5.5 / Gemini 3.1 Pro) | 无(你来贴) | 临时 triage、批量、任意上报平台 | 你现有的套餐(Plus / Pro 档约 20 美元/月) |
| Crashlytics AI Insights(Gemini in Firebase) | 无(仅控制台) | 已在 Firebase 里的崩溃 + ANR | 个人免费;随 Gemini Code Assist 捆绑 |
| Crashlytics MCP(Gemini CLI / Claude Code / Cursor) | 有(读 + 改仓库) | 在编辑器里复现并修复 | 你 AI 工具的套餐 |
| Sentry Seer Autofix | 有(读仓库、开 PR) | 高量级团队、自动根因 | 每位活跃贡献者 40 美元/月 |
triage 时几个要点:
- Crashlytics AI Insights 在控制台里生成根因摘要和下一步建议,但截至 2026 年 6 月只覆盖崩溃和 ANR,不含 non-fatal 事件。它看不到也改不了你的代码。
- Crashlytics MCP 把 Crashlytics issue 暴露给 Gemini CLI、Claude Code、Cursor,让模型能拉取优先级排序的 issue、改状态,并直接修掉引发崩溃的代码。
- Sentry Seer 在 issue 进来时就扫描,给出根因猜测,还能开修复 PR,或把改码任务交给 Claude Code、Cursor agent。Sentry 自报 Autofix 根因命中率 94.5%、可用修复落地率 53.6%,其语义化 issue 分组把重复噪声砍掉约 40%。定价已于 2026 年 1 月 21 日改为每位活跃贡献者每月 40 美元(活跃 = 在已接入仓库提交 2 个以上 PR)。
经验法则:量不大就一直待在对话框里,等收件箱开始难受(每周新增约 50 个以上)再打开”和代码住在一起”的那个工具。
怎么继续打磨 Prompt
- AI 编行号:反复强调”只用我给的帧,不许编行号”。
- 严重级全是 P2:强制按规则。“碰到付费路径至少 P1”。
- 永远把最新提交者当负责人:要求”先按区域匹配,最近改动只是次要信号”。
- 输出是大段文字:坚持”3 行,固定结构”。
- AI 提议泛泛修法(“加错误处理”):强制”第一步必须指出 file、method 和要检查什么”。
容易踩的坑
- 没有代码区域 map 直接 triage。AI 按方法名猜负责人,错率高。
- 只贴顶帧。崩溃点很少是根因,AI 需要往下 5 到 8 帧。
- 忽略设备分布。iOS 版本 60/40 的盘子里 crash 89% 在 iPhone 14/15,说明是结构问题不是 OS 问题。
- 自动指给最近提交者。最近改动是信号不是规则。
- 拿未符号化的堆栈去 triage。一串十六进制地址对模型毫无意义,先传 dSYM。
FAQ
- AI 能读混淆或未符号化的堆栈吗? 不能。十六进制地址没有任何含义。先传 dSYM(Apple)或 mapping 文件(Android),让控制台服务端符号化,再贴可读堆栈。Crashlytics 和 Sentry 都是上传符号文件后在服务端完成符号化。
- iOS 卡死和 Android ANR 怎么办? Crashlytics AI Insights 已经覆盖 ANR。Prompt 里把规则换一下:Android 上”用户感知 ANR 率超过 Google Play 的 0.47% 不良行为上限就 P0,否则 P1”。iOS 没有 ANR 这个指标——主线程无响应约 5 到 10 秒后 watchdog 会直接终止进程,所以按会话数当 P0/P1 处理。
- 要不要批量? 要。一次喂 5 到 10 条堆栈,要求一条 issue 一张卡。Opus 4.7、Sonnet 4.6、Gemini 3.1 Pro 的 100 万 token 上下文足以装下整个周一批次,比一条条跑更省 triage 时间。
- 健康的严重级基线是多少,好让我知道 P0 该怎么定? 截至 2026 年,行业崩溃无故障会话率 iOS 约 99.93%、Android 约 99.81%。如果单个 issue 把你的会话率拉到约 99% 以下,那不管它在哪个区域,都是你的 P0。
- Sentry breadcrumb 怎么用? 把最后 5 到 8 条 breadcrumb 贴在堆栈帧之后。它们常常点出真正的根因(一次失败的网络调用、一次状态切换),而光看帧是看不出来的。
- Seer 或 Crashlytics MCP 会取代这个 Prompt 吗? 对只用 Firebase 和 Sentry 的团队,基本会——让内置工具跑第一遍。但跨多个上报平台 triage、想要给站会用的固定卡片格式、或者在免费档不想付每人每月 40 美元时,手动 Prompt 仍然更划算。