1# 使用JSVM-API接口进行JavaScript代码调试调优 2 3## 简介 4 5这些JSVM-API接口涵盖了虚拟机实例检索、内存分析、性能剖析和调试支持,为优化代码性能及提升开发效率提供了有力的支持。 6 7## 基本概念 8 9- **JSVM**:JavaScript虚拟机是执行JavaScript代码的环境。它负责解析和执行JavaScript代码,管理内存,并提供与其他系统资源的交互。接口如OH_JSVM_GetVM用于检索特定环境的虚拟机实例,这是JSVM管理的基本操作之一。 10- **调试(debug)**:调试是程序开发中的一项重要活动,它涉及到定位、分析和修复代码中的错误。OH_JSVM_OpenInspector和OH_JSVM_CloseInspector接口提供了在特定主机和端口上激活和关闭inspector的功能,inspector是一个用于调试JavaScript代码的工具,允许开发者实时查看和交互程序的运行状态。 11 12## 接口说明 13 14| 接口 | 功能说明 | 15|----------------------------|--------------------------------| 16| OH_JSVM_GetVM | 将检索给定环境的虚拟机实例。 | 17| OH_JSVM_GetHeapStatistics | 返回一组虚拟机堆的统计数据。 | 18| OH_JSVM_StartCpuProfiler | 创建并启动一个CPU profiler。 | 19| OH_JSVM_StopCpuProfiler | 停止CPU profiler并将结果输出到流。 | 20| OH_JSVM_TakeHeapSnapshot | 获取当前堆快照并将其输出到流。 | 21| OH_JSVM_OpenInspector | 在指定的主机和端口上激活inspector,将用来调试JS代码。 | 22| OH_JSVM_CloseInspector | 尝试关闭剩余的所有inspector连接。 | 23| OH_JSVM_WaitForDebugger | 等待主机与inspector建立socket连接,连接建立后程序将继续运行。发送Runtime.runIfWaitingForDebugger命令。 | 24 25## 使用示例 26 27JSVM-API接口开发流程参考[使用JSVM-API实现JS与C/C++语言交互开发流程](use-jsvm-process.md),本文仅对接口对应C++及ArkTS相关代码进行展示。 28 29### OH_JSVM_GetVM 30 31将检索给定环境的虚拟机实例。 32 33cpp部分代码 34 35```cpp 36// hello.cpp 37#include "napi/native_api.h" 38#include "ark_runtime/jsvm.h" 39#include <hilog/log.h> 40// GetVM注册回调 41static JSVM_CallbackStruct param[] = { 42 {.data = nullptr, .callback = GetVM}, 43}; 44static JSVM_CallbackStruct *method = param; 45// GetVM方法别名,供JS调用 46static JSVM_PropertyDescriptor descriptor[] = { 47 {"getVM", nullptr, method++, nullptr, nullptr, nullptr, JSVM_DEFAULT}, 48}; 49// OH_JSVM_GetVM的样例方法 50static JSVM_Value GetVM(JSVM_Env env, JSVM_CallbackInfo info) 51{ 52 // 获取当前虚拟机对象,后续可以进行与虚拟机相关的操作或分析 53 JSVM_VM testVm; 54 JSVM_Status status = OH_JSVM_GetVM(env, &testVm); 55 JSVM_Value result = nullptr; 56 if (status != JSVM_OK || testVm == nullptr) { 57 OH_LOG_ERROR(LOG_APP, "JSVM OH_JSVM_GetVM: failed"); 58 OH_JSVM_GetBoolean(env, true, &result); 59 } else { 60 OH_LOG_INFO(LOG_APP, "JSVM OH_JSVM_GetVM: success"); 61 OH_JSVM_GetBoolean(env, false, &result); 62 } 63 return result; 64} 65``` 66 67ArkTS侧示例代码 68 69```ts 70import hilog from "@ohos.hilog" 71// 通过import的方式,引入Native能力。 72import napitest from "libentry.so" 73let script: string = ` 74 getVM() 75` 76let result = napitest.runJsVm(script); 77hilog.info(0x0000, 'testJSVM', 'Test JSVM getVM: %{public}s', result); 78``` 79 80### OH_JSVM_GetHeapStatistics 81 82返回一组虚拟机堆的统计数据。 83 84cpp部分代码 85 86```cpp 87// hello.cpp 88#include "napi/native_api.h" 89#include "ark_runtime/jsvm.h" 90#include <hilog/log.h> 91// GetHeapStatistics注册回调 92static JSVM_CallbackStruct param[] = { 93 {.data = nullptr, .callback = GetHeapStatistics}, 94}; 95static JSVM_CallbackStruct *method = param; 96// GetHeapStatistics方法别名,供JS调用 97static JSVM_PropertyDescriptor descriptor[] = { 98 {"getHeapStatistics", nullptr, method++, nullptr, nullptr, nullptr, JSVM_DEFAULT}, 99}; 100// OH_JSVM_GetHeapStatistics的样例方法 101void PrintHeapStatistics(JSVM_HeapStatistics result) 102{ 103 OH_LOG_INFO(LOG_APP, "JSVM API heap totalHeapSize: %{public}zu", result.totalHeapSize); 104 OH_LOG_INFO(LOG_APP, "JSVM API heap totalHeapSizeExecutable: %{public}zu", result.totalHeapSizeExecutable); 105 OH_LOG_INFO(LOG_APP, "JSVM API heap totalPhysicalSize: %{public}zu", result.totalPhysicalSize); 106 OH_LOG_INFO(LOG_APP, "JSVM API heap totalAvailableSize: %{public}zu", result.totalAvailableSize); 107 OH_LOG_INFO(LOG_APP, "JSVM API heap usedHeapSize: %{public}zu", result.usedHeapSize); 108 OH_LOG_INFO(LOG_APP, "JSVM API heap heapSizeLimit: %{public}zu", result.heapSizeLimit); 109 OH_LOG_INFO(LOG_APP, "JSVM API heap mallocedMemory: %{public}zu", result.mallocedMemory); 110 OH_LOG_INFO(LOG_APP, "JSVM API heap externalMemory: %{public}zu", result.externalMemory); 111 OH_LOG_INFO(LOG_APP, "JSVM API heap peakMallocedMemory: %{public}zu", result.peakMallocedMemory); 112 OH_LOG_INFO(LOG_APP, "JSVM API heap numberOfNativeContexts: %{public}zu", result.numberOfNativeContexts); 113 OH_LOG_INFO(LOG_APP, "JSVM API heap numberOfDetachedContexts: %{public}zu", result.numberOfDetachedContexts); 114 OH_LOG_INFO(LOG_APP, "JSVM API heap totalGlobalHandlesSize: %{public}zu", result.totalGlobalHandlesSize); 115 OH_LOG_INFO(LOG_APP, "JSVM API heap usedGlobalHandlesSize: %{public}zu", result.usedGlobalHandlesSize); 116} 117 118static JSVM_Value GetHeapStatistics(JSVM_Env env, JSVM_CallbackInfo info) 119{ 120 // 获取当前虚拟机对象 121 JSVM_VM testVm; 122 OH_JSVM_GetVM(env, &testVm); 123 // 获取虚拟机的堆统计信息 124 JSVM_HeapStatistics result; 125 OH_JSVM_GetHeapStatistics(testVm, &result); 126 // 打印虚拟机堆统计信息 127 PrintHeapStatistics(result); 128 // 返回虚拟机堆统计信息中‘本机上下文数量’ 129 JSVM_Value nativeContextsCnt = nullptr; 130 OH_JSVM_CreateInt64(env, result.numberOfNativeContexts, &nativeContextsCnt); 131 return nativeContextsCnt; 132} 133``` 134 135ArkTS侧示例代码 136 137```ts 138import hilog from "@ohos.hilog" 139// 通过import的方式,引入Native能力。 140import napitest from "libentry.so" 141let script: string = ` 142 getHeapStatistics() 143` 144let numberOfNativeContexts = napitest.runJsVm(script); 145hilog.info(0x0000, 'testJSVM', 'Test JSVM getHeapStatistics: %{public}s', numberOfNativeContexts); 146``` 147 148以下接口的示例代码可以参考链接: 149 150[JSVM调试调优能力](https://gitee.com/openharmony/docs/blob/master/zh-cn/application-dev/napi/jsvm-debugger-cpuprofiler-heapsnapshot.md) 151 152### OH_JSVM_StartCpuProfiler 153 154创建并启动一个CPU profiler。 155 156### OH_JSVM_StopCpuProfiler 157 158停止CPU profiler并将结果输出到流。 159 160### OH_JSVM_TakeHeapSnapshot 161 162获取当前堆快照并将其输出到流。 163 164### OH_JSVM_OpenInspector 165 166在指定的主机和端口上激活inspector,将用来调试JS代码。 167 168### OH_JSVM_CloseInspector 169 170尝试关闭剩余的所有inspector连接。 171 172### OH_JSVM_WaitForDebugger 173 174等待主机与inspector建立socket连接,连接建立后程序将继续运行。发送Runtime.runIfWaitingForDebugger命令。 175