第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 目标进程,避免事后补采失真。

3.3 原因定位:工具在排查流程中的角色映射

面对 IO 类 ANR,排查者需要在“全局视图”与“进程细节”之间来回切换。下面的故障树展示了如何根据排查阶段选择正确工具:

工具选择故障树:IO瓶颈ANR排查 磁盘IO ANR 选择排查工具链 systrace strace dumpsys /proc/diskstats adb 数据桥接 定位IO瓶颈 故障树遍历路径:ANR → 选择工具 → 执行采集(adb桥接) → 分析数据 → 定位IO瓶颈
排查规则:
  • 若怀疑全局 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,方便后续回溯。
知识管理清单:
  1. 建立团队 Wiki,记录每种工具的典型输出解读(如 /proc/diskstats 各字段含义表)。
  2. 整理常见 IO 指标阈值:avgrq-sz < 16 KB 提示碎片、await > 200 ms 提示磁盘饱和。
  3. 每季度验证一次工具链在新版本 Android 上的兼容性,更新 atrace 类别列表。