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