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