崩溃现场信息采集规范
崩溃发生后,现场数据是定位根因的唯一线索。不规范的采集会导致关键信息丢失,使排查陷入“盲人摸象”的困境。本章定义必采字段与可选字段的采集规范,并给出采集决策树与判断规则,确保每一份崩溃现场数据都能支撑后续的归因分析。
必采字段
以下字段在任何崩溃场景下都必须采集,缺一不可。缺失任一字段将导致该崩溃现场“不可用”。
| 字段 | 含义 | 采集方式 | 优先级 |
|---|---|---|---|
| 堆栈 | 崩溃线程的完整调用栈(native / Java / Dart) | Breakpad / signal handler / Exception catch | P0 |
| 设备 | 设备型号(如 iPhone15,4 / SM-S928B) | Build.MODEL / sysctl hw.model | P0 |
| OS 版本 | 操作系统完整版本号(如 iOS 17.4 / Android 14 API 34) | Build.VERSION.RELEASE + SDK_INT | P0 |
| 应用版本 | 当前安装的 App 版本(versionName + versionCode) | PackageManager / Bundle | P0 |
| 内存状态 | 崩溃瞬间的内存快照(总内存、已用、剩余、PSS、低内存水位) | Debug.MemoryInfo / vm_stat | P0 |
可选字段
根据崩溃重现度和业务场景,选择性采集。若崩溃率 > 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"
}
}
字段采集结构总览
下图为崩溃现场信息采集字段的完整层级关系。橙色根节点代表“崩溃现场信息”,蓝色组为必采字段,紫色组为可选字段,子节点为具体字段名。
实践建议:在客户端
CrashHandler 中先采集必采字段,再根据判断规则决定是否拉取可选字段。避免因 IO 阻塞导致堆栈被覆盖。建议使用独立线程或 mmap 缓冲上报。