4. Trace 文件导出与完整性验证
Trace 文件是卡顿分析的唯一原始证据。导出阶段如果出现截断、损坏或丢失关键段,后续所有分析都将失去依据。本章提供一套“导出时即完成验证”的实战规则,避免将损坏的 Trace 带入下个环节。
4.1 现象识别:导出失败或文件异常
在导出阶段常见的异常现象分为以下四种:
| 现象 | 典型表现 | 严重等级 |
|---|---|---|
| 导出命令报错 | perfetto: error: unable to open file | 高 |
| 导出文件过小 | 文件 < 2MB(非空 trace) | 高 |
| 文件体积异常 | 大于预期 3 倍以上(死循环写入) | 中 |
| 打开后提示截断 | UI 显示“Trace truncated at XX timestamp” | 高 |
实战警示:文件大小为 0 或仅包含文件头(约 1KB)的 Trace 无法解码,需立即重录。不要在
perfetto-ui 中强行打开截断文件进行“模糊分析”,这种做法会产生误导性的卡顿归因。
4.2 数据采集:标准导出命令与参数
确保使用以下导出命令,避免通过 adb pull 手动搬运未完成的文件:
# 标准导出到本地文件,自动等待录制完成并写入完整 header
adb shell perfetto --out /data/local/tmp/trace.perfetto-trace \
-c /data/local/tmp/config.pbtx \
--txt
# 导出完成后从设备拉取到本地
adb pull /data/local/tmp/trace.perfetto-trace ./trace.perfetto-trace
关键参数解释:
| 参数 | 作用 | 导出失败时排查点 |
|---|---|---|
--out | 指定输出路径 | 检查路径权限,不可使用 /sdcard/ |
--txt | 使用文本格式配置 | 确保 .pbtx 内容格式正确 |
-c | 配置文件的本地路径 | 确认文件已推送至设备对应目录 |
导出规则:在录制结束后,
--out 写入完成之前 不要拔出 USB 线或关闭终端。等待 perfetto 进程打印 Trace written 后再执行 adb pull。
4.3 原因定位:文件大小判断与截断异常处理
根据文件大小快速定位问题:
| 文件大小范围 | 可能原因 | 判定结论 |
|---|---|---|
| 0 或 < 2KB | 录制未启动 / 写入失败 | 不可用,必须重录 |
| 2KB ~ 10MB(30 秒以内) | 录制时间过短 / 配置中缓冲区过小 | 建议按需求重录,加大缓冲区 |
| 10MB ~ 200MB | 正常范围(长 Trace 或高频率事件) | 可用,检查是否包含目标卡顿时长 |
| 200MB ~ 1GB+ | 缓冲区溢出 / 高频日志全开 / 死循环 | 需检查文件完整性,优先重录 |
截断异常的快速判断方法:
# 使用 perfetto 自带的验证命令
perfetto --query /path/to/trace.perfetto-trace
# 输出包含以下行表示完整:
# trace_size: 21894106 bytes
# packet_count: 145213
# has_finished: true
# 输出包含以下行表示截断:
# has_finished: false
# truncated_at: 1678901234567890123
排查技巧:如果文件大小正常但
has_finished: false,常见原因是 adb 超时或 usb 中断。解决办法:使用 adb exec-out 代替 adb shell 来提升数据传输稳定性。
4.4 修复动作:重录判断条件与自动化流程
以下任意条件满足时,必须启动重录流程:
- 文件大小为 0 或 < 2KB
perfetto --query显示has_finished: false- 在 UI 中打开时提示“Trace Truncated”
- 文件大小 < 配置中
buffer_size_kb的 60%(说明数据严重缺失)
重录动作标准化操作:
# 删除残留的临时文件
adb shell rm -f /data/local/tmp/trace.perfetto-trace
# 检查设备可用存储
adb shell df -h /data/local/tmp
# 重新推送配置并启动录制
adb push config.pbtx /data/local/tmp/config.pbtx
adb shell perfetto --out /data/local/tmp/trace.perfetto-trace \
-c /data/local/tmp/config.pbtx --txt
自动化建议:在 CI/脚本中加入如下完整性校验逻辑:
if ! perfetto --query trace.perfetto-trace | grep -q "has_finished: true"; then echo "RE-RECORD"; fi
4.5 复测:导出后立即验证
每次导出后执行以下三步验证,确认文件可用性:
- 步骤1: 检查物理文件大小,记录到日志
- 步骤2: 运行
perfetto --query确认完整性 - 步骤3: 在 Perfetto UI 中打开前 3 秒,确认时间轴和进程列表完整
复测通过后,将文件重命名为 trace_${场景名}_${日期}_checkok.perfetto-trace,防止后续混淆。
4.6 预防:导出行为的标准化规范
| 预防措施 | 操作说明 |
|---|---|
| 预留存储 | 录制前使用 adb shell df 确保设备可用空间 > 500MB |
| 固定导出目录 | 统一使用 /data/local/tmp/,避免使用分区空间不足的 /sdcard/ |
| 超时保护 | 录制脚本中增加 timeout 120,防止 perfetto 无响应 |
| 文件命名规范 | 包含场景标识、日期、录次编号,避免覆盖 |
| 版本对齐 | 导出设备的 perfetto 版本必须与分析工具的版本兼容 |
预防经验:永远不要使用
kill -9 强制终止 perfetto 进程。这会直接导致文件头损坏,产生不可修复的截断 Trace。应使用 Ctrl+C 或 adb shell kill -SIGINT 正常停止。
4.7 故障树:导出完整性排查
故障树总结了导出阶段最关键的三个研判节点。记住:文件不完整,分析不开始。养成导出后立即执行 perfetto --query 的肌肉记忆,才能确保后续卡顿定位有可靠的原始数据作为基础。
4.8 排查速查表
| 步骤 | 检查项 | 通过标准 | 失败处理 |
|---|---|---|---|
| 1 | 文件是否存在 | ls -l trace.perfetto-trace 存在 | 检查 adb 连接和 --out 参数 |
| 2 | 文件大小 > 2KB | 非空文件 | 删除残留文件后重录 |
| 3 | --query 完整性 | has_finished: true | 检查是否手动 kill 或 USB 中断 |
| 4 | UI 初步查看 | 时间轴正常展开 | 检查配置中数据源是否正确开启 |
| 5 | 文件命名与备份 | 按规范重命名并归档 | 将失败文件移至 backup 目录备查 |