返回资讯中心
外部精选
软件工程
#开发工具#intellij-platform#marketplace-marketplace#plugins#jetbrains-marketplace

JetBrains Marketplace 向插件作者开放 UI 冻结报告

来源标题:UI freeze reports are now available in JetBrains Marketplace

JetBrains Marketplace 现在向插件作者提供归因于其插件的 UI 冻结报告,可在插件管理页面的 Freezes 标签查看。使用前需先在插件中启用 Marketplace 报告功能。报告按错误类型分组,并提供自动生成的线程转储摘录。

JetBrains BlogJakub Chrzanowski2026/10/9 · 28 天前16 分钟阅读

以下正文由 AI 翻译自 JetBrains Blog(原文版权归原站所有),可能存在偏差,重要内容请以原文为准。

用户报告 IDE 停止响应,而你的插件是头号嫌疑对象。你按同样的步骤操作,一切却正常。如果没有更多细节,比如在卡死期间捕获的线程转储,就很难知道从何入手。

JetBrains Marketplace 现在让插件作者可以查看归因于其插件的 UI 冻结报告。要查看这些报告,打开你的插件管理页面,选择 Freezes 标签页。

有一个前提:你需要先在插件中启用 Marketplace 报告功能。希望这个标签页始终保持安静,但在你需要它之前把它配置好是值得的。

冻结报告里有什么?

Marketplace 按错误类型对冻结报告进行分组,并将相似的报告归入同一堆。每一堆显示一份代表性报告,这样你无需打开每一条记录就能发现反复出现的模式。

自动生成的线程转储摘录为你提供了一个起点,展示了被识别为与冻结相关的线程。它也是给编码 agent 的一个很好的初始输入:简短的摘录有助于它快速了解情况,同时比完整转储消耗更少的 token。如需更深入的调查,使用 analyze-freeze 技能,然后添加完整转储,让 agent 能够追踪线程或协程之间的关联。

dump-N.txt 文件包含在冻结期间每五秒捕获一次的完整线程转储。根据 IDE 能够捕获到的内容,报告还可能包括:

  • snapshot.jfr,CPU 快照。
  • report.txt,对捕获的线程栈的分析。
  • open-telemetry-metrics.csv,涵盖 VFS 活动和 UI 响应性等方面的性能指标。

从一份报告开始

打开一份报告,在其摘录中找到事件调度线程(EDT)。它通常命名为 AWT-EventQueue-0 或包含 EDT。首先,检查 EDT 是正在忙于执行耗时操作,还是在等待其他事情完成。

要进一步调查,下载完整转储,并使用 IDE 中的 Search Everywhere 打开 Analyze Stack Trace or Thread Dump。粘贴转储文本并检查结果。在追踪是什么阻止 EDT 继续推进时,随时回看原始线程数据。如果有多个转储可用,比较它们,看看同一操作是否在多个采样中持续出现在栈上。

在下面的示例中,分析器识别出 EDT 上 org.xml.sax.helpers.XMLFilterImpl.parse 中的文件 I/O。

原因也可能出在后台线程上。一个长时间、不可取消的读操作可能持有写操作所需的锁,导致 UI 等待,即便耗时的工作实际上在别处运行。⁠UI Freezes and the Dangers of Non-Cancellable Read Actions in Background Threads 详细介绍了这种模式以及如何应对。

试试冻结分析技能

我们的同事 Patrick Scheibe 创建了 ⁠analyze-freeze 技能,帮助 AI 编码 agent 调查 IntelliJ Platform 线程转储。它包含了关于协程行为、Dispatchers.Default 饥饿以及其他常见冻结模式的指导,并附有修复建议。

试用方法:

  • 将 gist 中的 SKILL.md 保存到你的调查文件夹中。
  • 添加下载的完整线程转储,以及 report.txt 和协程转储文本(如果有的话)。
  • 让你的 agent 阅读该技能并用以下提示分析这些文件:

阅读 SKILL.md 并将其 analyze-freeze 指令应用于所附的 IntelliJ Platform 线程转储。 从 EDT 开始,然后追踪是什么阻止它继续推进。 识别相关代码帧、参与的线程或协程、涉及的任何服务,以及可能的插件。 为每个结论引用转储证据。区分观察到的事实和假设。 如果摘录或转储不够充分,说明缺少哪些证据。 建议一个最小修复方案以及如何验证它。 暂时不要编辑代码。

在将转储分享给 AI 服务之前,请遵循你项目处理诊断数据的流程。使用 agent 的解释来指导你的调查,并在做出更改之前,对照完整转储和你的代码检查所引用的帧。

启用 Marketplace 报告

要使用 Marketplace 的内置报告功能,在 plugin.xml 中注册其错误处理器:

此处理器自 IntelliJ Platform 2023.3 起可用,无需自定义实现。对于支持 Split Mode 的插件,请在前端或共享插件模块中注册它。仅在后端注册将无法在前端使用。

用户可以通过 IDE 的错误报告 UI 提交报告,或启用 Send error reports to JetBrains automatically 以在后台自动发送。如果 Freezes 标签页为空,请检查你的处理器注册情况。报告还取决于用户的设置以及 IDE 是否识别出你的插件与此相关。

如果你维护自定义报告后端,⁠SDK error reporting guide 介绍了面向用户的 ErrorReportSubmitter API 以及用于自动后台报告的实验性 ErrorReportSink API。对于此处描述的内置 Marketplace 配置,你不需要自定义 sink。

如需视频概览,Patrick Scheibe 的 How IntelliJ Plugin Error Reporting Actually Works 比较了 Marketplace 报告与自定义 ErrorReportSubmitter。它还涵盖了提交了什么内容以及为什么附件对冻结报告很重要。

在选择修复方案之前检查证据

在将转储与你的代码匹配之前,检查它来自哪个插件版本。版本信息并不总是可用,这使得难以确定受影响的版本或对栈追踪进行反混淆。如果版本缺失,请将其标记为未知,而不是假设报告来自你的最新版本。

一旦你有了可能的原因,专注于阻止 UI 继续推进的操作。对于长时间的后台读操作,这可能意味着缩短访问模型的时间或选择可取消的读操作 API。将阻塞 I/O 保持在读操作之外,并确保任何可以重新开始的计算是安全可重试的。

(原文较长,此处译出前 6000 字,完整内容请点「打开原文」。)

正文由 探How 从来源站点 RSS 同步,内容未经改写;遇到排版缺失或需要图片、视频时请以原文为准。

打开原文
去社区讨论 →