• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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