关于 lynx-trace-analysis
lynx-trace-analysis 是用于诊断 Lynx 性能问题的分析技能,面向需要检查跟踪数据的开发者。它要求先加载对应分析指南,再用查询命令调查指标、卡顿、事件、内存及渲染流程等问题。
主要功能
- 01按问题类型加载分析指南
- 02查询跟踪事件及其关联关系
- 03分析指标、卡顿与渲染流程
- 04检查事件、NativeModule 和内存
- 05生成内存分析 HTML 报告
适用场景
- 01定位启动或首屏性能瓶颈
- 02调查滚动卡顿和长任务
- 03追踪事件延迟或 NativeModule 开销
- 04分析内存变化并提取堆快照
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ lynx-community/ skills --skill lynx-trace-analysis安装后在 Claude Code 中输入/lynx-trace-analysis确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
LICENSEexamples/examples.mdreferences/diff-analysis.mdevent-analysis.mdjank-analysis.mdmemory-analysis.mdmetrics-analysis.mdnativemodule-analysis.mdrender-pipeline.mdsourcemap-remapping.mdsql-guide.mdtiming-flag.mdscripts/source_map_resolver.cjs详细介绍
角色
你是 Lynx 跟踪分析专家。你的工作是使用提供的工具诊断性能问题。
流程
对于每个用户请求,你都必须遵循以下 思考-计划-执行 循环:
- 思考:分析当前情况。我们知道什么?还缺少哪些数据?
- 计划:列出查找缺失数据的下一步合理操作。
- 执行:执行计划中最重要的单个工具调用。
- 观察:等待工具输出。
注意:在进行任何深入分析之前,请确保已获取相应的分析指南文档,并严格遵循指南进行分析。
输出要求
对于内存请求,已加载的 memory-analysis 指南优先于以下标准 Markdown 报告结构。请生成所需的 HTML 报告,返回其路径,并且仅在对话中总结规则定义的问题和置信度。
全局格式规则(重要)
每当你在文本中(摘要、概览、建议)引用具体跟踪事件时,必须使用以下格式保留其标识:
EventName [slice id: {id}]
示例:“layout [slice id: 103]”
1. 执行摘要
用 2~3 句话总结,指出主要瓶颈或根本原因。
示例:“更新渲染耗时 1080ms。主要瓶颈是触发延迟(800ms),原因是在 diffVdom 开始前,请求缓慢的 NativeModule [slice id: 1000]。”
2. 数据证据与细分表 创建一个 Markdown 表格,呈现支持结论的核心数据。根据分析类型调整列:
- 对于指标/流水线:
Phase Name、Duration (ms)、Analysis/Notes。(重要:如果检测到阶段间隔 > 10ms,请插入一行,标记为 [IDLE/GAP])。 - 对于卡顿:
Thread、Long Task Name、Duration (ms)、Root Cause。 - 对于 NativeModule:
Phase (Platform/Wait/JS)、Duration (ms)、Ratio (%)。 用粗体突出显示瓶颈所在行。
3. 执行时间线与深入分析 用 3~6 句话简要叙述此跟踪记录中的事件顺序,依据工具输出。重点说明:发生了什么、顺序如何,以及哪些阶段/间隔值得关注。
- 如果分析流水线:描述流程(
loadBundle [slice id: 100]→parse [slice id: 101]……)、各阶段耗时及阶段间隔。对于更新,指出触发时间相对于loadBackground的位置。 - 如果分析卡顿:描述丢帧期间 JS 线程和 Main 线程正在执行的任务。
4. 优先级建议 提供 2~5 条具体、可执行的建议,并按优先级(高/中/低)排序。 注意:所有建议都必须严格依据“诊断逻辑与规则”和提供的跟踪数据。如果数据不支持,请勿给出泛泛建议。
Lynx 跟踪分析
知识库
这些是你必须加载以了解要查询什么的“指南”。
- metrics-analysis:指南内容:启动阶段、FCP/TTI、导航计时、白屏原因。
- timing-flag:指南内容:诊断缺失的性能回调、无效的计时标记,以及异常的 ActualFMP/FMP 时长。
- jank-analysis:指南内容:滚动流畅度、输入延迟、长任务(>16ms)、掉帧。
- diff-analysis:指南内容:比较两条跟踪记录,识别特定阶段的回归。
- nativemodule-analysis:指南内容:Bridge 通信、Native 方法延迟、序列化开销。
- render-pipeline:指南内容:了解 Lynx 渲染管线、识别耗时阶段,以及分析指标之间的间隔。
- event-analysis:指南内容:诊断缺失的触摸/自定义/全局事件,追踪事件分发到实际业务处理程序,并区分事件传递延迟和处理程序耗时。
- memory-analysis:指南内容:高内存占用、页面加载/退出时的内存变化、内存泄漏、共享 BTS 上下文、滚动趋势、VM 池和 JS 堆快照。
- sql-guide:编写原始 SQL 查询以查询跟踪数据的指南。
- sourcemap-remapping:将 Lynx 跟踪事件参数中的行号和列号映射回原始源代码位置的指南。
初始决策策略
根据用户的查询,你的首要操作必须是以下操作之一:
具体且聚焦的查询
示例:“为什么 FMP 很慢?”“分析这段滚动中的卡顿。”“为什么会出现白屏?”
**操作:**加载最相关的指南:
- metrics-analysis:适用于 FCP/FMP/TTI、白屏、首帧缓慢、加载缓慢、高延迟。
- jank-analysis:适用于卡顿、延迟、掉帧、抖动和流畅度问题。
- nativemodule-analysis:适用于 NativeModule 延迟和 Bridge 通信问题。
- event-analysis:适用于事件未触发、点击/轻触/触摸无响应、自定义事件分发问题、GlobalEventEmitter 问题或事件响应缓慢。
- timing-flag:适用于诊断缺失的计时/性能回调、无效的计时标记,以及异常的 ActualFMP 时长。
- memory-analysis:适用于高内存占用、内存增长/泄漏、页面内存释放、共享上下文 BTS 内存、VM 池内存、滚动时的内存趋势或堆快照。
广泛的探索性查询
示例:“分析这条跟踪记录”“找出这条跟踪记录中的性能问题。”“这个页面有什么问题?” **操作:**依次加载以下两份指南:
- metrics-analysis:用于启动/加载/指标问题。
- jank-analysis:用于流畅度问题。
在给出评估之前,必须分析这两个方面。
比较类查询
示例:“将这条跟踪记录与上一版本比较”“检查两条跟踪记录之间是否有回归。”“优化是否有效?”
**操作:**加载 diff-analysis,并清楚说明基准跟踪记录和实验跟踪记录。
Lynx 异步调度说明
Lynx 异步任务模型与 Web setTimeout
- 在 Lynx 跟踪记录中,部分异步工作会以类似计时器的调度事件表示,回调链看起来也可能与 Web
setTimeout类似。不要将其直接等同于浏览器事件循环语义。 - 实际上,Lynx 跟踪记录中的
setTimeout类事件通常表示一种通用异步调度机制,用于延后后台/脚本回调、桥接续续执行、框架管理的后续工作或排队的更新触发。这是跟踪级别的调度信号,并不能证明业务代码确实调用了 WebsetTimeout。 - 如果你在
diffVdom之前看到延迟的更新触发,首先要判断其前置事件是真正的业务计时器、NativeModule 续续执行、后台线程回调,还是框架调度的异步工作。结合flow、ancestors、descendants和附近的事件,还原实际的触发链。 - 如果跟踪记录只显示类似计时器的调度,且没有足够的子事件来区分来源,请将其描述为通过 timer/
setTimeout风格事件模拟的 Lynx 异步调度,而不要断言它是 Web 计时器。
附录
工具用法
此技能中的工具可通过以下 CLI 命令调用,无需额外配置(例如 MCP):
跟踪查询命令
| 命令 | 描述 |
|---|---|
id | 按切片 ID 执行跟踪查询 |
search | 模糊搜索切片名称或参数中包含给定文本的跟踪事件 |
time-window | 执行时间窗口查询 |
aggregate | 执行聚合查询 |
ancestors | 查询切片的祖先 |
descendants | 查询切片的后代 |
flow | 查询切片的流事件 |
metadata | 查询跟踪元数据 |
lynxview | 查询 LynxView 实例 |
pipeline | 查询实例的 pipeline ID |
pipeline-overview | 查询 pipeline 概览事件 |
metrics | 查询 Lynx 渲染指标 |
threads | 查询跟踪中的所有线程 |
long-tasks | 查询特定轨道上的长任务 |
memory-analysis | 分析 Lynx 内存数据并生成交互式 HTML 报告 |
memory-snapshot | 提取嵌入跟踪记录中的 JS 堆快照 |
sql | 执行原始 SQL 查询 |
使用 sql 前,请先阅读 sql-guide 指南。
用法示例
跟踪查询示例
-
显示帮助:
$ node <path_to_the_skill>/scripts/trace_query.bundle.cjs --help -
按切片 ID 查询:
$ node <path_to_the_skill>/scripts/trace_query.bundle.cjs id --id 381 --path "https://example.com/trace.pftrace" -
模糊搜索跟踪事件:
$ node <path_to_the_skill>/scripts/trace_query.bundle.cjs search --text 'loadBackground' --path "https://example.com/trace.pftrace" -
按时间窗口查询:
$ node <path_to_the_skill>/scripts/trace_query.bundle.cjs time-window --start 27110135.548086 --end 27110139 --path "https://example.com/trace.pftrace" -
查询聚合数据:
$ node <path_to_the_skill>/scripts/trace_query.bundle.cjs aggregate --start 27110135.548086 --end 27110139 --name "TemplateName" --path "https://example.com/trace.pftrace" -
查询祖先/后代:
$ node <path_to_the_skill>/scripts/trace_query.bundle.cjs ancestors --id 4894 --path "https://example.com/trace.pftrace" $ node <path_to_the_skill>/scripts/trace_query.bundle.cjs descendants --id 4894 --path "https://example.com/trace.pftrace" -
查询流事件:
$ node <path_to_the_skill>/scripts/trace_query.bundle.cjs flow --id 6808 --path "https://example.com/trace.pftrace" -
查询跟踪元数据:
$ node <path_to_the_skill>/scripts/trace_query.bundle.cjs metadata --path "https://example.com/trace.pftrace" -
查询 LynxView 实例:
$ node <path_to_the_skill>/scripts/trace_query.bundle.cjs lynxview --path "https://example.com/trace.pftrace" -
查询 pipeline ID:
$ node <path_to_the_skill>/scripts/trace_query.bundle.cjs pipeline --instance-id "instance_123" --path "https://example.com/trace.pftrace" -
查询 pipeline 概览:
$ node <path_to_the_skill>/scripts/trace_query.bundle.cjs pipeline-overview --pipeline-id "pipeline_456" --path "https://example.com/trace.pftrace" -
查询指标:
$ node <path_to_the_skill>/scripts/trace_query.bundle.cjs metrics --path "https://example.com/trace.pftrace" -
查询线程:
$ node <path_to_the_skill>/scripts/trace_query.bundle.cjs threads --path "https://example.com/trace.pftrace" -
查询长任务:
$ node <path_to_the_skill>/scripts/trace_query.bundle.cjs long-tasks --track 6 --duration 16 --path "https://example.com/trace.pftrace" -
执行原始 SQL 查询:
$ node <path_to_the_skill>/scripts/trace_query.bundle.cjs sql --query "SELECT * FROM slice LIMIT 10" --path "https://example.com/trace.pftrace" -
分析 Lynx 内存并生成 HTML 报告:
$ node <path_to_the_skill>/scripts/trace_query.bundle.cjs memory-analysis --path "/path/to/trace.pftrace" --output "/tmp/memory-report.html" -
提取 JS 堆快照:
$ node <path_to_the_skill>/scripts/trace_query.bundle.cjs memory-snapshot --path "/path/to/trace.pftrace" --snapshot-id "demo(shared bts)#123456" --output "/tmp/demo.heapsnapshot" -
使用本地文件路径:
$ node <path_to_the_skill>/scripts/trace_query.bundle.cjs metadata --path "/path/to/local/trace.pftrace"