Dart VM Service 功能可用性矩阵:JIT 与 AOT 模式下 VM Service 协议各功能的支持范围解析

发布时间:2026/9/27 11:06:20

Dart VM Service 功能可用性矩阵:JIT 与 AOT 模式下 VM Service 协议各功能的支持范围解析 编程语言编译器语言运行时标准库开发工具【免费下载链接】sdkThe Dart SDK, including the VM, JS and Wasm compilers, analysis, core libraries, and more.项目地址https://gitcode.com/gh_mirrors/sdk1/sdk点击查看免费下载本文基于 runtime/vm/service/feature_availability.md 展开系统梳理 Dart VM Service Protocol 各功能在 JIT、AOT、Debug、PRODUCT 等不同运行模式下的可用性差异并结合 runtime/vm/service/service.md 协议文档与 runtime/vm/service.cc、runtime/vm/json_stream.h 等源码说明错误码 100Feature is disabled的触发机制与底层实现。读完本文你将能判断任意 VM Service 功能在目标运行模式下是否可用、为何不可用以及如何在 AOT 模式下通过入口点entry point注解等手段获得部分能力。一、背景VM Service 与运行模式Dart VM Service Protocol 是用于与正在运行的 Dart 虚拟机通信的标准协议其完整定义见 runtime/vm/service/service.md当前协议版本为 4.23。要启用 VM Service需以--observe标志启动 VMVM 会启动一个通过 WebSocket 提供协议请求的 Web 服务协议本身遵循 JSON-RPC 2.0 规范支持getVM、getIsolate、addBreakpoint、evaluate、getCpuSamples等大量公开 RPC。Dart VM 主要存在两种执行模式JITJust-In-Time模式运行时动态编译支持代码生成与修改因此理论上支持全部 VM Service 功能。AOTAhead-Of-Time模式预先编译为原生快照运行时不具备代码生成/修改能力因此只能支持那些不需要代码生成或修改的功能。在源码中AOT 模式通过宏DART_PRECOMPILED_RUNTIME标识例如 runtime/vm/service.cc 中的CheckDebuggerDisabled即根据该宏判断并拒绝调试器相关操作。另外还存在Debug VM 构建带调试支持的特殊构建、PRODUCT 构建裁剪后的发布构建等变体它们进一步限制部分功能。二、功能可用性总表原文核心内容以下为 runtime/vm/service/feature_availability.md 定义的功能可用性矩阵FeatureSupported ModesCPU ProfilerAll ModesDart Allocation Site ProfilerJIT onlyMalloc Allocation Site ProfilerDebug VM builds onlyAllocation TableAll ModesHeap SnapshotAll ModesMetricsAll ModesTimeline/TracingAll ModesObject InspectionAll ModesStack InspectionJIT onlyBreakpoints/Pause-on-ExceptionJIT onlySteppingJIT onlyPausing/ResumingJIT only [1]ReloadJIT with a compilation server availableEvaluateJIT with a compilation server availableInvokeJIT AOT [2]两个脚注原文附录[1]Pausing/Resuming 理论上可以加入 AOT 而不会影响 AOT 代码生成但目前尚未实现。[2]在 AOT 模式下使用 Invoke目标函数必须被注解为入口点entry point才能生效。三、错误码 100Feature is disabled 的协议与源码机制当客户端在某个不支持特定功能的模式下调用对应 RPC 时服务端不会静默忽略而是返回错误码100消息为Feature is disabled。该错误码的协议定义见 runtime/vm/service/service.md 的应用错误码表codemessagemeaning100Feature is disabledThe operation is unable to complete because a feature is disabled在源码层面错误码常量定义于 runtime/vm/json_stream.hkFeatureDisabled 100消息文本的映射位于 runtime/vm/json_stream.cc 的GetJSONRpcErrorMessage函数中case kFeatureDisabled: return Feature is disabled;。服务端实际的拒绝逻辑分散在 runtime/vm/service.cc 中典型模式如下static bool CheckDebuggerDisabled(Thread* thread, JSONStream* js) { #if defined(DART_PRECOMPILED_RUNTIME) js-PrintError(kFeatureDisabled, Debugger is disabled in AOT mode.); return true; #else if (thread-isolate()-debugger() nullptr) { js-PrintError(kFeatureDisabled, Debugger is disabled.); return true; } return false; #endif }见 runtime/vm/service.cc这段代码清晰展示了两种禁用路径编译期禁用DART_PRECOMPILED_RUNTIMEAOT 快照下直接拒绝消息为 Debugger is disabled in AOT mode.运行时禁用非 AOT 构建但 isolate 未挂载调试器时拒绝消息为 Debugger is disabled.。类似地runtime/vm/service.cc 的CheckProfilerDisabled在 Profiler 未运行时返回kFeatureDisabledProfiler is disabled.该文件中还有多处kFeatureDisabled分支分别对应 AOT 下的编译器禁用、PRODUCT 构建下的功能裁剪等场景如 runtime/vm/service.cc 的 disabled in AOT mode and PRODUCT.。四、分组深度解读各功能在 JIT / AOT 下的具体表现4.1 分析类功能All Modes 可用以下功能不依赖代码生成因此在包括 AOT 在内的所有模式下均可使用CPU Profiler对应getCpuSamples、clearCpuSamples、getPerfettoCpuSamples、streamCpuSamplesWithUserTag等 RPC。CPU 采样基于运行时维护的采样缓冲区与编译模式无关故所有模式可用前提是 Profiler 处于运行状态否则按上文CheckProfilerDisabled逻辑返回错误码 100。Allocation Table对应getAllocationProfile等 RPC统计各 class 的分配情况。Heap Snapshot对应getInstances、getInstancesAsList、getRetainingPath、getInboundReferences等 RPC用于分析对象图与保留路径。Metrics对应getMemoryUsage、getProcessMemoryUsage等 RPC提供 isolate/进程级内存指标。Timeline/Tracing对应getVMTimeline、getVMTimelineFlags、getVMTimelineMicros、clearVMTimeline、getPerfettoVMTimeline、setVMTimelineFlags等 RPC记录 VM 内部事件的时间线。Object Inspection对应getObject、getClassList、getScripts、getSourceReport等 RPC允许客户端检视对象、类、脚本等元信息。4.2 分配分析类功能受限Dart Allocation Site Profiler仅JIT模式可用。它需要记录 Dart 代码中的分配调用点信息而 AOT 快照在编译期已将代码固化无法再维护分配点统计。Malloc Allocation Site Profiler仅Debug VM builds可用。该功能追踪 C/C 层malloc的调用点需要额外的调试构建支持来保留符号与栈信息普通Release构建不包含此能力。4.3 调试类功能JIT only调试器的核心能力在 AOT 下全部不可用这正是CheckDebuggerDisabled中DART_PRECOMPILED_RUNTIME分支的用武之地Stack Inspection对应getStackRPC。栈帧展开与符号解析依赖 JIT 运行时的活动帧信息与动态代码映射。Breakpoints / Pause-on-Exception对应addBreakpoint、addBreakpointWithScriptUri、addBreakpointAtEntry、removeBreakpoint、setBreakpointState、setExceptionPauseMode等 RPC。断点需要在执行流中注入检查代码AOT 编译产物无法在运行时修改。Stepping单步执行依赖 JIT 的指令级/语句级控制AOT 下同样不可用。Pausing / Resuming对应pause、resume、kill、getIsolatePauseEvent等 RPC。注意原文档脚注 [1] 特别说明这一限制并非技术上的必然——暂停/恢复理论上可在不影响 AOT 代码生成的前提下实现只是目前尚未落地。换言之这是尚未实现而非原理上不可能。4.4 编译类功能JIT 编译服务器Reload热重载对应reloadSourcesRPC。它需要在运行期重新编译变更后的源码因此要求 JIT 模式并且必须存在可用的编译服务器compilation server提供增量编译服务。Evaluate对应evaluate、evaluateInFrameRPC。表达式求值需要现场编译表达式为可执行代码同样仅在 JIT 且有编译服务器的环境中可用。从源码结构看runtime/vm/service.cc 中大量#if !defined(DART_PRECOMPILED_RUNTIME)/#if defined(DART_PRECOMPILED_RUNTIME)条件编译块AOT 构建下这些 RPC 的实现要么被整体裁剪要么在入口处直接返回kFeatureDisabled错误如 Compiler is disabled in AOT mode. 一类消息。4.5 InvokeJIT AOT带前提invokeRPC 是少数在 AOT 下也能工作的执行类功能但有一个关键前提脚注 [2]目标函数必须被注解为入口点entry point。原因在于 AOT 编译默认只保留可达代码未被标记为入口点的函数会被剪枝tree-shaking剔除运行时自然无法调用而通过pragma(vm:entry-point)注解可以强制保留指定函数使其在 AOT 快照中可被invoke调用。这一机制的实现在 sdk/lib/_internal/vm/bin/builtin.dart 等 SDK 内部库中有大量先例例如pragma(vm:entry-point, call)见 sdk/lib/_internal/vm/bin/builtin.dart 等类似的pragma(vm:entry-point)、pragma(vm:entry-point, set)注解遍布 sdk/lib/_http/embedder_config.dart、sdk/lib/_internal/vm/bin/file_patch.dart 等文件。SDK 自身正是依赖这些注解在 AOT 产物中保留必要的内建函数供 VM 内部或invoke调用。五、实用结论与排查建议判断功能是否可用先确定运行模式开发/调试阶段使用 JIT默认dart run可享受全部调试与分析能力发布阶段使用 AOT如dart compile exe或 Flutter release 构建仅可使用 4.1 节所列的All Modes功能以及受限的invoke。遇到错误码 100 的处置客户端收到{error:{code:100,message:Feature is disabled,...}}时应将该功能视为在当前模式下不支持并降级到兼容路径——例如在 AOT 下用getMemoryUsage/getCpuSamples做性能分析而不要尝试addBreakpoint或evaluate。AOT 下使用invoke务必为被调用函数添加pragma(vm:entry-point)注解并确认该函数未被裁剪。Pausing/Resuming 是例外中的例外它在原理上可支持 AOT但当前未实现若你的工具链依赖暂停能力请评估 JIT 模式或等待该功能的后续实现。六、深入阅读协议完整定义与全部 RPC/事件/类型说明runtime/vm/service/service.md错误码与消息映射实现runtime/vm/json_stream.h、runtime/vm/json_stream.cc各 RPC 的禁用检查与实现runtime/vm/service.cc入口点注解在 SDK 中的使用示例sdk/lib/_internal/vm/bin/builtin.dart、sdk/lib/_internal/vm/bin/file_patch.dart赞分享编程语言编译器语言运行时标准库开发工具【免费下载链接】sdkThe Dart SDK, including the VM, JS and Wasm compilers, analysis, core libraries, and more.项目地址https://gitcode.com/gh_mirrors/sdk1/sdk点击查看免费下载相关推荐DWDS 深度解析Dart Web Developer Service 如何桥接 VM Service 协议与 Chrome DevTools 协议DWDS 深度解析Dart Web Developer Service 如何桥接 VM Service 协议与 Chrome DevTools 协议 DWDS编程语言编译器语言运行时标准库开发工具Dart Development Service (DDS) 协议 2.1 详解VM Service 之上的开发服务扩展协议Dart Development Service DDS 协议 2.1 详解VM Service 之上的开发服务扩展协议 本篇技术指南系统讲解 Dart SD编程语言编译器语言运行时标准库开发工具dds_service_extensions 包详解扩展 Dart VM Service 接口对接 DDS 协议 RPCdds_service_extensions 包详解扩展 Dart VM Service 接口对接 DDS 协议 RPC dds_service_exten编程语言编译器语言运行时标准库开发工具上一篇被云待办坑了一个月后我换上了这款纯本地的跨平台桌面待办工具下一篇无名杀网页版从零开玩指南5 分钟跑起来还能亲手造武将的三国杀开源项目创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
延伸阅读

更多相关文章

2026/9/27 11:06:20

用Workbuddy AI编程助手打造RS485/LoRa参数调试工具实战

做嵌入式开发这些年,设备联调是我最头疼的环节之一。尤其是 RS485 总线上的传感器和控制板,型号杂、协议乱,每家厂商的寄存器定义都不一样,手里没有一套趁手的调试工具,全靠串口助手一帧一帧地看十六进制数据&#xff…

2026/9/27 11:06:20

网址制作网站多少钱?3个案例拆解备案避坑与成本真相

网址制作网站多少钱?3个案例拆解备案避坑与成本真相 刚接到个急单,客户盯着屏幕问我:“这个网址制作网站到底要多少钱?我刚才去查备案,流程看得我头都大了,一头雾水,根本不知道从哪下手。”…

2026/9/27 11:56:22

基于图像识别与SpringBoot的工业产品外观缺陷检测系统-附源码

温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台…

2026/9/27 11:56:22

搞懂搜索引擎优化seo信息,建站哪家强

搞懂搜索引擎优化seo信息,建站哪家强 网站做好了没人访问,这是很多设计师转前端时最崩溃的时刻。你精心设计的页面,在浏览器里看着挺漂亮,但扔进搜索引擎,排名惨不忍睹。这时候,别再问建站公司哪家好,先问问自己,有没有把…

2026/9/27 11:56:22

UltraEdit 文本替换换行符实战:从 Ctrl+H 到 16 进制模式排查

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/27 11:56:22

MAX795TESA+T微处理器监控芯片原理与实战设计

1. 这颗小芯片到底在系统里干了什么——从“掉电死机”说起你有没有遇到过这样的场景:嵌入式设备在野外无人值守运行三个月后,某天凌晨三点突然黑屏、串口无响应、远程ping不通?重启电源后一切如常,但日志里找不到明确的崩溃记录&…

2026/9/27 0:00:45

东莞市品牌网站建设报价常见报错与解决

东莞品牌网站建设报价单背后:一份保姆级建站教程避坑实录 网站做好了没人访问,这大概是很多老板最头疼的事。花了大几万做的品牌站,上线后流量惨淡,比路边摊还冷清。别急着骂外包公司,很多“东莞品牌网站建设报价”里藏着不少猫腻,比如用模板站冒充定制…

2026/9/27 0:00:45

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解 【免费下载链接】spirula-studio Cross-vendor 3D Gaussian Splatting trainer - video to splat to mesh, Vulkan or CUDA. 项目地址: https://gitcode.com/GitHub_Trending/sp/spirula-studio Sp…

2026/9/27 0:00:45

SEO怎么推广速查手册新手避坑实战指南

SEO怎么推广速查手册新手避坑实战指南 模板网站太丑不够用?别急着加滤镜,那是治标不治本。很多老板盯着后台流量掉得眼红,却还在纠结首页Banner的圆角是不是3像素。这就像穿着西装去挖土,姿势不对,努力白费。我整理这份 速查手册…

2026/9/27 0:00:45

东莞市品牌网站建设报价常见报错与解决

东莞品牌网站建设报价单背后:一份保姆级建站教程避坑实录 网站做好了没人访问,这大概是很多老板最头疼的事。花了大几万做的品牌站,上线后流量惨淡,比路边摊还冷清。别急着骂外包公司,很多“东莞品牌网站建设报价”里藏着不少猫腻,比如用模板站冒充定制…

2026/9/27 0:00:45

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解 【免费下载链接】spirula-studio Cross-vendor 3D Gaussian Splatting trainer - video to splat to mesh, Vulkan or CUDA. 项目地址: https://gitcode.com/GitHub_Trending/sp/spirula-studio Sp…

2026/9/27 0:00:45

SEO怎么推广速查手册新手避坑实战指南

SEO怎么推广速查手册新手避坑实战指南 模板网站太丑不够用?别急着加滤镜,那是治标不治本。很多老板盯着后台流量掉得眼红,却还在纠结首页Banner的圆角是不是3像素。这就像穿着西装去挖土,姿势不对,努力白费。我整理这份 速查手册…

2026/9/25 20:55:38

USB Type-C PCB布局分区设计:电源、高速信号与PD协议全攻略

做硬件这行,Type-C接口算是典型的“看着简单,做起来全坑”的东西。光引脚就24个,高低速信号、电源、控制线全部塞在一个小小的连接器里,如果PCB布局不做规划,打样回来基本就是“插上没反应”、“高速掉线”、“静电一打…

2026/9/26 19:58:38

系统编程学习原型如何补齐稳定性边界

系统编程学习原型如何补齐稳定性边界预算有限时&#xff0c;我先优化明显多余的复制&#xff0c;而不是猜测性地换容器。用借用传递只读数据通常就能减少分配&#xff1a; fn parse(line: &str) -> Result<Item, Error> { /* ... */ }用基准确认热点确实在分配&am…

2026/9/25 18:34:56

雨花区哪家财务公司代理记账比较好?

在雨花区&#xff0c;企业处理财税事务常常面临诸多挑战&#xff0c;选择一家靠谱的财务公司至关重要。湖南巨勤财务管理咨询有限公司就是本地正规实体财税服务机构&#xff0c;深耕本地工商财税行业多年&#xff0c;熟悉当地工商局、税务局最新政策与申报流程。主营公司注册、…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑