崩溃现场信息采集规范

崩溃发生后,现场数据是定位根因的唯一线索。不规范的采集会导致关键信息丢失,使排查陷入“盲人摸象”的困境。本章定义必采字段与可选字段的采集规范,并给出采集决策树与判断规则,确保每一份崩溃现场数据都能支撑后续的归因分析。

必采字段

以下字段在任何崩溃场景下都必须采集,缺一不可。缺失任一字段将导致该崩溃现场“不可用”。

字段含义采集方式优先级
堆栈崩溃线程的完整调用栈(native / Java / Dart)Breakpad / signal handler / Exception catchP0
设备设备型号(如 iPhone15,4 / SM-S928B)Build.MODEL / sysctl hw.modelP0
OS 版本操作系统完整版本号(如 iOS 17.4 / Android 14 API 34)Build.VERSION.RELEASE + SDK_INTP0
应用版本当前安装的 App 版本(versionName + versionCode)PackageManager / BundleP0
内存状态崩溃瞬间的内存快照(总内存、已用、剩余、PSS、低内存水位)Debug.MemoryInfo / vm_statP0

可选字段

根据崩溃重现度和业务场景,选择性采集。若崩溃率 > 0.1% 或涉及资金/安全模块,建议强制采集。

字段含义采集条件建议优先级
用户操作路径崩溃前用户的操作序列(Activity / ViewController 栈 + 点击事件)页面栈 > 1 且崩溃非首次P1
网络状态当前网络类型(WiFi / 4G / 5G)及信号强度崩溃涉及网络请求位点P1

判断规则与采集决策树

以下规则用于快速判定是否需要采集可选字段,并指导采集时机:

  • 规则 A:若堆栈指向 libc.so 或 libhwui.so 等系统库 → 必采 内存状态 并补充 用户操作路径。
  • 规则 B:若崩溃发生在异步线程(堆栈含 pthread_create / dispatch_async)→ 优先采集 网络状态 与崩溃前 30s 的 CPU/IO 采样。
  • 规则 C:若崩溃率在 1h 内突增超过 1% → 启动全量可选字段采集,持续 15min 后自动降级。

采集日志格式示例

客户端上报时应将字段序列化为 JSON,统一键名,便于服务端聚合。以下为推荐格式:

{
  "crash_id": "crcs_20250315_12abc3",
  "stack": "0x7b4d2c10 0x8f3a...",
  "device": "SM-S928B",
  "os_version": "Android 14 (API 34)",
  "app_version": "5.2.1 (3021)",
  "memory": {
    "total_kb": 8192000,
    "avail_kb": 512000,
    "pss_kb": 3400000,
    "low_memory": false
  },
  "optional": {
    "user_path": "HomeActivity -> ProductDetailActivity -> CheckoutActivity",
    "network": "WiFi / signal_strength: -68dBm"
  }
}

字段采集结构总览

下图为崩溃现场信息采集字段的完整层级关系。橙色根节点代表“崩溃现场信息”,蓝色组为必采字段,紫色组为可选字段,子节点为具体字段名。

崩溃现场信息采集字段结构 崩溃现场信息 必采字段组 可选字段组 堆栈 设备 OS 版本 应用版本 内存状态 用户操作路径 网络状态
实践建议:在客户端 CrashHandler 中先采集必采字段,再根据判断规则决定是否拉取可选字段。避免因 IO 阻塞导致堆栈被覆盖。建议使用独立线程或 mmap 缓冲上报。