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