1020a203aSopenharmony_ci/*
2020a203aSopenharmony_ci * Copyright (C) 2021-2024 Huawei Device Co., Ltd.
3020a203aSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
4020a203aSopenharmony_ci * you may not use this file except in compliance with the License.
5020a203aSopenharmony_ci * You may obtain a copy of the License at
6020a203aSopenharmony_ci *
7020a203aSopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
8020a203aSopenharmony_ci *
9020a203aSopenharmony_ci * Unless required by applicable law or agreed to in writing, software
10020a203aSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
11020a203aSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12020a203aSopenharmony_ci * See the License for the specific language governing permissions and
13020a203aSopenharmony_ci * limitations under the License.
14020a203aSopenharmony_ci */
15020a203aSopenharmony_ci#include "event_log_task.h"
16020a203aSopenharmony_ci
17020a203aSopenharmony_ci#include <unistd.h>
18020a203aSopenharmony_ci#include <regex>
19020a203aSopenharmony_ci
20020a203aSopenharmony_ci#include "binder_catcher.h"
21020a203aSopenharmony_ci#include "common_utils.h"
22020a203aSopenharmony_ci#include "dmesg_catcher.h"
23020a203aSopenharmony_ci#include "ffrt_catcher.h"
24020a203aSopenharmony_ci#include "hiview_logger.h"
25020a203aSopenharmony_ci#include "memory_catcher.h"
26020a203aSopenharmony_ci#include "open_stacktrace_catcher.h"
27020a203aSopenharmony_ci#include "parameter_ex.h"
28020a203aSopenharmony_ci#include "peer_binder_catcher.h"
29020a203aSopenharmony_ci#include "securec.h"
30020a203aSopenharmony_ci#include "shell_catcher.h"
31020a203aSopenharmony_ci#include "string_util.h"
32020a203aSopenharmony_ci#include "trace_collector.h"
33020a203aSopenharmony_ci#include "time_util.h"
34020a203aSopenharmony_ci
35020a203aSopenharmony_cinamespace OHOS {
36020a203aSopenharmony_cinamespace HiviewDFX {
37020a203aSopenharmony_cinamespace {
38020a203aSopenharmony_ci    static constexpr int BP_CMD_PERF_TYPE_INDEX = 2;
39020a203aSopenharmony_ci    static constexpr int BP_CMD_LAYER_INDEX = 1;
40020a203aSopenharmony_ci    static constexpr size_t BP_CMD_SZ = 3;
41020a203aSopenharmony_ci    const char* SYSTEM_STACK[] = {
42020a203aSopenharmony_ci        "foundation",
43020a203aSopenharmony_ci        "render_service",
44020a203aSopenharmony_ci    };
45020a203aSopenharmony_ci    static constexpr int TRACE_OUT_OF_TIME = 30; // 30s
46020a203aSopenharmony_ci    static constexpr int DELAY_OUT_OF_TIME = 15; // 15s
47020a203aSopenharmony_ci    static constexpr int DEFAULT_LOG_SIZE = 1024 * 1024; // 1M
48020a203aSopenharmony_ci    static constexpr uint64_t MILLISEC_TO_SEC = 1000;
49020a203aSopenharmony_ci    static constexpr uint64_t DELAY_TIME = 2;
50020a203aSopenharmony_ci}
51020a203aSopenharmony_ciDEFINE_LOG_LABEL(0xD002D01, "EventLogger-EventLogTask");
52020a203aSopenharmony_ciEventLogTask::EventLogTask(int fd, int jsonFd, std::shared_ptr<SysEvent> event)
53020a203aSopenharmony_ci    : targetFd_(fd),
54020a203aSopenharmony_ci      targetJsonFd_(jsonFd),
55020a203aSopenharmony_ci      event_(event),
56020a203aSopenharmony_ci      maxLogSize_(DEFAULT_LOG_SIZE),
57020a203aSopenharmony_ci      taskLogSize_(0),
58020a203aSopenharmony_ci      status_(Status::TASK_RUNNABLE)
59020a203aSopenharmony_ci{
60020a203aSopenharmony_ci    int pid = event_->GetEventIntValue("PID");
61020a203aSopenharmony_ci    pid_ = pid ? pid : event_->GetPid();
62020a203aSopenharmony_ci    captureList_.insert(std::pair<std::string, capture>("s", [this] { this->AppStackCapture(); }));
63020a203aSopenharmony_ci    captureList_.insert(std::pair<std::string, capture>("S", [this] { this->SystemStackCapture(); }));
64020a203aSopenharmony_ci    captureList_.insert(std::pair<std::string, capture>("b", [this] { this->BinderLogCapture(); }));
65020a203aSopenharmony_ci    captureList_.insert(std::pair<std::string, capture>("ffrt", [this] { this->FfrtCapture(); }));
66020a203aSopenharmony_ci    captureList_.insert(std::pair<std::string, capture>("cmd:m", [this] { this->MemoryUsageCapture(); }));
67020a203aSopenharmony_ci    captureList_.insert(std::pair<std::string, capture>("cmd:c", [this] { this->CpuUsageCapture(); }));
68020a203aSopenharmony_ci    captureList_.insert(std::pair<std::string, capture>("cmd:w", [this] { this->WMSUsageCapture(); }));
69020a203aSopenharmony_ci    captureList_.insert(std::pair<std::string, capture>("cmd:a", [this] { this->AMSUsageCapture(); }));
70020a203aSopenharmony_ci    captureList_.insert(std::pair<std::string, capture>("cmd:p", [this] { this->PMSUsageCapture(); }));
71020a203aSopenharmony_ci    captureList_.insert(std::pair<std::string, capture>("cmd:d", [this] { this->DPMSUsageCapture(); }));
72020a203aSopenharmony_ci    captureList_.insert(std::pair<std::string, capture>("cmd:rs", [this] { this->RSUsageCapture(); }));
73020a203aSopenharmony_ci    captureList_.insert(std::pair<std::string, capture>("cmd:mmi", [this] { this->MMIUsageCapture(); }));
74020a203aSopenharmony_ci    captureList_.insert(std::pair<std::string, capture>("cmd:dms", [this] { this->DMSUsageCapture(); }));
75020a203aSopenharmony_ci    captureList_.insert(std::pair<std::string, capture>("cmd:eec", [this] { this->EECStateCapture(); }));
76020a203aSopenharmony_ci    captureList_.insert(std::pair<std::string, capture>("cmd:gec", [this] { this->GECStateCapture(); }));
77020a203aSopenharmony_ci    captureList_.insert(std::pair<std::string, capture>("cmd:ui", [this] { this->UIStateCapture(); }));
78020a203aSopenharmony_ci    captureList_.insert(std::pair<std::string, capture>("cmd:ss", [this] { this->Screenshot(); }));
79020a203aSopenharmony_ci    captureList_.insert(std::pair<std::string, capture>("T", [this] { this->HilogCapture(); }));
80020a203aSopenharmony_ci    captureList_.insert(std::pair<std::string, capture>("t", [this] { this->LightHilogCapture(); }));
81020a203aSopenharmony_ci    captureList_.insert(std::pair<std::string, capture>("e", [this] { this->DmesgCapture(); }));
82020a203aSopenharmony_ci    captureList_.insert(std::pair<std::string, capture>("k:SysRq",
83020a203aSopenharmony_ci        [this] { this->SysrqCapture(false); }));
84020a203aSopenharmony_ci    captureList_.insert(std::pair<std::string, capture>("k:SysRqFile",
85020a203aSopenharmony_ci        [this] { this->SysrqCapture(true); }));
86020a203aSopenharmony_ci    captureList_.insert(std::pair<std::string, capture>("tr", [this] { this->HitraceCapture(); }));
87020a203aSopenharmony_ci    captureList_.insert(std::pair<std::string, capture>("cmd:scbCS",
88020a203aSopenharmony_ci        [this] { this->SCBSessionCapture(); }));
89020a203aSopenharmony_ci    captureList_.insert(std::pair<std::string, capture>("cmd:scbVP",
90020a203aSopenharmony_ci        [this] { this->SCBViewParamCapture(); }));
91020a203aSopenharmony_ci    captureList_.insert(std::pair<std::string, capture>("cmd:scbWMS",
92020a203aSopenharmony_ci        [this] { this->SCBWMSCapture(); }));
93020a203aSopenharmony_ci    captureList_.insert(std::pair<std::string, capture>("cmd:scbWMSEVT",
94020a203aSopenharmony_ci        [this] { this->SCBWMSEVTCapture(); }));
95020a203aSopenharmony_ci    captureList_.insert(std::pair<std::string, capture>("cmd:dam",
96020a203aSopenharmony_ci        [this] { this->DumpAppMapCapture(); }));
97020a203aSopenharmony_ci    captureList_.insert(std::pair<std::string, capture>("t:input",
98020a203aSopenharmony_ci        [this] { this->InputHilogCapture(); }));
99020a203aSopenharmony_ci}
100020a203aSopenharmony_ci
101020a203aSopenharmony_civoid EventLogTask::AddLog(const std::string &cmd)
102020a203aSopenharmony_ci{
103020a203aSopenharmony_ci    if (tasks_.size() == 0) {
104020a203aSopenharmony_ci        status_ = Status::TASK_RUNNABLE;
105020a203aSopenharmony_ci    }
106020a203aSopenharmony_ci
107020a203aSopenharmony_ci    if (captureList_.find(cmd) != captureList_.end()) {
108020a203aSopenharmony_ci        captureList_[cmd]();
109020a203aSopenharmony_ci        return;
110020a203aSopenharmony_ci    }
111020a203aSopenharmony_ci    PeerBinderCapture(cmd);
112020a203aSopenharmony_ci    catchedPids_.clear();
113020a203aSopenharmony_ci}
114020a203aSopenharmony_ci
115020a203aSopenharmony_civoid EventLogTask::SetFocusWindowId(const std::string& focusWindowId)
116020a203aSopenharmony_ci{
117020a203aSopenharmony_ci    focusWindowId_ = focusWindowId;
118020a203aSopenharmony_ci}
119020a203aSopenharmony_ci
120020a203aSopenharmony_ciEventLogTask::Status EventLogTask::StartCompose()
121020a203aSopenharmony_ci{
122020a203aSopenharmony_ci    // nothing to do, return success
123020a203aSopenharmony_ci    if (status_ != Status::TASK_RUNNABLE) {
124020a203aSopenharmony_ci        return status_;
125020a203aSopenharmony_ci    }
126020a203aSopenharmony_ci    status_ = Status::TASK_RUNNING;
127020a203aSopenharmony_ci    // nothing to do, return success
128020a203aSopenharmony_ci    if (tasks_.size() == 0) {
129020a203aSopenharmony_ci        return Status::TASK_SUCCESS;
130020a203aSopenharmony_ci    }
131020a203aSopenharmony_ci
132020a203aSopenharmony_ci    auto dupedFd = dup(targetFd_);
133020a203aSopenharmony_ci    int dupedJsonFd = -1;
134020a203aSopenharmony_ci    if (targetJsonFd_ >= 0) {
135020a203aSopenharmony_ci        dupedJsonFd = dup(targetJsonFd_);
136020a203aSopenharmony_ci    }
137020a203aSopenharmony_ci    uint32_t catcherIndex = 0;
138020a203aSopenharmony_ci    for (auto& catcher : tasks_) {
139020a203aSopenharmony_ci        catcherIndex++;
140020a203aSopenharmony_ci        if (dupedFd < 0) {
141020a203aSopenharmony_ci            status_ = Status::TASK_FAIL;
142020a203aSopenharmony_ci            AddStopReason(targetFd_, catcher, "Fail to dup file descriptor, exit!");
143020a203aSopenharmony_ci            return TASK_FAIL;
144020a203aSopenharmony_ci        }
145020a203aSopenharmony_ci
146020a203aSopenharmony_ci        AddSeparator(dupedFd, catcher);
147020a203aSopenharmony_ci        int curLogSize = catcher->Catch(dupedFd, dupedJsonFd);
148020a203aSopenharmony_ci        HIVIEW_LOGI("finish catcher: %{public}s, curLogSize: %{public}d", catcher->GetDescription().c_str(),
149020a203aSopenharmony_ci            curLogSize);
150020a203aSopenharmony_ci        if (ShouldStopLogTask(dupedFd, catcherIndex, curLogSize, catcher)) {
151020a203aSopenharmony_ci            break;
152020a203aSopenharmony_ci        }
153020a203aSopenharmony_ci    }
154020a203aSopenharmony_ci    close(dupedFd);
155020a203aSopenharmony_ci    if (dupedJsonFd >= 0) {
156020a203aSopenharmony_ci        close(dupedJsonFd);
157020a203aSopenharmony_ci    }
158020a203aSopenharmony_ci    if (status_ == Status::TASK_RUNNING) {
159020a203aSopenharmony_ci        status_ = Status::TASK_SUCCESS;
160020a203aSopenharmony_ci    }
161020a203aSopenharmony_ci    return status_;
162020a203aSopenharmony_ci}
163020a203aSopenharmony_ci
164020a203aSopenharmony_cibool EventLogTask::ShouldStopLogTask(int fd, uint32_t curTaskIndex, int curLogSize,
165020a203aSopenharmony_ci    std::shared_ptr<EventLogCatcher> catcher)
166020a203aSopenharmony_ci{
167020a203aSopenharmony_ci    if (status_ == Status::TASK_TIMEOUT) {
168020a203aSopenharmony_ci        HIVIEW_LOGE("Break Log task, parent has timeout.");
169020a203aSopenharmony_ci        return true;
170020a203aSopenharmony_ci    }
171020a203aSopenharmony_ci
172020a203aSopenharmony_ci    bool encounterErr = (curLogSize < 0);
173020a203aSopenharmony_ci    bool hasFinished = (curTaskIndex == tasks_.size());
174020a203aSopenharmony_ci    if (!encounterErr) {
175020a203aSopenharmony_ci        taskLogSize_ += static_cast<uint32_t>(curLogSize);
176020a203aSopenharmony_ci    }
177020a203aSopenharmony_ci
178020a203aSopenharmony_ci    if (taskLogSize_ > maxLogSize_ && !hasFinished) {
179020a203aSopenharmony_ci        AddStopReason(fd, catcher, "Exceed max log size");
180020a203aSopenharmony_ci        status_ = Status::TASK_EXCEED_SIZE;
181020a203aSopenharmony_ci        return true;
182020a203aSopenharmony_ci    }
183020a203aSopenharmony_ci
184020a203aSopenharmony_ci    if (encounterErr) {
185020a203aSopenharmony_ci        AddStopReason(fd, catcher, "Log catcher not successful");
186020a203aSopenharmony_ci        HIVIEW_LOGE("catcher %{public}s, Log catcher not successful", catcher->GetDescription().c_str());
187020a203aSopenharmony_ci    }
188020a203aSopenharmony_ci    return false;
189020a203aSopenharmony_ci}
190020a203aSopenharmony_ci
191020a203aSopenharmony_civoid EventLogTask::AddStopReason(int fd, std::shared_ptr<EventLogCatcher> catcher, const std::string& reason)
192020a203aSopenharmony_ci{
193020a203aSopenharmony_ci    char buf[BUF_SIZE_512] = {0};
194020a203aSopenharmony_ci    int ret = -1;
195020a203aSopenharmony_ci    if (catcher != nullptr) {
196020a203aSopenharmony_ci        catcher->Stop();
197020a203aSopenharmony_ci        // sleep 1s for syncing log to the fd, then we could append failure reason ?
198020a203aSopenharmony_ci        sleep(1);
199020a203aSopenharmony_ci        std::string summary = catcher->GetDescription();
200020a203aSopenharmony_ci        ret = snprintf_s(buf, BUF_SIZE_512, BUF_SIZE_512 - 1, "\nTask stopped when running catcher:%s, Reason:%s \n",
201020a203aSopenharmony_ci                         summary.c_str(), reason.c_str());
202020a203aSopenharmony_ci    } else {
203020a203aSopenharmony_ci        ret = snprintf_s(buf, BUF_SIZE_512, BUF_SIZE_512 - 1, "\nTask stopped, Reason:%s \n", reason.c_str());
204020a203aSopenharmony_ci    }
205020a203aSopenharmony_ci
206020a203aSopenharmony_ci    if (ret > 0) {
207020a203aSopenharmony_ci        write(fd, buf, strnlen(buf, BUF_SIZE_512));
208020a203aSopenharmony_ci        fsync(fd);
209020a203aSopenharmony_ci    }
210020a203aSopenharmony_ci}
211020a203aSopenharmony_ci
212020a203aSopenharmony_civoid EventLogTask::AddSeparator(int fd, std::shared_ptr<EventLogCatcher> catcher) const
213020a203aSopenharmony_ci{
214020a203aSopenharmony_ci    char buf[BUF_SIZE_512] = {0};
215020a203aSopenharmony_ci    std::string summary = catcher->GetDescription();
216020a203aSopenharmony_ci    if (summary.empty()) {
217020a203aSopenharmony_ci        HIVIEW_LOGE("summary.empty() catcher is %{public}s", catcher->GetName().c_str());
218020a203aSopenharmony_ci        return;
219020a203aSopenharmony_ci    }
220020a203aSopenharmony_ci
221020a203aSopenharmony_ci    int ret = snprintf_s(buf, BUF_SIZE_512, BUF_SIZE_512 - 1, "\n%s\n", summary.c_str());
222020a203aSopenharmony_ci    if (ret > 0) {
223020a203aSopenharmony_ci        write(fd, buf, strnlen(buf, BUF_SIZE_512));
224020a203aSopenharmony_ci        fsync(fd);
225020a203aSopenharmony_ci    }
226020a203aSopenharmony_ci}
227020a203aSopenharmony_ci
228020a203aSopenharmony_civoid EventLogTask::RecordCatchedPids(const std::string& packageName)
229020a203aSopenharmony_ci{
230020a203aSopenharmony_ci    int pid = CommonUtils::GetPidByName(packageName);
231020a203aSopenharmony_ci    if (pid > 0) {
232020a203aSopenharmony_ci        catchedPids_.insert(pid);
233020a203aSopenharmony_ci    }
234020a203aSopenharmony_ci}
235020a203aSopenharmony_ci
236020a203aSopenharmony_ciEventLogTask::Status EventLogTask::GetTaskStatus() const
237020a203aSopenharmony_ci{
238020a203aSopenharmony_ci    return status_;
239020a203aSopenharmony_ci}
240020a203aSopenharmony_ci
241020a203aSopenharmony_cilong EventLogTask::GetLogSize() const
242020a203aSopenharmony_ci{
243020a203aSopenharmony_ci    return taskLogSize_;
244020a203aSopenharmony_ci}
245020a203aSopenharmony_ci
246020a203aSopenharmony_civoid EventLogTask::AppStackCapture()
247020a203aSopenharmony_ci{
248020a203aSopenharmony_ci    auto capture = std::make_shared<OpenStacktraceCatcher>();
249020a203aSopenharmony_ci    capture->Initialize(event_->GetEventValue("PACKAGE_NAME"), pid_, 0);
250020a203aSopenharmony_ci    tasks_.push_back(capture);
251020a203aSopenharmony_ci}
252020a203aSopenharmony_ci
253020a203aSopenharmony_civoid EventLogTask::SystemStackCapture()
254020a203aSopenharmony_ci{
255020a203aSopenharmony_ci    for (auto packageName : SYSTEM_STACK) {
256020a203aSopenharmony_ci        auto capture = std::make_shared<OpenStacktraceCatcher>();
257020a203aSopenharmony_ci        capture->Initialize(packageName, 0, 0);
258020a203aSopenharmony_ci        RecordCatchedPids(packageName);
259020a203aSopenharmony_ci        tasks_.push_back(capture);
260020a203aSopenharmony_ci    }
261020a203aSopenharmony_ci}
262020a203aSopenharmony_ci
263020a203aSopenharmony_civoid EventLogTask::BinderLogCapture()
264020a203aSopenharmony_ci{
265020a203aSopenharmony_ci    auto capture = std::make_shared<BinderCatcher>();
266020a203aSopenharmony_ci    capture->Initialize("", 0, 0);
267020a203aSopenharmony_ci    tasks_.push_back(capture);
268020a203aSopenharmony_ci}
269020a203aSopenharmony_ci
270020a203aSopenharmony_civoid EventLogTask::FfrtCapture()
271020a203aSopenharmony_ci{
272020a203aSopenharmony_ci    if (pid_ > 0) {
273020a203aSopenharmony_ci        auto capture = std::make_shared<FfrtCatcher>();
274020a203aSopenharmony_ci        capture->Initialize("", pid_, 0);
275020a203aSopenharmony_ci        tasks_.push_back(capture);
276020a203aSopenharmony_ci    }
277020a203aSopenharmony_ci}
278020a203aSopenharmony_ci
279020a203aSopenharmony_civoid EventLogTask::MemoryUsageCapture()
280020a203aSopenharmony_ci{
281020a203aSopenharmony_ci    auto capture = std::make_shared<MemoryCatcher>();
282020a203aSopenharmony_ci    capture->Initialize("", 0, 0);
283020a203aSopenharmony_ci    tasks_.push_back(capture);
284020a203aSopenharmony_ci}
285020a203aSopenharmony_ci
286020a203aSopenharmony_cibool EventLogTask::PeerBinderCapture(const std::string &cmd)
287020a203aSopenharmony_ci{
288020a203aSopenharmony_ci    auto find = cmd.find("pb");
289020a203aSopenharmony_ci    if (find == cmd.npos) {
290020a203aSopenharmony_ci        return false;
291020a203aSopenharmony_ci    }
292020a203aSopenharmony_ci
293020a203aSopenharmony_ci    std::vector<std::string> cmdList;
294020a203aSopenharmony_ci    StringUtil::SplitStr(cmd, ":", cmdList, true);
295020a203aSopenharmony_ci    if (cmdList.size() != BP_CMD_SZ || cmdList.front() != "pb") {
296020a203aSopenharmony_ci        return false;
297020a203aSopenharmony_ci    }
298020a203aSopenharmony_ci
299020a203aSopenharmony_ci    auto capture = std::make_shared<PeerBinderCatcher>();
300020a203aSopenharmony_ci    capture->Initialize(cmdList[BP_CMD_PERF_TYPE_INDEX],
301020a203aSopenharmony_ci        StringUtil::StrToInt(cmdList[BP_CMD_LAYER_INDEX]), pid_);
302020a203aSopenharmony_ci    capture->Init(event_, "", catchedPids_);
303020a203aSopenharmony_ci    tasks_.push_back(capture);
304020a203aSopenharmony_ci    return true;
305020a203aSopenharmony_ci}
306020a203aSopenharmony_ci
307020a203aSopenharmony_civoid EventLogTask::CpuUsageCapture()
308020a203aSopenharmony_ci{
309020a203aSopenharmony_ci    auto capture = std::make_shared<ShellCatcher>();
310020a203aSopenharmony_ci    capture->Initialize("hidumper --cpuusage", ShellCatcher::CATCHER_CPU, pid_);
311020a203aSopenharmony_ci    tasks_.push_back(capture);
312020a203aSopenharmony_ci}
313020a203aSopenharmony_ci
314020a203aSopenharmony_civoid EventLogTask::WMSUsageCapture()
315020a203aSopenharmony_ci{
316020a203aSopenharmony_ci    auto capture = std::make_shared<ShellCatcher>();
317020a203aSopenharmony_ci    capture->Initialize("hidumper -s WindowManagerService -a -a", ShellCatcher::CATCHER_WMS, pid_);
318020a203aSopenharmony_ci    tasks_.push_back(capture);
319020a203aSopenharmony_ci}
320020a203aSopenharmony_ci
321020a203aSopenharmony_civoid EventLogTask::AMSUsageCapture()
322020a203aSopenharmony_ci{
323020a203aSopenharmony_ci    auto capture = std::make_shared<ShellCatcher>();
324020a203aSopenharmony_ci    capture->Initialize("hidumper -s AbilityManagerService -a -a", ShellCatcher::CATCHER_AMS, pid_);
325020a203aSopenharmony_ci    tasks_.push_back(capture);
326020a203aSopenharmony_ci}
327020a203aSopenharmony_ci
328020a203aSopenharmony_civoid EventLogTask::PMSUsageCapture()
329020a203aSopenharmony_ci{
330020a203aSopenharmony_ci    auto capture = std::make_shared<ShellCatcher>();
331020a203aSopenharmony_ci    capture->Initialize("hidumper -s PowerManagerService -a -s", ShellCatcher::CATCHER_PMS, pid_);
332020a203aSopenharmony_ci    tasks_.push_back(capture);
333020a203aSopenharmony_ci}
334020a203aSopenharmony_ci
335020a203aSopenharmony_civoid EventLogTask::DPMSUsageCapture()
336020a203aSopenharmony_ci{
337020a203aSopenharmony_ci    auto capture = std::make_shared<ShellCatcher>();
338020a203aSopenharmony_ci    capture->Initialize("hidumper -s DisplayPowerManagerService", ShellCatcher::CATCHER_DPMS, pid_);
339020a203aSopenharmony_ci    tasks_.push_back(capture);
340020a203aSopenharmony_ci}
341020a203aSopenharmony_ci
342020a203aSopenharmony_civoid EventLogTask::RSUsageCapture()
343020a203aSopenharmony_ci{
344020a203aSopenharmony_ci    auto capture = std::make_shared<ShellCatcher>();
345020a203aSopenharmony_ci    capture->Initialize("hidumper -s RenderService -a allInfo", ShellCatcher::CATCHER_RS, pid_);
346020a203aSopenharmony_ci    tasks_.push_back(capture);
347020a203aSopenharmony_ci}
348020a203aSopenharmony_ci
349020a203aSopenharmony_civoid EventLogTask::MMIUsageCapture()
350020a203aSopenharmony_ci{
351020a203aSopenharmony_ci    auto capture = std::make_shared<ShellCatcher>();
352020a203aSopenharmony_ci    capture->Initialize("hidumper -s MultimodalInput -a -w", ShellCatcher::CATCHER_MMI, pid_);
353020a203aSopenharmony_ci    tasks_.push_back(capture);
354020a203aSopenharmony_ci}
355020a203aSopenharmony_ci
356020a203aSopenharmony_civoid EventLogTask::DMSUsageCapture()
357020a203aSopenharmony_ci{
358020a203aSopenharmony_ci    auto capture = std::make_shared<ShellCatcher>();
359020a203aSopenharmony_ci    capture->Initialize("hidumper -s DisplayManagerService -a -a", ShellCatcher::CATCHER_DMS, pid_);
360020a203aSopenharmony_ci    tasks_.push_back(capture);
361020a203aSopenharmony_ci}
362020a203aSopenharmony_ci
363020a203aSopenharmony_civoid EventLogTask::EECStateCapture()
364020a203aSopenharmony_ci{
365020a203aSopenharmony_ci    auto capture = std::make_shared<ShellCatcher>();
366020a203aSopenharmony_ci    capture->Initialize("hidumper -s 4606 -a '-b EventExclusiveCommander getAllEventExclusiveCaller'",
367020a203aSopenharmony_ci        ShellCatcher::CATCHER_EEC, pid_);
368020a203aSopenharmony_ci    tasks_.push_back(capture);
369020a203aSopenharmony_ci}
370020a203aSopenharmony_ci
371020a203aSopenharmony_civoid EventLogTask::GECStateCapture()
372020a203aSopenharmony_ci{
373020a203aSopenharmony_ci    auto capture = std::make_shared<ShellCatcher>();
374020a203aSopenharmony_ci    capture->Initialize("hidumper -s 4606 -a '-b SCBGestureManager getAllGestureEnableCaller'",
375020a203aSopenharmony_ci        ShellCatcher::CATCHER_GEC, pid_);
376020a203aSopenharmony_ci    tasks_.push_back(capture);
377020a203aSopenharmony_ci}
378020a203aSopenharmony_ci
379020a203aSopenharmony_civoid EventLogTask::UIStateCapture()
380020a203aSopenharmony_ci{
381020a203aSopenharmony_ci    auto capture = std::make_shared<ShellCatcher>();
382020a203aSopenharmony_ci    capture->Initialize("hidumper -s 4606 -a '-p 0'", ShellCatcher::CATCHER_UI, pid_);
383020a203aSopenharmony_ci    tasks_.push_back(capture);
384020a203aSopenharmony_ci}
385020a203aSopenharmony_ci
386020a203aSopenharmony_civoid EventLogTask::Screenshot()
387020a203aSopenharmony_ci{
388020a203aSopenharmony_ci    auto capture = std::make_shared<ShellCatcher>();
389020a203aSopenharmony_ci    capture->Initialize("snapshot_display -f x.jpeg", ShellCatcher::CATCHER_SNAPSHOT, pid_);
390020a203aSopenharmony_ci    tasks_.push_back(capture);
391020a203aSopenharmony_ci}
392020a203aSopenharmony_ci
393020a203aSopenharmony_civoid EventLogTask::HilogCapture()
394020a203aSopenharmony_ci{
395020a203aSopenharmony_ci    auto capture = std::make_shared<ShellCatcher>();
396020a203aSopenharmony_ci    capture->Initialize("hilog -x", ShellCatcher::CATCHER_HILOG, 0);
397020a203aSopenharmony_ci    tasks_.push_back(capture);
398020a203aSopenharmony_ci}
399020a203aSopenharmony_ci
400020a203aSopenharmony_civoid EventLogTask::LightHilogCapture()
401020a203aSopenharmony_ci{
402020a203aSopenharmony_ci    auto capture = std::make_shared<ShellCatcher>();
403020a203aSopenharmony_ci    capture->Initialize("hilog -z 1000 -P", ShellCatcher::CATCHER_LIGHT_HILOG, pid_);
404020a203aSopenharmony_ci    tasks_.push_back(capture);
405020a203aSopenharmony_ci}
406020a203aSopenharmony_ci
407020a203aSopenharmony_civoid EventLogTask::DmesgCapture()
408020a203aSopenharmony_ci{
409020a203aSopenharmony_ci    auto capture = std::make_shared<DmesgCatcher>();
410020a203aSopenharmony_ci    capture->Initialize("", 0, 0);
411020a203aSopenharmony_ci    capture->Init(event_);
412020a203aSopenharmony_ci    tasks_.push_back(capture);
413020a203aSopenharmony_ci}
414020a203aSopenharmony_ci
415020a203aSopenharmony_civoid EventLogTask::SysrqCapture(bool isWriteNewFile)
416020a203aSopenharmony_ci{
417020a203aSopenharmony_ci    auto capture = std::make_shared<DmesgCatcher>();
418020a203aSopenharmony_ci    capture->Initialize("", isWriteNewFile, 1);
419020a203aSopenharmony_ci    capture->Init(event_);
420020a203aSopenharmony_ci    tasks_.push_back(capture);
421020a203aSopenharmony_ci}
422020a203aSopenharmony_ci
423020a203aSopenharmony_civoid EventLogTask::HitraceCapture()
424020a203aSopenharmony_ci{
425020a203aSopenharmony_ci    std::shared_ptr<UCollectUtil::TraceCollector> collector = UCollectUtil::TraceCollector::Create();
426020a203aSopenharmony_ci    UCollect::TraceCaller caller = UCollect::TraceCaller::RELIABILITY;
427020a203aSopenharmony_ci    std::regex reg("Fault time:(\\d{4}/\\d{2}/\\d{2}-\\d{2}:\\d{2}:\\d{2})");
428020a203aSopenharmony_ci    std::string timeStamp = event_->GetEventValue("MSG");
429020a203aSopenharmony_ci    std::smatch match;
430020a203aSopenharmony_ci    timeStamp = std::regex_search(timeStamp, match, reg) ? match[1].str() : "";
431020a203aSopenharmony_ci    uint64_t faultTime = timeStamp.empty() ? (event_->happenTime_) :
432020a203aSopenharmony_ci        static_cast<uint64_t>(TimeUtil::StrToTimeStamp(timeStamp, "%Y/%m/%d-%H:%M:%S"));
433020a203aSopenharmony_ci    faultTime += DELAY_TIME;
434020a203aSopenharmony_ci    uint64_t currentTime = TimeUtil::GetMilliseconds() / MILLISEC_TO_SEC;
435020a203aSopenharmony_ci    if (currentTime >= (TRACE_OUT_OF_TIME + faultTime)) {
436020a203aSopenharmony_ci        faultTime = currentTime - DELAY_OUT_OF_TIME;
437020a203aSopenharmony_ci    }
438020a203aSopenharmony_ci    auto result = collector->DumpTraceWithDuration(caller, MAX_DUMP_TRACE_LIMIT, faultTime);
439020a203aSopenharmony_ci    if (result.retCode != 0) {
440020a203aSopenharmony_ci        HIVIEW_LOGE("get hitrace fail! error code : %{public}d", result.retCode);
441020a203aSopenharmony_ci        return;
442020a203aSopenharmony_ci    }
443020a203aSopenharmony_ci}
444020a203aSopenharmony_ci
445020a203aSopenharmony_civoid EventLogTask::SCBSessionCapture()
446020a203aSopenharmony_ci{
447020a203aSopenharmony_ci    auto capture = std::make_shared<ShellCatcher>();
448020a203aSopenharmony_ci    capture->Initialize("hidumper -s 4606 -a '-b SCBScenePanel getContainerSession'",
449020a203aSopenharmony_ci        ShellCatcher::CATCHER_SCBSESSION, pid_);
450020a203aSopenharmony_ci    tasks_.push_back(capture);
451020a203aSopenharmony_ci}
452020a203aSopenharmony_ci
453020a203aSopenharmony_civoid EventLogTask::SCBViewParamCapture()
454020a203aSopenharmony_ci{
455020a203aSopenharmony_ci    auto capture = std::make_shared<ShellCatcher>();
456020a203aSopenharmony_ci    capture->Initialize("hidumper -s 4606 -a '-b SCBScenePanel getViewParam'",
457020a203aSopenharmony_ci        ShellCatcher::CATCHER_SCBVIEWPARAM, pid_);
458020a203aSopenharmony_ci    tasks_.push_back(capture);
459020a203aSopenharmony_ci}
460020a203aSopenharmony_ci
461020a203aSopenharmony_civoid EventLogTask::SCBWMSCapture()
462020a203aSopenharmony_ci{
463020a203aSopenharmony_ci    auto capture = std::make_shared<ShellCatcher>();
464020a203aSopenharmony_ci    capture->SetEvent(event_);
465020a203aSopenharmony_ci    if (focusWindowId_.empty()) {
466020a203aSopenharmony_ci        HIVIEW_LOGE("dump simplify get focus window error");
467020a203aSopenharmony_ci        return;
468020a203aSopenharmony_ci    }
469020a203aSopenharmony_ci    std::string cmd = "hidumper -s WindowManagerService -a -w " + focusWindowId_ + " -simplify";
470020a203aSopenharmony_ci    capture->Initialize(cmd, ShellCatcher::CATCHER_SCBWMS, pid_);
471020a203aSopenharmony_ci    capture->SetFocusWindowId(focusWindowId_);
472020a203aSopenharmony_ci    tasks_.push_back(capture);
473020a203aSopenharmony_ci}
474020a203aSopenharmony_ci
475020a203aSopenharmony_civoid EventLogTask::SCBWMSEVTCapture()
476020a203aSopenharmony_ci{
477020a203aSopenharmony_ci    auto capture = std::make_shared<ShellCatcher>();
478020a203aSopenharmony_ci    capture->SetEvent(event_);
479020a203aSopenharmony_ci    if (focusWindowId_.empty()) {
480020a203aSopenharmony_ci        HIVIEW_LOGE("dump event get focus window error");
481020a203aSopenharmony_ci        return;
482020a203aSopenharmony_ci    }
483020a203aSopenharmony_ci    std::string cmd = "hidumper -s WindowManagerService -a -w " + focusWindowId_ + " -event";
484020a203aSopenharmony_ci    capture->Initialize(cmd, ShellCatcher::CATCHER_SCBWMSEVT, pid_);
485020a203aSopenharmony_ci    capture->SetFocusWindowId(focusWindowId_);
486020a203aSopenharmony_ci    tasks_.push_back(capture);
487020a203aSopenharmony_ci}
488020a203aSopenharmony_ci
489020a203aSopenharmony_civoid EventLogTask::DumpAppMapCapture()
490020a203aSopenharmony_ci{
491020a203aSopenharmony_ci    auto capture = std::make_shared<ShellCatcher>();
492020a203aSopenharmony_ci    capture->Initialize("hidumper -s 1910 -a DumpAppMap", ShellCatcher::CATCHER_DAM, pid_);
493020a203aSopenharmony_ci    tasks_.push_back(capture);
494020a203aSopenharmony_ci}
495020a203aSopenharmony_ci
496020a203aSopenharmony_civoid EventLogTask::InputHilogCapture()
497020a203aSopenharmony_ci{
498020a203aSopenharmony_ci    auto capture = std::make_shared<ShellCatcher>();
499020a203aSopenharmony_ci    int32_t eventId = event_->GetEventIntValue("INPUT_ID");
500020a203aSopenharmony_ci    if (eventId > 0) {
501020a203aSopenharmony_ci        std::string cmd = "hilog -T InputKeyFlow -e " +
502020a203aSopenharmony_ci            std::to_string(eventId) + " -x";
503020a203aSopenharmony_ci        capture->Initialize(cmd, ShellCatcher::CATCHER_INPUT_EVENT_HILOG, eventId);
504020a203aSopenharmony_ci    } else {
505020a203aSopenharmony_ci        capture->Initialize("hilog -T InputKeyFlow -x", ShellCatcher::CATCHER_INPUT_HILOG,
506020a203aSopenharmony_ci            pid_);
507020a203aSopenharmony_ci    }
508020a203aSopenharmony_ci    tasks_.push_back(capture);
509020a203aSopenharmony_ci}
510020a203aSopenharmony_ci} // namespace HiviewDFX
511020a203aSopenharmony_ci} // namespace OHOS
512