• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2021 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #include "trace_streamer_selector.h"
17 #include <algorithm>
18 #include <chrono>
19 #include <functional>
20 #include <regex>
21 #include "animation_filter.h"
22 #include "app_start_filter.h"
23 #include "args_filter.h"
24 #include "binder_filter.h"
25 #include "clock_filter_ex.h"
26 #include "cpu_filter.h"
27 #include "file.h"
28 #include "filter_filter.h"
29 #include "frame_filter.h"
30 #include "hi_sysevent_measure_filter.h"
31 #include "irq_filter.h"
32 #include "measure_filter.h"
33 #include "task_pool_filter.h"
34 #include "parser/bytrace_parser/bytrace_parser.h"
35 #include "parser/htrace_pbreader_parser/htrace_parser.h"
36 #include "perf_data_filter.h"
37 #include "process_filter.h"
38 #include "slice_filter.h"
39 #include "stat_filter.h"
40 #include "string_help.h"
41 #include "symbols_filter.h"
42 #include "system_event_measure_filter.h"
43 
44 using namespace SysTuning::base;
45 namespace SysTuning {
46 namespace TraceStreamer {
47 namespace {
GuessFileType(const uint8_t * data,size_t size)48 TraceFileType GuessFileType(const uint8_t* data, size_t size)
49 {
50     if (size == 0) {
51         return TRACE_FILETYPE_UN_KNOW;
52     }
53     std::string start(reinterpret_cast<const char*>(data), std::min<size_t>(size, 20));
54     if (start.find("# tracer") != std::string::npos) {
55         return TRACE_FILETYPE_BY_TRACE;
56     }
57     if (start.find("# TRACE") != std::string::npos) {
58         return TRACE_FILETYPE_BY_TRACE;
59     }
60     if (start.find("# SYSEVENT") != std::string::npos) {
61         return TRACE_FILETYPE_SYSEVENT;
62     }
63     if (start.find("# sysevent") != std::string::npos) {
64         return TRACE_FILETYPE_SYSEVENT;
65     }
66     std::string lowerStart(start);
67     transform(start.begin(), start.end(), lowerStart.begin(), ::tolower);
68     if ((lowerStart.compare(0, std::string("<!doctype html>").length(), "<!doctype html>") == 0) ||
69         (lowerStart.compare(0, std::string("<html>").length(), "<html>") == 0)) {
70         return TRACE_FILETYPE_BY_TRACE;
71     }
72     if (start.compare(0, std::string("\x0a").length(), "\x0a") == 0) {
73         return TRACE_FILETYPE_UN_KNOW;
74     }
75     if (start.compare(0, std::string("OHOSPROF").length(), "OHOSPROF") == 0) {
76         return TRACE_FILETYPE_H_TRACE;
77     }
78     if (start.compare(0, std::string("PERFILE2").length(), "PERFILE2") == 0) {
79         return TRACE_FILETYPE_PERF;
80     }
81     if (start.compare(0, std::string("\x1f\x8b").length(), "\x1f\x8b") == 0) {
82         return TRACE_FILETYPE_PERF;
83     }
84     const std::regex bytraceMatcher = std::regex(R"(-(\d+)\s+\(?\s*(\d+|-+)?\)?\s?\[(\d+)\]\s*)"
85                                                  R"([a-zA-Z0-9.]{0,5}\s+(\d+\.\d+):\s+(\S+):)");
86     std::smatch matcheLine;
87     std::string bytraceMode(reinterpret_cast<const char*>(data), size);
88     if (std::regex_search(bytraceMode, matcheLine, bytraceMatcher)) {
89         return TRACE_FILETYPE_BY_TRACE;
90     }
91     return TRACE_FILETYPE_UN_KNOW;
92 }
93 } // namespace
94 
TraceStreamerSelector()95 TraceStreamerSelector::TraceStreamerSelector()
96     : fileType_(TRACE_FILETYPE_UN_KNOW), bytraceParser_(nullptr), htraceParser_(nullptr)
97 {
98     InitFilter();
99 }
~TraceStreamerSelector()100 TraceStreamerSelector::~TraceStreamerSelector() {}
101 
InitFilter()102 void TraceStreamerSelector::InitFilter()
103 {
104     streamFilters_ = std::make_unique<TraceStreamerFilters>();
105     traceDataCache_ = std::make_unique<TraceDataCache>();
106     streamFilters_->animationFilter_ = std::make_unique<AnimationFilter>(traceDataCache_.get(), streamFilters_.get());
107     streamFilters_->cpuFilter_ = std::make_unique<CpuFilter>(traceDataCache_.get(), streamFilters_.get());
108     streamFilters_->sliceFilter_ = std::make_unique<SliceFilter>(traceDataCache_.get(), streamFilters_.get());
109 
110     streamFilters_->processFilter_ = std::make_unique<ProcessFilter>(traceDataCache_.get(), streamFilters_.get());
111     streamFilters_->clockFilter_ = std::make_unique<ClockFilterEx>(traceDataCache_.get(), streamFilters_.get());
112     streamFilters_->filterFilter_ = std::make_unique<FilterFilter>(traceDataCache_.get(), streamFilters_.get());
113 
114     streamFilters_->threadMeasureFilter_ =
115         std::make_unique<MeasureFilter>(traceDataCache_.get(), streamFilters_.get(), E_THREADMEASURE_FILTER);
116     streamFilters_->threadFilter_ =
117         std::make_unique<MeasureFilter>(traceDataCache_.get(), streamFilters_.get(), E_THREAD_FILTER);
118     streamFilters_->cpuMeasureFilter_ =
119         std::make_unique<MeasureFilter>(traceDataCache_.get(), streamFilters_.get(), E_CPU_MEASURE_FILTER);
120     streamFilters_->processMeasureFilter_ =
121         std::make_unique<MeasureFilter>(traceDataCache_.get(), streamFilters_.get(), E_PROCESS_MEASURE_FILTER);
122     streamFilters_->processFilterFilter_ =
123         std::make_unique<MeasureFilter>(traceDataCache_.get(), streamFilters_.get(), E_PROCESS_FILTER_FILTER);
124     streamFilters_->symbolsFilter_ = std::make_unique<SymbolsFilter>(traceDataCache_.get(), streamFilters_.get());
125     streamFilters_->statFilter_ = std::make_unique<StatFilter>(traceDataCache_.get(), streamFilters_.get());
126     streamFilters_->binderFilter_ = std::make_unique<BinderFilter>(traceDataCache_.get(), streamFilters_.get());
127     streamFilters_->argsFilter_ = std::make_unique<ArgsFilter>(traceDataCache_.get(), streamFilters_.get());
128     streamFilters_->irqFilter_ = std::make_unique<IrqFilter>(traceDataCache_.get(), streamFilters_.get());
129     streamFilters_->frameFilter_ = std::make_unique<FrameFilter>(traceDataCache_.get(), streamFilters_.get());
130     streamFilters_->clockRateFilter_ =
131         std::make_unique<MeasureFilter>(traceDataCache_.get(), streamFilters_.get(), E_CLOCK_RATE_FILTER);
132     streamFilters_->clockEnableFilter_ =
133         std::make_unique<MeasureFilter>(traceDataCache_.get(), streamFilters_.get(), E_CLOCK_ENABLE_FILTER);
134     streamFilters_->clockDisableFilter_ =
135         std::make_unique<MeasureFilter>(traceDataCache_.get(), streamFilters_.get(), E_CLOCK_DISABLE_FILTER);
136     streamFilters_->clkRateFilter_ =
137         std::make_unique<MeasureFilter>(traceDataCache_.get(), streamFilters_.get(), E_CLK_RATE_FILTER);
138     streamFilters_->clkEnableFilter_ =
139         std::make_unique<MeasureFilter>(traceDataCache_.get(), streamFilters_.get(), E_CLK_ENABLE_FILTER);
140     streamFilters_->clkDisableFilter_ =
141         std::make_unique<MeasureFilter>(traceDataCache_.get(), streamFilters_.get(), E_CLK_DISABLE_FILTER);
142     streamFilters_->sysEventMemMeasureFilter_ =
143         std::make_unique<SystemEventMeasureFilter>(traceDataCache_.get(), streamFilters_.get(), E_SYS_MEMORY_FILTER);
144     streamFilters_->sysEventVMemMeasureFilter_ = std::make_unique<SystemEventMeasureFilter>(
145         traceDataCache_.get(), streamFilters_.get(), E_SYS_VIRTUAL_MEMORY_FILTER);
146     streamFilters_->appStartupFilter_ = std::make_unique<APPStartupFilter>(traceDataCache_.get(), streamFilters_.get());
147     streamFilters_->perfDataFilter_ = std::make_unique<PerfDataFilter>(traceDataCache_.get(), streamFilters_.get());
148     streamFilters_->sysEventSourceFilter_ = std::make_unique<SystemEventMeasureFilter>(
149         traceDataCache_.get(), streamFilters_.get(), E_SYS_EVENT_SOURCE_FILTER);
150     streamFilters_->hiSysEventMeasureFilter_ =
151         std::make_unique<HiSysEventMeasureFilter>(traceDataCache_.get(), streamFilters_.get());
152     streamFilters_->taskPoolFilter_ = std::make_unique<TaskPoolFilter>(traceDataCache_.get(), streamFilters_.get());
153 }
154 
WaitForParserEnd()155 void TraceStreamerSelector::WaitForParserEnd()
156 {
157     if (fileType_ == TRACE_FILETYPE_H_TRACE) {
158         htraceParser_->WaitForParserEnd();
159     }
160     if (fileType_ == TRACE_FILETYPE_BY_TRACE) {
161         bytraceParser_->WaitForParserEnd();
162     }
163     if (fileType_ == TRACE_FILETYPE_PERF) {
164         htraceParser_->TraceDataSegmentEnd();
165         htraceParser_->WaitForParserEnd();
166     }
167     traceDataCache_->UpdateTraceRange();
168     if (traceDataCache_->AnimationTraceEnabled()) {
169         streamFilters_->animationFilter_->UpdateDynamicFrameInfo();
170     }
171 }
172 
GetMetaData()173 MetaData* TraceStreamerSelector::GetMetaData()
174 {
175     return traceDataCache_->GetMetaData();
176 }
177 
SetDataType(TraceFileType type)178 void TraceStreamerSelector::SetDataType(TraceFileType type)
179 {
180     fileType_ = type;
181     if (fileType_ == TRACE_FILETYPE_H_TRACE) {
182         htraceParser_ = std::make_unique<HtraceParser>(traceDataCache_.get(), streamFilters_.get());
183     } else if (fileType_ == TRACE_FILETYPE_BY_TRACE) {
184         bytraceParser_ = std::make_unique<BytraceParser>(traceDataCache_.get(), streamFilters_.get());
185     }
186 }
ParseTraceDataSegment(std::unique_ptr<uint8_t[]> data,size_t size)187 bool TraceStreamerSelector::ParseTraceDataSegment(std::unique_ptr<uint8_t[]> data, size_t size)
188 {
189     if (size == 0) {
190         return true;
191     }
192     if (fileType_ == TRACE_FILETYPE_UN_KNOW) {
193         fileType_ = GuessFileType(data.get(), size);
194         if (fileType_ == TRACE_FILETYPE_H_TRACE || fileType_ == TRACE_FILETYPE_PERF) {
195             htraceParser_ = std::make_unique<HtraceParser>(traceDataCache_.get(), streamFilters_.get());
196             htraceParser_->EnableFileSeparate(enableFileSeparate_);
197         } else if (fileType_ == TRACE_FILETYPE_BY_TRACE || fileType_ == TRACE_FILETYPE_SYSEVENT) {
198             bytraceParser_ = std::make_unique<BytraceParser>(traceDataCache_.get(), streamFilters_.get());
199             bytraceParser_->EnableBytrace(fileType_ == TRACE_FILETYPE_BY_TRACE);
200         }
201         if (fileType_ == TRACE_FILETYPE_UN_KNOW) {
202             SetAnalysisResult(TRACE_PARSER_FILE_TYPE_ERROR);
203             TS_LOGI(
204                 "File type is not supported!,\nthe head content is:%s\n ---warning!!!---\n"
205                 "File type is not supported!,\n",
206                 data.get());
207             return false;
208         }
209     }
210     if (fileType_ == TRACE_FILETYPE_H_TRACE) {
211         htraceParser_->ParseTraceDataSegment(std::move(data), size);
212     } else if (fileType_ == TRACE_FILETYPE_BY_TRACE || fileType_ == TRACE_FILETYPE_SYSEVENT) {
213         bytraceParser_->ParseTraceDataSegment(std::move(data), size);
214     } else if (fileType_ == TRACE_FILETYPE_PERF) {
215         htraceParser_->StoreTraceDataSegment(std::move(data), size);
216     }
217     SetAnalysisResult(TRACE_PARSER_NORMAL);
218     return true;
219 }
EnableMetaTable(bool enabled)220 void TraceStreamerSelector::EnableMetaTable(bool enabled)
221 {
222     traceDataCache_->EnableMetaTable(enabled);
223 }
224 
EnableFileSave(bool enabled)225 void TraceStreamerSelector::EnableFileSave(bool enabled)
226 {
227     enableFileSeparate_ = enabled;
228 }
229 
SetCleanMode(bool cleanMode)230 void TraceStreamerSelector::SetCleanMode(bool cleanMode)
231 {
232     g_cleanMode = true;
233 }
234 
ExportDatabase(const std::string & outputName,TraceDataDB::ResultCallBack resultCallBack)235 int32_t TraceStreamerSelector::ExportDatabase(const std::string& outputName, TraceDataDB::ResultCallBack resultCallBack)
236 {
237     traceDataCache_->UpdateTraceRange();
238     return traceDataCache_->ExportDatabase(outputName, resultCallBack);
239 }
240 
ReloadSymbolFiles(std::string & directory,std::vector<std::string> & symbolsPaths)241 bool TraceStreamerSelector::ReloadSymbolFiles(std::string& directory, std::vector<std::string>& symbolsPaths)
242 {
243     if (fileType_ != TRACE_FILETYPE_H_TRACE) {
244         return false;
245     }
246     TS_LOGE("directory is %s", directory.c_str());
247     for (auto file : symbolsPaths) {
248         TS_LOGE("files is %s", file.c_str());
249     }
250     return htraceParser_->ReparseSymbolFilesAndResymbolization(directory, symbolsPaths);
251 }
Clear()252 void TraceStreamerSelector::Clear()
253 {
254     traceDataCache_->Prepare();
255     traceDataCache_->Clear();
256 }
SearchData()257 std::vector<std::string> TraceStreamerSelector::SearchData()
258 {
259     return traceDataCache_->SearchData();
260 }
OperateDatabase(const std::string & sql)261 int32_t TraceStreamerSelector::OperateDatabase(const std::string& sql)
262 {
263     return traceDataCache_->OperateDatabase(sql);
264 }
SearchDatabase(const std::string & sql,TraceDataDB::ResultCallBack resultCallBack)265 int32_t TraceStreamerSelector::SearchDatabase(const std::string& sql, TraceDataDB::ResultCallBack resultCallBack)
266 {
267     return traceDataCache_->SearchDatabase(sql, resultCallBack);
268 }
SearchDatabase(const std::string & sql,uint8_t * out,int32_t outLen)269 int32_t TraceStreamerSelector::SearchDatabase(const std::string& sql, uint8_t* out, int32_t outLen)
270 {
271     return traceDataCache_->SearchDatabase(sql, out, outLen);
272 }
SearchDatabase(const std::string & sql,bool printf)273 int32_t TraceStreamerSelector::SearchDatabase(const std::string& sql, bool printf)
274 {
275     return traceDataCache_->SearchDatabase(sql, printf);
276 }
UpdateTraceRangeTime(uint8_t * data,int32_t len)277 int32_t TraceStreamerSelector::UpdateTraceRangeTime(uint8_t* data, int32_t len)
278 {
279     std::string traceRangeStr;
280     memcpy(&traceRangeStr, data, len);
281     std::vector<string> vTraceRangeStr = SplitStringToVec(traceRangeStr, ";");
282     uint64_t minTs = std::stoull(vTraceRangeStr.at(0));
283     uint64_t maxTs = std::stoull(vTraceRangeStr.at(1));
284     traceDataCache_->UpdateTraceTime(minTs);
285     traceDataCache_->UpdateTraceTime(maxTs);
286     return 0;
287 }
SetCancel(bool cancel)288 void TraceStreamerSelector::SetCancel(bool cancel)
289 {
290     traceDataCache_->SetCancel(cancel);
291 }
UpdateAnimationTraceStatus(bool status)292 void TraceStreamerSelector::UpdateAnimationTraceStatus(bool status)
293 {
294     traceDataCache_->UpdateAnimationTraceStatus(status);
295 }
UpdateTaskPoolTraceStatus(bool status)296 void TraceStreamerSelector::UpdateTaskPoolTraceStatus(bool status)
297 {
298     traceDataCache_->UpdateTaskPoolTraceStatus(status);
299 }
UpdateAppStartTraceStatus(bool status)300 void TraceStreamerSelector::UpdateAppStartTraceStatus(bool status)
301 {
302     traceDataCache_->UpdateAppStartTraceStatus(status);
303 }
304 } // namespace TraceStreamer
305 } // namespace SysTuning
306