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