UI freeze reports are now available in JetBrains Marketplace

TL;DR · AI 摘要
UI freeze reports are now available in JetBrains Marketplace - The JetBrains Blog JetBrains Platform Plugin and extensio...
核心要点
- 主题聚焦:UI freeze reports are now available in JetBrains
- 来源:The JetBrains Blog,建议结合原文判断细节。
- AI 分析暂不可用,本条为保底评分与摘要。
JetBrains Marketplace 现在提供 UI 冻结报告 - JetBrains 博客
JetBrains 平台
JetBrains 产品的插件和扩展开发。
关注
- 关注:
- X X
- RSS RSS
前往 Marketplace
IntelliJ 平台
Marketplace
插件
JetBrains Marketplace 现在提供 UI 冻结报告
Jakub Chrzanowski
用户报告 IDE 停止响应,而你的插件成为首要怀疑对象。你尝试相同步骤,但一切正常。没有更多细节(例如冻结期间捕获的线程转储),很难知道从哪里入手。
JetBrains Marketplace 现在为插件开发者提供 UI 冻结报告。要查看这些报告,请打开插件管理页面并选择“冻结”标签页。
有个前提条件:你必须先在插件中启用 Marketplace 报告功能。希望这个标签页保持安静,但最好在需要时提前设置好。
冻结报告包含哪些内容?
Marketplace 按错误类型对冻结报告进行分组,并将相似报告归类整理。每个归类会显示一份代表性报告,帮助你快速发现重复模式而无需逐一查看所有实例。
自动生成的线程转储摘录通过展示被识别为冻结相关线程,为你提供分析起点。这也是编码代理的优质初始输入:简短摘录能帮助代理快速定位,且使用的 token 数量少于完整转储。如需深入调查,请使用 analyze-freeze 技能,然后添加完整转储,让代理追踪线程或协程之间的关联。
dump-N.txt 文件包含冻结期间每 5 秒捕获的完整线程转储。根据 IDE 能捕获的内容,报告还可能包含:
- snapshot.jfr,CPU 快照。
- report.txt,捕获线程堆栈的分析。
- open-telemetry-metrics.csv,涵盖 VFS 活动和 UI 响应性等性能指标。
从一份报告开始
打开报告并在摘录中找到事件调度线程(EDT)。它通常命名为 AWT-EventQueue-0 或包含 EDT。首先检查 EDT 是否因执行耗时操作或等待其他操作完成而繁忙。
如需进一步调查,请下载完整转储并在 IDE 中使用“随处搜索”打开“分析堆栈跟踪”或“线程转储”。粘贴转储文本并检查结果。在追踪导致 EDT 阻塞的因素时,请参考原始线程数据。如果有多个转储,比较它们以查看相同操作是否在不同样本中持续出现在堆栈中。
在下面的示例中,分析器识别出 EDT 在 org.xml.sax.helpers.XMLFilterImpl.parse 中执行文件 I/O。
原因也可能出现在后台线程中。长时间且不可取消的读取操作可能持有写入操作需要的锁,导致 UI 即使耗时操作在别处执行仍需等待。《UI 冻结与后台线程中不可取消读取操作的危险》详细介绍了这种模式并解释了如何解决。
尝试 freeze-analysis 技能
我们的同事 Patrick Scheibe 创建了 analyze-freeze 技能,帮助 AI 编码代理分析 IntelliJ 平台线程转储。它包含关于协程行为、Dispatchers.Default 饥饿和其他常见冻结模式的指导,以及修复建议。
尝试方法:
- 将 gist 的 SKILL.md 保存到你的调查文件夹中。
- 将下载的完整线程转储文件与 report.txt 和 coroutine-dump 文本(如果可用)一并添加。
- 请要求您的代理阅读技能文档,并使用以下提示分析这些文件:
阅读 SKILL.md 并按照其中的 analyze-freeze 指令分析附加的 IntelliJ 平台线程转储。
从 EDT 开始,追踪阻碍其进展的原因。
识别相关代码帧、参与的线程或协程、涉及的服务以及可能的插件。
为每个结论引用转储中的证据,区分观察到的事实与假设。
如果摘录或转储信息不足,请说明缺少哪些证据。
建议一个最小化的修复方案并说明如何验证。
目前不要修改代码。在将转储文件共享给 AI 服务前,请遵循项目处理诊断数据的流程。使用代理的解释来指导您的调查,并在修改前将引用的代码帧与完整转储和您的代码进行核对。
启用 Marketplace 报告
要使用 Marketplace 的内置报告功能,请在 plugin.xml 中注册其错误处理器:
<extensions defaultExtensionNs="com.intellij">
<errorHandler implementation="com.intellij.diagnostic.JetBrainsMarketplaceErrorReportSubmitter"/>
</extensions>该处理器自 IntelliJ 平台 2023.3 版本起可用,无需自定义实现。对于支持 Split Mode 的插件,请在前端或共享插件模块中注册它。仅在后端注册将无法在前端使用。
用户可通过 IDE 的错误报告界面提交报告,或启用"自动发送错误报告给 JetBrains"功能在后台提交。如果"冻结"标签页为空,请检查处理器注册情况。报告功能还依赖用户的设置以及 IDE 是否将您的插件识别为相关插件。
如果您维护自定义的报告后端,SDK 错误报告指南将解释面向用户的 ErrorReportSubmitter API 以及用于自动后台报告的实验性 ErrorReportSink API。对于此处描述的内置 Marketplace 设置,您不需要自定义的 sink。
关于视频概述,Patrick Scheibe 的《How IntelliJ Plugin Error Reporting Actually Works》视频将比较 Marketplace 报告与自定义 ErrorReportSubmitter 的差异。该视频还涵盖了提交内容以及为何附件对冻结报告至关重要。
在选择修复方案前检查证据
在将转储文件与您的代码匹配前,请检查它来自哪个插件版本。版本信息并非总是可用,这使得难以识别受影响的发布版本或反混淆堆栈跟踪。如果缺少版本信息,请将其标记为未知,而非假设报告来自您最新的发布版本。
一旦确定可能原因,请重点关注阻碍 UI 进展的操作。对于长时间的后台读取操作,这可能意味着缩短访问模型的时间或选择可取消的读取操作 API。确保阻塞 I/O 操作在读取操作之外执行,并确保任何可重启的计算都安全可重试。
通过重复受影响的操作并检查新的诊断证据来测试更改。如果仍然遇到困难,请在 JetBrains 平台论坛提问,并附上 IDE 构建版本、已知的插件版本、相关转储证据以及您已检查的内容。
即使你无法复现冻结问题,其完整的转储信息仍能显示 IDE 线程在停滞期间的状态,并为你提供调查方向。如果已为你的插件启用 Marketplace 报告功能,请访问其「冻结」页面查看相关报告;简要摘录的内容可帮助你确定优先排查的位置。祝你调查顺利,调试愉快!
JetBrains Marketplace
插件开发
UI 冻结
- 分享
上一篇博客
幕后揭秘:OpenTelemetry 插件如何实时映射你的微服务架构 /Behind the Scenes: How the OpenTelemetry Plugin Maps Your Microservices in Real-Time