Repository navigation
feat(desktop): #1794 标题栏运行/调试接入,调试工具窗口按 IntelliJ IDEA 布局重做 - #1837
Conversation
- 标题栏:运行配置下拉、运行、调试按钮接入当前运行配置;会话进行中显示停止与重新运行 - 调试工具栏改为图标按钮:重新运行、停止 | 继续、暂停、单步跳过/进入/跳出 | 查看断点、静音断点 | 更多; 未开始会话时适配器选择器收在工具栏右端 - 线程和变量:线程下拉、“函数 (文件:行)”栈帧、求值/添加监视输入框、带类型图标的变量树; 断点与异常断点移到“查看断点”对话框 - 反汇编:去掉自带按钮行,工具栏单步按指令执行,行首红点增删指令断点,打开时以当前指令居中, 滚动到两端加载更多代码 - 内存:可输入地址跳转(十六进制或十进制),每行 8/16/32/64 字节,十六/十/八/二进制切换, 高亮目标字节 - 补齐中英词条与功能矩阵条目
Lithe Review结论: 未发现需要阻塞合并的问题。以下为本次引入的 P2 非阻塞问题。 Findings
Scope Check
架构归属对账
Checked and cleared
Suggestions
Summary主要接线复用了既有 Core、插件和 Viva 组件。建议补齐分页失败、静音范围及无指令指针场景,并落实新增共享规则的 Core 归属。新增测试覆盖了主要成功路径,尚未覆盖上述失败与能力组合。 Verification
|
- 调试工具栏和其他只有图标的按钮(工具窗口按钮、搜索、终端查找、欢迎页设置等)鼠标悬停显示操作名 - 调试适配器下拉在会话中仍显示并可切换,供下次启动;状态只在下拉显示的不是该会话适配器时带会话名 - 反汇编标签左栏复用线程下拉和栈帧,右栏显示所选栈帧的指令;切换栈帧重置反汇编, 过期回复按 epoch 丢弃 - 求值结果和监视的失败原因折行完整显示,不再截断;有值的监视保持单行
…败可重试 - 静音断点:Core 新增 debug.setBreakpointsMuted,静音期间源码、异常、函数、指令和数据断点都以空集合发送;静音时启动的会话一创建就静音 - 内存窗口:读取范围、对齐、地址规范化和高亮位置由 Core 的 debug.planMemoryWindow / debug.locateMemoryWindow 计算;没有指令指针的栈帧也能读输入的地址 - 标题栏运行/调试:按下后做什么由 Core 的 runConfig.decideTitleAction 判定;没有构建插件负责的配置给出提示 - 反汇编:向前、向后翻页失败时显示重试 - PINNED_CORE_REVISION 升到 Lithe-core-rust #21 分支头 3350dd7
|
已在
本地验证(macOS,固定 Core |
关联 Issue / Linked issue
PR 类型 / Type
改动说明 / 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)。runConfig.decideTitleAction判定:Go 只报告事实(运行还是调试、按下还是配置读出后再问、是否选了当前文件、配置是否读完,以及所选配置的实例是否检测到、模型是否加载/上次加载失败/运行是否声明了调试适配器),按 Core 的回答等待、先加载模型、启动、调试或给出提示。上次加载失败的模型只在按下时重载,再次失败就结束,不会循环。process配置)时,提示“无法启动 {name}:没有构建插件负责运行它。”提供者调试(
core/build.go、pluginservice/builds.go、workbench/build.go、build_menus.go)Client.DecodeBuildDebug改为返回BuildDebugPreparation,对应 Corebuild.decodeDebugPreparation的preparation字段,包含适配器本地 ID、根目录、程序、参数、工作目录和环境。请求新增run字段,用来标明是哪个运行声明。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)generate-desktop-icons.sh生成到icons.go。rerunDebug):停止本项目的会话(包括子会话),按首次启动的方式重启。debug_mute.go):断点保留并照常显示(淡色),宿主照常发送每次修改;由 Core 的debug.setBreakpointsMuted记住每个会话的断点集合,静音期间把源码、异常、函数、指令、数据断点全部以空集合发给适配器,取消静音时重发保存的集合。debug_start.go)。经startDebugging启动的子会话在 Core 中继承父会话的状态。Tooltip)。顺带给其他只有图标的按钮也加了悬停提示:工具窗口图标按钮(gitToolButton)、随处搜索的预览和筛选、搜索的刷新和选项、替换开关、面板隐藏、新建终端标签、新建项目的选择目录、终端查找的上一个/下一个/关闭、欢迎页设置。pickerShows),避免和下拉重复。ui.Select返回的容器没有标识,不能加Tooltip,属于 Viva 的 API 缺口。线程和变量(
debug_sections_view.go、debug_threads.go、debug_watch.go、debug_menus.go、debug_breakpoints.go、debug_gutter.go)debugRowText、debugTextLeading)。drag.go)。反汇编(
debug_disassembly.go、debug_sections_view.go、debug_variables.go)debugBesideFrames),右栏是所选栈帧的指令。selectDebugFrame调用disassembly.reset()),按新栈帧的指令指针重新打开;没有指令指针的栈帧显示“无反汇编”。epoch,换帧、换线程或程序继续运行后,旧窗口迟到的回复按 epoch 丢弃,不会填进当前栈帧的窗口。debugStepGranularity)。opening)。内存(
debug_memory.go)debug.planMemoryWindow计算:数字地址规范成小写 0x 十六进制,按 64 字节对齐,从目标地址所在行开始读 1 KB;适配器给的不透明内存引用从偏移 0 读取;空地址、超过 256 个字符或含控制字符时报错。debug.locateMemoryWindow算出起始地址和要高亮的字节,Go 只按结果排版,高亮目标字节(十六进制格和 ASCII 格同时高亮)。0x加至少 8 位十六进制。测试
title_run_test.go:下拉选择、运行、调试,以及配置读出前按下的情况。debug_toolbar_test.go,覆盖:TestDebugToolbarNamesItsIconsAndKeepsTheAdapterSwitchable:每个工具栏图标的悬停提示是操作名;会话中选择器仍在工具栏,切换到别的适配器后状态带上会话名。TestDebugDisassemblyShowsTheStackBesideTheChosenFramesCode:栈帧在指令左侧;选中无指令指针的栈帧显示无反汇编,选回后重新打开当前指令。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:反汇编打开时居中,且不额外加载;复制地址;在该地址读内存。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/debug_state.go、core/run_config.go)。debug-variable-json-view的 notes 写明树和 JSON 的切换已移到“更多”菜单。不在本 PR 范围内 / Out of scope
DebugStackFrame没有包字段);监视还没有并入变量树。memoryReference。进制只提供 16/10/8/2,没有 4 进制。ui.Select支持Tooltip,在 Lithe-IDEA/viva 修。类型专属:feat
多平台对齐
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/下生成的矩阵视图统一日志系统 / Structured logging
N/A:本 PR 没有新增日志。Viva 桌面端的运行和调试路径还没有接入统一日志系统(仓库里没有
shared/logging/events/),本 PR 也没有改变这一点。界面文案 / 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
debug.adapter指定性能与内存 / Performance and memory
设置 / 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
验证 / Verification
gofmt -l desktop/internalscripts/desktop/desktop-go.sh vet ./...c001967,identitycore-source=pinned)scripts/desktop/desktop-go.sh test ./...desktop-go.sh test ./internal/workbench/ -run 'TestDebug'desktop-go.sh test ./internal/workbench/ -run 'TestDebugToolbarNamesItsIcons|TestDebugDisassemblyShowsTheStack' -count=3node scripts/i18n/generate-i18n.mjs --checknode scripts/i18n/verify-app-language-localization.mjs./scripts/platform-feature-matrix/verify-platform-feature-matrix.sh./scripts/platform-feature-matrix/verify-platform-feature-matrix-change.sh origin/preview HEAD./scripts/desktop/verify/verify-runtime-bundle-immutability.sh.agents/skills/write-stable-tests/scripts/verify-test-stability.sh --base origin/preview未能执行的检查和原因:
提交前确认 / Final checks
preview的e145b2b3c创建;处理审核意见后用 merge 合入最新preview(feat(ci): 每天从 preview 自动构建并滚动发布 Desktop AutoBuild(macOS/Windows/Linux) #1839、fix(desktop): Java 文件图标缺失、调试插件声明 C 系语言后无语法高亮 #1840),没有冲突,没有 rebase 或强制推送;目标分支:preview.build/、target/、dist/、.artifacts/等产物,没有凭据、个人路径和未脱敏的日志或截图