第3章 Crash分类体系与标签编码

适用场景

  • Crash 上报后需要自动化或人工打标签的场景,如每日 Crash 日报、归因分析、灰度对比。
  • 建立统一 Crash 知识库,使不同团队(客户端、服务端、QA)使用相同分类语言。
  • 灰度验证前对 Crash 进行分组,确保同一标签下的 Crash 可以使用同样的灰度策略。

前置条件

  • 已完成第2章《Crash 上报与堆栈采集》的接入与数据清洗。
  • 已定义一级和二级分类的枚举清单(见下文表格)。
  • 责任人员已确认分类决策树逻辑,并准备标签字典。

操作步骤

  1. 确定一级分类:根据堆栈类型、异常特征、发生环境,从五类中选取唯一一级标签:Java、Native、ANR、系统、第三方SDK。
  2. 确定二级分类:在一级分类基础上,根据 Crash 根因再细分:内存、线程、IO、网络、权限。若无法归入则使用 “其他/未知”。
  3. 编码拼接:按规则 CRASH_{一级缩写}_{二级缩写}_{序号} 生成唯一标签编码。序号为四位数字,从 0001 开始。
  4. 应用决策树:按照本章下方 SVG 决策树流程图逐级判断;若分支未覆盖,则进入通用分支“其他”。
  5. 写入标签库:将生成的编码与描述写入 Crash 元数据表,供后续查询与灰度分组使用。
贴士:二级分类不是必填项。若堆栈信息不足以判断二级类型,可仅记录一级分类,二级留空或标记为 UNKNOWN。

输入输出物

输入物来源输出物去向
原始 Crash 堆栈及元数据上报系统标签编码(字符串)Crash 元数据表
一级/二级分类枚举表本课程附录 A决策树决策结果自动化分类脚本或人工审核界面
编码规则说明本课程第3章正文标签目录(JSON 格式)灰度分组模块

责任边界

  • 客户端/端上团队:负责在堆栈中提取平台信息(Android/iOS),辅助一级分类的确定;不参与编码。
  • Crash 归因分析师:按照决策树执行分类,并生成编码;对模糊场景有裁决权。
  • 平台工程团队:维护分类脚本与标签数据库,确保编码唯一。

记录材料

每个 Crash 必须至少记录以下字段到 Crash 元数据表:

{
  "crash_id": "CRASH_20250501_A001",
  "level1": "Native",
  "level2": "Memory",
  "tag_code": "CRASH_NAT_MEM_0001",
  "classifier": "zhang.li",
  "classified_at": "2025-05-01T14:30:00+08:00"
}

若分类失败或人工介入,需额外记录异常说明。

异常处理

异常场景1:同一 Crash 可同时归入不同二级分类(如内存相关 AND 线程相关)。
规则:按决策树优先级选择最具体的分类;若并列,则取首次出现的二级分类。若无法决定,标记为 “MULTI” 并触发人工复核。

异常场景2:堆栈信息严重残缺,无法判断一级分类。
规则:使用一级分类 “Unknown”,二级分类留空,编码为 CRASH_UNK_UNK_9999。事后需通过重跑脚本或人工补标签。

验收标准

  1. 每个已上报的 Crash 均有且仅有一个 tag_code(包括 “Unknown” 情况)。
  2. tag_code 格式严格符合 CRASH_[A-Z]{3}_[A-Z]{3}_[0-9]{4}。
  3. 决策树覆盖率 ≥95%(即人工介入/Unknown 占比不超过5%)。
  4. 自动分类脚本在 500 条测试样本上准确率 ≥90%,召回率 ≥85%。
Crash 分类决策树 Crash Java Native ANR 系统 第三方SDK 内存 (MEM) 线程 (THR) 网络 (NET) 二级分类是否明确? 标记 UNKNOWN 编码规则说明: CRASH_{一级缩写3字母}_{二级缩写3字母}_{4位序号} 示例:Java + 内存 → CRASH_JAV_MEM_0001 ; ANR + 线程 → CRASH_ANR_THR_0012