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/dumper_opts.h"
16
17 #include <algorithm>
18 #include <string>
19 #include <vector>
20
21 #include "dump_common_utils.h"
22 #include "dump_controller.h"
23 #include "dump_utils.h"
24 #include "hilog_wrapper.h"
25 #include "string_ex.h"
26 #include "util/config_data.h"
27 #include "util/config_utils.h"
28 namespace OHOS {
29 namespace HiviewDFX {
30 namespace {
31 static const std::string PATH_SEPARATOR = "/";
32 }
33
DumperOpts()34 DumperOpts::DumperOpts()
35 {
36 Reset();
37 }
38
Reset()39 void DumperOpts::Reset()
40 {
41 isDumpCpuFreq_ = false;
42 isDumpCpuUsage_ = false;
43 cpuUsagePid_ = -1;
44 isDumpLog_ = false;
45 logArgs_.clear();
46 isDumpMem_ = false;
47 memPid_ = -1;
48 isDumpStorage_ = false;
49 storagePid_ = -1;
50 isDumpNet_ = false;
51 netPid_ = -1;
52 isDumpList_ = false;
53 isDumpService_ = false;
54 isDumpSystemAbility_ = false;
55 abilitieNames_.clear();
56 abilitieArgs_.clear();
57 isDumpSystem_ = false;
58 systemArgs_.clear();
59 isDumpProcesses_ = false;
60 processPid_ = -1;
61 isFaultLog_ = false;
62 path_.clear(); // for zip
63 isAppendix_ = false;
64 isShowSmaps_ = false;
65 isShowSmapsInfo_ = false;
66 isDumpJsHeapMem_ = false;
67 isDumpJsHeapMemGC_ = false;
68 isDumpJsHeapLeakobj_ = false;
69 dumpJsHeapMemPid_ = 0;
70 threadId_ = 0;
71 ipcStatPid_ = -1;
72 isDumpAllIpc_ = false;
73 isDumpIpc_ = false;
74 isDumpIpcStartStat_ = false;
75 isDumpIpcStopStat_ = false;
76 isDumpIpcStat_ = false;
77 }
78
operator =(const DumperOpts & opts)79 DumperOpts& DumperOpts::operator = (const DumperOpts& opts)
80 {
81 Reset();
82 isDumpCpuFreq_ = opts.isDumpCpuFreq_;
83 isDumpCpuUsage_ = opts.isDumpCpuUsage_;
84 cpuUsagePid_ = opts.cpuUsagePid_;
85 isDumpLog_ = opts.isDumpLog_;
86 logArgs_.assign((opts.logArgs_).begin(), (opts.logArgs_).end());
87 isDumpMem_ = opts.isDumpMem_;
88 memPid_ = opts.memPid_;
89 isDumpStorage_ = opts.isDumpStorage_;
90 storagePid_ = opts.storagePid_;
91 isDumpNet_ = opts.isDumpNet_;
92 netPid_ = opts.netPid_;
93 isDumpList_ = opts.isDumpList_;
94 isDumpService_ = opts.isDumpService_;
95 isDumpSystemAbility_ = opts.isDumpSystemAbility_;
96 abilitieNames_.assign((opts.abilitieNames_).begin(), (opts.abilitieNames_).end());
97 abilitieArgs_.assign((opts.abilitieArgs_).begin(), (opts.abilitieArgs_).end());
98 isDumpSystem_ = opts.isDumpSystem_;
99 systemArgs_ = opts.systemArgs_;
100 isDumpProcesses_ = opts.isDumpProcesses_;
101 processPid_ = opts.processPid_;
102 isFaultLog_ = opts.isFaultLog_;
103 path_ = opts.path_;
104 isAppendix_ = opts.isAppendix_;
105 isShowSmaps_ = opts.isShowSmaps_;
106 isShowSmapsInfo_ = opts.isShowSmapsInfo_;
107 isDumpJsHeapMem_ = opts.isDumpJsHeapMem_;
108 isDumpJsHeapMemGC_ = opts.isDumpJsHeapMemGC_;
109 isDumpJsHeapLeakobj_ = opts.isDumpJsHeapLeakobj_;
110 dumpJsHeapMemPid_ = opts.dumpJsHeapMemPid_;
111 threadId_ = opts.threadId_;
112 ipcStatPid_ = opts.ipcStatPid_;
113 isDumpAllIpc_ = opts.isDumpAllIpc_;
114 isDumpIpc_ = opts.isDumpIpc_;
115 isDumpIpcStartStat_ = opts.isDumpIpcStartStat_;
116 isDumpIpcStopStat_ = opts.isDumpIpcStopStat_;
117 isDumpIpcStat_ = opts.isDumpIpcStat_;
118 return *this;
119 }
120
AddSelectAll()121 void DumperOpts::AddSelectAll()
122 {
123 isDumpCpuFreq_ = true;
124 isDumpCpuUsage_ = true;
125 isDumpLog_ = true;
126 isDumpMem_ = true;
127 isDumpStorage_ = true;
128 isDumpNet_ = true;
129 isDumpService_ = true;
130 isDumpSystemAbility_ = true;
131 isDumpSystem_ = true;
132 isDumpProcesses_ = true;
133 isFaultLog_ = true;
134 isAppendix_ = true;
135 }
136
IsDumpZip() const137 bool DumperOpts::IsDumpZip() const
138 {
139 return DumpCommonUtils::StartWith(path_, PATH_SEPARATOR);
140 }
141
IsSelectAny() const142 bool DumperOpts::IsSelectAny() const
143 {
144 if (isDumpCpuFreq_ || isDumpCpuUsage_) {
145 return true;
146 }
147 if (isDumpLog_ || isFaultLog_) {
148 return true;
149 }
150 if (isDumpMem_) {
151 return true;
152 }
153 if (isDumpStorage_) {
154 return true;
155 }
156 if (isDumpNet_) {
157 return true;
158 }
159 if (isDumpService_ || isDumpSystemAbility_ || isDumpSystem_) {
160 return true;
161 }
162 if (isDumpProcesses_) {
163 return true;
164 }
165 if (isShowSmaps_) {
166 return true;
167 }
168 if (isDumpJsHeapMem_) {
169 return true;
170 }
171 if (isDumpIpc_) {
172 return true;
173 }
174 DUMPER_HILOGE(MODULE_COMMON, "select nothing.");
175 return false;
176 }
177
CheckOptions(std::string & errStr) const178 bool DumperOpts::CheckOptions(std::string& errStr) const
179 {
180 if (cpuUsagePid_ < -1) {
181 errStr = std::to_string(cpuUsagePid_);
182 return false;
183 }
184 if (memPid_ < -1) {
185 errStr = std::to_string(memPid_);
186 return false;
187 }
188 if (isDumpList_ && ((!isDumpService_) && (!isDumpSystemAbility_) && (!isDumpSystem_))) {
189 errStr = "-1";
190 return false;
191 }
192 std::string path = TrimStr(path_);
193 if ((!path.empty()) && (!DumpCommonUtils::StartWith(path, PATH_SEPARATOR))) {
194 errStr = path_;
195 return false;
196 }
197 for (size_t i = 0; i < abilitieNames_.size(); i++) {
198 if (DumpUtils::StrToId(abilitieNames_[i]) == -1) {
199 errStr = abilitieNames_[i];
200 return false;
201 }
202 }
203 std::vector<std::string> systemList;
204 ConfigUtils::GetSectionNames(ConfigUtils::CONFIG_GROUP_SYSTEM_, systemList);
205 for (size_t i = 0; i < systemArgs_.size(); i++) {
206 if (std::find(systemList.begin(), systemList.end(), systemArgs_[i]) == systemList.end()) {
207 errStr = systemArgs_[i];
208 return false;
209 }
210 }
211 if (processPid_ < -1) {
212 errStr = std::to_string(processPid_);
213 return false;
214 }
215 if (storagePid_ < -1) {
216 errStr = std::to_string(storagePid_);
217 return false;
218 }
219 if (netPid_ < -1) {
220 errStr = std::to_string(netPid_);
221 return false;
222 }
223 if (dumpJsHeapMemPid_ < 0) {
224 errStr = std::to_string(dumpJsHeapMemPid_);
225 return false;
226 }
227 if (threadId_ < 0) {
228 errStr = std::to_string(threadId_);
229 return false;
230 }
231 if (ipcStatPid_ < -1) {
232 errStr = std::to_string(ipcStatPid_);
233 return false;
234 }
235 return true;
236 }
237 } // namespace HiviewDFX
238 } // namespace OHOS
239