1fb726d48Sopenharmony_ci/*
2fb726d48Sopenharmony_ci * Copyright (c) Huawei Technologies Co., Ltd. 2023. All rights reserved.
3fb726d48Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
4fb726d48Sopenharmony_ci * you may not use this file except in compliance with the License.
5fb726d48Sopenharmony_ci * You may obtain a copy of the License at
6fb726d48Sopenharmony_ci *
7fb726d48Sopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0
8fb726d48Sopenharmony_ci *
9fb726d48Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software
10fb726d48Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
11fb726d48Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12fb726d48Sopenharmony_ci * See the License for the specific language governing permissions and
13fb726d48Sopenharmony_ci * limitations under the License.
14fb726d48Sopenharmony_ci */
15fb726d48Sopenharmony_ci#include <dirent.h>
16fb726d48Sopenharmony_ci#include <fcntl.h>
17fb726d48Sopenharmony_ci#include <fstream>
18fb726d48Sopenharmony_ci#include <iostream>
19fb726d48Sopenharmony_ci#include <memory>
20fb726d48Sopenharmony_ci#include <regex>
21fb726d48Sopenharmony_ci#include <sys/stat.h>
22fb726d48Sopenharmony_ci#include <unistd.h>
23fb726d48Sopenharmony_ci
24fb726d48Sopenharmony_ci#include "codec_cov.h"
25fb726d48Sopenharmony_ci#include "file.h"
26fb726d48Sopenharmony_ci#include "cpu_filter.h"
27fb726d48Sopenharmony_ci#include "frame_filter.h"
28fb726d48Sopenharmony_ci#include "slice_filter.h"
29fb726d48Sopenharmony_ci#include "string_help.h"
30fb726d48Sopenharmony_ci
31fb726d48Sopenharmony_ci#include "trace_streamer_selector.h"
32fb726d48Sopenharmony_ci#include "version.h"
33fb726d48Sopenharmony_ciusing namespace SysTuning::TraceStreamer;
34fb726d48Sopenharmony_ciusing namespace SysTuning;
35fb726d48Sopenharmony_cinamespace SysTuning {
36fb726d48Sopenharmony_cinamespace TraceStreamer {
37fb726d48Sopenharmony_ciusing namespace SysTuning::TraceStreamer;
38fb726d48Sopenharmony_ciusing namespace SysTuning::base;
39fb726d48Sopenharmony_ciconstexpr int G_MIN_PARAM_NUM = 2;
40fb726d48Sopenharmony_ciconstexpr size_t G_FILE_PERMISSION = 664;
41fb726d48Sopenharmony_ciconstexpr uint8_t RAW_TRACE_PARSE_MAX = 2;
42fb726d48Sopenharmony_ciconstexpr uint8_t PARSER_THREAD_MAX = 16;
43fb726d48Sopenharmony_ciconstexpr uint8_t PARSER_THREAD_MIN = 1;
44fb726d48Sopenharmony_cistd::regex traceInvalidStr("\\\\");
45fb726d48Sopenharmony_ci// set version info in meta.cpp please
46fb726d48Sopenharmony_civoid ExportStatusToLog(const std::string &dbPath, TraceParserStatus status)
47fb726d48Sopenharmony_ci{
48fb726d48Sopenharmony_ci    std::string path = dbPath + ".ohos.ts";
49fb726d48Sopenharmony_ci    std::ofstream out(path, std::ios_base::trunc);
50fb726d48Sopenharmony_ci    out << (std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::system_clock::now().time_since_epoch()))
51fb726d48Sopenharmony_ci               .count()
52fb726d48Sopenharmony_ci        << ":" << status << std::endl;
53fb726d48Sopenharmony_ci    using std::chrono::system_clock;
54fb726d48Sopenharmony_ci
55fb726d48Sopenharmony_ci    system_clock::time_point today = system_clock::now();
56fb726d48Sopenharmony_ci
57fb726d48Sopenharmony_ci    std::time_t tt = system_clock::to_time_t(today);
58fb726d48Sopenharmony_ci    out << "last running  time  is: " << ctime(&tt);
59fb726d48Sopenharmony_ci    out << "last running status is: " << status;
60fb726d48Sopenharmony_ci    out.close();
61fb726d48Sopenharmony_ci}
62fb726d48Sopenharmony_civoid ShowHelpInfo(const char *argv)
63fb726d48Sopenharmony_ci{
64fb726d48Sopenharmony_ci    std::string dumpReadableTextPluginName;
65fb726d48Sopenharmony_ci#ifdef ENABLE_NATIVE_HOOK
66fb726d48Sopenharmony_ci    dumpReadableTextPluginName.append("hook.");
67fb726d48Sopenharmony_ci#endif
68fb726d48Sopenharmony_ci#ifdef ENABLE_HIPERF
69fb726d48Sopenharmony_ci    dumpReadableTextPluginName.append("perf.");
70fb726d48Sopenharmony_ci#endif
71fb726d48Sopenharmony_ci#ifdef ENABLE_EBPF
72fb726d48Sopenharmony_ci    dumpReadableTextPluginName.append("ebpf.");
73fb726d48Sopenharmony_ci#endif
74fb726d48Sopenharmony_ci    printf(
75fb726d48Sopenharmony_ci        "trace analyze tool, it can transfer a bytrace/htrace file into a "
76fb726d48Sopenharmony_ci        "SQLite database and save result to a local file trace_streamer.log.\n"
77fb726d48Sopenharmony_ci        "Usage: %s FILE -e sqlite_out.db\n"
78fb726d48Sopenharmony_ci        " or    %s FILE -c\n"
79fb726d48Sopenharmony_ci        "Options:\n"
80fb726d48Sopenharmony_ci        " -e    transfer a trace file into a SQLiteBased DB. with -nm to except meta table\n"
81fb726d48Sopenharmony_ci        " -c    command line mode.\n"
82fb726d48Sopenharmony_ci        " -D    Specify the directory path with multiple long trace files\n"
83fb726d48Sopenharmony_ci        " -d    dump '%s' readable text.Default dump file path is src path name + `_ReadableText.txt`\n"
84fb726d48Sopenharmony_ci        " -l <level>, --level=<level>\n"
85fb726d48Sopenharmony_ci        "       Show specific level/levels logs with format: level1,level2,level3\n"
86fb726d48Sopenharmony_ci        "       Long level string coule be: DEBUG/INFO/WARN/ERROR/FATAL/OFF.\n"
87fb726d48Sopenharmony_ci        "       Short level string coule be: D/I/W/E/F/O.\n"
88fb726d48Sopenharmony_ci        "       Default level is OFF.\n"
89fb726d48Sopenharmony_ci        " --list Show the support and disable ability.\n"
90fb726d48Sopenharmony_ci        " -lnc  long trace no clear the db cache.\n"
91fb726d48Sopenharmony_ci        " -o    set dump file path.\n"
92fb726d48Sopenharmony_ci        " -s    separate arkts-plugin data, and save it in current dir with default filename.\n"
93fb726d48Sopenharmony_ci        " -q    select sql from file.\n"
94fb726d48Sopenharmony_ci        " -m    Perform operations that query metrics through linux,supports querying multiple metrics items.For "
95fb726d48Sopenharmony_ci        "example:-m x,y,z.\n"
96fb726d48Sopenharmony_ci        " -tn <num>   set parser thread num, min is 1, max is 16.\n"
97fb726d48Sopenharmony_ci        " -nt   close muti thread.\n"
98fb726d48Sopenharmony_ci        " -i    show information.\n"
99fb726d48Sopenharmony_ci        " -v    show version.\n",
100fb726d48Sopenharmony_ci        argv, argv, dumpReadableTextPluginName.empty() ? "null" : dumpReadableTextPluginName.data());
101fb726d48Sopenharmony_ci}
102fb726d48Sopenharmony_civoid PrintInformation()
103fb726d48Sopenharmony_ci{
104fb726d48Sopenharmony_ci    TraceStreamerConfig cfg;
105fb726d48Sopenharmony_ci    cfg.PrintInfo();
106fb726d48Sopenharmony_ci}
107fb726d48Sopenharmony_civoid PrintVersion()
108fb726d48Sopenharmony_ci{
109fb726d48Sopenharmony_ci    (void)fprintf(stderr, "version %s\n", TRACE_STREAMER_VERSION.c_str());
110fb726d48Sopenharmony_ci}
111fb726d48Sopenharmony_civoid SetFtracePluginsAbilityInfo(std::string &disableInfo, std::string &enableInfo)
112fb726d48Sopenharmony_ci{
113fb726d48Sopenharmony_ci#ifndef ENABLE_BYTRACE
114fb726d48Sopenharmony_ci    disableInfo.append("\n\tbytrace");
115fb726d48Sopenharmony_ci#else
116fb726d48Sopenharmony_ci    enableInfo.append("\n\tbytrace");
117fb726d48Sopenharmony_ci#endif
118fb726d48Sopenharmony_ci#ifndef ENABLE_RAWTRACE
119fb726d48Sopenharmony_ci    disableInfo.append("\n\trawtrace");
120fb726d48Sopenharmony_ci#else
121fb726d48Sopenharmony_ci    enableInfo.append("\n\trawtrace");
122fb726d48Sopenharmony_ci#endif
123fb726d48Sopenharmony_ci#ifndef ENABLE_HTRACE
124fb726d48Sopenharmony_ci    disableInfo.append("\n\thtrace");
125fb726d48Sopenharmony_ci#else
126fb726d48Sopenharmony_ci    enableInfo.append("\n\thtrace");
127fb726d48Sopenharmony_ci#endif
128fb726d48Sopenharmony_ci#ifndef ENABLE_FFRT
129fb726d48Sopenharmony_ci    disableInfo.append("\n\tffrt");
130fb726d48Sopenharmony_ci#else
131fb726d48Sopenharmony_ci    enableInfo.append("\n\tffrt");
132fb726d48Sopenharmony_ci#endif
133fb726d48Sopenharmony_ci}
134fb726d48Sopenharmony_civoid PrintDefaultAbilityInfo(std::string &disableInfo, std::string &enableInfo)
135fb726d48Sopenharmony_ci{
136fb726d48Sopenharmony_ci    SetFtracePluginsAbilityInfo(disableInfo, enableInfo);
137fb726d48Sopenharmony_ci#ifndef ENABLE_MEMORY
138fb726d48Sopenharmony_ci    disableInfo.append("\n\tmemory");
139fb726d48Sopenharmony_ci#else
140fb726d48Sopenharmony_ci    enableInfo.append("\n\tmemory");
141fb726d48Sopenharmony_ci#endif
142fb726d48Sopenharmony_ci#ifndef ENABLE_HTDUMP
143fb726d48Sopenharmony_ci    disableInfo.append("\n\thidump");
144fb726d48Sopenharmony_ci#else
145fb726d48Sopenharmony_ci    enableInfo.append("\n\thidump");
146fb726d48Sopenharmony_ci#endif
147fb726d48Sopenharmony_ci#ifndef ENABLE_CPUDATA
148fb726d48Sopenharmony_ci    disableInfo.append("\n\tcpudata");
149fb726d48Sopenharmony_ci#else
150fb726d48Sopenharmony_ci    enableInfo.append("\n\tcpudata");
151fb726d48Sopenharmony_ci#endif
152fb726d48Sopenharmony_ci#ifndef ENABLE_NETWORK
153fb726d48Sopenharmony_ci    disableInfo.append("\n\tnetwork");
154fb726d48Sopenharmony_ci#else
155fb726d48Sopenharmony_ci    enableInfo.append("\n\tnetwork");
156fb726d48Sopenharmony_ci#endif
157fb726d48Sopenharmony_ci#ifndef ENABLE_DISKIO
158fb726d48Sopenharmony_ci    disableInfo.append("\n\tdiskio");
159fb726d48Sopenharmony_ci#else
160fb726d48Sopenharmony_ci    enableInfo.append("\n\tdiskio");
161fb726d48Sopenharmony_ci#endif
162fb726d48Sopenharmony_ci#ifndef ENABLE_PROCESS
163fb726d48Sopenharmony_ci    disableInfo.append("\n\tprocess");
164fb726d48Sopenharmony_ci#else
165fb726d48Sopenharmony_ci    enableInfo.append("\n\tprocess");
166fb726d48Sopenharmony_ci#endif
167fb726d48Sopenharmony_ci    printf(
168fb726d48Sopenharmony_ci        "the default support ability list:\n\thiperf,ebpf,native_hook,hilog,hisysevent,arkts\n\t"
169fb726d48Sopenharmony_ci        "bytrace,rawtrace,htrace,ffrt,memory,hidump,cpudata,network,diskio,process\n");
170fb726d48Sopenharmony_ci}
171fb726d48Sopenharmony_civoid PrintExtendAbilityInfo(std::string &disableInfo, std::string &enableInfo)
172fb726d48Sopenharmony_ci{
173fb726d48Sopenharmony_ci#ifndef ENABLE_STREAM_EXTEND
174fb726d48Sopenharmony_ci    disableInfo.append("\n\tstream_extend");
175fb726d48Sopenharmony_ci#else
176fb726d48Sopenharmony_ci    enableInfo.append("\n\tstream_extend");
177fb726d48Sopenharmony_ci#endif
178fb726d48Sopenharmony_ci    printf("the extend support ability list:\n\tstream_extend\n");
179fb726d48Sopenharmony_ci}
180fb726d48Sopenharmony_civoid PrintAbilityInfo()
181fb726d48Sopenharmony_ci{
182fb726d48Sopenharmony_ci    std::string disableInfo;
183fb726d48Sopenharmony_ci    std::string enableInfo;
184fb726d48Sopenharmony_ci#ifndef ENABLE_HIPERF
185fb726d48Sopenharmony_ci    disableInfo.append("\n\thiperf");
186fb726d48Sopenharmony_ci#else
187fb726d48Sopenharmony_ci    enableInfo.append("\n\thiperf");
188fb726d48Sopenharmony_ci#endif
189fb726d48Sopenharmony_ci#ifndef ENABLE_EBPF
190fb726d48Sopenharmony_ci    disableInfo.append("\n\tebpf");
191fb726d48Sopenharmony_ci#else
192fb726d48Sopenharmony_ci    enableInfo.append("\n\tebpf");
193fb726d48Sopenharmony_ci#endif
194fb726d48Sopenharmony_ci#ifndef ENABLE_NATIVE_HOOK
195fb726d48Sopenharmony_ci    disableInfo.append("\n\tnative_hook");
196fb726d48Sopenharmony_ci#else
197fb726d48Sopenharmony_ci    enableInfo.append("\n\tnative_hook");
198fb726d48Sopenharmony_ci#endif
199fb726d48Sopenharmony_ci#ifndef ENABLE_HILOG
200fb726d48Sopenharmony_ci    disableInfo.append("\n\thilog");
201fb726d48Sopenharmony_ci#else
202fb726d48Sopenharmony_ci    enableInfo.append("\n\thilog");
203fb726d48Sopenharmony_ci#endif
204fb726d48Sopenharmony_ci#ifndef ENABLE_HISYSEVENT
205fb726d48Sopenharmony_ci    disableInfo.append("\n\thisysevent");
206fb726d48Sopenharmony_ci#else
207fb726d48Sopenharmony_ci    enableInfo.append("\n\thisysevent");
208fb726d48Sopenharmony_ci#endif
209fb726d48Sopenharmony_ci#ifndef ENABLE_ARKTS
210fb726d48Sopenharmony_ci    disableInfo.append("\n\tarkts");
211fb726d48Sopenharmony_ci#else
212fb726d48Sopenharmony_ci    enableInfo.append("\n\tarkts");
213fb726d48Sopenharmony_ci#endif
214fb726d48Sopenharmony_ci    PrintDefaultAbilityInfo(disableInfo, enableInfo);
215fb726d48Sopenharmony_ci    PrintExtendAbilityInfo(disableInfo, enableInfo);
216fb726d48Sopenharmony_ci    printf("the enable ability list:%s\n", enableInfo.empty() ? "\n\tnull" : enableInfo.c_str());
217fb726d48Sopenharmony_ci    printf("the disable ability list:%s\n", disableInfo.empty() ? "\n\tnull" : disableInfo.c_str());
218fb726d48Sopenharmony_ci}
219fb726d48Sopenharmony_cibool ReadAndParser(SysTuning::TraceStreamer::TraceStreamerSelector &ta, int fd)
220fb726d48Sopenharmony_ci{
221fb726d48Sopenharmony_ci    auto startTime =
222fb726d48Sopenharmony_ci        (std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::system_clock::now().time_since_epoch()))
223fb726d48Sopenharmony_ci            .count();
224fb726d48Sopenharmony_ci    auto isFinish = false;
225fb726d48Sopenharmony_ci    g_loadSize = 0;
226fb726d48Sopenharmony_ci    auto curParseCnt = 1;
227fb726d48Sopenharmony_ci    while (true) {
228fb726d48Sopenharmony_ci        // for rawtrace next parse.the first parse is for last comm data;
229fb726d48Sopenharmony_ci        if (isFinish && ta.GetFileType() == TRACE_FILETYPE_RAW_TRACE && curParseCnt < RAW_TRACE_PARSE_MAX) {
230fb726d48Sopenharmony_ci            ++curParseCnt;
231fb726d48Sopenharmony_ci            isFinish = false;
232fb726d48Sopenharmony_ci            g_loadSize = 0;
233fb726d48Sopenharmony_ci            TS_CHECK_TRUE(lseek(fd, 0, SEEK_SET) != -1, false, "lseek error:%s", strerror(errno));
234fb726d48Sopenharmony_ci        }
235fb726d48Sopenharmony_ci        std::unique_ptr<uint8_t[]> buf = std::make_unique<uint8_t[]>(G_CHUNK_SIZE);
236fb726d48Sopenharmony_ci        auto rsize = Read(fd, buf.get(), G_CHUNK_SIZE);
237fb726d48Sopenharmony_ci        if (rsize == 0) {
238fb726d48Sopenharmony_ci            break;
239fb726d48Sopenharmony_ci        }
240fb726d48Sopenharmony_ci
241fb726d48Sopenharmony_ci        if (rsize < 0) {
242fb726d48Sopenharmony_ci            TS_LOGE("Reading trace file failed (errno: %d, %s)", errno, strerror(errno));
243fb726d48Sopenharmony_ci            return false;
244fb726d48Sopenharmony_ci        }
245fb726d48Sopenharmony_ci        g_loadSize += rsize;
246fb726d48Sopenharmony_ci        if (g_loadSize == g_fileSize) {
247fb726d48Sopenharmony_ci            isFinish = true;
248fb726d48Sopenharmony_ci        }
249fb726d48Sopenharmony_ci        if (!ta.ParseTraceDataSegment(std::move(buf), static_cast<size_t>(rsize), false, isFinish)) {
250fb726d48Sopenharmony_ci            return false;
251fb726d48Sopenharmony_ci        };
252fb726d48Sopenharmony_ci        printf("\rLoadingFile:\t%.2f MB\r", static_cast<double>(g_loadSize) / 1E6);
253fb726d48Sopenharmony_ci    }
254fb726d48Sopenharmony_ci    ta.WaitForParserEnd();
255fb726d48Sopenharmony_ci    auto endTime =
256fb726d48Sopenharmony_ci        (std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::system_clock::now().time_since_epoch()))
257fb726d48Sopenharmony_ci            .count();
258fb726d48Sopenharmony_ci    (void)fprintf(stdout, "\nParserDuration:\t%u ms\n", static_cast<unsigned int>(endTime - startTime));
259fb726d48Sopenharmony_ci    (void)fprintf(stdout, "ParserSpeed:\t%.2f MB/s\n", (g_loadSize / (endTime - startTime) / 1E3));
260fb726d48Sopenharmony_ci    return true;
261fb726d48Sopenharmony_ci}
262fb726d48Sopenharmony_cibool SetFileSize(const std::string &traceFilePath)
263fb726d48Sopenharmony_ci{
264fb726d48Sopenharmony_ci    if (traceFilePath.empty()) {
265fb726d48Sopenharmony_ci        g_fileSize = 0;
266fb726d48Sopenharmony_ci        return false;
267fb726d48Sopenharmony_ci    }
268fb726d48Sopenharmony_ci    struct stat statBuff;
269fb726d48Sopenharmony_ci    stat(traceFilePath.c_str(), &statBuff);
270fb726d48Sopenharmony_ci    g_fileSize = statBuff.st_size;
271fb726d48Sopenharmony_ci    return true;
272fb726d48Sopenharmony_ci}
273fb726d48Sopenharmony_ciint OpenAndParserFile(TraceStreamerSelector &ts, const std::string &traceFilePath)
274fb726d48Sopenharmony_ci{
275fb726d48Sopenharmony_ci    std::string filePath = traceFilePath;
276fb726d48Sopenharmony_ci    if (!UnZipFile(traceFilePath, filePath)) {
277fb726d48Sopenharmony_ci        return 1;
278fb726d48Sopenharmony_ci    }
279fb726d48Sopenharmony_ci    if (!SetFileSize(filePath)) {
280fb726d48Sopenharmony_ci        return 0;
281fb726d48Sopenharmony_ci    }
282fb726d48Sopenharmony_ci    int fd(OpenFile(filePath, O_RDONLY, G_FILE_PERMISSION));
283fb726d48Sopenharmony_ci    if (fd < 0) {
284fb726d48Sopenharmony_ci        TS_LOGE("%s does not exist", filePath.c_str());
285fb726d48Sopenharmony_ci        SetAnalysisResult(TRACE_PARSER_ABNORMAL);
286fb726d48Sopenharmony_ci        return 1;
287fb726d48Sopenharmony_ci    }
288fb726d48Sopenharmony_ci    if (!ReadAndParser(ts, fd)) {
289fb726d48Sopenharmony_ci        close(fd);
290fb726d48Sopenharmony_ci        SetAnalysisResult(TRACE_PARSER_ABNORMAL);
291fb726d48Sopenharmony_ci        return 1;
292fb726d48Sopenharmony_ci    }
293fb726d48Sopenharmony_ci    MetaData *metaData = ts.GetMetaData();
294fb726d48Sopenharmony_ci
295fb726d48Sopenharmony_ci    std::string fileNameTmp = traceFilePath;
296fb726d48Sopenharmony_ci#ifdef _WIN32
297fb726d48Sopenharmony_ci    if (!base::GetCoding(reinterpret_cast<const uint8_t *>(fileNameTmp.c_str()), fileNameTmp.length())) {
298fb726d48Sopenharmony_ci        fileNameTmp = base::GbkToUtf8(fileNameTmp.c_str());
299fb726d48Sopenharmony_ci    }
300fb726d48Sopenharmony_ci#endif
301fb726d48Sopenharmony_ci    metaData->SetSourceFileName(fileNameTmp);
302fb726d48Sopenharmony_ci    metaData->SetTraceType((ts.DataType() == TRACE_FILETYPE_H_TRACE) ? "proto-based-trace" : "txt-based-trace");
303fb726d48Sopenharmony_ci
304fb726d48Sopenharmony_ci    close(fd);
305fb726d48Sopenharmony_ci    return 0;
306fb726d48Sopenharmony_ci}
307fb726d48Sopenharmony_ciint ExportDatabase(TraceStreamerSelector &ts, const std::string &sqliteFilePath)
308fb726d48Sopenharmony_ci{
309fb726d48Sopenharmony_ci    auto startTime =
310fb726d48Sopenharmony_ci        (std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::system_clock::now().time_since_epoch()))
311fb726d48Sopenharmony_ci            .count();
312fb726d48Sopenharmony_ci    if (!sqliteFilePath.empty()) {
313fb726d48Sopenharmony_ci        MetaData *metaData = ts.GetMetaData();
314fb726d48Sopenharmony_ci        std::string fileNameTmp = sqliteFilePath;
315fb726d48Sopenharmony_ci#ifdef _WIN32
316fb726d48Sopenharmony_ci        if (!base::GetCoding(reinterpret_cast<const uint8_t *>(fileNameTmp.c_str()), fileNameTmp.length())) {
317fb726d48Sopenharmony_ci            fileNameTmp = base::GbkToUtf8(fileNameTmp.c_str());
318fb726d48Sopenharmony_ci        }
319fb726d48Sopenharmony_ci#endif
320fb726d48Sopenharmony_ci        metaData->SetOutputFileName(fileNameTmp);
321fb726d48Sopenharmony_ci        metaData->SetParserToolVersion(TRACE_STREAMER_VERSION);
322fb726d48Sopenharmony_ci        metaData->SetParserToolPublishDateTime(TRACE_STREAMER_PUBLISH_VERSION);
323fb726d48Sopenharmony_ci        metaData->SetTraceDataSize(g_loadSize);
324fb726d48Sopenharmony_ci        if (ts.ExportDatabase(sqliteFilePath)) {
325fb726d48Sopenharmony_ci            fprintf(stdout, "ExportDatabase failed\n");
326fb726d48Sopenharmony_ci            ExportStatusToLog(sqliteFilePath, TRACE_PARSER_ABNORMAL);
327fb726d48Sopenharmony_ci            return 1;
328fb726d48Sopenharmony_ci        }
329fb726d48Sopenharmony_ci    }
330fb726d48Sopenharmony_ci    auto endTime =
331fb726d48Sopenharmony_ci        (std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::system_clock::now().time_since_epoch()))
332fb726d48Sopenharmony_ci            .count();
333fb726d48Sopenharmony_ci    endTime += 1; // for any exception of endTime == startTime
334fb726d48Sopenharmony_ci    (void)fprintf(stdout, "ExportDuration:\t%u ms\n", static_cast<unsigned int>(endTime - startTime));
335fb726d48Sopenharmony_ci    (void)fprintf(stdout, "ExportSpeed:\t%.2f MB/s\n", (g_loadSize / (endTime - startTime)) / 1E3);
336fb726d48Sopenharmony_ci    return 0;
337fb726d48Sopenharmony_ci}
338fb726d48Sopenharmony_cibool LongTraceExportDatabase(TraceStreamerSelector &ts, const std::string &sqliteFilePath)
339fb726d48Sopenharmony_ci{
340fb726d48Sopenharmony_ci    if (!sqliteFilePath.empty()) {
341fb726d48Sopenharmony_ci        std::string fileNameTmp = sqliteFilePath;
342fb726d48Sopenharmony_ci#ifdef _WIN32
343fb726d48Sopenharmony_ci        if (!base::GetCoding(reinterpret_cast<const uint8_t *>(fileNameTmp.c_str()), fileNameTmp.length())) {
344fb726d48Sopenharmony_ci            fileNameTmp = base::GbkToUtf8(fileNameTmp.c_str());
345fb726d48Sopenharmony_ci        }
346fb726d48Sopenharmony_ci#endif
347fb726d48Sopenharmony_ci        if (ts.BatchExportDatabase(sqliteFilePath)) {
348fb726d48Sopenharmony_ci            fprintf(stdout, "ExportDatabase failed\n");
349fb726d48Sopenharmony_ci            ExportStatusToLog(sqliteFilePath, TRACE_PARSER_ABNORMAL);
350fb726d48Sopenharmony_ci            return false;
351fb726d48Sopenharmony_ci        }
352fb726d48Sopenharmony_ci    }
353fb726d48Sopenharmony_ci    return true;
354fb726d48Sopenharmony_ci}
355fb726d48Sopenharmony_cienum DumpFileType { UNKONW_TYPE = 0, PERF_TYPE, NATIVE_HOOK_TYPE, EBPF_TYPE };
356fb726d48Sopenharmony_cistruct TraceExportOption {
357fb726d48Sopenharmony_ci    std::string longTraceDir;
358fb726d48Sopenharmony_ci    std::string traceFilePath;
359fb726d48Sopenharmony_ci    std::string sqliteFilePath;
360fb726d48Sopenharmony_ci    DumpFileType dumpFileType = DumpFileType::UNKONW_TYPE;
361fb726d48Sopenharmony_ci    std::string outputFilePath;
362fb726d48Sopenharmony_ci    std::string metricsIndex;
363fb726d48Sopenharmony_ci    std::string sqlOperatorFilePath;
364fb726d48Sopenharmony_ci    bool interactiveState = false;
365fb726d48Sopenharmony_ci    bool exportMetaTable = true;
366fb726d48Sopenharmony_ci    bool separateFile = false;
367fb726d48Sopenharmony_ci    bool closeMutiThread = false;
368fb726d48Sopenharmony_ci    uint8_t parserThreadNum = INVALID_UINT8;
369fb726d48Sopenharmony_ci    bool needClearLongTraceCache = true;
370fb726d48Sopenharmony_ci    std::string soFilesDir;
371fb726d48Sopenharmony_ci};
372fb726d48Sopenharmony_cibool CheckFinal(char **argv, TraceExportOption &traceExportOption)
373fb726d48Sopenharmony_ci{
374fb726d48Sopenharmony_ci    if (((traceExportOption.traceFilePath.empty() && traceExportOption.longTraceDir.empty()) ||
375fb726d48Sopenharmony_ci         (!traceExportOption.interactiveState && traceExportOption.sqliteFilePath.empty())) &&
376fb726d48Sopenharmony_ci        !traceExportOption.separateFile && traceExportOption.metricsIndex.empty() &&
377fb726d48Sopenharmony_ci        traceExportOption.sqlOperatorFilePath.empty() && traceExportOption.outputFilePath.empty() &&
378fb726d48Sopenharmony_ci        traceExportOption.dumpFileType == DumpFileType::UNKONW_TYPE) {
379fb726d48Sopenharmony_ci        ShowHelpInfo(argv[0]);
380fb726d48Sopenharmony_ci        return false;
381fb726d48Sopenharmony_ci    }
382fb726d48Sopenharmony_ci    return true;
383fb726d48Sopenharmony_ci}
384fb726d48Sopenharmony_cibool CheckArgc(int argc, char **argv, int curArgNum)
385fb726d48Sopenharmony_ci{
386fb726d48Sopenharmony_ci    if (curArgNum == argc) {
387fb726d48Sopenharmony_ci        ShowHelpInfo(argv[0]);
388fb726d48Sopenharmony_ci        return false;
389fb726d48Sopenharmony_ci    }
390fb726d48Sopenharmony_ci    return true;
391fb726d48Sopenharmony_ci}
392fb726d48Sopenharmony_cibool CheckAndSetSoFilesPath(TraceExportOption &traceExportOption, int argc, char **argv, int &index)
393fb726d48Sopenharmony_ci{
394fb726d48Sopenharmony_ci    TS_CHECK_TRUE_RET(CheckArgc(argc, argv, ++index), false);
395fb726d48Sopenharmony_ci    traceExportOption.soFilesDir = std::string(argv[index]);
396fb726d48Sopenharmony_ci    return true;
397fb726d48Sopenharmony_ci}
398fb726d48Sopenharmony_cibool CheckAndSetLogLevel(int argc, char **argv, int &index)
399fb726d48Sopenharmony_ci{
400fb726d48Sopenharmony_ci    TS_CHECK_TRUE_RET(CheckArgc(argc, argv, ++index), false);
401fb726d48Sopenharmony_ci    if (SetLogLevel(std::string(argv[index]))) {
402fb726d48Sopenharmony_ci        return true;
403fb726d48Sopenharmony_ci    }
404fb726d48Sopenharmony_ci    ShowHelpInfo(argv[0]);
405fb726d48Sopenharmony_ci    return false;
406fb726d48Sopenharmony_ci}
407fb726d48Sopenharmony_cibool CheckAndSetMetrics(TraceExportOption &traceExportOption, int argc, char **argv, int &index)
408fb726d48Sopenharmony_ci{
409fb726d48Sopenharmony_ci    TS_CHECK_TRUE_RET(CheckArgc(argc, argv, ++index), false);
410fb726d48Sopenharmony_ci    traceExportOption.metricsIndex = std::string(argv[index]);
411fb726d48Sopenharmony_ci    return true;
412fb726d48Sopenharmony_ci}
413fb726d48Sopenharmony_cibool CheckAndSetThreadNum(TraceExportOption &traceExportOption, int argc, char **argv, int &index)
414fb726d48Sopenharmony_ci{
415fb726d48Sopenharmony_ci    TS_CHECK_TRUE_RET(CheckArgc(argc, argv, ++index), false);
416fb726d48Sopenharmony_ci    traceExportOption.parserThreadNum = std::stoi(argv[index]);
417fb726d48Sopenharmony_ci    return true;
418fb726d48Sopenharmony_ci}
419fb726d48Sopenharmony_ci
420fb726d48Sopenharmony_cibool CheckAndSetSqlitePath(TraceExportOption &traceExportOption, int argc, char **argv, int &index)
421fb726d48Sopenharmony_ci{
422fb726d48Sopenharmony_ci    TS_CHECK_TRUE_RET(CheckArgc(argc, argv, ++index), false);
423fb726d48Sopenharmony_ci    traceExportOption.sqliteFilePath = std::string(argv[index]);
424fb726d48Sopenharmony_ci    return true;
425fb726d48Sopenharmony_ci}
426fb726d48Sopenharmony_cibool CheckAndSetOutputFilePath(TraceExportOption &traceExportOption, int argc, char **argv, int &index)
427fb726d48Sopenharmony_ci{
428fb726d48Sopenharmony_ci    TS_CHECK_TRUE_RET(CheckArgc(argc, argv, ++index), false);
429fb726d48Sopenharmony_ci    traceExportOption.outputFilePath = std::string(argv[index]);
430fb726d48Sopenharmony_ci    return true;
431fb726d48Sopenharmony_ci}
432fb726d48Sopenharmony_cibool CheckAndSetSqlQueryFilePath(TraceExportOption &traceExportOption, int argc, char **argv, int &index)
433fb726d48Sopenharmony_ci{
434fb726d48Sopenharmony_ci    TS_CHECK_TRUE_RET(CheckArgc(argc, argv, ++index), false);
435fb726d48Sopenharmony_ci    traceExportOption.sqlOperatorFilePath = std::string(argv[index]);
436fb726d48Sopenharmony_ci    return true;
437fb726d48Sopenharmony_ci}
438fb726d48Sopenharmony_cibool CheckAndSetDumpFileType(TraceExportOption &traceExportOption, int argc, char **argv, int &index)
439fb726d48Sopenharmony_ci{
440fb726d48Sopenharmony_ci    TS_CHECK_TRUE_RET(CheckArgc(argc, argv, ++index), false);
441fb726d48Sopenharmony_ci    auto dumpFileType = std::string(argv[index]);
442fb726d48Sopenharmony_ci    if (dumpFileType == "perf") {
443fb726d48Sopenharmony_ci#ifdef ENABLE_HIPERF
444fb726d48Sopenharmony_ci        traceExportOption.dumpFileType = DumpFileType::PERF_TYPE;
445fb726d48Sopenharmony_ci#endif
446fb726d48Sopenharmony_ci    } else if (dumpFileType == "hook") {
447fb726d48Sopenharmony_ci#ifdef ENABLE_NATIVE_HOOK
448fb726d48Sopenharmony_ci        traceExportOption.dumpFileType = DumpFileType::NATIVE_HOOK_TYPE;
449fb726d48Sopenharmony_ci#endif
450fb726d48Sopenharmony_ci    } else if (dumpFileType == "ebpf") {
451fb726d48Sopenharmony_ci#ifdef ENABLE_EBPF
452fb726d48Sopenharmony_ci        traceExportOption.dumpFileType = DumpFileType::EBPF_TYPE;
453fb726d48Sopenharmony_ci#endif
454fb726d48Sopenharmony_ci    }
455fb726d48Sopenharmony_ci    if (traceExportOption.dumpFileType == DumpFileType::UNKONW_TYPE) {
456fb726d48Sopenharmony_ci        ShowHelpInfo(argv[0]);
457fb726d48Sopenharmony_ci        return false;
458fb726d48Sopenharmony_ci    }
459fb726d48Sopenharmony_ci    if (!traceExportOption.outputFilePath.empty()) {
460fb726d48Sopenharmony_ci        auto strVec = SplitStringToVec(traceExportOption.traceFilePath, ".");
461fb726d48Sopenharmony_ci        traceExportOption.outputFilePath = strVec.front() + "_ReadableText.txt";
462fb726d48Sopenharmony_ci    }
463fb726d48Sopenharmony_ci    return true;
464fb726d48Sopenharmony_ci}
465fb726d48Sopenharmony_cibool CheckAndSetLongTraceDir(TraceExportOption &traceExportOption, int argc, char **argv, int &index)
466fb726d48Sopenharmony_ci{
467fb726d48Sopenharmony_ci    TS_CHECK_TRUE_RET(CheckArgc(argc, argv, ++index), false);
468fb726d48Sopenharmony_ci    traceExportOption.longTraceDir = std::string(argv[index]);
469fb726d48Sopenharmony_ci    return true;
470fb726d48Sopenharmony_ci}
471fb726d48Sopenharmony_cibool ParseOtherArgs(int argc, char **argv, TraceExportOption &traceExportOption, int &i)
472fb726d48Sopenharmony_ci{
473fb726d48Sopenharmony_ci    if (!strcmp(argv[i], "-i") || !strcmp(argv[i], "--info")) {
474fb726d48Sopenharmony_ci        PrintInformation();
475fb726d48Sopenharmony_ci        i++;
476fb726d48Sopenharmony_ci    } else if (!strcmp(argv[i], "-lnc")) {
477fb726d48Sopenharmony_ci        traceExportOption.needClearLongTraceCache = false;
478fb726d48Sopenharmony_ci        i++;
479fb726d48Sopenharmony_ci        return true;
480fb726d48Sopenharmony_ci    } else if (!strcmp(argv[i], "-l") || !strcmp(argv[i], "--level")) {
481fb726d48Sopenharmony_ci        TS_CHECK_TRUE_RET(CheckAndSetLogLevel(argc, argv, i), false);
482fb726d48Sopenharmony_ci        i++;
483fb726d48Sopenharmony_ci        return true;
484fb726d48Sopenharmony_ci    } else if (!strcmp(argv[i], "--list")) {
485fb726d48Sopenharmony_ci        PrintAbilityInfo();
486fb726d48Sopenharmony_ci        i++;
487fb726d48Sopenharmony_ci        return false;
488fb726d48Sopenharmony_ci    } else if (!strcmp(argv[i], "-s") || !strcmp(argv[i], "--s")) {
489fb726d48Sopenharmony_ci        traceExportOption.separateFile = true;
490fb726d48Sopenharmony_ci        return true;
491fb726d48Sopenharmony_ci    } else if (!strcmp(argv[i], "-tn") || !strcmp(argv[i], "--threadnum")) {
492fb726d48Sopenharmony_ci        TS_CHECK_TRUE_RET(CheckAndSetThreadNum(traceExportOption, argc, argv, i), false);
493fb726d48Sopenharmony_ci        i++;
494fb726d48Sopenharmony_ci        return true;
495fb726d48Sopenharmony_ci    } else if (!strcmp(argv[i], "-nt") || !strcmp(argv[i], "--nothreads")) {
496fb726d48Sopenharmony_ci        traceExportOption.closeMutiThread = true;
497fb726d48Sopenharmony_ci        i++;
498fb726d48Sopenharmony_ci        return true;
499fb726d48Sopenharmony_ci    } else if (!strcmp(argv[i], "-nm") || !strcmp(argv[i], "--nometa")) {
500fb726d48Sopenharmony_ci        traceExportOption.exportMetaTable = false;
501fb726d48Sopenharmony_ci        i++;
502fb726d48Sopenharmony_ci        return true;
503fb726d48Sopenharmony_ci    } else if (!strcmp(argv[i], "-m") || !strcmp(argv[i], "--run-metrics")) {
504fb726d48Sopenharmony_ci        TS_CHECK_TRUE_RET(CheckAndSetMetrics(traceExportOption, argc, argv, i), false);
505fb726d48Sopenharmony_ci        i++;
506fb726d48Sopenharmony_ci        return true;
507fb726d48Sopenharmony_ci    } else if (!strcmp(argv[i], "-v") || !strcmp(argv[i], "--version")) {
508fb726d48Sopenharmony_ci        PrintVersion();
509fb726d48Sopenharmony_ci        i++;
510fb726d48Sopenharmony_ci        return false;
511fb726d48Sopenharmony_ci    }
512fb726d48Sopenharmony_ci    traceExportOption.traceFilePath = std::string(argv[i]);
513fb726d48Sopenharmony_ci    i++;
514fb726d48Sopenharmony_ci    return true;
515fb726d48Sopenharmony_ci}
516fb726d48Sopenharmony_cibool ParseArgs(int argc, char **argv, TraceExportOption &traceExportOption)
517fb726d48Sopenharmony_ci{
518fb726d48Sopenharmony_ci    int i = 1;
519fb726d48Sopenharmony_ci    while (i < argc) {
520fb726d48Sopenharmony_ci        if (!strcmp(argv[i], "-e")) {
521fb726d48Sopenharmony_ci            TS_CHECK_TRUE_RET(CheckAndSetSqlitePath(traceExportOption, argc, argv, i), false);
522fb726d48Sopenharmony_ci            i++;
523fb726d48Sopenharmony_ci            continue;
524fb726d48Sopenharmony_ci        } else if (!strcmp(argv[i], "-c") || !strcmp(argv[i], "--command")) {
525fb726d48Sopenharmony_ci            traceExportOption.interactiveState = true;
526fb726d48Sopenharmony_ci            i++;
527fb726d48Sopenharmony_ci            continue;
528fb726d48Sopenharmony_ci        } else if (!strcmp(argv[i], "-D") || !strcmp(argv[i], "--directory")) {
529fb726d48Sopenharmony_ci            TS_CHECK_TRUE_RET(CheckAndSetLongTraceDir(traceExportOption, argc, argv, i), false);
530fb726d48Sopenharmony_ci            i++;
531fb726d48Sopenharmony_ci            continue;
532fb726d48Sopenharmony_ci        } else if (!strcmp(argv[i], "-d") || !strcmp(argv[i], "--dump")) {
533fb726d48Sopenharmony_ci            TS_CHECK_TRUE_RET(CheckAndSetDumpFileType(traceExportOption, argc, argv, i), false);
534fb726d48Sopenharmony_ci            i++;
535fb726d48Sopenharmony_ci            continue;
536fb726d48Sopenharmony_ci        } else if (!strcmp(argv[i], "-q") || !strcmp(argv[i], "--query-file")) {
537fb726d48Sopenharmony_ci            TS_CHECK_TRUE_RET(CheckAndSetSqlQueryFilePath(traceExportOption, argc, argv, i), false);
538fb726d48Sopenharmony_ci            i++;
539fb726d48Sopenharmony_ci            continue;
540fb726d48Sopenharmony_ci        } else if (!strcmp(argv[i], "-o") || !strcmp(argv[i], "--out")) {
541fb726d48Sopenharmony_ci            TS_CHECK_TRUE_RET(CheckAndSetOutputFilePath(traceExportOption, argc, argv, i), false);
542fb726d48Sopenharmony_ci            i++;
543fb726d48Sopenharmony_ci            continue;
544fb726d48Sopenharmony_ci        } else if (!strcmp(argv[i], "--So_dir")) {
545fb726d48Sopenharmony_ci            TS_CHECK_TRUE_RET(CheckAndSetSoFilesPath(traceExportOption, argc, argv, i), false);
546fb726d48Sopenharmony_ci            i++;
547fb726d48Sopenharmony_ci            continue;
548fb726d48Sopenharmony_ci        } else if (!ParseOtherArgs(argc, argv, traceExportOption, i)) {
549fb726d48Sopenharmony_ci            return false;
550fb726d48Sopenharmony_ci        }
551fb726d48Sopenharmony_ci    }
552fb726d48Sopenharmony_ci    return CheckFinal(argv, traceExportOption);
553fb726d48Sopenharmony_ci}
554fb726d48Sopenharmony_ci
555fb726d48Sopenharmony_cibool GetLongTraceFilePaths(const TraceExportOption &traceExportOption, std::map<int, std::string> &seqToFilePathMap)
556fb726d48Sopenharmony_ci{
557fb726d48Sopenharmony_ci    std::regex traceInvalidStr("\\\\");
558fb726d48Sopenharmony_ci    auto strEscape = std::regex_replace(traceExportOption.longTraceDir, traceInvalidStr, "\\\\\\\\");
559fb726d48Sopenharmony_ci    DIR *dir = opendir(strEscape.c_str());
560fb726d48Sopenharmony_ci    if (dir == nullptr) {
561fb726d48Sopenharmony_ci        TS_LOGE("long trace dir is not exist or not dir");
562fb726d48Sopenharmony_ci        return false;
563fb726d48Sopenharmony_ci    }
564fb726d48Sopenharmony_ci    dirent *entry;
565fb726d48Sopenharmony_ci    while ((entry = readdir(dir)) != nullptr) {
566fb726d48Sopenharmony_ci        std::regex pattern("^hiprofiler_data_(\\d{8})_(\\d{6})_(\\d+)\\.htrace$");
567fb726d48Sopenharmony_ci        std::smatch matches;
568fb726d48Sopenharmony_ci        std::string name = entry->d_name;
569fb726d48Sopenharmony_ci        if (std::regex_match(name, matches, pattern)) {
570fb726d48Sopenharmony_ci            std::string seqStr = matches[3].str();
571fb726d48Sopenharmony_ci            int seq = std::stoi(seqStr);
572fb726d48Sopenharmony_ci            std::string path = std::string(strEscape) + "/" + name;
573fb726d48Sopenharmony_ci            seqToFilePathMap.insert({seq, path});
574fb726d48Sopenharmony_ci        }
575fb726d48Sopenharmony_ci    }
576fb726d48Sopenharmony_ci    closedir(dir);
577fb726d48Sopenharmony_ci    if (!seqToFilePathMap.size()) {
578fb726d48Sopenharmony_ci        TS_LOGE("%s has no matched file!", strEscape.c_str());
579fb726d48Sopenharmony_ci        return false;
580fb726d48Sopenharmony_ci    }
581fb726d48Sopenharmony_ci    auto seq = seqToFilePathMap.begin()->first;
582fb726d48Sopenharmony_ci    for (auto itor = seqToFilePathMap.begin(); itor != seqToFilePathMap.end(); itor++) {
583fb726d48Sopenharmony_ci        if (itor->first != seq++) {
584fb726d48Sopenharmony_ci            seqToFilePathMap.erase(itor, seqToFilePathMap.end());
585fb726d48Sopenharmony_ci            break;
586fb726d48Sopenharmony_ci        }
587fb726d48Sopenharmony_ci    }
588fb726d48Sopenharmony_ci    return true;
589fb726d48Sopenharmony_ci}
590fb726d48Sopenharmony_ci
591fb726d48Sopenharmony_cibool ReadAndParserLongTrace(SysTuning::TraceStreamer::TraceStreamerSelector &ta,
592fb726d48Sopenharmony_ci                            int fd,
593fb726d48Sopenharmony_ci                            const std::string &traceFilePath)
594fb726d48Sopenharmony_ci{
595fb726d48Sopenharmony_ci    printf("Start Parse %s ...\n", traceFilePath.c_str());
596fb726d48Sopenharmony_ci    g_loadSize = 0;
597fb726d48Sopenharmony_ci    while (true) {
598fb726d48Sopenharmony_ci        std::unique_ptr<uint8_t[]> buf = std::make_unique<uint8_t[]>(G_CHUNK_SIZE);
599fb726d48Sopenharmony_ci        auto rSize = Read(fd, buf.get(), G_CHUNK_SIZE);
600fb726d48Sopenharmony_ci        if (rSize == 0) {
601fb726d48Sopenharmony_ci            break;
602fb726d48Sopenharmony_ci        }
603fb726d48Sopenharmony_ci        if (rSize < 0) {
604fb726d48Sopenharmony_ci            TS_LOGE("Reading trace file failed (errno: %d, %s)", errno, strerror(errno));
605fb726d48Sopenharmony_ci            return false;
606fb726d48Sopenharmony_ci        }
607fb726d48Sopenharmony_ci        g_loadSize += rSize;
608fb726d48Sopenharmony_ci        if (!ta.BatchParseTraceDataSegment(std::move(buf), static_cast<size_t>(rSize))) {
609fb726d48Sopenharmony_ci            return false;
610fb726d48Sopenharmony_ci        }
611fb726d48Sopenharmony_ci        printf("\rLoadingFile:\t%.2f MB\r", static_cast<double>(g_loadSize) / 1E6);
612fb726d48Sopenharmony_ci    }
613fb726d48Sopenharmony_ci    return true;
614fb726d48Sopenharmony_ci}
615fb726d48Sopenharmony_cibool OpenAndParserLongTraceFile(TraceStreamerSelector &ts, const std::string &traceFilePath)
616fb726d48Sopenharmony_ci{
617fb726d48Sopenharmony_ci    if (!SetFileSize(traceFilePath)) {
618fb726d48Sopenharmony_ci        return false;
619fb726d48Sopenharmony_ci    }
620fb726d48Sopenharmony_ci    int fd(OpenFile(traceFilePath, O_RDONLY, G_FILE_PERMISSION));
621fb726d48Sopenharmony_ci    if (fd < 0) {
622fb726d48Sopenharmony_ci        TS_LOGE("%s does not exist", traceFilePath.c_str());
623fb726d48Sopenharmony_ci        SetAnalysisResult(TRACE_PARSER_ABNORMAL);
624fb726d48Sopenharmony_ci        return false;
625fb726d48Sopenharmony_ci    }
626fb726d48Sopenharmony_ci    if (!ReadAndParserLongTrace(ts, fd, traceFilePath)) {
627fb726d48Sopenharmony_ci        close(fd);
628fb726d48Sopenharmony_ci        SetAnalysisResult(TRACE_PARSER_ABNORMAL);
629fb726d48Sopenharmony_ci        return false;
630fb726d48Sopenharmony_ci    }
631fb726d48Sopenharmony_ci    close(fd);
632fb726d48Sopenharmony_ci    return true;
633fb726d48Sopenharmony_ci}
634fb726d48Sopenharmony_cibool ParseLongTrace(TraceStreamerSelector &ts, const TraceExportOption &traceExportOption)
635fb726d48Sopenharmony_ci{
636fb726d48Sopenharmony_ci    std::map<int, std::string> seqToFilePathMap;
637fb726d48Sopenharmony_ci    TS_CHECK_TRUE(!traceExportOption.sqliteFilePath.empty(), false, "sqliteFilePath is empty");
638fb726d48Sopenharmony_ci    TS_CHECK_TRUE(GetLongTraceFilePaths(traceExportOption, seqToFilePathMap), false, "GetLongTraceFilePaths err!");
639fb726d48Sopenharmony_ci    ts.CreatEmptyBatchDB(traceExportOption.sqliteFilePath);
640fb726d48Sopenharmony_ci    ts.GetTraceDataCache()->supportThread_ = false;
641fb726d48Sopenharmony_ci    for (auto itor = seqToFilePathMap.begin(); itor != seqToFilePathMap.end(); itor++) {
642fb726d48Sopenharmony_ci        if (!OpenAndParserLongTraceFile(ts, itor->second)) {
643fb726d48Sopenharmony_ci            break;
644fb726d48Sopenharmony_ci        }
645fb726d48Sopenharmony_ci        if (itor == std::prev(seqToFilePathMap.end())) {
646fb726d48Sopenharmony_ci            ts.WaitForParserEnd();
647fb726d48Sopenharmony_ci            if (!traceExportOption.needClearLongTraceCache) {
648fb726d48Sopenharmony_ci                TS_CHECK_TRUE(ExportDatabase(ts, traceExportOption.sqliteFilePath) == 0, false, "ExportDatabase Err!");
649fb726d48Sopenharmony_ci            }
650fb726d48Sopenharmony_ci        }
651fb726d48Sopenharmony_ci        if (!traceExportOption.needClearLongTraceCache) {
652fb726d48Sopenharmony_ci            continue;
653fb726d48Sopenharmony_ci        }
654fb726d48Sopenharmony_ci        ts.GetStreamFilter()->sliceFilter_->UpdateReadySize(); // for irq_
655fb726d48Sopenharmony_ci        ts.GetStreamFilter()->frameFilter_->UpdateReadySize(); // for frameSliceRow_
656fb726d48Sopenharmony_ci        ts.GetStreamFilter()->cpuFilter_->UpdateReadySize();   // for sched_slice
657fb726d48Sopenharmony_ci        ts.GetTraceDataCache()->UpdateAllReadySize();
658fb726d48Sopenharmony_ci        TS_CHECK_TRUE(LongTraceExportDatabase(ts, traceExportOption.sqliteFilePath), false,
659fb726d48Sopenharmony_ci                      "LongTraceExportDatabase Err!");
660fb726d48Sopenharmony_ci        ts.GetTraceDataCache()->ClearAllExportedCacheData();
661fb726d48Sopenharmony_ci        if (itor == std::prev(seqToFilePathMap.end())) {
662fb726d48Sopenharmony_ci            ts.RevertTableName(traceExportOption.sqliteFilePath);
663fb726d48Sopenharmony_ci        }
664fb726d48Sopenharmony_ci    }
665fb726d48Sopenharmony_ci    if (!traceExportOption.sqliteFilePath.empty()) {
666fb726d48Sopenharmony_ci        ExportStatusToLog(traceExportOption.sqliteFilePath, GetAnalysisResult());
667fb726d48Sopenharmony_ci    }
668fb726d48Sopenharmony_ci    return true;
669fb726d48Sopenharmony_ci}
670fb726d48Sopenharmony_civoid ExportReadableText(TraceStreamerSelector &ts, const TraceExportOption &traceExportOption)
671fb726d48Sopenharmony_ci{
672fb726d48Sopenharmony_ci    if (traceExportOption.dumpFileType == DumpFileType::PERF_TYPE) {
673fb726d48Sopenharmony_ci        ts.ExportPerfReadableText(traceExportOption.outputFilePath);
674fb726d48Sopenharmony_ci    } else if (traceExportOption.dumpFileType == DumpFileType::NATIVE_HOOK_TYPE) {
675fb726d48Sopenharmony_ci        ts.ExportHookReadableText(traceExportOption.outputFilePath);
676fb726d48Sopenharmony_ci    } else if (traceExportOption.dumpFileType == DumpFileType::EBPF_TYPE) {
677fb726d48Sopenharmony_ci        ts.ExportEbpfReadableText(traceExportOption.outputFilePath);
678fb726d48Sopenharmony_ci    }
679fb726d48Sopenharmony_ci}
680fb726d48Sopenharmony_cibool CheckAndParseArgs(int argc, char **argv, TraceExportOption &traceExportOption)
681fb726d48Sopenharmony_ci{
682fb726d48Sopenharmony_ci    if (argc < G_MIN_PARAM_NUM) {
683fb726d48Sopenharmony_ci        ShowHelpInfo(argv[0]);
684fb726d48Sopenharmony_ci        return false;
685fb726d48Sopenharmony_ci    }
686fb726d48Sopenharmony_ci    int ret = ParseArgs(argc, argv, traceExportOption);
687fb726d48Sopenharmony_ci    if (ret) {
688fb726d48Sopenharmony_ci        if (!traceExportOption.sqliteFilePath.empty()) {
689fb726d48Sopenharmony_ci            ExportStatusToLog(traceExportOption.sqliteFilePath, GetAnalysisResult());
690fb726d48Sopenharmony_ci        }
691fb726d48Sopenharmony_ci        return true;
692fb726d48Sopenharmony_ci    }
693fb726d48Sopenharmony_ci    return false;
694fb726d48Sopenharmony_ci}
695fb726d48Sopenharmony_cibool EnterInteractiveState(TraceStreamerSelector &ts)
696fb726d48Sopenharmony_ci{
697fb726d48Sopenharmony_ci    MetaData *metaData = ts.GetMetaData();
698fb726d48Sopenharmony_ci    metaData->SetOutputFileName("command line mode");
699fb726d48Sopenharmony_ci    metaData->SetParserToolVersion(TRACE_STREAMER_VERSION.c_str());
700fb726d48Sopenharmony_ci    metaData->SetParserToolPublishDateTime(TRACE_STREAMER_PUBLISH_VERSION.c_str());
701fb726d48Sopenharmony_ci    metaData->SetTraceDataSize(g_loadSize);
702fb726d48Sopenharmony_ci    while (true) {
703fb726d48Sopenharmony_ci        auto values = ts.SearchData();
704fb726d48Sopenharmony_ci        if (!values.empty()) {
705fb726d48Sopenharmony_ci            std::string symbolsPath = "default";
706fb726d48Sopenharmony_ci            ts.ReloadSymbolFiles(symbolsPath, values);
707fb726d48Sopenharmony_ci        } else {
708fb726d48Sopenharmony_ci            return false;
709fb726d48Sopenharmony_ci        }
710fb726d48Sopenharmony_ci    }
711fb726d48Sopenharmony_ci}
712fb726d48Sopenharmony_civoid Init(TraceStreamerSelector &ts, const TraceExportOption &traceExportOption)
713fb726d48Sopenharmony_ci{
714fb726d48Sopenharmony_ci    ts.EnableMetaTable(traceExportOption.exportMetaTable);
715fb726d48Sopenharmony_ci    ts.EnableFileSave(traceExportOption.separateFile);
716fb726d48Sopenharmony_ci    if (traceExportOption.closeMutiThread) {
717fb726d48Sopenharmony_ci        ts.GetTraceDataCache()->supportThread_ = false;
718fb726d48Sopenharmony_ci    }
719fb726d48Sopenharmony_ci    if (traceExportOption.parserThreadNum != INVALID_UINT8 && traceExportOption.parserThreadNum >= PARSER_THREAD_MIN &&
720fb726d48Sopenharmony_ci        traceExportOption.parserThreadNum <= PARSER_THREAD_MAX) {
721fb726d48Sopenharmony_ci        ts.GetTraceDataCache()->parserThreadNum_ = traceExportOption.parserThreadNum;
722fb726d48Sopenharmony_ci    }
723fb726d48Sopenharmony_ci}
724fb726d48Sopenharmony_ci
725fb726d48Sopenharmony_ci} // namespace TraceStreamer
726fb726d48Sopenharmony_ci} // namespace SysTuning
727fb726d48Sopenharmony_ci
728fb726d48Sopenharmony_ciint main(int argc, char **argv)
729fb726d48Sopenharmony_ci{
730fb726d48Sopenharmony_ci    TraceExportOption traceExportOption;
731fb726d48Sopenharmony_ci    TS_CHECK_TRUE_RET(CheckAndParseArgs(argc, argv, traceExportOption), 1);
732fb726d48Sopenharmony_ci    TraceStreamerSelector ts;
733fb726d48Sopenharmony_ci    Init(ts, traceExportOption);
734fb726d48Sopenharmony_ci#ifndef IS_WASM
735fb726d48Sopenharmony_ci    if (!traceExportOption.longTraceDir.empty()) {
736fb726d48Sopenharmony_ci        ParseLongTrace(ts, traceExportOption);
737fb726d48Sopenharmony_ci        return 0;
738fb726d48Sopenharmony_ci    }
739fb726d48Sopenharmony_ci#endif
740fb726d48Sopenharmony_ci    auto strEscape = std::regex_replace(traceExportOption.traceFilePath, traceInvalidStr, "\\\\\\\\");
741fb726d48Sopenharmony_ci    if (OpenAndParserFile(ts, strEscape)) {
742fb726d48Sopenharmony_ci        if (!traceExportOption.sqliteFilePath.empty()) {
743fb726d48Sopenharmony_ci            ExportStatusToLog(traceExportOption.sqliteFilePath, GetAnalysisResult());
744fb726d48Sopenharmony_ci        }
745fb726d48Sopenharmony_ci        return 1;
746fb726d48Sopenharmony_ci    }
747fb726d48Sopenharmony_ci#if defined(is_linux) || defined(_WIN32)
748fb726d48Sopenharmony_ci    if (!traceExportOption.soFilesDir.empty()) {
749fb726d48Sopenharmony_ci        auto values = GetFilesNameFromDir(traceExportOption.soFilesDir);
750fb726d48Sopenharmony_ci        ts.ReloadSymbolFiles(traceExportOption.soFilesDir, values);
751fb726d48Sopenharmony_ci    }
752fb726d48Sopenharmony_ci#endif
753fb726d48Sopenharmony_ci    if (traceExportOption.interactiveState) {
754fb726d48Sopenharmony_ci        TS_CHECK_TRUE_RET(EnterInteractiveState(ts), 1);
755fb726d48Sopenharmony_ci    }
756fb726d48Sopenharmony_ci    if (traceExportOption.dumpFileType != DumpFileType::UNKONW_TYPE) {
757fb726d48Sopenharmony_ci        ExportReadableText(ts, traceExportOption);
758fb726d48Sopenharmony_ci    }
759fb726d48Sopenharmony_ci    if (!traceExportOption.sqliteFilePath.empty()) {
760fb726d48Sopenharmony_ci        if (ExportDatabase(ts, traceExportOption.sqliteFilePath)) {
761fb726d48Sopenharmony_ci            ExportStatusToLog(traceExportOption.sqliteFilePath, GetAnalysisResult());
762fb726d48Sopenharmony_ci            return 1;
763fb726d48Sopenharmony_ci        }
764fb726d48Sopenharmony_ci        ExportStatusToLog(traceExportOption.sqliteFilePath, GetAnalysisResult());
765fb726d48Sopenharmony_ci    }
766fb726d48Sopenharmony_ci    if (!traceExportOption.metricsIndex.empty()) {
767fb726d48Sopenharmony_ci        MetaData *metaData = ts.GetMetaData();
768fb726d48Sopenharmony_ci        metaData->SetOutputFileName("command line mode");
769fb726d48Sopenharmony_ci        metaData->SetParserToolVersion(TRACE_STREAMER_VERSION.c_str());
770fb726d48Sopenharmony_ci        metaData->SetParserToolPublishDateTime(TRACE_STREAMER_PUBLISH_VERSION.c_str());
771fb726d48Sopenharmony_ci        metaData->SetTraceDataSize(g_loadSize);
772fb726d48Sopenharmony_ci        ts.ParserAndPrintMetrics(traceExportOption.metricsIndex);
773fb726d48Sopenharmony_ci    }
774fb726d48Sopenharmony_ci    if (!traceExportOption.sqlOperatorFilePath.empty()) {
775fb726d48Sopenharmony_ci        ts.ReadSqlFileAndPrintResult(traceExportOption.sqlOperatorFilePath);
776fb726d48Sopenharmony_ci    }
777fb726d48Sopenharmony_ci    return 0;
778fb726d48Sopenharmony_ci}
779