• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2021-2022 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 #include "common/dump_cfg.h"
16 #include "hilog_wrapper.h"
17 namespace OHOS {
18 namespace HiviewDFX {
DumpCfg()19 DumpCfg::DumpCfg()
20 {
21 }
22 
~DumpCfg()23 DumpCfg::~DumpCfg()
24 {
25     childs_.clear();
26     parent_ = nullptr;
27 }
28 
operator =(const DumpCfg & dumpCfg)29 DumpCfg& DumpCfg::operator=(const DumpCfg& dumpCfg)
30 {
31     name_ = dumpCfg.name_;
32     desc_ = dumpCfg.desc_;
33     target_ = dumpCfg.target_;
34     section_ = dumpCfg.section_;
35     class_ = dumpCfg.class_;
36     level_ = dumpCfg.level_;
37     loop_ = dumpCfg.loop_;
38     filterCfg_ = dumpCfg.filterCfg_;
39     args_ = dumpCfg.args_;
40     return *this;
41 }
42 
Dump(int deep) const43 void DumpCfg::Dump(int deep) const
44 {
45     Dump(*this, deep);
46 }
47 
IsGroup() const48 bool DumpCfg::IsGroup() const
49 {
50     return ((class_ == DumperConstant::GROUP) || (!childs_.empty()));
51 }
52 
IsDumper() const53 bool DumpCfg::IsDumper() const
54 {
55     return IsDumper(class_);
56 }
57 
IsFilter() const58 bool DumpCfg::IsFilter() const
59 {
60     return IsFilter(class_);
61 }
62 
IsLevel() const63 bool DumpCfg::IsLevel() const
64 {
65     return IsLevel(level_);
66 }
67 
CanLoop() const68 bool DumpCfg::CanLoop() const
69 {
70     return CanLoop(loop_);
71 }
72 
IsOutput() const73 bool DumpCfg::IsOutput() const
74 {
75     return IsOutput(class_);
76 }
77 
HasPid() const78 bool DumpCfg::HasPid() const
79 {
80     return HasPid(target_);
81 }
82 
HasCpuId() const83 bool DumpCfg::HasCpuId() const
84 {
85     return HasCpuId(target_);
86 }
87 
Create()88 std::shared_ptr<DumpCfg> DumpCfg::Create()
89 {
90     return std::make_shared<DumpCfg>();
91 }
92 
IsDumper(int cls)93 bool DumpCfg::IsDumper(int cls)
94 {
95     return ((cls > DumperConstant::DUMPER_BEGIN) && (cls < DumperConstant::DUMPER_END));
96 }
97 
IsFilter(int cls)98 bool DumpCfg::IsFilter(int cls)
99 {
100     return ((cls > DumperConstant::FILTER_BEGIN) && (cls < DumperConstant::FILTER_END));
101 }
102 
IsLevel(int level)103 bool DumpCfg::IsLevel(int level)
104 {
105     return ((level > DumperConstant::LEVEL_BEGIN) && (level < DumperConstant::LEVEL_END));
106 }
107 
CanLoop(int loop)108 bool DumpCfg::CanLoop(int loop)
109 {
110     return ((loop != DumperConstant::NONE) && (loop > 0));
111 }
112 
IsOutput(int cls)113 bool DumpCfg::IsOutput(int cls)
114 {
115     return ((cls > DumperConstant::OUTPUT_BEGIN) && (cls < DumperConstant::OUTPUT_END));
116 }
117 
HasPid(const std::string & target)118 bool DumpCfg::HasPid(const std::string &target)
119 {
120     return (target.find("%pid") != std::string::npos);
121 }
122 
HasCpuId(const std::string & target)123 bool DumpCfg::HasCpuId(const std::string &target)
124 {
125     return (target.find("%cpuid") != std::string::npos);
126 }
127 
Dump(const DumpCfg & cfg,int nest)128 void DumpCfg::Dump(const DumpCfg& cfg, int nest)
129 {
130     DUMPER_HILOGD(MODULE_COMMON, "debug|*********[%{public}d]********", nest);
131     DUMPER_HILOGD(MODULE_COMMON, "debug|section=%{public}s,"
132         " class=%{public}d[%{public}s], level=%{public}d[%{public}s],"
133         " name=%{public}s, type=%{public}d[%{public}s], expand_=%{public}d, target=%{public}s,"
134         " desc=%{public}s,"
135         " filterCfg=%{public}s",
136         cfg.section_.c_str(),
137         cfg.class_, ToStr(cfg.class_).c_str(), cfg.level_, ToStr(cfg.level_).c_str(),
138         cfg.name_.c_str(), cfg.type_, ToStr(cfg.type_).c_str(), cfg.expand_, cfg.target_.c_str(),
139         cfg.desc_.c_str(),
140         cfg.filterCfg_.c_str());
141     if (cfg.args_ != nullptr) {
142         cfg.args_->Dump();
143     }
144     if (cfg.parent_ != nullptr) {
145         DUMPER_HILOGD(MODULE_COMMON, "debug|parent...name=%{public}s, desc=%{public}s",
146             cfg.parent_->name_.c_str(), cfg.parent_->desc_.c_str());
147     } else {
148         for (auto dumpCfg : cfg.childs_) {
149             dumpCfg->Dump(nest+1);
150         }
151     }
152 }
153 
ToStr(int type)154 std::string DumpCfg::ToStr(int type)
155 {
156     if (type == DumperConstant::NONE) {
157         return "none";
158     } else if (type == DumperConstant::GROUP) {
159         return "group";
160     } else if ((type >= DumperConstant::DUMPER_BEGIN) && (type <= DumperConstant::DUMPER_END)) {
161         return ToDumperStr(type);
162     } else if ((type >= DumperConstant::FILTER_BEGIN) && (type <= DumperConstant::FILTER_END)) {
163         return ToFilterStr(type);
164     } else if ((type >= DumperConstant::OUTPUT_BEGIN) && (type <= DumperConstant::OUTPUT_END)) {
165         return ToOutputStr(type);
166     } else if ((type >= DumperConstant::LEVEL_BEGIN) && (type <= DumperConstant::LEVEL_END)) {
167         return ToLevelStr(type);
168     } else if ((type >= DumperConstant::GROUPTYPE_BEGIN) && (type <= DumperConstant::GROUPTYPE_END)) {
169         return ToTypeStr(type);
170     } else if (type == DumperConstant::LOOP) {
171         return "loop";
172     }
173     return "unknown_type";
174 };
175 
ToDumperStr(int type)176 std::string DumpCfg::ToDumperStr(int type)
177 {
178     if (type == DumperConstant::CPU_DUMPER) {
179         return "cpu_dumper";
180     } else if (type == DumperConstant::FILE_DUMPER) {
181         return "file_dumper";
182     } else if (type == DumperConstant::ENV_PARAM_DUMPER) {
183         return "env_dumper";
184     } else if (type == DumperConstant::CMD_DUMPER) {
185         return "cmd_dumper";
186     } else if (type == DumperConstant::PROPERTIES_DUMPER) {
187         return "prop_dumper";
188     } else if (type == DumperConstant::API_DUMPER) {
189         return "api_dumper";
190     } else if (type == DumperConstant::LIST_DUMPER) {
191         return "list_dumper";
192     } else if (type == DumperConstant::VERSION_DUMPER) {
193         return "ver_dumper";
194     } else if (type == DumperConstant::SA_DUMPER) {
195         return "sa_dumper";
196     } else if (type == DumperConstant::MEMORY_DUMPER) {
197         return "mem_dumper";
198     } else if (type == DumperConstant::STACK_DUMPER) {
199         return "stack_dumper";
200     }
201     return "unknown_dumper";
202 }
203 
ToFilterStr(int type)204 std::string DumpCfg::ToFilterStr(int type)
205 {
206     if (type == DumperConstant::COLUMN_ROWS_FILTER) {
207         return "col_row_filter";
208     } else if (type == DumperConstant::FILE_FORMAT_DUMP_FILTER) {
209         return "file_format_dump_filter";
210     }
211     return "unknown_filter";
212 }
213 
ToOutputStr(int type)214 std::string DumpCfg::ToOutputStr(int type)
215 {
216     if (type == DumperConstant::STD_OUTPUT) {
217         return "std_output";
218     } else if (type == DumperConstant::FILE_OUTPUT) {
219         return "file_output";
220     } else if (type == DumperConstant::FD_OUTPUT) {
221         return "fd_output";
222     } else if (type == DumperConstant::ZIP_OUTPUT) {
223         return "zip_output";
224     }
225     return "unknown_output";
226 }
227 
ToLevelStr(int type)228 std::string DumpCfg::ToLevelStr(int type)
229 {
230     if (type == DumperConstant::LEVEL_NONE) {
231         return "level_none";
232     } else if (type == DumperConstant::LEVEL_MIDDLE) {
233         return "level_middle";
234     } else if (type == DumperConstant::LEVEL_HIGH) {
235         return "level_high";
236     } else if (type == DumperConstant::LEVEL_ALL) {
237         return "level_all";
238     }
239     return "level_unknown";
240 }
241 
ToTypeStr(int type)242 std::string DumpCfg::ToTypeStr(int type)
243 {
244     if (type == DumperConstant::LEVEL_NONE) {
245         return "type_none";
246     } else if (type == DumperConstant::GROUPTYPE_PID) {
247         return "type_pid";
248     } else if (type == DumperConstant::GROUPTYPE_CPUID) {
249         return "type_cpuid";
250     }
251     return "type_unknown";
252 }
253 } // namespace HiviewDFX
254 } // namespace OHOS
255