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 修复动作:重录判断条件与自动化流程

以下任意条件满足时,必须启动重录流程:

  1. 文件大小为 0 或 < 2KB
  2. perfetto --query 显示 has_finished: false
  3. 在 UI 中打开时提示“Trace Truncated”
  4. 文件大小 < 配置中 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 故障树:导出完整性排查

Trace 导出完整性验证故障树 导出 Trace 文件 命令执行失败 文件大小不合预期 UI 提示截断 检查路径/权限/配置 运行 --query 验证 对比预期大小 检测 USB/超时断流 是否通过验证? 是 否 文件可用,进入分析 启动重录流程 预防:固定目录 + 预留空间 + 版本对齐 + 正常停止

故障树总结了导出阶段最关键的三个研判节点。记住:文件不完整,分析不开始。养成导出后立即执行 perfetto --query 的肌肉记忆,才能确保后续卡顿定位有可靠的原始数据作为基础。

4.8 排查速查表

步骤检查项通过标准失败处理
1文件是否存在ls -l trace.perfetto-trace 存在检查 adb 连接和 --out 参数
2文件大小 > 2KB非空文件删除残留文件后重录
3--query 完整性has_finished: true检查是否手动 kill 或 USB 中断
4UI 初步查看时间轴正常展开检查配置中数据源是否正确开启
5文件命名与备份按规范重命名并归档将失败文件移至 backup 目录备查