公司动态

Android 7系统异常问题排查(九)日志系统—logcat与bugreport

📅 2026/8/6 12:36:53
Android 7系统异常问题排查(九)日志系统—logcat与bugreport
系列目录第一篇异常机制全景图 | 第二篇Kernel Panic 与系统重启 | 第三篇Tombstone 机制 | 第四篇System Server Watchdog | 第五篇System Server 崩溃 | 第六篇ANR 机制 | 第七篇Java 层崩溃 | 第八篇Trace 机制 | 第九篇日志系统 | 第十篇实战方法论一、日志系统异常定位的数据源你可能遇到过这些场景异常发生后 logcat 缓冲区已被覆盖找不到关键日志不知道tombstone、dropbox、traces.txt分别存在哪里bugreport 文件巨大10-50MB不知道从哪个 Section 开始看重启后内核日志丢失无法分析 Kernel Panic前 8 篇文章介绍了各种异常机制它们产生的日志最终都汇集到 Android 的日志系统中。理解日志系统的架构才能做到异常发生后知道去哪里找什么日志。Android 日志体系总览┌───────────────────────────────────────────────┐ │ 日志生产者 │ │ ├─ 内核 (printk) → dmesg / pstore │ │ ├─ Native 进程 (ALOGx 宏) │ │ ├─ Java 进程 (Log.x / Slog.x) │ │ └─ debuggerd (tombstone) │ ├───────────────────────────────────────────────┤ │ 日志传输与缓冲 │ │ ├─ logd daemon (用户态日志守护进程) │ │ ├─ /dev/socket/logd (socket 通信) │ │ └─ 四种缓冲区 (main/system/crash/kernel) │ ├───────────────────────────────────────────────┤ │ 日志持久化 │ │ ├─ DropBoxManagerService (/data/system/dropbox/) │ │ ├─ tombstone (/data/tombstones/) │ │ ├─ ANR traces (/data/anr/) │ │ └─ pstore (内核 panic 日志) │ ├───────────────────────────────────────────────┤ │ 日志消费工具 │ │ ├─ logcat 命令行 │ │ ├─ dumpsys dropbox │ │ ├─ bugreport / bugreportz │ │ └─ bugreport 可视化工具ChkBugReport 等 │ └───────────────────────────────────────────────┘二、logd 守护进程2.1 logd 是什么logd是 Android 的用户态日志守护进程源码位于system/core/logd/。在 AOSP 7 中所有Log.x()调用最终都通过logd写入日志缓冲区。App/System 进程 │ ├─ Log.i(TAG, message) ├─ Slog.i(TAG, message) ← System Server 使用 └─ ALOGI(message) ← Native 进程使用 │ ▼ liblog.so (log write 接口) │ ▼ /dev/socket/logd (Unix Domain Socket) │ ▼ logd daemon ├─ LogBuffer (环形缓冲区内存中) │ ├─ main (默认 256KB) │ ├─ system (默认 256KB) │ ├─ crash (默认 256KB) │ └─ kernel (默认 256KB) │ ├─ LogReader (响应 logcat 读取请求) └─ CommandListener (响应 clear 等命令)2.2 四种日志缓冲区缓冲区用途典型 TAG读取方式mainApp 日志默认Log.i()写入自定义 TAGlogcat -b mainsystem系统服务日志Slog.i()写入ActivityManager、WindowManagerlogcat -b systemcrash崩溃相关日志AndroidRuntime等logcat -b crashkernel内核日志kernellogcat -b kernel或dmesg2.3 logcat 命令详解# 基础用法adb logcat# 默认读取 main system 缓冲区adb logcat-ball# 读取所有缓冲区adb logcat-bmain-bsystem# 读取指定缓冲区# 过滤adb logcat-sActivityManager# 只显示指定 TAGadb logcat *:W# 只显示 Warning 及以上级别adb logcat ActivityManager:I *:S# AMS 的 Info 以上其他静默# 格式控制adb logcat-vtime# 显示时间戳adb logcat-vthreadtime# 显示时间 线程信息adb logcat-vbrief# 简洁格式adb logcat-vlong# 详细格式含 PID/TID/TAG/Priority# 输出控制adb logcat-d# dump 当前缓冲区后退出adb logcat-c# 清空缓冲区adb logcat-f/sdcard/log.txt# 输出到文件adb logcat-r1024-n5# 自动切割每文件1MB保留5个# 过滤指定进程adb logcat--pid1234# 只看指定 PID2.4 日志级别级别缩写含义使用场景VerboseV详细信息开发和调试用不用于生产DebugD调试信息调试阶段的临时日志InfoI一般信息正常流程的标记WarningW警告异常但可恢复的情况ErrorE错误功能异常需要关注FatalF致命错误系统级别的严重问题Log.v(TAG,verbose);// VERBOSELog.d(TAG,debug);// DEBUGLog.i(TAG,info);// INFOLog.w(TAG,warning);// WARNLog.e(TAG,error);// ERRORLog.wtf(TAG,what a terrible failure);// ASSERT (FATAL)三、内核日志3.1 dmesg# 查看当前内核日志环形缓冲区adb shelldmesg# 持续监控内核日志adb shellcat/proc/kmsg# 清空内核日志adb shelldmesg-c3.2 last_kmsg重启前最后的内核日志# 查看上次重启前的内核日志adb shellcat/proc/last_kmsg# 高通平台从 pstore 读取adb shellcat/sys/fs/pstore/console-ramoops3.3 dmesg vs logcat -b kernel 的区别特性dmesglogcat -b kernel直接来源内核printk环形缓冲区logd 的 kernel buffer是否持久化重启消失重启消失读取方式直接读/dev/kmsg通过 logd socket包含内容所有printk输出logd 初始时从/proc/kmsg读取的快照四、DropBoxManagerService4.1 什么是 DropBoxDropBoxManagerService是 Android 的异常日志收件箱负责将各类系统异常crash、ANR、watchdog、tombstone 等持久化存储到磁盘。源码路径frameworks/base/services/core/java/com/android/server/DropBoxManagerService.javapublicclassDropBoxManagerServiceextendsIDropBoxManagerService.Stub{// ...// 存储路径/data/system/dropbox/// 每个条目是一个文件文件名格式tagtimestamp.txt// ...}关键设计DropBox 条目以文件形式持久化存储每个条目有独立的 tag 和时间戳不会因 logcat 缓冲区溢出而丢失。4.2 DropBox 条目类型速查adb shell dumpsys dropboxTag对应异常包含内容SYSTEM_BOOT系统启动启动时间、上次重启原因system_server_crashSystem Server 崩溃Java 异常堆栈、进程信息system_server_watchdogSystem Server Watchdog各线程堆栈、锁信息SYSTEM_TOMBSTONE系统进程 Native 崩溃完整 tombstone 文本data_app_crashApp 崩溃异常类型、消息、堆栈data_app_anrApp ANRCPU 使用率、线程堆栈system_app_crash系统 App 崩溃同上系统 App 用system_app_anr系统 App ANR同上系统 App 用BATTERY_DISCHARGE_INFO电池放电信息低电量关机时记录4.3 查看 DropBox 内容# 列出所有条目adb shell dumpsys dropbox# 查看指定条目内容adb shell dumpsys dropbox data_app_crash--print# 查看最近的条目adb shell dumpsys dropbox|head-100# 导出所有 dropbox 文件adb pull /data/system/dropbox/ dropbox_dump/五、bugreport5.1 bugreport 是什么bugreport是 Android 最全面的诊断信息收集命令一键收集系统运行的所有状态信息。它相当于同时执行了以下所有操作logcat-ball-d# 所有日志缓冲区dmesg# 内核日志dumpsys# 所有系统服务的当前状态/data/anr/traces.txt# ANR 线程堆栈/data/tombstones/# Native 崩溃墓碑/proc/last_kmsg# 上次重启的内核日志/proc/meminfo# 内存使用情况/proc/cpuinfo# CPU 信息...(还有很多)5.2 生成 bugreport# 方法1传统方式文本格式较大adb bugreportbugreport.txt# 方法2压缩格式推荐adb bugreportz# 输出bugreport-NRD90M-2024-01-01-12-00-00.zip# 方法3从设备上直接生成adb shell bugreportz adb pull /data/user_de/0/com.android.shell/files/bugreports/bugreport-*.zip5.3 bugreport 核心 Section 解读bugreport 是一个巨大的文本文件通常 10-50MB以下是异常定位最需要关注的 SectionDUMP OF SERVICE activity当前 Activity 状态ACTIVITY MANAGER ACTIVITIES (dumpsys activity activities) Stack #0: Task id #1 TaskRecord{xxx #1 Acom.example.app U0 sz1} Hist #0: ActivityRecord{xxx u0 com.example.app/.MainActivity} state: RESUMEDDUMP OF SERVICE meminfo内存状态Total RAM: 2,876,928 kB (status normal) Free RAM: 1,234,567 kB Used RAM: 1,642,361 kB Lost RAM: 0 kB ZRAM: 123,456 kB physical used ...DUMP OF SERVICE dropbox最近异常显示最近的 DropBox 条目列表快速找到异常记录。KERNEL LOG (dmesg)4[ 1234.567890] [BATTERY] capacity80% voltage4000mV ... 3[ 1234.567900] eMMC: mmc0: timeout waiting for ...SYSTEM LOG (所有缓冲区)主日志缓冲区 系统日志缓冲区。EVENT LOG系统事件日志二进制格式解析后可读包含am_anrANR 事件am_crash崩溃事件am_proc_died进程死亡am_proc_start进程启动battery_level电量变化screen_toggled亮屏/灭屏5.4 bugreport 快速定位技巧# 搜索崩溃记录grep-nFATAL EXCEPTIONbugreport.txt# 搜索 ANRgrep-nANR inbugreport.txt# 搜索 Native 崩溃grep-nsignal 11\|signal 6\|signal 7bugreport.txt# 查找 System Server Watchdoggrep-nWATCHDOGbugreport.txt# 查看重启原因grep-nboot_reason\|rebootbugreport.txt# 查找低内存杀死grep-nLow Memory Killer\|kill.*adjbugreport.txt六、日志存储路径汇总路径内容持久化重启后/proc/kmsg内核日志实时否消失/proc/last_kmsg上次内核日志通过 pstore可读/sys/fs/pstore/pstore 持久化日志是保留/data/anr/traces.txtANR 线程堆栈是保留/data/tombstones/Native 崩溃墓碑是保留/data/system/dropbox/DropBox 异常日志是保留/dev/socket/logdlogd 缓冲区否内存消失七、日志抓取策略7.1 在线收集设备正常运行#!/bin/bash# 完整收集脚本TIMESTAMP$(date%Y%m%d_%H%M%S)DIRbugreport_${TIMESTAMP}mkdir-p$DIRecho1/6 收集 bugreport...adb bugreportz adb pull /data/user_de/0/com.android.shell/files/bugreports/bugreport-*.zip$DIR/echo2/6 收集 logcat...adb logcat-ball-d$DIR/logcat_all.txtecho3/6 收集 dmesg...adb shelldmesg$DIR/dmesg.txtecho4/6 收集 ANR traces...adb pull /data/anr/traces.txt$DIR/2/dev/nullecho5/6 收集 tombstone...adb shellls/data/tombstones/|whilereadf;doadb pull /data/tombstones/$f$DIR/doneecho6/6 收集 dropbox...adb shell dumpsys dropbox$DIR/dropbox.txtecho收集完成$DIR7.2 离线收集重启后优先级顺序 1. /sys/fs/pstore/console-ramoops → 内核 panic 现场 2. /proc/last_kmsg → 上次内核日志 3. /data/tombstones/tombstone_* → Native 崩溃记录 4. /data/system/dropbox/ → 异常记录 5. /data/anr/traces.txt → ANR 记录八、总结logd 是用户态日志的中心枢纽main/system/crash/kernel 四种缓冲区各有侧重。DropBox 是异常日志的持久化保险箱crash、ANR、watchdog、tombstone 都存储在此不因 logcat 缓冲区溢出而丢失。bugreport 是一键收集全系统状态的瑞士军刀集成了 logcat、dmesg、dumpsys 等所有诊断信息。日志存储有内存和磁盘两层logcat 缓冲区在内存重启消失DropBox/tombstone 在磁盘重启保留。掌握日志路径映射 掌握问题定位的第一步什么问题对应什么路径是高效排障的基础。下一篇系列终篇将用真实案例串联前 9 篇的所有知识形成完整的排障方法论。本文基于 AOSP 7Android Nougat源码编写。