ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

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

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),仅供参考
返回列表