- 开发工具
- 数据可视化
【免费下载链接】vscode-debug-visualizer
An extension for VS Code that visualizes data during debugging.
本篇文章以 Debug Visualizer 扩展(位于extension/目录)官方变更日志 extension/CHANGELOG.md 为骨架,逐版本梳理该扩展从 0.9.0 初版到 2.6.0 的功能演进:可视化视图与命令、数据提取器、调试适配器支持、远程开发适配、自定义脚本注入等关键能力,并结合extension/src源码验证每项能力的真实实现与配置方式。读完本文,你将完整掌握该扩展的配置项语义、命令快捷键、多语言支持边界,以及"数据提取器 + 可视化框架"这一核心架构的形成过程。
版本演进总览
从 0.9.0 到 2.6.0,扩展经历了三个明显阶段:基础能力搭建期(0.x)、稳定与体验优化期(1.x)、数据提取器与自定义能力爆发期(2.x)。各版本核心变化如下表:
| 版本 | 核心变化 |
|---|---|
| 0.9.0 | 初始发布 |
| 0.11.0 | 多行表达式输入、Helper Bundle 注入、Plotly 可视化、对象图与 Plotly 数据提取器 |
| 0.12.0 | 通用调试适配器支持(PHP/Java/C#)、暗色主题、Grid 可视化 |
| 0.13.0 | 新增debugVisualizer.debugAdapterConfigurations配置 |
| 0.14.0 | 新增命令 "Use Selection as Expression"(Shift+F1)、代码分包优化加载 |
| 1.0.0 | 基于类型的自动补全、License 改为 GPL-3.0、可视化错误捕获 |
| 1.1.0 | pwa-chrome适配器、repl 求值上下文、远程开发支持 |
| 2.0.0 | 新版 JS 调试适配器、可视化框架独立、全新设计与 Logo |
| 2.2.0 | 新增debugVisualizer.js.customScriptPaths自定义数据提取器脚本 |
| 2.4.0 | Ruby 支持、新增debugVisualizer.customVisualizerScriptPaths、内置 JS 数据提取器 |
| 2.6.0 | 改进 JS 数据提取器、使用活动栈帧求值 |
基础能力搭建期(0.x):可视化、数据提取器与通用调试适配器
0.9.0–0.11.0:初版核心架构成型
0.9.0 为初始发布,随后的 0.11.0 确立了扩展的两大核心能力支柱:
- 多行表达式输入(Multiline Expression Input):可视化视图中的表达式输入框支持多行书写。README 中明确了快捷键约定——
shift+enter换行、ctrl+enter求值;单行时enter直接提交表达式。这与 webview 组件 ExpressionInput.tsx 的实现相对应。 - Plotly 可视化器与 Plotly 数据提取器:新增基于 Plotly 的图表可视化和对应的数据提取器。数据提取器实现位于>"debugVisualizer.debugAdapterConfigurations": { "lldb": { "expressionTemplate": "script to_json(\"${expr}\")", "context": "repl" } }
参数语义:
expressionTemplate:发送给调试器的最终表达式模板,${expr}会被替换为当前可视化表达式。例如 Swift/Lua 等语言的调试器需要先把表达式包进脚本调用才能得到 JSON。context:求值上下文,取值为"watch"或"repl"。
配置的解析与渲染实现在 extension/src/Config.ts 的
getDebugAdapterConfig与evaluateTemplate中:expressionTemplate默认为${expr},context默认为watch;渲染时按key -> ${key}做字符串替换。该配置通过ConfigurableVisualizationSupport(extension/src/VisualizationBackend/ConfigurableVisualizationSupport.ts)接入后端分发链,且会覆盖对应调试适配器类型的内置支持。0.14.0:命令体系完善与加载优化
- 新增命令"Debug Visualizer: Use Selection as Expression",快捷键Shift+F1。命令实现见 extension/src/extension.ts:优先取编辑器选区文本;若选区为空,则尝试匹配当前行内反引号
`包裹的内容(如模板字符串中的子表达式);随后将表达式写入最近打开的视图(latestConnection.setExpression(selectedText)),若尚无视图则新建一个并携带该表达式(this.views.createNew(selectedText))。 - 命令 "Open a new Debug Visualizer View" 更名为"Debug Visualizer: New View"(内部 id 为
vscode-debug-visualizer.new-visualizer)。 - 表达式输入框在失去焦点时自动提交表达式;输入框模式固定为纯文本
text而非 TypeScript,因为扩展需支持多种语言。 - 通过将代码拆分为多个 bundle 优化加载时间,并修复了 Monaco 编辑器加载错误。
1.x 稳定期:求值可靠性、远程开发与类型自动补全
1.0.0:错误处理与交互强化
- "Use Selection as Expression" 在无视图时自动新建视图(前述
createNew(selectedText)行为)。 - 类型驱动的自动补全:当调试 JavaScript/TypeScript 时,表达式输入框基于类型提供自动补全。补全由
VisualizationWatchModelImpl.getCompletions(extension/src/VisualizationWatchModel/VisualizationWatchModelImpl.ts)转发给后端实现。 - License 从 MIT 变更为 GPL-3.0,这一变更在 extension/package.json 与 extension/LICENSE.md 中固化。
- 捕获可视化错误而非让整个 webview 崩溃:求值/解析/渲染过程中的错误被转化为格式化错误消息(
FormattedMessage)展示在视图内。
1.1.0:调试会话时序、pwa-chrome 与远程开发
- 修复调试会话启动后才打开可视化视图的 bug:此前若在调试会话开始后再打开视图,可能取不到数据;1.1.0 修复了该时序问题。
- 修复 VS Code 对同一会话多次触发调试追踪导致的 bug。
- 支持新版
pwa-chrome调试适配器。 - 默认使用
repl求值上下文,避免响应被截断。这一默认值在 GenericVisualizationSupport.ts 的getContext()中有明确注释:// we will use "repl" as default so that results are not truncated. - 改进求值/解析失败时的错误信息。
- 设置
webview.retainContextWhenHidden为 true:已打开过的可视化视图会保留上下文,重新显示时加载更快。 - 配置
webview.portMapping:使扩展在**远程开发(Remote Development)**场景下可用。
2.x 爆发期:数据提取器体系、自定义脚本与活动栈帧
2.0.0:新版 JS 调试适配器与可视化框架独立
- 支持新版 JS 调试适配器(
pwa-node等,详见下文源码证据)。 - 可视化层独立为
github.com/hediet/visualization框架:扩展自身专注于"求值 + 数据提取",实际渲染交给通用可视化框架,扩展通过其公开的 JSON 数据契约(可视化数据 schema)驱动渲染。这是架构上的重要分水岭——从此"数据提取(data-extraction 包)+ 可视化渲染(visualization 框架)+ 调试集成(extension 本体)"三层解耦。 - 新增/改进可视化器、改进设计并强化暗色主题,更换新 Logo(见 extension/docs/logo.drawio.png)。
2.0.6:提取器修复与 Table 提取器
- 修复 Grid 提取器、Perspective.js、AST 可视化器的 bug。
- 新增 Table 数据提取器(data-extraction/src/js/api/default-extractors/TableExtractor.ts)。
- 改进 TypeScript 数据提取器。
2.1.0:文本 Diff 与更多 JS 调试适配器
- 新增文本 diff 与文本装饰查看器(text diff and text decoration viewer):文本型可视化从单一 text 视图扩展为差异对比与装饰高亮能力,对应数据提取器见>"debugVisualizer.js.customScriptPaths": [ "${workspaceFolder}/custom-visualizer.js" ]
脚本契约:路径必须为绝对路径,可使用
${workspaceFolder}变量(模板渲染实现在 extension/src/Config.ts 的SimpleTemplate中,${workspaceFolder}会替换为首个工作区文件夹的fsPath);脚本必须把module.exports赋值为类型import('@hediet/debug-visualizer-data-extraction').LoadDataExtractorsFn的函数。注入与热重载逻辑位于 extension/src/VisualizationBackend/JsVisualizationSupport.ts 的CustomScripts类:它通过FileWatcher监视文件变化,把脚本内容包进function (module) { ... }求值,得到module.exports后调用setDataExtractorFn(path, fn)注册;文件不存在或执行出错时通过showErrorMessage提示用户。README 给出了一个把Map转成 Table 可视化的完整示例脚本(demos/js/custom-visualizer.js 为可运行样例)。2.3.0:Python 支持改进
改进对 Python 调试器的支持,对应后端为
PyEvaluationEngine(extension/src/VisualizationBackend/PyVisualizationSupport.ts)。2.4.0:Ruby 支持与自定义可视化器脚本
- Ruby 支持:新增
RbEvaluationEngine(extension/src/VisualizationBackend/RbVisualizationSupport.ts),配合rdbg调试适配器,演示见 demos/ruby。 - 新增配置
debugVisualizer.customVisualizerScriptPaths:与 2.2.0 的customScriptPaths不同,该配置注入的是**可视化器(webview 侧)**而非被调试进程:脚本须把module.exports赋值为类型import('@hediet/visualization-core').RegisterVisualizerFn的函数,用于注册自定义可视化器。注入在 extension/src/webview/WebviewConnection.ts 的FileWatcher中完成。 - 新增内置 JS 数据提取器(JS data extractors)。
2.6.0:活动栈帧求值与提取器改进
2.6.0 有两个重要改进:
- 改进 JS 数据提取器(Improved JS data extractors)。
- 使用活动栈帧(active stack frame)而非最顶层栈帧求值:这是对多线程/异步场景的准确性修复。此前求值固定在最顶层栈帧,可能求值到错误的上下文;现在改为跟踪用户当前选中的栈帧。
从源码看,活动栈帧的获取是一个巧妙但略显"hacky"的实现(extension/src/proxies/DebuggerViewProxy.ts,源码注释直言
This is currently all faked. A proper API would be nice.):扩展注册了一个InlineValuesProvider(FrameIdGetter),VS Code 在渲染内联值时会把当前活动栈帧的context.frameId写入调试会话代理对象的_activeStackFrameId属性,此后各后端通过debuggerView.getActiveStackFrameId(session)读取该 ID 作为evaluate请求的frameId。JS 后端在 JsVisualizationSupport.ts 中据此获取帧 ID,并额外拉取该帧的栈跟踪与变量名列表,用于构造提取器所需的求值闭包。配置项全景(截至 2.6.0)
结合 extension/package.json 的
contributes.configuration与 extension/src/Config.ts,扩展当前共有四个配置项:配置项 类型 默认值 作用与注入目标 debugVisualizer.useChromeKioskModeboolean true是否用 Chrome Kiosk 模式弹出可视化视图;Chrome 不可用时回退默认浏览器(WebviewConnection.ts 的 openInBrowser)debugVisualizer.debugAdapterConfigurationsobject {}按调试适配器类型定制 expressionTemplate与context,覆盖内置支持debugVisualizer.js.customScriptPathsstring[] []注入被调试进程的自定义数据提取器脚本,支持 ${workspaceFolder},改动自动重载debugVisualizer.customVisualizerScriptPathsstring[] []注入 webview 侧的自定义可视化器注册脚本,支持 ${workspaceFolder}对应的读取实现均封装在
Config类中:customScriptPaths与customVisualizerScriptPaths会通过SimpleTemplate渲染${workspaceFolder}变量;VsCodeSetting(extension/src/utils/VsCodeSettings.ts)统一封装了配置的读取、序列化与变更订阅,配置值经 mobx 计算属性监听,变更时触发视图刷新。命令与快捷键
扩展贡献的命令定义在 extension/package.json:
vscode-debug-visualizer.new-visualizer→ 标题 "Debug Visualizer: New View":打开一个新的可视化视图。vscode-debug-visualizer.visualizer-set-expression→ 标题 "Debug Visualizer: Use Selection as Expression",默认键绑定Shift+F1(when: editorTextFocus):将编辑器选区(或反引号包裹的表达式)作为可视化表达式。
从变更日志看架构演进脉络
CHANGELOG 不仅记录变更,也勾勒出清晰的架构演进路径:
- 0.x:从单一 JS 调试器到通用 DAP。0.12.0 的通用调试适配器支持奠定了"任何能
evaluate出 JSON 字符串的调试器都能可视化"的基础;0.12.1 的双重 JSON 解析则是对 C/C++/C# 转义差异的现实妥协。 - 1.x:可靠性与体验。repl 上下文、错误信息格式化、
retainContextWhenHidden、portMapping远程开发支持,属于"让既有能力在各种环境下稳定可用"。 - 2.x:三层架构定型。2.0.0 将渲染层独立为 visualization 框架;2.2.0 与 2.4.0 分别开放了"数据提取器"与"可视化器"两个扩展点(对应
customScriptPaths与customVisualizerScriptPaths),使扩展从"开箱即用的工具"变成"可编程的可视化调试平台";2.6.0 的活动栈帧求值则是对调试语义准确性的最后补全。
截至 2.6.0,扩展官方验证支持的语言包括:JavaScript/TypeScript(
node/node2/extensionHost/chrome/pwa-chrome/pwa-node等,全量支持,见 JsVisualizationSupport.ts 中维护的适配器清单)、Dart、Go、Python、C#、PHP、Java、C++、Swift、Rust、Ruby(基础支持,仅 JSON 字符串可视化)。各语言可运行演示位于 demos 目录,数据提取器 API 与实现位于>赞 - Ruby 支持:新增
- 开发工具
- 数据可视化
【免费下载链接】vscode-debug-visualizer
An extension for VS Code that visualizes data during debugging.
相关推荐
Focalboard 版本演进全解析:从 v0.6 到 v0.15 的核心功能与实现原理
Focalboard 版本演进全解析:从 v0.6 到 v0.15 的核心功能与实现原理 Focalboard 是一个开源、可自托管的项目管理工具,定位为 Tr
后端前端企业应用桌面应用协同办公Joplin 桌面端版本演进全解析:从 v0.10 到 v3.7 的核心功能与实现原理
Joplin 桌面端版本演进全解析:从 v0.10 到 v3.7 的核心功能与实现原理 本篇技术指南以 Joplin 桌面端官方 Changelog( read
知识管理跨平台插件系统vscode-debug-visualizer扩展架构演进:从1.0到最新版的设计变化
vscode debug visualizer扩展架构演进:从1.0到最新版的设计变化 引言:调试可视化的架构挑战 你是否曾在调试复杂数据结构时,因无法直观感知
开发工具数据可视化