• 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/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