Skip to content

feat(desktop): #1794 标题栏运行/调试接入,调试工具窗口按 IntelliJ IDEA 布局重做 - #1837

Merged
xiaoyumuxi merged 5 commits into
previewfrom
feature/1794-run-debug-toolbar
Nov 13, 2026
Merged

xiaoyumuxi merged 5 commits into
previewfrom
feature/1794-run-debug-toolbar

Conversation

@xiaoyumuxi

@xiaoyumuxi xiaoyumuxi commented Nov 13, 2026 •

Copy link
Copy Markdown
Collaborator

关联 Issue / Linked issue

PR 类型 / Type

  • feat:新功能或用户可见的改进
  • fix:缺陷修复
  • docs:文档、Agent Note、Skill 等规则文件
  • release:稳定版发布准备

改动说明 / What changes

背景 / Why

Viva 桌面端右上角的运行配置、运行、调试按钮只是摆设:按了不会启动任何东西。调试工具窗口是一排文字按钮加几个分区,和 IntelliJ IDEA 的调试窗口差别很大:断点列表占着主区域,反汇编有一行自己的按钮,内存只能看当前指令处的固定 1 KB。本 PR 把标题栏三个按钮接到运行配置和构建提供者上,并按 IDEA 的布局重做调试工具窗口、反汇编和内存视图。

改动 / Changes

标题栏运行/调试(新增 workbench/title_run.go、title_run_view.go;runconfig.go、chrome.go、chrome_view.go、shell_view.go)

  • 运行配置下拉:列出构建提供者检测到的运行配置,另有“当前文件”一项。标题显示所选配置的名称。
  • 运行:按所选配置交给提供者启动,并打开运行窗口。
  • 调试:让提供者准备该运行声明的调试适配器(debug.adapter),然后在调试窗口启动会话。
  • 配置还没读出时按下运行或调试,会等配置读出后再执行(runConfigurations.pending)。这时所有检测到的实例都会加载模型,不只是构建窗口显示的那个(wanted)。
  • 按下后做什么由 Core 的 runConfig.decideTitleAction 判定:Go 只报告事实(运行还是调试、按下还是配置读出后再问、是否选了当前文件、配置是否读完,以及所选配置的实例是否检测到、模型是否加载/上次加载失败/运行是否声明了调试适配器),按 Core 的回答等待、先加载模型、启动、调试或给出提示。上次加载失败的模型只在按下时重载,再次失败就结束,不会循环。
  • 所选配置不是构建插件负责的(例如 process 配置)时,提示“无法启动 {name}:没有构建插件负责运行它。”
  • 再按一次下拉会收起菜单;打开项目、分支或齿轮菜单时也会收起它。

提供者调试(core/build.go、pluginservice/builds.go、workbench/build.go、build_menus.go)

  • Client.DecodeBuildDebug 改为返回 BuildDebugPreparation,对应 Core build.decodeDebugPreparation 的 preparation 字段,包含适配器本地 ID、根目录、程序、参数、工作目录和环境。请求新增 run 字段,用来标明是哪个运行声明。
    • Core 早已按这个形状回答。
    • 补了 core/build_test.go。
  • BuildRunDeclaration 新增 DebugAdapter,从清单里运行声明的 debug.adapter 读出。没有声明适配器的运行不能调试。
  • 新增 debugProviderTarget / redebugProviderTarget:
    • 先保存未保存的文档,再准备程序,然后用该插件自己的适配器启动。
    • 重新运行时会重新准备程序,所以调试的是最新构建。
    • 实例按插件、构建系统和根目录重新查找,找不到时会提示。
  • 模型随检测一起返回时,就地把它的运行解析成运行配置。

调试工具栏(debug_view.go、新增 debug_mute.go;icons/icons.go、scripts/desktop/generate-desktop-icons.sh)

  • 文字按钮改为图标按钮,分三组:
    • 重新运行、停止
    • 继续、暂停、单步跳过、单步进入、单步跳出
    • 查看断点、静音断点、更多(⋮)
  • 新增 9 个 Lucide 图标:pause、redo-dot、arrow-down-to-dot、arrow-up-from-dot、circle-dot、circle-slash、braces、variable、rotate-ccw,由 generate-desktop-icons.sh 生成到 icons.go。
  • 重新运行(rerunDebug):停止本项目的会话(包括子会话),按首次启动的方式重启。
    • 为免卡住窗口线程,等待会话退出有上限。
    • 无法重复的启动方式下,按钮不可用。
  • 静音断点(debug_mute.go):断点保留并照常显示(淡色),宿主照常发送每次修改;由 Core 的 debug.setBreakpointsMuted 记住每个会话的断点集合,静音期间把源码、异常、函数、指令、数据断点全部以空集合发给适配器,取消静音时重发保存的集合。
    • 开关属于项目,所有运行中的会话一起切换;静音状态下启动的会话在创建后、发送任何断点前就设为静音(debug_start.go)。经 startDebugging 启动的子会话在 Core 中继承父会话的状态。
    • 每次发送在会话的操作锁内读取当前状态,连续切换时最后一次发送的总是最后的状态。
  • “更多”菜单负责树和 JSON 视图的切换(原来在变量区标签上),以及折叠过滤帧的开关。
  • 每个图标按钮鼠标悬停时显示操作名(Viva Tooltip)。顺带给其他只有图标的按钮也加了悬停提示:工具窗口图标按钮(gitToolButton)、随处搜索的预览和筛选、搜索的刷新和选项、替换开关、面板隐藏、新建终端标签、新建项目的选择目录、终端查找的上一个/下一个/关闭、欢迎页设置。
  • 适配器选择器始终收在工具栏右端,宽 160。会话进行中也能切换,切换结果用于下次启动。
    • 状态文字只在下拉显示的不是本会话的适配器时,才在前面带上会话名(pickerShows),避免和下拉重复。
    • 选择器本身没有悬停提示:Viva 的 ui.Select 返回的容器没有标识,不能加 Tooltip,属于 Viva 的 API 缺口。

线程和变量(debug_sections_view.go、debug_threads.go、debug_watch.go、debug_menus.go、debug_breakpoints.go、debug_gutter.go)

  • 左栏:线程下拉(只有一个线程时也显示)、“函数 (文件:行)”格式的栈帧;过滤帧用淡色显示。
  • 栈帧右键菜单末尾新增两项:复制线程名、单独恢复线程。
  • 右栏:
    • 输入框写着“对表达式求值(⏎)或添加监视(⇧⌘⏎)”。回车求值并保留输入;⇧⌘⏎(其他平台是 Ctrl+Shift+Enter)加为监视并清空输入。
    • 监视单独成行显示。
    • 求值结果和监视的失败原因折行完整显示,不再用省略号截断(例如 LLDB 的 “Expression evaluation in pure C not supported. Ran expression as 'ISO C++'…”);求值结果的值也折行完整显示,有值的监视仍为单行。行按首行与图标对齐(debugRowText、debugTextLeading)。
    • 变量树每行是“名称 = {类型} 值”,带类型图标。
  • 分隔条可以用键盘调整(drag.go)。
  • 断点和异常断点从主区域移到“查看断点”对话框,可增删断点、启用/停用断点、选择异常断点。
  • “控制台”标签显示适配器输出。停在末尾时会跟着新行滚动。

反汇编(debug_disassembly.go、debug_sections_view.go、debug_variables.go)

  • 左栏和“线程和变量”共用线程下拉、栈帧和分隔条(debugBesideFrames),右栏是所选栈帧的指令。
    • 切换栈帧时清空反汇编(selectDebugFrame 调用 disassembly.reset()),按新栈帧的指令指针重新打开;没有指令指针的栈帧显示“无反汇编”。
    • 反汇编窗口带 epoch,换帧、换线程或程序继续运行后,旧窗口迟到的回复按 epoch 丢弃,不会填进当前栈帧的窗口。
  • 去掉自带的按钮行:
    • 单步共用工具栏按钮,反汇编标签显示时按指令执行(debugStepGranularity)。
    • 回到当前指令放在“更多”菜单。
  • 行首的红点和编辑器行断点画法相同,点击设置或移除指令断点:已设置是实心,静音时是空心,悬停处淡色。
  • 打开时以当前指令居中。
    • 首次布局按估计行高和窗口高度排版,报告的可见范围不准,所以首次布局后的那一帧不据此加载(opening)。
  • 滚动到顶端或底端时,各加载 64 条指令。
    • 加载前面的指令时,以可见范围的中点为准保持滚动位置。
    • 向前或向后加载失败时,在对应一端显示失败原因和“重试”,点击后重新加载这一端,不再停在失败状态。

内存(debug_memory.go)

  • 地址输入框:
    • 输入十六进制(0x 开头)或十进制地址,回车或点搜索键跳转。
    • 读取范围由 Core 的 debug.planMemoryWindow 计算:数字地址规范成小写 0x 十六进制,按 64 字节对齐,从目标地址所在行开始读 1 KB;适配器给的不透明内存引用从偏移 0 读取;空地址、超过 256 个字符或含控制字符时报错。
    • 读到后由 debug.locateMemoryWindow 算出起始地址和要高亮的字节,Go 只按结果排版,高亮目标字节(十六进制格和 ASCII 格同时高亮)。
    • 没有指令指针的栈帧(或没有栈帧时)也能输入地址读取,不再要求先有当前指令。
  • “回到当前指令”按钮重新从指令指针读取。
  • 每行字节数可选 8 / 16 / 32 / 64。
  • 进制可选十六 / 十 / 八 / 二进制;切换后保留当前地址和高亮。
  • 地址列在绝对地址下显示 0x 加至少 8 位十六进制。
  • 有不可读的字节时显示警告。

测试

  • 新增 title_run_test.go:下拉选择、运行、调试,以及配置读出前按下的情况。
  • 新增 debug_toolbar_test.go,覆盖:
    • 按钮按会话状态启用。
    • 重新运行、静音、更多菜单。
    • 适配器选择器位于工具栏内,并和“开始”按钮对齐。
    • TestDebugToolbarNamesItsIconsAndKeepsTheAdapterSwitchable:每个工具栏图标的悬停提示是操作名;会话中选择器仍在工具栏,切换到别的适配器后状态带上会话名。
    • TestDebugDisassemblyShowsTheStackBesideTheChosenFramesCode:栈帧在指令左侧;选中无指令指针的栈帧显示无反汇编,选回后重新打开当前指令。
    • 反汇编行首红点的设置和移除、按指令单步。
    • 内存的地址跳转、每行 32 字节、二进制和回到当前指令。
  • debug_memory_test.go:各进制、每行字节数、绝对地址标签、高亮位置,以及 TestDebugMemoryBaseReadsCoreAddresses(读取 Core 返回的起始地址)。
  • debug_toolbar_test.go 补充:静音时所有断点类型都经 Core 发送为空、静音状态下启动的会话一开始就静音、反汇编两端加载失败后可重试、没有指令指针时输入地址读取内存。
  • title_run_test.go 补充 TestTitleRunOnAConfigurationNoProviderStartsSaysSo:非构建插件配置按运行给出提示,不发请求、不留等待。
  • core/debug_state_test.go、core/run_config_test.go 用共享 fixture(shared/fixtures/debug/memory-window-v1.json、shared/fixtures/run-configuration/title-action-v1.json)核对 Go 客户端和 Core 的请求、回答形状。
  • debug_threads_test.go 新增 TestDebugEvaluateAndWatchShowTheirWholeReason:长失败原因在求值结果和监视中都完整显示、没有省略号、折成多行且首行和表达式对齐;有失败原因的监视行变高,有值的监视行保持一行高。改回截断写法时该测试失败。
  • debug_menus_test.go:反汇编打开时居中,且不额外加载;复制地址;在该地址读内存。
  • fixture 适配器(debug_adapter_test.go):
    • 新增 supportsInstructionBreakpoints 和 setInstructionBreakpoints。
    • readMemory 按 memoryReference、offset 和 count 应答。
  • 其他调试测试按新的布局和入口更新。

界面文案(shared/i18n/)

  • 新增工具栏、线程、监视、静音、查看断点、内存地址、每行字节数、进制等中英词条,并重新生成 desktop/internal/i18n/shared.generated.go。
  • 处理审核意见时新增:desktop.debug.disassemblyRetry(反汇编重试)、desktop.debug.memoryTypeAddress(选中的栈帧没有指令地址时,提示在上方输入地址)、desktop.title.configurationNotStartable(非构建插件配置无法启动)。
  • 删除不再使用的词条:desktop.debug.breakpoint.instruction、desktop.debug.endOfCode、desktop.debug.loadBefore、desktop.debug.loadAfter、desktop.title.runLater。

Core 固定版本(scripts/desktop/build-desktop-core.sh)

  • PINNED_CORE_REVISION 升到 Lithe-core-rust #21 合入 main 的 c001967,带来 debug.setBreakpointsMuted、debug.planMemoryWindow、debug.locateMemoryWindow、runConfig.decideTitleAction 四个 Core 命令(与审核时用的分支头 3350dd7 源码树相同)。

功能矩阵

  • 新增 viva-title-run-debug、viva-debug-tool-window-layout,两端实现状态为 implemented,验证状态为 pending。
  • 两条记录的验证说明和证据补上:静音经 Core 覆盖所有断点类型、静音时启动的会话即静音、反汇编失败重试、内存窗口与高亮由 Core 计算、没有指令指针也能输入地址,以及标题栏判定在 Core(证据加 core/debug_state.go、core/run_config.go)。
  • debug-variable-json-view 的 notes 写明树和 JSON 的切换已移到“更多”菜单。

不在本 PR 范围内 / Out of scope

  • Go 插件没有声明调试适配器(dlv),所以 Go 运行配置的“调试”目前不可用。
  • 标题栏“当前文件”的运行只给出提示,还不能直接运行打开的文件。
  • 提供者调试不传启动选项(Core 的原生调试准备不接受启动选项)。
  • 调试窗口还没有布局切换按钮、异步栈和包名列(DebugStackFrame 没有包字段);监视还没有并入变量树。
  • 内存不能按表达式跳转:变量还不带 memoryReference。进制只提供 16/10/8/2,没有 4 进制。
  • 编辑器里 Java 标签页缺图标、C 语言没有语法高亮,已由 fix(desktop): Java 文件图标缺失、调试插件声明 C 系语言后无语法高亮 #1840 单独处理并合入 preview。
  • 适配器下拉的悬停提示需要 Viva ui.Select 支持 Tooltip,在 Lithe-IDEA/viva 修。

类型专属:feat

多平台对齐

  • 两端都具备:标题栏和调试窗口都是 macOS 与 Windows 共用的 Viva/Go 代码,合入后两端都具备;Windows 整机验收尚未执行(见“验证”)。
  • 只实现了 macOS:已为 Windows 提交跟进 Issue:#
  • 只实现了 Windows:已为 macOS 提交跟进 Issue:#
  • 刻意只属于某个平台(功能矩阵中另一端记为 platform-specific),理由:

范围检查 / Scope checks

功能矩阵 / Feature matrix

  • 已新增 shared/platform-feature-matrix/features/viva-title-run-debug.json、viva-debug-tool-window-layout.json,更新 debug-variable-json-view.json;两端验证状态保持 pending(没有执行整机验收)
  • 已运行 ./scripts/platform-feature-matrix/verify-platform-feature-matrix.sh 和 ./scripts/platform-feature-matrix/verify-platform-feature-matrix-change.sh origin/preview HEAD
  • 没有提交 .artifacts/ 下生成的矩阵视图
  • [N/A] 没有更新矩阵的理由:已更新矩阵

统一日志系统 / Structured logging

N/A:本 PR 没有新增日志。Viva 桌面端的运行和调试路径还没有接入统一日志系统(仓库里没有 shared/logging/events/),本 PR 也没有改变这一点。

界面文案 / i18n

  • 文案都走共享 i18n:在 shared/i18n/ 补齐中英词条,运行 node scripts/i18n/generate-i18n.mjs 并提交生成结果,没有手改生成文件
  • 已运行 node scripts/i18n/verify-app-language-localization.mjs 和 node scripts/i18n/generate-i18n.mjs --check,没有放宽脚本或扩大豁免名单

逻辑归属 / Logic placement

  • 反汇编分页(窗口、拒绝后的恢复、边缘探测、去重)、运行声明校验、调试准备的解码、断点静音、内存窗口的地址解析/对齐/高亮定位,以及标题栏按下后的判定都在 Rust Core;Go 只报告事实、发请求和保存结果
  • Go 层只剩内存视图的按行排版(进制、每行字节数、ASCII 列),属于界面呈现
  • 工具或运行时专属的知识放在插件或成熟上游,宿主和 Core 没有按工具名加分支;调试适配器由运行声明的 debug.adapter 指定

性能与内存 / Performance and memory

  • 没有新增后台功能、子进程、定时器或依赖。内存每次只读 1 KB,反汇编每次只加载 64 条,都在滚动到端点时才加载
  • 配置读取、调试准备、读内存、反汇编都在窗口线程之外完成。重新运行时等待会话退出有上限
  • [N/A] 性能基线:没有改动启动、打开项目、输入、大文件、长输出或搜索路径;反汇编和内存列表用虚拟列表

设置 / Settings

N/A:没有新增或修改设置项、设置页。

插件契约 / Plugin contract

N/A:没有改动插件契约、能力版本、插件函数协议,也没有新增或修改宿主方法与通知。debug.adapter 和 build.decodeDebugPreparation 已在 Core 中,本 PR 只让 Go 客户端按它们已有的形状读取。新增的四个是宿主调用 Core 的内部命令(Core #21),不是插件可见的 API;请求和回答形状由 shared/fixtures/ 下的两个 fixture 固定。

发行包与资源 / Bundle and resources

N/A:没有新增运行时资源、缓存、下载物或构建步骤;新增图标编译进可执行文件(generate-desktop-icons.sh 生成 icons.go)。仍运行了 ./scripts/desktop/verify/verify-runtime-bundle-immutability.sh,结果通过。

无用代码与重构 / Dead code and refactoring

  • 本次改动导致变成无用的代码已在本 PR 删除,包括反汇编按钮行、断点主区域列表、旧的调试分区标签和变量区 JSON 切换,以及它们的词条
  • 本次之前就存在的可重构之处:没有发现新的;内存排版放在哪一层见“逻辑归属”

验证 / Verification

命令或操作 平台 结果
gofmt -l desktop/internal macOS 无输出
scripts/desktop/desktop-go.sh vet ./... macOS 通过(固定 Core c001967,identity core-source=pinned)
scripts/desktop/desktop-go.sh test ./... macOS 52 个包全部 ok,无 FAIL(处理审核意见、合入最新 preview 后用固定 Core 重跑)
desktop-go.sh test ./internal/workbench/ -run 'TestDebug' macOS 通过(含求值错误完整显示的改动)
desktop-go.sh test ./internal/workbench/ -run 'TestDebugToolbarNamesItsIcons|TestDebugDisassemblyShowsTheStack' -count=3 macOS 通过
node scripts/i18n/generate-i18n.mjs --check macOS 通过
node scripts/i18n/verify-app-language-localization.mjs macOS 通过(en-US、zh-CN 均 10999/10999)
./scripts/platform-feature-matrix/verify-platform-feature-matrix.sh macOS 通过(219 条)
./scripts/platform-feature-matrix/verify-platform-feature-matrix-change.sh origin/preview HEAD macOS 通过
./scripts/desktop/verify/verify-runtime-bundle-immutability.sh macOS 通过(desktop macOS 与 Windows 源码)
.agents/skills/write-stable-tests/scripts/verify-test-stability.sh --base origin/preview macOS 通过

未能执行的检查和原因:

  • 整机界面:开发过程中在本机构建版本上看过工具栏、反汇编、内存的界面,并按意见调整过;最终版本的明暗主题和中英文截图,以及用真实 LLDB 适配器的整机验收,待维护者确认。
  • Windows:没有在 Windows 上构建或运行,依赖完整 CI。

提交前确认 / Final checks

- 标题栏:运行配置下拉、运行、调试按钮接入当前运行配置;会话进行中显示停止与重新运行
- 调试工具栏改为图标按钮:重新运行、停止 | 继续、暂停、单步跳过/进入/跳出 | 查看断点、静音断点 | 更多;
  未开始会话时适配器选择器收在工具栏右端
- 线程和变量:线程下拉、“函数 (文件:行)”栈帧、求值/添加监视输入框、带类型图标的变量树;
  断点与异常断点移到“查看断点”对话框
- 反汇编:去掉自带按钮行,工具栏单步按指令执行,行首红点增删指令断点,打开时以当前指令居中,
  滚动到两端加载更多代码
- 内存:可输入地址跳转(十六进制或十进制),每行 8/16/32/64 字节,十六/十/八/二进制切换,
  高亮目标字节
- 补齐中英词条与功能矩阵条目
@ghfind-review ghfind-review Bot added the review: high ghfind author score; see https://ghfind.com label Nov 13, 2026
@xiaoyumuxi
xiaoyumuxi marked this pull request as ready for review November 13, 2026 03:53
@lithe-code-review

lithe-code-review Bot commented Nov 13, 2026 •

Copy link
Copy Markdown

Lithe Review

结论: ⚠️ 有建议
范围: preview ← feature/1794-run-debug-toolbar · head: 380cfeb

未发现需要阻塞合并的问题。以下为本次引入的 P2 非阻塞问题。

Findings

  1. [P2 / 本次引入] 反汇编分页失败后会持续自动重试
    desktop/internal/workbench/debug_disassembly.go:90

    • 实际影响:用户停在列表边缘时,失败请求会反复发送,持续占用适配器和后台任务。
    • 触发条件:已有指令列表,边缘请求最终失败;reduceDisassembly 将 loading 清为 false,但 loadDisassemblyAtEdges 不检查 failure,也没有暂停重试状态。
    • 复现步骤:加载反汇编并滚到顶部,让分页请求超时。Core 返回 failed 后,下一次绘制仍满足第 101 行条件,会再次请求同一页。现有 shared/fixtures/debug/disassembly-paging-v1.json 已包含返回终态失败的超时场景。
    • 修复方向:失败后暂停该方向的自动加载,提供本地化的显式重试入口;补充失败后多次绘制仍不新增请求的回归测试。base 使用手动分页按钮,不会自动进入此循环。
  2. [P2 / 本次引入] 静音没有覆盖异常断点及所有会话
    desktop/internal/workbench/debug_mute.go:43

    • 实际影响:工具栏显示断点已静音,调试目标仍可能因断点暂停。
    • 触发条件:启用了异常断点,或父子会话中非当前会话已有函数、指令或数据断点。
    • 复现步骤:启用一个异常过滤器,点击静音,再触发该异常。此函数从未更新异常过滤器;debug_exceptions.go:57 的选择也不考虑 muted。此外,第 47–54 行调用的三种发送函数均只更新 activeSession(),与行断点遍历所有会话的行为不同。
    • 修复方向:静音和恢复应按各会话的能力更新全部相关断点类型,包括默认启用的异常过滤器;覆盖静音后新建会话及父子会话场景。现有新增静音测试只验证行断点。
  3. [P2 / 本次引入] 新增共享规则仍在 Go 层实现
    desktop/internal/workbench/debug_memory.go:136

    • 实际影响:本次继续在客户端建立独立于 Rust Core 的行为规则,未满足 [Feature] Windows/macOS 统一 Viva 工作台与原生编辑器,保留 Rust Core 和插件体系(分阶段重构) #1794 和 develop-lithe 的逻辑归属要求。
    • 触发条件:输入十进制地址或读取未按 64 字节对齐的地址时,Go 负责解析、规范化并计算实际请求的负 offset。这会改变读取位置,超出了文字排版。新增的标题动作等待状态机和断点静音投影同样不依赖平台 API。
    • 复核路径:readDebugMemoryAt → parseDebugAddress → loadDebugMemory;titleStart → settleTitleAction → performTitleAction;sessionSourceBreakpoints / unlessMuted。这些新增规则没有对应 Core 命令及共享 fixture。
    • 修复方向:将地址输入规范化、读取窗口计划、启动等待规则和静音投影交给 Core,补齐命令与 fixture;Go 保留输入、绘制、滚动及原生 I/O。PR 中将地址解析归为呈现、等待维护者确认后再建单,不能满足新增共享规则必须先进入 Core 的要求。
  4. [P2 / 本次引入] 没有指令指针的栈帧无法使用新增地址输入框
    desktop/internal/workbench/debug_memory.go:291

    • 实际影响:适配器支持读取内存、用户也知道绝对地址时,仍无法输入地址发起读取。
    • 触发条件:会话暂停,supportsReadMemoryRequest 为 true,但选中栈帧没有 instructionPointerReference。
    • 复现步骤:让 fixture 的栈帧省略指令指针,打开内存标签。第 281 行的检查会因引用为空提前返回,新增工具栏根本不显示;而用户必须通过这个工具栏才能设置 memory.at。共享契约中的显式 readMemory 请求并不要求栈帧提供指令指针。
    • 修复方向:区分“允许输入地址”和“可以回到当前指令”;在适配器支持且会话暂停时显示输入框,仅禁用依赖指令指针的动作,并增加该场景测试。

Scope Check

  • 关联需求与完成范围:对应 [Feature] Windows/macOS 统一 Viva 工作台与原生编辑器,保留 Rust Core 和插件体系(分阶段重构) #1794 的标题栏运行/调试和调试工具窗口切片,不能据此认定整个迁移 Epic 完成。
  • 未完成范围:当前文件运行、部分调试能力和真实适配器验收已在 PR 中明确列出;这些范围声明本身不作为缺陷。
  • 上游复用:运行准备和 DAP 继续使用插件与既有 Core 接口,未发现新增工具名特判或第二套 DAP 引擎。
  • Findings 均指向本次新增行为或新增控件受旧检查条件直接影响的路径。

架构归属对账

逻辑块(路径与符号) 归属 依据
desktop/internal/core/build.go:DecodeBuildDebug、desktop/internal/pluginservice/builds.go:parseBuildSystems 的字段接线 rust/lithe-core 结果的薄桥接 build.decodeDebugPreparation;测试引用外部 Core 的 shared/plugins/contract/v1/fixtures/build-providers/build-debug-preparation.json
desktop/internal/workbench/build.go:debugProviderTarget/startProviderDebug 的保存与启动接线 平台 API / Core 计划 复用保存入口、filepath.Join 和原有适配器启动路径;准备事实由 build.prepareDebugPlan、build.decodeDebugPreparation 返回
desktop/internal/workbench/title_run.go:titleStart/settleTitleAction/performTitleAction 的等待与动作规则 应归 rust/lithe-core,尚未下沉 未提供对应命令与 fixture,见 Finding 3
desktop/internal/workbench/debug_mute.go:sessionSourceBreakpoints/unlessMuted 应归 rust/lithe-core,尚未下沉 Go 自行决定发送集合;未提供静音规则命令与 fixture,见 Finding 3
desktop/internal/workbench/debug_memory.go:parseDebugAddress/loadDebugMemory 的规范化与对齐 应归 rust/lithe-core,尚未下沉 debug.inspect 接收到的是 Go 已算好的引用与偏移;缺少对应计划命令与 fixture,见 Finding 3
desktop/internal/workbench/debug_disassembly.go 的分页计划与回复归约 rust/lithe-core debug.planDisassemblyWindow、debug.reduceDisassemblyPage;shared/fixtures/debug/disassembly-paging-v1.json
工具栏、标题菜单、线程/变量/监视呈现、内存文本排版及滚动定位 平台 API 使用 Viva ui.List、ui.Tree、ui.Menu、ui.TextField、ui.Splitter 和 ListState.ScrollTo;像素与焦点状态留在视图
编辑器断点呈现与分隔条键盘接线 平台 API editorview.SetBreakpoints、gfx.KeyEvent、SplitterState.Key
  • 存量未沉入清单:无新增确认的存量条目;Finding 3 属于本次新增或扩大的规则。

Checked and cleared

  • 两端共用本次 Viva 工作台实现,未新增 macOS/Windows 两套功能逻辑;原生平台验证仍分别需要完成。
  • 提供者调试按插件身份和准备结果指定的适配器 ID 匹配,已删除“选择同插件第一个适配器”的行为。
  • 调试准备先走文档保存;后台结果通过现有项目归属检查应用,关闭项目后不会应用到新项目。
  • 新增用户文案使用共享 i18n,源词条补齐中英文;未修改 i18n 校验脚本。
  • 功能矩阵保持两端验证状态为 pending,没有将共享代码或无头测试写成原生验收通过。

Suggestions

  1. 对应 Finding 1:增加分页失败暂停状态、显式重试和请求次数断言。
  2. 对应 Finding 2:统一静音的断点类型及会话覆盖范围,测试异常过滤器和父子会话。
  3. 对应 Finding 3:先补 Core 命令、共享 fixture,再将客户端改为执行和呈现返回结果。
  4. 对应 Finding 4:让绝对地址输入独立于指令指针,并测试缺少指令指针的有效暂停帧。
  5. 补充最终 head 的界面前后对比截图,展示标题栏、调试工具窗口、反汇编和内存视图。当前上下文没有截图,视觉效果尚未验证。

Summary

主要接线复用了既有 Core、插件和 Viva 组件。建议补齐分页失败、静音范围及无指令指针场景,并落实新增共享规则的 Core 归属。新增测试覆盖了主要成功路径,尚未覆盖上述失败与能力组合。

Verification

  • 实际检查:指定 e145b2b3...380cfebe 的相关 diff、base 实现,以及启动、保存、断点发送、分页归约、内存请求和直接关联测试;生成图标和生成字典正文按要求未读取。
  • 作者提供:macOS 全量 Go 测试、vet、聚焦调试测试、i18n、矩阵、发行资源只读和静态测试稳定性检查通过;这些结果未由本次审查重新执行。
  • head Check Run:Verify pins、矩阵检查成功;Linux/macOS/Windows 测试及格式检查仍为进行中,不能视为通过。
  • 本次未运行任何仓库代码、脚本、测试或应用,未访问网络。
  • 验证缺口:未提供截图、真实 LLDB 最终工作流、Windows 原生验收、受影响包竞态与逐测试计时结果,以及滚动场景的性能对比。

- 调试工具栏和其他只有图标的按钮(工具窗口按钮、搜索、终端查找、欢迎页设置等)鼠标悬停显示操作名
- 调试适配器下拉在会话中仍显示并可切换,供下次启动;状态只在下拉显示的不是该会话适配器时带会话名
- 反汇编标签左栏复用线程下拉和栈帧,右栏显示所选栈帧的指令;切换栈帧重置反汇编,
  过期回复按 epoch 丢弃
- 求值结果和监视的失败原因折行完整显示,不再截断;有值的监视保持单行
…败可重试

- 静音断点:Core 新增 debug.setBreakpointsMuted,静音期间源码、异常、函数、指令和数据断点都以空集合发送;静音时启动的会话一创建就静音
- 内存窗口:读取范围、对齐、地址规范化和高亮位置由 Core 的 debug.planMemoryWindow / debug.locateMemoryWindow 计算;没有指令指针的栈帧也能读输入的地址
- 标题栏运行/调试:按下后做什么由 Core 的 runConfig.decideTitleAction 判定;没有构建插件负责的配置给出提示
- 反汇编:向前、向后翻页失败时显示重试
- PINNED_CORE_REVISION 升到 Lithe-core-rust #21 分支头 3350dd7
@xiaoyumuxi

Copy link
Copy Markdown
Collaborator Author

已在 60473564a(之后 7ca23a973 把 Core 固定到合入后的 c001967,d09c4fde0 合入最新 preview)处理本次 Lithe Review 的 4 条 P2:

  1. 反汇编分页失败后持续自动重试:失败后记下失败的一端(failedEdge),该端停止自动加载,显示失败原因和本地化的“重试”(desktop.debug.disassemblyRetry),点击后才重新加载。TestDebugDisassemblyEdgeFailureWaitsForRetry 断言停在失败一端连续绘制 5 次都不发新请求,点击重试后页面到达、失败状态清除。
  2. 静音没有覆盖异常断点和所有会话:静音改由 Core 的 debug.setBreakpointsMuted 处理,Core 保存每个会话的断点集合,静音期间把源码、异常(包括默认启用的过滤器)、函数、指令、数据断点全部以空集合发送,取消静音时重发保存的集合;工具栏开关遍历本项目所有会话;静音状态下启动的会话在创建后、发送断点前就设为静音;startDebugging 子会话在 Core 中继承父会话状态。测试:TestDebugMuteSendsEveryKindEmptyAndUnmuteRestoresThem、TestDebugSessionStartedWhileMutedStartsMuted。
  3. 新增共享规则仍在 Go 层:三处都下沉到 Core(Lithe-core-rust [Feature] 支持空闲模块及后台应用休眠 #21)并用共享 fixture 固定形状:
    • 内存:debug.planMemoryWindow 负责地址规范化、64 字节对齐、读取窗口和输入校验,debug.locateMemoryWindow 负责起始地址和高亮位置;parseDebugAddress 已删除。fixture:shared/fixtures/debug/memory-window-v1.json。
    • 标题栏:runConfig.decideTitleAction 根据 Go 报告的事实决定等待、加载模型、运行、调试或提示;performTitleAction 已删除。fixture:shared/fixtures/run-configuration/title-action-v1.json。
    • 静音:见第 2 条,unlessMuted 已删除。
      Go 层只剩输入、绘制、滚动和原生 I/O。
  4. 没有指令指针的栈帧无法使用地址输入框:会话暂停且适配器支持 readMemory 时就显示地址输入框,只有“回到当前指令”依赖指令指针;没有指令指针时提示在上方输入地址(desktop.debug.memoryTypeAddress)。测试:TestDebugMemoryReadsAtATypedAddressOnAFrameWithoutAnInstructionPointer。

本地验证(macOS,固定 Core c001967):desktop-go.sh vet ./...、test ./...(52 个包全部 ok)、gofmt、i18n 两项检查、功能矩阵两项检查、发行包只读检查、测试稳定性检查都已通过。截图和真实 LLDB/Windows 验收仍按 PR 描述所列待做。

@xiaoyumuxi
xiaoyumuxi merged commit 42d6fb9 into preview Nov 13, 2026
4 of 6 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

review: high ghfind author score; see https://ghfind.com

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant