第3章 准备排查工具链:adb、systrace、strace、dumpsys、/proc/diskstats
3.1 现象识别:为什么需要专用工具链
当 App 出现 ANR 时,Logcat 往往只给出“Input dispatching timed out”或“Executing service”等宽泛提示,无法直接指向磁盘 IO。要穿透表象,必须依赖一套分层工具链:
- adb:Android 调试桥,是所有工具的数据通道,用于下发命令、拉取日志与转储文件。
- systrace:系统级跟踪,可捕捉 CPU 调度、Binder 调用、IO 等待等全局时间线。
- strace:进程级系统调用跟踪,精确记录每次
read()/write()/fsync()耗时。 - dumpsys:系统服务诊断,可查看
diskstats、procstats等聚合状态。 - /proc/diskstats:内核实时磁盘统计,反映 IO 队列深度、读写延迟和吞吐量。
排查经验:单独使用 Logcat 只能看到“果”,无法看到“因”。工具链的核心价值在于将 ANR 现象与底层 IO 指标建立可追溯的因果关系。
3.2 数据采集:各工具核心功能与命令速览
下表列出五种工具在 IO 瓶颈排查中的定位、采集数据类型和典型命令。所有命令均通过 adb shell 执行(systrace 通过 adb 前端触发)。
| 工具 | 采集数据类型 | 典型命令示例 |
|---|---|---|
| adb | 设备状态、日志、文件 | adb logcat -b main -b events |
| systrace | CPU 调度、IO 等待、线程状态 | python systrace.py -b 32768 -t 10 gfx input view sched freq disk |
| strace | 进程系统调用时序与耗时 | strace -p <PID> -T -e trace=file,write,read |
| dumpsys | 系统服务聚合统计 | dumpsys diskstats |
| /proc/diskstats | 内核块设备实时 IO 指标 | cat /proc/diskstats |
关键原则:数据采集必须覆盖“ANR 发生前 10 秒 → 发生时 → 发生后 5 秒”这个时间窗口,才能捕获 IO 尖峰。
建议在复现 ANR 前预启动 systrace(环形缓冲区模式)与 strace 目标进程,避免事后补采失真。
建议在复现 ANR 前预启动 systrace(环形缓冲区模式)与 strace 目标进程,避免事后补采失真。
3.3 原因定位:工具在排查流程中的角色映射
面对 IO 类 ANR,排查者需要在“全局视图”与“进程细节”之间来回切换。下面的故障树展示了如何根据排查阶段选择正确工具:
排查规则:
- 若怀疑全局 IO 压力(如多进程竞争磁盘带宽),优先使用 systrace 观察
iowait与blocked线程。 - 若怀疑单个进程存在慢 IO,使用 strace 附加到目标进程的 UI 线程或 Binder 线程。
- 若需要快速查看磁盘分区读写量,使用 dumpsys diskstats 或直接读取 /proc/diskstats。
3.4 修复动作:工具配置与验证步骤
以下步骤确保工具链在目标设备上可执行、可采集、可导出。
3.4.1 adb 连接与权限确认
# 检查设备是否识别
adb devices
# 如果设备未授权,检查 USB 调试授权弹窗
adb kill-server && adb start-server && adb devices
3.4.2 systrace 环境准备(Python + atrace)
# 确认设备端 atrace 可用
adb shell atrace --list-categories
# 确认主机端 systrace 脚本(Android SDK 路径)
python /path/to/android-sdk/platform-tools/systrace/systrace.py \
--time=10 \
--buf-size=32768 \
gfx input view sched freq disk
3.4.3 strace 可用性检查
# 确认设备包含 strace 二进制
adb shell which strace
# 测试附加到系统进程(通常需要 root 或 debuggable 应用)
adb shell strace -p 1 -T -c -S time 2>&1 | head -20
3.4.4 dumpsys diskstats 快速验证
# 确认 diskstats 服务存在且能输出
adb shell dumpsys diskstats
3.4.5 /proc/diskstats 可读性确认
# 确认文件存在并可读
adb shell cat /proc/diskstats | head -10
# 输出示例:
# 253 0 sda 12345 678 90123 45678 23456 789 10123 56789
# 字段含义:major minor 设备名 读完成次数 合并读 读扇区 读耗时(ms) 写完成次数 ...
常见失败场景:
- strace 权限不足:非 root 设备无法 strace 非 debuggable 进程。应对方案:使用 adb 提权或抓取 userdebug 版本。
- systrace 输出为空:内核未开启 ftrace / atrace 类别缺失。确认内核配置
CONFIG_FTRACE与CONFIG_DM_VERITY相关选项。 - /proc/diskstats 字段全零:内核块层未统计。检查
/sys/block/*/stat是否可用。
3.5 复测:工具可用性验证清单
完成配置后,逐项确认工具链状态。以下清单可在每次排查前快速执行:
| 检查项 | 验证命令 | 通过标准 |
|---|---|---|
| adb 设备在线 | adb devices |
显示设备序列号,状态为 device |
| systrace 可启动 | adb shell atrace --version |
返回版本号,且 disk 类别在列表中 |
| strace 可执行 | adb shell strace -V |
输出 strace 版本信息 |
| dumpsys diskstats | adb shell dumpsys diskstats |
输出中包含 Data-Free、Cache-Free 等分区统计 |
| /proc/diskstats 可读 | adb shell cat /proc/diskstats |
返回多行块设备统计,各列数值非全零 |
| 数据导出通路 | adb pull /data/local/tmp/test.txt ./ |
文件成功传输到主机 |
复测建议:将上述验证命令写入一个
check_toolchain.sh 脚本,每次排查 ANR 前先执行,确保工具链“热就绪”。
3.6 预防:工具使用规范与知识管理
工具链的长期有效性依赖于团队的使用习惯和知识沉淀。以下三条规范可降低排查时的工具摩擦:
- 标准化 SDK 环境:在 CI 构建机或开发者容器中预装 Android SDK 平台工具,固定
systrace/perfetto版本,避免兼容性问题。 - 设备预授权:对所有测试机开启
adb root(userdebug 版本)或配置adb keys信任,减少 strace / dumpsys 的权限拦截。 - 数据标注规范:每次采集的文件名统一命名为
ANR_${场景}_${日期}_${工具}.txt,例如ANR_启动页_20250220_systrace.ctrace,方便后续回溯。
知识管理清单:
- 建立团队 Wiki,记录每种工具的典型输出解读(如
/proc/diskstats各字段含义表)。 - 整理常见 IO 指标阈值:
avgrq-sz< 16 KB 提示碎片、await> 200 ms 提示磁盘饱和。 - 每季度验证一次工具链在新版本 Android 上的兼容性,更新 atrace 类别列表。