崩溃与稳定性:tombstone、信号与恢复策略
崩溃与稳定性:tombstone、信号与恢复策略
上一章看了 CPU 与锁。这一章回答:应用崩溃(Java 异常与 native 信号)的证据在哪, 怎么定位,以及系统级稳定性的恢复策略是什么?
FATAL EXCEPTION 提供 Java 未捕获异常的线程和调用栈;SIGSEGV、SIGABRT 等 native 崩溃 由 debuggerd 保存 tombstone,需要结合信号、fault address、寄存器、backtrace 和 maps 解读。
Java 异常与 native 信号使用不同证据
| 常见误解 | 正确理解 |
|---|---|
| 崩溃就是 Java 异常 | native 崩溃(SIGSEGV/SIGABRT)同样常见,证据在 tombstone |
| logcat 里的堆栈就是全部 | native 崩溃还要看 tombstone 里的寄存器、栈与 maps |
| 崩溃后系统不管了 | AMS 会清理进程、恢复前台并给出“应用已停止”流程 |
核心结论
- Java 崩溃:未捕获异常 → logcat 打印 FATAL EXCEPTION → 进程结束。
- native 崩溃:非法信号(SIGSEGV/SIGABRT 等)→ debuggerd 生成 tombstone。
- 定位顺序:确认崩溃类型 → 读堆栈/tombstone → 关联日志与复现场景。
- 系统恢复:AMS 检测进程死亡,清理状态并可能重启前台任务。
- 稳定性优化:崩溃统计、crash 上报、关键路径保护与恢复策略。
崩溃类型与证据主链
逐步解释:
- Java 崩溃:未捕获异常在 logcat 打印堆栈。
- native 崩溃:信号触发 debuggerd,生成 tombstone。
- 系统恢复:AMS 感知进程死亡,清理并恢复前台。
- 上报:应用可通过 CrashReporter 收集并上报现场。
tombstone 里看什么
按顺序读:信号(什么崩了)→ backtrace(在哪崩)→ 寄存器(关键值)→ maps(内存布局) → 相关线程。native 崩溃常与内存越界、use-after-free、栈溢出相关,backtrace 之外 还要看寄存器与相邻内存内容。
源码证据
阅读目标:确认崩溃处理与恢复入口。
正文指针:debuggerd(system/core/debuggerd/)生成 tombstone; ActivityManagerService.java 的进程死亡处理(handleAppDiedLocked 一类入口)。
// ActivityManagerService.java(伪代码,行号以 r75 为准)
void handleAppDiedLocked(ProcessRecord app) {
// 清理进程状态,恢复前台
}这段代码证明: 进程崩溃后 AMS 负责清理与恢复;崩溃现场由 debuggerd 负责记录。 两者分工明确:debuggerd 记录“怎么死的”,AMS 处理“死后怎么办”。
验证与排障
环境:开发设备或模拟器;读取 tombstone 需要 root。
adb logcat -v threadtime -d | grep -E "FATAL EXCEPTION|AndroidRuntime"
adb shell ls /data/tombstones/
adb shell cat /data/tombstones/tombstone_00
adb shell dumpsys activity processes | grep -i crash先确认崩溃类型:Java 看 FATAL EXCEPTION,native 看 tombstone。再关联复现步骤与 日志,定位到具体模块。闪退类问题先收集 tombstone 再谈修复。
常见误区
- “崩溃 = Java 异常”:native 崩溃同样高频。
- “logcat 堆栈足够”:native 崩溃要读 tombstone。
- “崩溃后系统什么都不做”:AMS 会清理与恢复前台。
- “崩溃率只看 logcat 统计”:要结合上报与现场文件。
延伸问题
- SIGSEGV、SIGABRT、SIGBUS 分别代表什么?
- 如何从 tombstone 判断越界还是 use-after-free?
- 崩溃上报体系如何保护用户数据并提高复现率?
- 系统关键进程(system_server)崩溃后如何重启恢复?
源码入口
| 文件 | 关键位置 | 作用 |
|---|---|---|
system/core/debuggerd/ | tombstone 生成 | native 现场 |
ActivityManagerService.java | 进程死亡处理 | 清理恢复 |
AndroidRuntime.cpp | Java 异常处理 | FATAL EXCEPTION |
/data/tombstones/ | 现场文件 | 排障证据 |
公共路径:system/core/debuggerd/、frameworks/base/core/jni/ 与 frameworks/base/services/core/java/com/android/server/am/。行号以 r75 检索为准。
需要把不同现象纳入同一排查流程,见 性能排障。