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++相关代码进行展示。
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
41// OH_JSVM_GetVM的样例方法
42static JSVM_Value GetVM(JSVM_Env env, JSVM_CallbackInfo info)
43{
44    // 获取当前虚拟机对象,后续可以进行与虚拟机相关的操作或分析
45    JSVM_VM testVm;
46    JSVM_Status status = OH_JSVM_GetVM(env, &testVm);
47    JSVM_Value result = nullptr;
48    if (status != JSVM_OK || testVm == nullptr) {
49        OH_LOG_ERROR(LOG_APP, "JSVM OH_JSVM_GetVM: failed");
50        OH_JSVM_GetBoolean(env, true, &result);
51    } else {
52        OH_LOG_INFO(LOG_APP, "JSVM OH_JSVM_GetVM: success");
53        OH_JSVM_GetBoolean(env, false, &result);
54    }
55    return result;
56}
57// GetVM注册回调
58static JSVM_CallbackStruct param[] = {
59    {.data = nullptr, .callback = GetVM},
60};
61static JSVM_CallbackStruct *method = param;
62// GetVM方法别名,供JS调用
63static JSVM_PropertyDescriptor descriptor[] = {
64    {"getVM", nullptr, method++, nullptr, nullptr, nullptr, JSVM_DEFAULT},
65};
66```
67
68// 样例测试JS
69
70```c++
71const char *srcCallNative = R"JS(getVM())JS";
72```
73
74### OH_JSVM_GetHeapStatistics
75
76返回一组虚拟机堆的统计数据。
77
78cpp部分代码
79
80```cpp
81// hello.cpp
82#include "napi/native_api.h"
83#include "ark_runtime/jsvm.h"
84#include <hilog/log.h>
85
86// OH_JSVM_GetHeapStatistics的样例方法
87void PrintHeapStatistics(JSVM_HeapStatistics result)
88{
89    OH_LOG_INFO(LOG_APP, "JSVM API heap totalHeapSize: %{public}zu", result.totalHeapSize);
90    OH_LOG_INFO(LOG_APP, "JSVM API heap totalHeapSizeExecutable: %{public}zu", result.totalHeapSizeExecutable);
91    OH_LOG_INFO(LOG_APP, "JSVM API heap totalPhysicalSize: %{public}zu", result.totalPhysicalSize);
92    OH_LOG_INFO(LOG_APP, "JSVM API heap totalAvailableSize: %{public}zu", result.totalAvailableSize);
93    OH_LOG_INFO(LOG_APP, "JSVM API heap usedHeapSize: %{public}zu", result.usedHeapSize);
94    OH_LOG_INFO(LOG_APP, "JSVM API heap heapSizeLimit: %{public}zu", result.heapSizeLimit);
95    OH_LOG_INFO(LOG_APP, "JSVM API heap mallocedMemory: %{public}zu", result.mallocedMemory);
96    OH_LOG_INFO(LOG_APP, "JSVM API heap externalMemory: %{public}zu", result.externalMemory);
97    OH_LOG_INFO(LOG_APP, "JSVM API heap peakMallocedMemory: %{public}zu", result.peakMallocedMemory);
98    OH_LOG_INFO(LOG_APP, "JSVM API heap numberOfNativeContexts: %{public}zu", result.numberOfNativeContexts);
99    OH_LOG_INFO(LOG_APP, "JSVM API heap numberOfDetachedContexts: %{public}zu", result.numberOfDetachedContexts);
100    OH_LOG_INFO(LOG_APP, "JSVM API heap totalGlobalHandlesSize: %{public}zu", result.totalGlobalHandlesSize);
101    OH_LOG_INFO(LOG_APP, "JSVM API heap usedGlobalHandlesSize: %{public}zu", result.usedGlobalHandlesSize);
102}
103
104static JSVM_Value GetHeapStatistics(JSVM_Env env, JSVM_CallbackInfo info)
105{
106    // 获取当前虚拟机对象
107    JSVM_VM testVm;
108    OH_JSVM_GetVM(env, &testVm);
109    // 获取虚拟机的堆统计信息
110    JSVM_HeapStatistics result;
111    OH_JSVM_GetHeapStatistics(testVm, &result);
112    // 打印虚拟机堆统计信息
113    PrintHeapStatistics(result);
114    // 返回虚拟机堆统计信息中‘本机上下文数量’
115    JSVM_Value nativeContextsCnt = nullptr;
116    OH_JSVM_CreateInt64(env, result.numberOfNativeContexts, &nativeContextsCnt);
117    return nativeContextsCnt;
118}
119// GetHeapStatistics注册回调
120static JSVM_CallbackStruct param[] = {
121    {.data = nullptr, .callback = GetHeapStatistics},
122};
123static JSVM_CallbackStruct *method = param;
124// GetHeapStatistics方法别名,供JS调用
125static JSVM_PropertyDescriptor descriptor[] = {
126    {"getHeapStatistics", nullptr, method++, nullptr, nullptr, nullptr, JSVM_DEFAULT},
127};
128```
129
130// 样例测试JS
131
132```c++
133const char *srcCallNative = R"JS(getHeapStatistics())JS";
134```
135
136以下接口的示例代码可以参考链接:
137
138[JSVM调试调优能力](https://gitee.com/openharmony/docs/blob/master/zh-cn/application-dev/napi/jsvm-debugger-cpuprofiler-heapsnapshot.md)
139
140### OH_JSVM_StartCpuProfiler
141
142创建并启动一个CPU profiler。
143
144### OH_JSVM_StopCpuProfiler
145
146停止CPU profiler并将结果输出到流。
147
148### OH_JSVM_TakeHeapSnapshot
149
150获取当前堆快照并将其输出到流。
151
152### OH_JSVM_OpenInspector
153
154在指定的主机和端口上激活inspector,将用来调试JS代码。
155
156### OH_JSVM_CloseInspector
157
158尝试关闭剩余的所有inspector连接。
159
160### OH_JSVM_WaitForDebugger
161
162等待主机与inspector建立socket连接,连接建立后程序将继续运行。发送Runtime.runIfWaitingForDebugger命令。
163