1# 使用JSVM-API接口进行Trace相关开发 2 3## 简介 4 5JSVM-API中trace相关接口用于在运行时采集并输出各种类型运行时信息。该能力可用于在JSVM模块中定位问题与性能分析。 6 7## 基本概念 8 9在JSVM-API中,Trace相关接口能够通过指定一系列分类,采集这些分类所属的JSVM内部事件信息,最后以JSON格式,按用户指定回调函数进行输出。 10 11在JSVM-API中,通过支持Trace相关能力,JSVM模块能够更紧密地与JavaScript环境集成,加深用户对JSVM的理解,提高复杂问题的定位能力与性能分析能力。 12 13## 接口说明 14 15| 接口 | 功能说明 | 16|----------------------------|--------------------------------| 17| OH_JSVM_TraceStart | 以指定事件类型与事件数量限制,开始采集运行时信息。 | 18| OH_JSVM_TraceStop | 停止采集信息,并以JSON格式在用户指定的回调函数中进行输出。 | 19 20## 使用示例 21 22JSVM-API接口开发流程参考[使用JSVM-API实现JS与C/C++语言交互开发流程](use-jsvm-process.md),本文仅对接口对应C++相关代码进行展示。 23 24### 使用Trace接口进行数据采集 25 26cpp部分代码 27 28```cpp 29#include <vector> 30#include <string> 31 32bool OutputStream(const char *data, int size, void *streamData) { 33 std::string value(data, size); 34 *(std::string *)streamData = std::string(data, size); 35 return true; 36} 37 38// OH_JSVM_TraceStart/OH_JSVM_TraceStop样例方法 39static JSVM_Value Trace(JSVM_Env env, JSVM_CallbackInfo info) { 40 // start trace with categories 41 std::vector<JSVM_TraceCategory> categories = {JSVM_TRACE_VM}; 42 JSVM_CALL(OH_JSVM_TraceStart(categories.size(), categories.data(), "trace test", 0)); 43 44 // run and trace 45 JSVM_Script script; 46 JSVM_Value jsSrc; 47 JSVM_Value result; 48 const char* trace_js = R"JS( 49 function map(x, y) { 50 return {"a": x, "b": y}; 51 } 52 for (var i = 0; i < 80000; ++i) { 53 var x = map(i, i); 54 } 55 )JS"; 56 JSVM_CALL(OH_JSVM_CreateStringUtf8(env, trace_js, JSVM_AUTO_LENGTH, &jsSrc)); 57 JSVM_CALL(OH_JSVM_CompileScript(env, jsSrc, nullptr, 0, true, nullptr, &script)); 58 JSVM_CALL(OH_JSVM_RunScript(env, script, &result)); 59 60 // stop trace and write file 61 std::string data; 62 JSVM_CALL(OH_JSVM_TraceStop(OutputStream, (void *)&data)); 63 64 OH_LOG_INFO(LOG_APP, "JSVM Trace success:%{public}s", data.c_str()); 65 return nullptr; 66} 67// Trace注册回调 68static JSVM_CallbackStruct param[] = { 69 {.data = nullptr, .callback = Trace}, 70}; 71static JSVM_CallbackStruct *method = param; 72// Trace方法别名,供JS调用 73static JSVM_PropertyDescriptor descriptor[] = { 74 {"trace", nullptr, method, nullptr, nullptr, nullptr, JSVM_DEFAULT}, 75}; 76// 样例测试js 77const char *srcCallNative = R"JS(trace())JS"; 78```