用途:针对单一且可复现的 iOS 启动或运行时流程,用 ETTrace 做有边界的采样实验,并对符号化后的火焰图数据做定性归因。它不负责宽泛的 CPU、卡顿、能耗或并发排查,那类场景应先用 Instruments;视图标识、失效与布局问题应参考 SwiftUI 性能指南。
主要能力:规范采集契约(流程边界、启动或运行时采集、提交与构建配置、runner 与框架版本、线程模式、设备与系统、启动方式、数据与缓存状态、重复次数);采集前先做分流判断;固定 ETTrace 版本;先构建再采集与构建完全匹配的 dSYM;用辅助脚本按 dwarfdump --uuid 比对应用与内嵌二进制;在干净目录中运行 ETTrace;用辅助脚本校验并汇总 1.1.1 处理产物。
使用方式:从官方 tap 安装 runner,并将 ETTrace 包产物链接进被测目标:brew install emergetools/homebrew-tap/ettrace。运行一次确认出现 Starting ETTrace 日志。采集前先收集 dSYM,例如 python3 scripts/collect_dsyms.py --app … --search-root … --output … --pretty > dsym-report.json。采集时在空的每次运行目录中执行 ettrace --simulator --dsyms <目录>,仅在启动采集时加 --launch,并按 runner 提示手动从主屏启动;真机采集去掉 --simulator。汇总使用 python3 scripts/analyze_ettrace.py <output_*.json> --top 25 --pretty。
解读与限制:exclusive 秒数为扣除直接子节点后归给某符号的采样时间;inclusive 表示整个调用子树权重;聚合 inclusive 可超过根时长;<unattributed> 单独报告,过大将削弱结论;多线程文件为线程时间之和,不等于墙钟延迟。ETTrace 周期采样,时长是基于采样区间的归因重建,不能当作生产墙钟耗时,也不能与配置不同的剖析器直接对比。重要应用帧若为 <unknown>、原始地址或归属错误二进制,属于证据缺口,需先修复符号化。原始 runner 的 output.json 不是处理后的火焰图,分析脚本只接受 ETTrace 1.1.1 的处理产物形状,换格式前需重新核对上游与解析器。任何采集契约字段出现实质差异,都应拒绝前后对比声明,改为在同一契约下重建并重复至少两次,报告方差。应避免无边界采集、跨构建或架构混用 dSYM、把原始 JSON 当火焰图、混用启动与运行时或单线程与多线程采集、只看顶层 inclusive、凭一次噪声运行宣称改进,以及误将插桩留在生产配置中。具体版本更新与脚本细节暂未提供更多信息。