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```