diff --git a/ide/src/doc/compile_trace_streamer.html b/ide/src/doc/compile_trace_streamer.html index 64eb5f5aa814dc8f6cc4851d9f3fe0a942343c26..c4f815ed6827dda36e3d08448fcb2284aa9250fb 100644 --- a/ide/src/doc/compile_trace_streamer.html +++ b/ide/src/doc/compile_trace_streamer.html @@ -809,11 +809,11 @@ git pull │ └── prebuilts/emsdk/emsdk/lib │ └── prebuilts/emsdk/emsdk/lib/clang └── prebuilts/emsdk/node - └── prebuilts/emsdk/node/14.18.2_64bit - ├── prebuilts/emsdk/node/14.18.2_64bit/bin - ├── prebuilts/emsdk/node/14.18.2_64bit/include - ├── prebuilts/emsdk/node/14.18.2_64bit/lib - └── prebuilts/emsdk/node/14.18.2_64bit/share + └── prebuilts/emsdk/node/16.20.0_64bit + ├── prebuilts/emsdk/node/16.20.0_64bit/bin + ├── prebuilts/emsdk/node/16.20.0_64bit/include + ├── prebuilts/emsdk/node/16.20.0_64bit/lib + └── prebuilts/emsdk/node/16.20.0_64bit/share

之后调用

 = {
       pluginName: 'network-plugin',
       sampleInterval: 1000,
@@ -1577,7 +1575,7 @@ export class SpRecordTrace extends BaseElement {
     if (perfConfig?.process && !perfConfig?.process.includes('ALL') && perfConfig?.process.length > 0) {
       let process = perfConfig.process;
       if (process.indexOf(',') != -1) {
-        let processIdOrName =  process.split(',');
+        let processIdOrName = process.split(',');
         if (this.isNumber(processIdOrName[0])) {
           recordArgs = recordArgs + ' -p ' + perfConfig?.process;
         } else {
@@ -1800,20 +1798,20 @@ export class SpRecordTrace extends BaseElement {
     if (re.test(processId)) {
       pid = Number(processId);
     }
-    let jsHeapConfig: JsHeapConfig = {
+    let arkTSConfig: ArkTSConfig = {
       pid: pid,
       type: this.spJsHeap!.radioBoxType,
       interval: this.spJsHeap!.intervalValue,
       capture_numeric_value: this.spJsHeap!.grabNumeric,
       track_allocations: this.spJsHeap!.grabAllocations,
     };
-    let jsHeapPluginConfig: ProfilerPluginConfig = {
-      pluginName: 'js-memory',
+    let arkTSPluginConfig: ProfilerPluginConfig = {
+      pluginName: 'arkts-plugin',
       sampleInterval: 5000,
-      configData: jsHeapConfig,
+      configData: arkTSConfig,
     };
 
-    return jsHeapPluginConfig;
+    return arkTSPluginConfig;
   }
 
   private createFpsPluginConfig() {
diff --git a/ide/src/trace/component/setting/bean/ProfilerServiceTypes.ts b/ide/src/trace/component/setting/bean/ProfilerServiceTypes.ts
index 49f6583673e10b782096c11b0b5131db9fce58f6..7420cfa32f3ca35e024dc21edf8661a6619dc1a6 100644
--- a/ide/src/trace/component/setting/bean/ProfilerServiceTypes.ts
+++ b/ide/src/trace/component/setting/bean/ProfilerServiceTypes.ts
@@ -889,7 +889,6 @@ export interface DiskioConfig {
 }
 
 export interface NetworkConfig {
-  testFile: string;
 }
 
 export interface HiperfPluginConfig {
@@ -903,7 +902,7 @@ export interface HiSystemEventConfig {
   processName: string;
 }
 
-export interface JsHeapConfig {
+export interface ArkTSConfig {
   pid: number;
   type: number;
   interval: number;
diff --git a/trace_streamer/dl_emsdk.sh b/trace_streamer/dl_emsdk.sh
index 8ba47bab428a469c3152ac0ab41939dae3092e75..a1ebccbce5e3becfe712be25fdabca847c1916e1 100755
--- a/trace_streamer/dl_emsdk.sh
+++ b/trace_streamer/dl_emsdk.sh
@@ -22,7 +22,7 @@ if [ ! -d "prebuilts/emsdk" ];then
     fi
     if [ ! -d "tools/emsdk" ];then
         cd tools
-        git clone https://gitee.com/su_ze1688/emsdk.git --depth=1
+        git clone https://github.com/juj/emsdk.git --depth=1
         cd emsdk
         git pull
         ./emsdk install 3.1.12
diff --git a/trace_streamer/dl_tools.sh b/trace_streamer/dl_tools.sh
index b6e3e7411dbc45e6f53ed01f3525617b13cdd3b6..fa97b0624f170ae2ae112a453d04b519a75928e9 100755
--- a/trace_streamer/dl_tools.sh
+++ b/trace_streamer/dl_tools.sh
@@ -28,7 +28,9 @@ if [ ! -f "prebuilts/$gn_path/gn" ] || [ ! -f "prebuilts/$gn_path/ninja" ];then
         curl https://repo.huaweicloud.com/openharmony/compiler/ninja/1.11.0/darwin/ninja-darwin-x86-1.11.0.tar.gz  --output ninja.tar.gz
         tar -xvf ninja.tar.gz --directory=prebuilts/$gn_path/
     elif [ "$gn_path" == "windows" ];then
-        echo "fix path blow to get gn.exe and ninja.exe for windows"
-        ./gettoolsforwindows.sh windows
+        curl https://repo.huaweicloud.com/openharmony/compiler/gn/1744/windows/gn-windows-amd64.zip --output gn.zip
+        unzip gn.zip -d prebuilts/$gn_path/
+        curl https://repo.huaweicloud.com/openharmony/compiler/ninja/1.9.0/windows/ninja-win.zip  --output ninja.zip
+        unzip ninja.zip -d prebuilts/$gn_path/
     fi
 fi
diff --git a/trace_streamer/doc/des_tables.md b/trace_streamer/doc/des_tables.md
index 15a489c2a13aa7f10135191671b3dc4d00430b03..5880abd51104485f85065d4e3ca812846f72d825 100755
--- a/trace_streamer/doc/des_tables.md
+++ b/trace_streamer/doc/des_tables.md
@@ -12,8 +12,8 @@ TraceStreamer可以将trace数据源转化为易于理解和使用的数据库
 ![GitHub Logo](../figures/db_hisys_event.png)
 ## TraceStreamer输出数据库包含以下表格
 | 表名称 |作用|
-| ----          |----      | 
-| app_name | 记录HiSysEvent事件的事件名与IDE部分事件的字段名为APPNAME中存放的相关信息的映射关系 | 
+| ----          |----      |
+| app_name | 记录HiSysEvent事件的事件名与IDE部分事件的字段名为APPNAME中存放的相关信息的映射关系 |
 | args | 记录方法参数集合|
 | bio_latency_sample | 记录IO操作相关方法调用,及调用栈数据|
 | callstack | 记录调用堆栈和异步调用信息,其中depth,stack_id和parent_stack_id仅在非异步调用中有效。当cookid不为空时,为异步调用,此时callid为进程唯一号,否则为线程唯一号|
@@ -28,7 +28,7 @@ TraceStreamer可以将trace数据源转化为易于理解和使用的数据库
 | file_system_samp | 记录了调用栈的相关信息|
 | hidump | 记录FPS(Frame Per Second)数据|
 | hisys_event_measure | 记录了HiSysEvent事件相关数据,目前HiSysEvent事件包括了异常事件,IDE事件,器件状态事件 |
-| instant |  记录Sched_waking, sched_wakeup事件, 用作ThreadState表的上下文使用 | 
+| instant |  记录Sched_waking, sched_wakeup事件, 用作ThreadState表的上下文使用 |
 | irq | 记录中断相关事件|
 | js_heap_edges | 记录了js内存数据类对象对应的成员的信息|
 | js_heap_files | 记录了js内存数据的名称和时间|
@@ -45,6 +45,7 @@ TraceStreamer可以将trace数据源转化为易于理解和使用的数据库
 | meta | 记录执行解析操作相关的基本信息|
 | native_hook | 记录堆内存申请与释放相关的数据|
 | native_hook_frame | 记录堆内存申请与释放相关的调用栈|
+| native_hook_statistic | 记录堆内存申请与释放相关的统计信息|
 | network | 抓取网络信息传输时产生的一些相关信息|
 | paged_memory_sample | 记录内存操作相关方法调用,及调用栈数据|
 | perf_callchain | 记录Hiperf采样数据的调用栈信息|
@@ -58,7 +59,7 @@ TraceStreamer可以将trace数据源转化为易于理解和使用的数据库
 | process_measure_filter | 将进程ID作为key1,进程的内存,界面刷新,屏幕亮度等信息作为key2,唯一确定一个filter_id|
 | raw | 此数据结构主要作为ThreadState的上下文使用,这张表是sched_waking,sched_wakup, cpu_idle事件的原始记录|
 | sched_slice | 此数据结构主要作为ThreadState的上下文使用,这张表是sched_switch事件的原始记录|
-| smaps | 记录进程的内存消耗的相关信息采样| 
+| smaps | 记录进程的内存消耗的相关信息采样|
 | stat | 此结果用来统计数据解析中各类数据的数据条数,数据和合法性,数据的匹配程度(begin-end),数据的损失等,查看此结构对应的表,可对数据源有基本的了解|
 | symbols | 记录系统调用名称和其函数指针的对应关系,trace中用addr来映射function_name来节省存储空间|
 | syscall | 记录用户空间函数与内核空间函数相互调用记录|
@@ -89,15 +90,15 @@ TraceStreamer可以将trace数据源转化为易于理解和使用的数据库
 |hisys_event_measure   |    -         |hisysevent-plugin  |JSON数据源             |
 |instant               |    -         |ftrace-plugin      |waking和wakeup事件     |
 |irq                   |    -         |ftrace-plugin      |记录中断事件           |
-| js_heap_edges        |    -         |js-memory          | js内存数据            |
-| js_heap_files        |    -         |js-memory          | js内存数据            |
-| js_heap_info         |    -         |js-memory          | js内存数据            |
-| js_heap_location     |    -         |js-memory          | js内存数据            |
-| js_heap_nodes        |    -         |js-memory          | js内存数据            |
-| js_heap_sample       |    -         |js-memory          | js内存数据            |
-| js_heap_string       |    -         |js-memory          | js内存数据            |
-| js_heap_trace_function_info | -     |js-memory          | js内存数据            |
-| js_heap_trace_node   |    -         |js-memory          | js内存数据            |                
+| js_heap_edges        |    -         |arkts-plugin          | js内存数据            |
+| js_heap_files        |    -         |arkts-plugin          | js内存数据            |
+| js_heap_info         |    -         |arkts-plugin          | js内存数据            |
+| js_heap_location     |    -         |arkts-plugin          | js内存数据            |
+| js_heap_nodes        |    -         |arkts-plugin          | js内存数据            |
+| js_heap_sample       |    -         |arkts-plugin          | js内存数据            |
+| js_heap_string       |    -         |arkts-plugin          | js内存数据            |
+| js_heap_trace_function_info | -     |arkts-plugin          | js内存数据            |
+| js_heap_trace_node   |    -         |arkts-plugin          | js内存数据            |
 |live_process          |    -         |process-plugin     |Monitor数据            |
 |network               |    -         |network-plugin     |Monitor数据            |
 |diskio                |    -         |diskio-plugin      |Monitor数据            |
@@ -105,8 +106,9 @@ TraceStreamer可以将trace数据源转化为易于理解和使用的数据库
 |measure               |  通用的      |    -              |系统中的计量值(数值型)|
 |measure_filter        |  通用的      |    -              |计量值的查询辅助表      |
 |meta                  |  通用的      |    -              |记录解析现场数据(解析时间,数据类型,解析工具等)|
-|native_hook           |    -         |nativehook/hookdaemon |内存数据            |
-|native_hook_frame     |    -         |nativehook/hookdaemon |内存数据            |
+|native_hook           |    -         |nativehook/hookdaemon |malloc && mmap内存数据            |
+|native_hook_frame     |    -         |nativehook/hookdaemon |native_hook调用栈数据            |
+|native_hook_statistic |    -         |nativehook/hookdaemon |malloc && mmap统计数据 |
 |perf_callchain        |    -         |perf-plugin        |perf数据(非插件模式) |
 |perf_files            |    -         |    -              |perf数据(非插件模式) |
 |perf_report           |    -         |    -              |perf数据(非插件模式) |
@@ -158,11 +160,17 @@ native_hook表字段解释如下:
 
 native_hook_frame表记录内存申请/释放的调用堆栈。通过callChainId区分一组调用堆栈,depth为堆栈深度,depth为0时,表示当前行为栈顶数据。  
 ![GitHub Logo](../figures/dump_and_mem.png) 
+
+native_hook_statistic表记录内存申请/释放的统计信息。通过callChainId区分一组调用堆栈。每个统计事件将记录当前事件的callChainId,并统计当前调用栈内存分配/释放的总次数和总大小。
+![GitHub Logo](../figures/db_native_hook_statistic.png) 
+
 ### 查询举例
 - 已知tid = 123,查看当前线程的所有堆内存变化信息,可以使用如下SQL语句:  
 ```select native_hook.* from thread, native_hook where thread.tid = 123 and thread.id = native_hook.itid```
-- 已知callchainid = 0, 查看当前内存变化调用堆栈  
-```select * from native_hook_frame where callChainId = 0```
+- 已知callchainid = 1, 查看当前内存变化调用堆栈  
+```select * from native_hook_frame where callchain_id = 1```
+- 已知callchainid = 1, 查看当前内存变化调用堆栈对应的统计信息
+```select * from native_hook_statistic where callchain_id = 1```
 
 ### 日志表与进程线程表关系图
 log表记录日志信息。可以根据seq字段的连续性,来判断是否存在日志丢失的情况。  
@@ -894,6 +902,32 @@ js_heap_sample:记录timeline的时间轴信息
 - symbol_id:函数名  
 - file_id:函数所属文件
 
+### native_hook_statistic表
+#### 表结构
+| Columns Name | SQL TYPE |
+|----          |----      |
+|id      |INT       |
+|callchain_id      |INT       |
+|ipid      |INT       |
+|ts      |INT       |
+|type      |INT       |
+|apply_count      |INT       |
+|release_count      |INT       |
+|apply_size      |INT       |
+|release_size      |INT       |
+
+#### 表描述
+该表记录了内存申请/释放的统计信息。
+#### 关键字段描述
+- callchain_id:内存分配的回调链id
+- ipid:进程id
+- ts:统计数据上报时间
+- type:事件类型,0代表malloc事件,1代表mmap事件
+- apply_count:当前调用栈内存分配总次数
+- release_count:当前调用栈内存释放总次数
+- apply_size:当前调用栈累计分配总大小
+- release_size:当前调用栈累计释放总大小
+
 ### network表
 #### 表结构
 | Columns Name | SQL TYPE |
@@ -1427,7 +1461,7 @@ js_heap_sample:记录timeline的时间轴信息
 |start_ts      |INT       |
 |end_ts        |INT       |
 #### 表描述
-记录解析解析开始时间以及结束时间。
+该表记录了解析开始时间以及结束时间。
 #### 关键字段描述
-- start_ts:trace的开始时间,纳秒为单位  
+- start_ts:trace的开始时间,纳秒为单位
 - end_ts:trace的结束时间,纳秒为单位
\ No newline at end of file
diff --git a/trace_streamer/doc/js_memory.md b/trace_streamer/doc/js_memory.md
index 1580d43767015e7bc56c26a3963b9b17f7d54228..1cfb5528f9906008cd6c219482b78d10b6c5eb28 100644
--- a/trace_streamer/doc/js_memory.md
+++ b/trace_streamer/doc/js_memory.md
@@ -38,7 +38,7 @@ JS内存数据解析对应两个proto文件
 
 ---
 
-js memory的数据包含在htrace文件中,由proto文件定义数据格式,解析规则如下:
+arkts-plugin的数据包含在htrace文件中,由proto文件定义数据格式,解析规则如下:
 
 1.js-memory相关数据携带js-memory_config和js-memory插件头,先通过接口ParseJSMemoryConfig获取对应的type和pid,其中type=0为snapshot类型数据,type=1为timeline数据。js-memory数据为json格式,json包含以下节点:snapshot,nodes,edges,locations,strings,samples,trace_function_infos,trace_tree。使用第三方json库nlohmann::json进行解析。
 
diff --git a/trace_streamer/figures/db_native_hook_statistic.png b/trace_streamer/figures/db_native_hook_statistic.png
new file mode 100644
index 0000000000000000000000000000000000000000..b20e4439633a00e2a75367ae384ae7773b602f4e
Binary files /dev/null and b/trace_streamer/figures/db_native_hook_statistic.png differ
diff --git a/trace_streamer/figures/db_native_memory.png b/trace_streamer/figures/db_native_memory.png
old mode 100755
new mode 100644
index 0e1403e958fbf76f3d2c31fc6304426de6579afb..7cb32fd4250fcda94ad9aa86157d02628e776e28
Binary files a/trace_streamer/figures/db_native_memory.png and b/trace_streamer/figures/db_native_memory.png differ
diff --git a/trace_streamer/figures/dump_and_mem.png b/trace_streamer/figures/dump_and_mem.png
old mode 100755
new mode 100644
index 2c3f59eef7476de91cafb8f59832c93fe4117e51..ab9d01a8107c957e53cce9b66ff5a1d8e200064c
Binary files a/trace_streamer/figures/dump_and_mem.png and b/trace_streamer/figures/dump_and_mem.png differ
diff --git a/trace_streamer/gettoolsforwindows.sh b/trace_streamer/gettoolsforwindows.sh
deleted file mode 100755
index c6586a651c6faa3e3b0bef4e03cfe6d8f0d86290..0000000000000000000000000000000000000000
--- a/trace_streamer/gettoolsforwindows.sh
+++ /dev/null
@@ -1,24 +0,0 @@
-#!/bin/bash
-# Copyright (C) 2021 Huawei Device Co., Ltd.
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-set -e
-gn_path="$1"
-if [ ! -d "tools" ];then
-    mkdir tools
-fi
-cd tools
-git clone git@gitee.com:su_ze1688/public_tools.git
-cd ..
-mv tools/public_tools/gn/$gn_path/gn prebuilts/$gn_path
-mv tools/public_tools/gn/$gn_path/ninja prebuilts/$gn_path/ninja
-rm -rf tools
\ No newline at end of file
diff --git a/trace_streamer/gn/.emscripten b/trace_streamer/gn/.emscripten
index 0ed7e1dd1a0e50b80ac895e5911c4b1adc2b8da6..97e12ef16abdaf931b2083af45e4563dd1b77f90 100644
--- a/trace_streamer/gn/.emscripten
+++ b/trace_streamer/gn/.emscripten
@@ -22,7 +22,7 @@ if thisFile is None:
 
 rootDir = os.path.dirname(os.path.dirname(thisFile))
 emsdkPath = os.path.join(rootDir, 'prebuilts/emsdk/emsdk')
-nodePath = os.path.join(rootDir, 'prebuilts/emsdk/node/14.18.2_64bit')
+nodePath = os.path.join(rootDir, 'prebuilts/emsdk/node/16.20.0_64bit')
 
 LLVM_ROOT = os.path.join(emsdkPath, 'bin')
 NODE_JS = os.path.join(nodePath, 'bin/node')
diff --git a/trace_streamer/gn/BUILD.gn b/trace_streamer/gn/BUILD.gn
index 3f6ecd540853e3702a809a8f88ad1b080585eeeb..006acf33146a8f51d2290bb4a10b4f01e9951191 100755
--- a/trace_streamer/gn/BUILD.gn
+++ b/trace_streamer/gn/BUILD.gn
@@ -64,6 +64,7 @@ config("default") {
   }
   if (target_os == "windows") {
     cflags += [ "-D target_cpu_x86_64" ]
+    libs += [ "z" ]
   } else if (is_linux || is_macx) {
     cflags += [
       "-Wa,--noexecstack",
@@ -88,6 +89,7 @@ config("default") {
         "-DHAVE_CONFIG_H",
         "-DCC_IS_CLANG",
       ]
+      libs += [ "z" ]
       # with_libunwind = true
     }
     if (!use_wasm && !is_win && !is_macx && !is_test) {
@@ -221,4 +223,5 @@ config("executable") {
   } else if (!is_debug && is_macx) {
     ldflags += [ "-dead_strip" ]
   }
+  ldflags += [ "-Wl,--gc-sections" ]
 }
diff --git a/trace_streamer/gn/wasm.gni b/trace_streamer/gn/wasm.gni
index b4c986495cbb7afe176ebaa0972e22e932b6fa75..e63cbe46ea40be54c76c8d27703c2e75cc4cb779 100644
--- a/trace_streamer/gn/wasm.gni
+++ b/trace_streamer/gn/wasm.gni
@@ -46,6 +46,8 @@ template("wasm_lib") {
     "EXPORT_NAME=${target_name}",
     "-s",
     "MODULARIZE=1",
+    "-s",
+    "USE_ZLIB=1",
     "-lworkerfs.js",  # For FS.filesystems.WORKERFS
   ]
   _lib_name = invoker.name
diff --git a/trace_streamer/pare_third_party.sh b/trace_streamer/pare_third_party.sh
index 0639f4a53abc98f8bb6a03fa5c18bce838c59802..830e8fe7a438d52a575be07ee2d8816f5f68839c 100755
--- a/trace_streamer/pare_third_party.sh
+++ b/trace_streamer/pare_third_party.sh
@@ -113,12 +113,7 @@ if [ ! -f "hiperf/BUILD.gn" ];then
         $cp ../prebuilts/patch_hiperf/file_ex.h hiperf/include/nonlinux/linux
         $cp ../prebuilts/patch_hiperf/unique_fd.h hiperf/include/nonlinux/linux
         $sed -i "/using __s8 = char;/a #define unw_word_t uint64_t" hiperf/include/nonlinux/linux/types.h
-        $sed -i "/#include /s/^\(.*\)$/\/\/\1/g" hiperf/src/utilities.cpp
-        $sed -i '/^bool CompressFile(/,/^}/ s/^.*$/\/\/&/; /^bool CompressFile(/,/return true;/ s/^[[:blank:]]*/    /' hiperf/src/utilities.cpp
-        $sed -i '/^bool UncompressFile(/,/^}/ s/^.*$/\/\/&/; /^bool UncompressFile(/,/return true;/ s/^[[:blank:]]*/    /' hiperf/src/utilities.cpp
         $sed -i '/^void Report::PrepareConsole(/,/^}/ s/^.*$/\/\/&/; /^void Report::PrepareConsole(/,/return;/ s/^[[:blank:]]*/    /' hiperf/src/report.cpp
-        $sed -i '/namespace HiPerf {/abool UncompressFile(const std::string &gzipFile, const std::string &dataFile){return true;}' hiperf/src/utilities.cpp
-        $sed -i '/namespace HiPerf {/abool CompressFile(const std::string &dataFile, const std::string &destFile){return true;}' hiperf/src/utilities.cpp
         $sed -i '/namespace HiPerf {/avoid Report::PrepareConsole(){ return;}' hiperf/src/report.cpp
     fi
 fi
diff --git a/trace_streamer/prebuilts/patch_hiperf/BUILD.gn b/trace_streamer/prebuilts/patch_hiperf/BUILD.gn
index c885ec156aaab9fff02d5af7af58df75fc3d637c..f2869ab4972507ae8ec6fce980b5d78dc8152038 100644
--- a/trace_streamer/prebuilts/patch_hiperf/BUILD.gn
+++ b/trace_streamer/prebuilts/patch_hiperf/BUILD.gn
@@ -32,6 +32,7 @@ ohos_source_set("elf") {
     "include/nonlinux/linux",
     "include/nonlinux",
     "${THIRD_PARTY}/perf_include/musl",
+    "${SRC}/../prebuilts/emsdk/node/16.20.0_64bit/include/node",
   ]
 }
 ohos_source_set("hiperf_src") {
@@ -88,7 +89,4 @@ group("hiperf") {
     "${THIRD_PARTY}/protobuf:protobuf",
     "${THIRD_PARTY}/protobuf:protobuf_lite",
   ]
-  if (target != "test" && !is_openharmony) {
-    deps += [ "//prebuilts/protos:ts_proto_data_cpp" ]
-  }
 }
diff --git a/trace_streamer/sdk/demo_sdk/BUILD.gn b/trace_streamer/sdk/demo_sdk/BUILD.gn
index 3f8527bbdbdb39a36a0f395e7856a1df8b0615e7..653b6e0014cceeb05be517081f0cdb8b1b2d6999 100755
--- a/trace_streamer/sdk/demo_sdk/BUILD.gn
+++ b/trace_streamer/sdk/demo_sdk/BUILD.gn
@@ -114,8 +114,7 @@ ohos_source_set("trace_streamer_sdk") {
     "${OHOS_PROTO_GEN}",
     "${OHOS_PROTO_GEN}/types/plugins/mock_data",
     "${THIRD_PARTY}/protobuf/src",
-    "${THIRD_PARTY}/json-master/include",
-    "${THIRD_PARTY}/json-master/include/nlohmann",
+    "${THIRD_PARTY}/json-master/single_include/nlohmann",
   ]
   if (!use_wasm) {
     include_dirs += [
diff --git a/trace_streamer/sdk/demo_sdk/doc/wasm.md b/trace_streamer/sdk/demo_sdk/doc/wasm.md
index 0c2876b9e1816899915b5c07234cf56743c6045e..2872ace529e1131ec632602d61626555d112ea32 100644
--- a/trace_streamer/sdk/demo_sdk/doc/wasm.md
+++ b/trace_streamer/sdk/demo_sdk/doc/wasm.md
@@ -31,11 +31,11 @@ prebuilts/emsdk
 │   └── prebuilts/emsdk/emsdk/lib
 │       └── prebuilts/emsdk/emsdk/lib/clang
 └── prebuilts/emsdk/node
-    └── prebuilts/emsdk/node/14.18.2_64bit
-        ├── prebuilts/emsdk/node/14.18.2_64bit/bin
-        ├── prebuilts/emsdk/node/14.18.2_64bit/include
-        ├── prebuilts/emsdk/node/14.18.2_64bit/lib
-        └── prebuilts/emsdk/node/14.18.2_64bit/share
+    └── prebuilts/emsdk/node/16.20.0_64bit
+        ├── prebuilts/emsdk/node/16.20.0_64bit/bin
+        ├── prebuilts/emsdk/node/16.20.0_64bit/include
+        ├── prebuilts/emsdk/node/16.20.0_64bit/lib
+        └── prebuilts/emsdk/node/16.20.0_64bit/share
 ```
 之后调用
 ```
diff --git a/trace_streamer/sdk/demo_sdk/test/BUILD.gn b/trace_streamer/sdk/demo_sdk/test/BUILD.gn
index f15fdc2848f5844a3a8b3153c177a555652834f5..34d13eac2419b2b13db1f4a3ff9b0960db337948 100755
--- a/trace_streamer/sdk/demo_sdk/test/BUILD.gn
+++ b/trace_streamer/sdk/demo_sdk/test/BUILD.gn
@@ -47,8 +47,7 @@ if (target == "sdkdemotest") {
       "${OHOS_PROTO_GEN}/types/plugins/mock_data",
       "${THIRD_PARTY}/googletest/googletest/include/gtest",
       "${THIRD_PARTY}/protobuf/src",
-      "${THIRD_PARTY}/json-master/include",
-      "${THIRD_PARTY}/json-master/include/nlohmann",
+      "${THIRD_PARTY}/json-master/single_include/nlohmann",
     ]
     cflags = [
       "-Wno-inconsistent-missing-override",
diff --git a/trace_streamer/sdk/dubai_sdk/BUILD.gn b/trace_streamer/sdk/dubai_sdk/BUILD.gn
index fbd88129e4a64629bf44f60aa554ec5796ba7e91..8f7a0212ea43f0cf2a49e828ea4da9705d4571e1 100755
--- a/trace_streamer/sdk/dubai_sdk/BUILD.gn
+++ b/trace_streamer/sdk/dubai_sdk/BUILD.gn
@@ -112,8 +112,7 @@ source_set("trace_streamer_sdk") {
     "${OHOS_PROTO_GEN}",
     "${OHOS_PROTO_GEN}/types/plugins/mock_data",
     "${THIRD_PARTY}/protobuf/src",
-    "${THIRD_PARTY}/json-master/include",
-    "${THIRD_PARTY}/json-master/include/nlohmann",
+    "${THIRD_PARTY}/json-master/single_include/nlohmann",
   ]
   if (!use_wasm) {
     include_dirs += [
diff --git a/trace_streamer/sdk/dubai_sdk/doc/wasm.md b/trace_streamer/sdk/dubai_sdk/doc/wasm.md
index 0c2876b9e1816899915b5c07234cf56743c6045e..2872ace529e1131ec632602d61626555d112ea32 100755
--- a/trace_streamer/sdk/dubai_sdk/doc/wasm.md
+++ b/trace_streamer/sdk/dubai_sdk/doc/wasm.md
@@ -31,11 +31,11 @@ prebuilts/emsdk
 │   └── prebuilts/emsdk/emsdk/lib
 │       └── prebuilts/emsdk/emsdk/lib/clang
 └── prebuilts/emsdk/node
-    └── prebuilts/emsdk/node/14.18.2_64bit
-        ├── prebuilts/emsdk/node/14.18.2_64bit/bin
-        ├── prebuilts/emsdk/node/14.18.2_64bit/include
-        ├── prebuilts/emsdk/node/14.18.2_64bit/lib
-        └── prebuilts/emsdk/node/14.18.2_64bit/share
+    └── prebuilts/emsdk/node/16.20.0_64bit
+        ├── prebuilts/emsdk/node/16.20.0_64bit/bin
+        ├── prebuilts/emsdk/node/16.20.0_64bit/include
+        ├── prebuilts/emsdk/node/16.20.0_64bit/lib
+        └── prebuilts/emsdk/node/16.20.0_64bit/share
 ```
 之后调用
 ```
diff --git a/trace_streamer/sdk/dubai_sdk/test/BUILD.gn b/trace_streamer/sdk/dubai_sdk/test/BUILD.gn
index f61d43e247e768ba1ef1a3327be7549a8f2c1123..573eea5b62be5a9f6a6c0be8174f01096426a783 100755
--- a/trace_streamer/sdk/dubai_sdk/test/BUILD.gn
+++ b/trace_streamer/sdk/dubai_sdk/test/BUILD.gn
@@ -47,8 +47,7 @@ if (target == "sdkdemotest") {
       "${OHOS_PROTO_GEN}/types/plugins/mock_data",
       "${THIRD_PARTY}/googletest/googletest/include/gtest",
       "${THIRD_PARTY}/protobuf/src",
-      "${THIRD_PARTY}/json-master/include",
-      "${THIRD_PARTY}/json-master/include/nlohmann",
+      "${THIRD_PARTY}/json-master/single_include/nlohmann",
     ]
     cflags = [
       "-Wno-inconsistent-missing-override",
diff --git a/trace_streamer/src/BUILD.gn b/trace_streamer/src/BUILD.gn
index d1862d800db6d3cda6d6ee9bad5dfe5ab942bea8..bcf90934e8d1853f47387cc0c153e0a0943072c9 100644
--- a/trace_streamer/src/BUILD.gn
+++ b/trace_streamer/src/BUILD.gn
@@ -48,8 +48,7 @@ ohos_source_set("lib") {
     "cfg",
     "proto_reader/include",
     "${THIRD_PARTY}/sqlite/include",
-    "${THIRD_PARTY}/json-master/include",
-    "${THIRD_PARTY}/json-master/include/nlohmann",
+    "${THIRD_PARTY}/json-master/single_include/nlohmann",
     "${OHOS_PROTO_GEN}/types/plugins/memory_data",
     "${OHOS_PROTO_GEN}/types/plugins/ftrace_data/${kernel_version}",
     "${OHOS_PROTO_GEN}/types/plugins/hilog_data",
@@ -147,8 +146,7 @@ ohos_source_set("trace_streamer_source") {
   include_dirs += [
     "${THIRD_PARTY}/libunwind/include",
     "${THIRD_PARTY}/libunwind/src",
-    "${THIRD_PARTY}/json-master/include",
-    "${THIRD_PARTY}/json-master/include/nlohmann",
+    "${THIRD_PARTY}/json-master/single_include/nlohmann",
     "${THIRD_PARTY}/hiperf/include",
     "${THIRD_PARTY}/hiperf/include/nonlinux/linux",
     "${THIRD_PARTY}/hiperf/include/nonlinux",
diff --git a/trace_streamer/src/base/ts_common.h b/trace_streamer/src/base/ts_common.h
index 85a6a1b96d8bbafee53e80676e320df961bf44a4..3c6705b02599488cf4c86321fe2002bc35de73c0 100644
--- a/trace_streamer/src/base/ts_common.h
+++ b/trace_streamer/src/base/ts_common.h
@@ -59,7 +59,13 @@ enum RefType {
     K_REF_MAX
 };
 
-enum TraceFileType { TRACE_FILETYPE_BY_TRACE, TRACE_FILETYPE_H_TRACE, TRACE_FILETYPE_SYSEVENT, TRACE_FILETYPE_UN_KNOW };
+enum TraceFileType {
+    TRACE_FILETYPE_BY_TRACE,
+    TRACE_FILETYPE_H_TRACE,
+    TRACE_FILETYPE_SYSEVENT,
+    TRACE_FILETYPE_PERF,
+    TRACE_FILETYPE_UN_KNOW
+};
 
 enum EndState {
     // (R) ready state or running state, the process is ready to run, but not necessarily occupying the CPU
diff --git a/trace_streamer/src/filter/BUILD.gn b/trace_streamer/src/filter/BUILD.gn
index 2073a827f094df9fde8fb881434f01abd8fa2a48..39830ce17baca481d52265b536a3b02eb2ba262b 100644
--- a/trace_streamer/src/filter/BUILD.gn
+++ b/trace_streamer/src/filter/BUILD.gn
@@ -36,6 +36,10 @@ ohos_source_set("filter") {
     "irq_filter.h",
     "measure_filter.cpp",
     "measure_filter.h",
+    "native_hook_filter.cpp",
+    "native_hook_filter.h",
+    "offline_symbolization_filter.cpp",
+    "offline_symbolization_filter.h",
     "process_filter.cpp",
     "process_filter.h",
     "slice_filter.cpp",
@@ -46,10 +50,6 @@ ohos_source_set("filter") {
     "symbols_filter.h",
     "system_event_measure_filter.cpp",
     "system_event_measure_filter.h",
-    "native_hook_filter.cpp",
-    "native_hook_filter.h",
-    "offline_symbolization_filter.cpp",
-    "offline_symbolization_filter.h",
   ]
 
   if (enable_ts_utest && !use_wasm) {
diff --git a/trace_streamer/src/filter/cpu_filter.cpp b/trace_streamer/src/filter/cpu_filter.cpp
index fce9980181da5b104df3509e6202f27caed38b0a..dfb354ddad992e6bce54f46f3a85f650eaf3aa7b 100644
--- a/trace_streamer/src/filter/cpu_filter.cpp
+++ b/trace_streamer/src/filter/cpu_filter.cpp
@@ -44,7 +44,6 @@ void CpuFilter::InsertSwitchEvent(uint64_t ts,
         auto lastRow = RowOfInternalTidInStateTable(nextPid);
         if (lastRow != INVALID_UINT64) {
             // check if there are wakeup or waking events before
-            lastRow = RowOfInternalTidInStateTable(nextPid);
             traceDataCache_->GetThreadStateData()->UpdateDuration(static_cast(lastRow), ts);
         }
         auto index =
@@ -75,7 +74,6 @@ void CpuFilter::InsertSwitchEvent(uint64_t ts,
         auto lastRow = RowOfInternalTidInStateTable(prevPid);
         if (lastRow != INVALID_UINT64) {
             CheckWakeupEvent(prevPid);
-            lastRow = RowOfInternalTidInStateTable(prevPid);
             traceDataCache_->GetThreadStateData()->UpdateDuration(static_cast(lastRow), ts);
             streamFilters_->processFilter_->AddCpuStateCount(prevPid);
             auto thread = traceDataCache_->GetThreadData(prevPid);
diff --git a/trace_streamer/src/filter/native_hook_filter.cpp b/trace_streamer/src/filter/native_hook_filter.cpp
index e9fec504c262f15418f3259ba825c71e1b858b34..4b745af8db437675dac8630569b86f2ede5656d3 100644
--- a/trace_streamer/src/filter/native_hook_filter.cpp
+++ b/trace_streamer/src/filter/native_hook_filter.cpp
@@ -929,6 +929,8 @@ bool NativeHookFilter::NativeHookReloadElfSymbolTable(
             }
         }
     }
+    filePathIdAndStValueToSymAddr_.Clear();
+    filePathIdToImportSymbolTableMap_.clear();
     return true;
 }
 } // namespace TraceStreamer
diff --git a/trace_streamer/src/main.cpp b/trace_streamer/src/main.cpp
index 24455e693023d7b59dd42f3a2e00d165e12d7921..18204e7f1d3d4b58a0137e96f0b3077f40c73857 100644
--- a/trace_streamer/src/main.cpp
+++ b/trace_streamer/src/main.cpp
@@ -75,7 +75,7 @@ void ShowHelpInfo(const char* argv)
         " -e    transfer a bytrace file into a SQLiteBased DB. with -nm to except meta table\n"
         " -c    command line mode.\n"
         " -h    start HTTP server.\n"
-        " -s    separate js memory data, and save it in current dir with default filename.\n"
+        " -s    separate arkts-plugin data, and save it in current dir with default filename.\n"
         " -p    Specify the port of HTTP server, default is 9001.\n"
         " -i    show information.\n"
         " -v    show version.",
diff --git a/trace_streamer/src/parser/BUILD.gn b/trace_streamer/src/parser/BUILD.gn
index ff6a449226fe11187c1a287806d20f54a407fda5..13032d7e743485b269b7aeef25bfdf3f42de056a 100644
--- a/trace_streamer/src/parser/BUILD.gn
+++ b/trace_streamer/src/parser/BUILD.gn
@@ -57,14 +57,12 @@ ohos_source_set("parser") {
     "${SRC}/filter",
     "${SRC}",
     ".",
-    "${THIRD_PARTY}/json-master/include",
-    "${THIRD_PARTY}/json-master/include/nlohmann",
+    "${THIRD_PARTY}/json-master/single_include/nlohmann",
   ]
 
   include_dirs += [ "htrace_pbreader_parser" ]
   include_dirs += [ "../proto_reader/include" ]
 
-
   if (enable_ts_utest && !use_wasm) {
     cflags = [
       "-fprofile-arcs",
diff --git a/trace_streamer/src/parser/bytrace_parser/bytrace_parser.cpp b/trace_streamer/src/parser/bytrace_parser/bytrace_parser.cpp
index 093d0022e35fe9afa7750b3cc7acc739465c3e5d..2178adc72cbb524576bbeff27cfbf1dec768e28d 100644
--- a/trace_streamer/src/parser/bytrace_parser/bytrace_parser.cpp
+++ b/trace_streamer/src/parser/bytrace_parser/bytrace_parser.cpp
@@ -72,6 +72,30 @@ void BytraceParser::ParseTraceDataSegment(std::unique_ptr bufferStr,
         auto extra = *(packagesLine - 1) == '\r' ? 1 : 0;
         std::string bufferLine(packagesBegin, packagesLine - extra);
 
+        if (isFirstLine) {
+            isFirstLine = false;
+            if (IsHtmlTrace(bufferLine)) {
+                isHtmlTrace_ = true;
+                goto NEXT_LINE;
+            }
+        }
+        if (isHtmlTrace_) {
+            if (!isHtmlTraceContent_) {
+                if (IsHtmlTraceBegin(bufferLine)) {
+                    isHtmlTraceContent_ = true;
+                }
+                goto NEXT_LINE;
+            }
+            auto pos = bufferLine.find(script_.c_str());
+            if (pos != std::string::npos) {
+                isHtmlTraceContent_ = false;
+                bufferLine = bufferLine.substr(0, pos);
+                if (std::all_of(bufferLine.begin(), bufferLine.end(), isspace)) {
+                    goto NEXT_LINE;
+                }
+            }
+        }
+
         if (IsTraceComment(bufferLine)) {
             traceCommentLines_++;
             goto NEXT_LINE;
@@ -81,10 +105,6 @@ void BytraceParser::ParseTraceDataSegment(std::unique_ptr bufferStr,
             goto NEXT_LINE;
         }
 
-        if (bufferLine.find(script_.c_str()) != std::string::npos) {
-            isParsingOver_ = true;
-            break;
-        }
         if (isBytrace_) {
             if (!traceBegan_) {
                 traceBegan_ = true;
diff --git a/trace_streamer/src/parser/bytrace_parser/bytrace_parser.h b/trace_streamer/src/parser/bytrace_parser/bytrace_parser.h
index 9baa0f75ea063c3dc133d56376957bc4488305b1..375b675b1fd00e43019a85b6d3d5218955024153 100644
--- a/trace_streamer/src/parser/bytrace_parser/bytrace_parser.h
+++ b/trace_streamer/src/parser/bytrace_parser/bytrace_parser.h
@@ -70,6 +70,17 @@ private:
     {
         return ((buffer[0] == '#') || buffer.find("TASK-PID") != std::string::npos);
     }
+    inline static bool IsHtmlTrace(const std::string& buffer)
+    {
+        std::string lower(buffer);
+        transform(buffer.begin(), buffer.end(), lower.begin(), ::tolower);
+        return ((lower.compare(0, std::string("").length(), "") == 0) ||
+                (lower.compare(0, std::string("").length(), "") == 0));
+    }
+    inline static bool IsHtmlTraceBegin(const std::string& buffer)
+    {
+        return buffer.find(R"(