1020a203aSopenharmony_ci/* 2020a203aSopenharmony_ci * Copyright (c) 2021 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 16020a203aSopenharmony_ci#include "vendor.h" 17020a203aSopenharmony_ci 18020a203aSopenharmony_ci#include "faultlogger_client.h" 19020a203aSopenharmony_ci#include "file_util.h" 20020a203aSopenharmony_ci#include "freeze_json_util.h" 21020a203aSopenharmony_ci#include "hiview_logger.h" 22020a203aSopenharmony_ci#include "string_util.h" 23020a203aSopenharmony_ci#include "time_util.h" 24020a203aSopenharmony_ci#include <regex> 25020a203aSopenharmony_ci 26020a203aSopenharmony_cinamespace OHOS { 27020a203aSopenharmony_cinamespace HiviewDFX { 28020a203aSopenharmony_cinamespace { 29020a203aSopenharmony_ci static const int MILLISECOND = 1000; 30020a203aSopenharmony_ci static const int MAX_LINE_NUM = 100; 31020a203aSopenharmony_ci static const int TIME_STRING_LEN = 16; 32020a203aSopenharmony_ci static const int MAX_FILE_NUM = 500; 33020a203aSopenharmony_ci static const int MAX_FOLDER_SIZE = 50 * 1024 * 1024; 34020a203aSopenharmony_ci static constexpr const char* const TRIGGER_HEADER = ">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>"; 35020a203aSopenharmony_ci static constexpr const char* const HEADER = "*******************************************"; 36020a203aSopenharmony_ci static constexpr const char* const HYPHEN = "-"; 37020a203aSopenharmony_ci static constexpr const char* const POSTFIX = ".tmp"; 38020a203aSopenharmony_ci static constexpr const char* const APPFREEZE = "appfreeze"; 39020a203aSopenharmony_ci static constexpr const char* const SYSFREEZE = "sysfreeze"; 40020a203aSopenharmony_ci static constexpr const char* const SYSWARNING = "syswarning"; 41020a203aSopenharmony_ci static constexpr const char* const FREEZE_DETECTOR_PATH = "/data/log/faultlog/"; 42020a203aSopenharmony_ci static constexpr const char* const FAULT_LOGGER_PATH = "/data/log/faultlog/faultlogger/"; 43020a203aSopenharmony_ci static constexpr const char* const COLON = ":"; 44020a203aSopenharmony_ci static constexpr const char* const EVENT_DOMAIN = "DOMAIN"; 45020a203aSopenharmony_ci static constexpr const char* const EVENT_STRINGID = "STRINGID"; 46020a203aSopenharmony_ci static constexpr const char* const EVENT_TIMESTAMP = "TIMESTAMP"; 47020a203aSopenharmony_ci static constexpr const char* const DISPLAY_POWER_INFO = "DisplayPowerInfo:"; 48020a203aSopenharmony_ci static constexpr const char* const FORE_GROUND = "FOREGROUND"; 49020a203aSopenharmony_ci} 50020a203aSopenharmony_ci 51020a203aSopenharmony_ciDEFINE_LOG_LABEL(0xD002D01, "FreezeDetector"); 52020a203aSopenharmony_cibool Vendor::ReduceRelevanceEvents(std::list<WatchPoint>& list, const FreezeResult& result) const 53020a203aSopenharmony_ci{ 54020a203aSopenharmony_ci HIVIEW_LOGI("before size=%{public}zu", list.size()); 55020a203aSopenharmony_ci if (freezeCommon_ == nullptr) { 56020a203aSopenharmony_ci return false; 57020a203aSopenharmony_ci } 58020a203aSopenharmony_ci if (!freezeCommon_->IsSystemResult(result) && !freezeCommon_->IsApplicationResult(result) && 59020a203aSopenharmony_ci !freezeCommon_->IsSysWarningResult(result)) { 60020a203aSopenharmony_ci list.clear(); 61020a203aSopenharmony_ci return false; 62020a203aSopenharmony_ci } 63020a203aSopenharmony_ci 64020a203aSopenharmony_ci // erase if not system event 65020a203aSopenharmony_ci if (freezeCommon_->IsSystemResult(result)) { 66020a203aSopenharmony_ci std::list<WatchPoint>::iterator watchPoint; 67020a203aSopenharmony_ci for (watchPoint = list.begin(); watchPoint != list.end();) { 68020a203aSopenharmony_ci if (freezeCommon_->IsSystemEvent(watchPoint->GetDomain(), watchPoint->GetStringId())) { 69020a203aSopenharmony_ci watchPoint++; 70020a203aSopenharmony_ci } else { 71020a203aSopenharmony_ci watchPoint = list.erase(watchPoint); 72020a203aSopenharmony_ci } 73020a203aSopenharmony_ci } 74020a203aSopenharmony_ci } 75020a203aSopenharmony_ci 76020a203aSopenharmony_ci // erase if not application event 77020a203aSopenharmony_ci if (freezeCommon_->IsApplicationResult(result)) { 78020a203aSopenharmony_ci std::list<WatchPoint>::iterator watchPoint; 79020a203aSopenharmony_ci for (watchPoint = list.begin(); watchPoint != list.end();) { 80020a203aSopenharmony_ci if (freezeCommon_->IsApplicationEvent(watchPoint->GetDomain(), watchPoint->GetStringId())) { 81020a203aSopenharmony_ci watchPoint++; 82020a203aSopenharmony_ci } else { 83020a203aSopenharmony_ci watchPoint = list.erase(watchPoint); 84020a203aSopenharmony_ci } 85020a203aSopenharmony_ci } 86020a203aSopenharmony_ci } 87020a203aSopenharmony_ci 88020a203aSopenharmony_ci // erase if not sysWarning event 89020a203aSopenharmony_ci if (freezeCommon_->IsSysWarningResult(result)) { 90020a203aSopenharmony_ci std::list<WatchPoint>::iterator watchPoint; 91020a203aSopenharmony_ci for (watchPoint = list.begin(); watchPoint != list.end();) { 92020a203aSopenharmony_ci if (freezeCommon_->IsSysWarningEvent(watchPoint->GetDomain(), watchPoint->GetStringId())) { 93020a203aSopenharmony_ci watchPoint++; 94020a203aSopenharmony_ci } else { 95020a203aSopenharmony_ci watchPoint = list.erase(watchPoint); 96020a203aSopenharmony_ci } 97020a203aSopenharmony_ci } 98020a203aSopenharmony_ci } 99020a203aSopenharmony_ci 100020a203aSopenharmony_ci list.sort(); 101020a203aSopenharmony_ci list.unique(); 102020a203aSopenharmony_ci HIVIEW_LOGI("after size=%{public}zu", list.size()); 103020a203aSopenharmony_ci return list.size() != 0; 104020a203aSopenharmony_ci} 105020a203aSopenharmony_ci 106020a203aSopenharmony_cistd::string Vendor::GetTimeString(unsigned long long timestamp) const 107020a203aSopenharmony_ci{ 108020a203aSopenharmony_ci struct tm tm; 109020a203aSopenharmony_ci time_t ts = static_cast<long long>(timestamp) / MILLISECOND; // ms 110020a203aSopenharmony_ci localtime_r(&ts, &tm); 111020a203aSopenharmony_ci char buf[TIME_STRING_LEN] = {0}; 112020a203aSopenharmony_ci 113020a203aSopenharmony_ci strftime(buf, TIME_STRING_LEN - 1, "%Y%m%d%H%M%S", &tm); 114020a203aSopenharmony_ci return std::string(buf, strlen(buf)); 115020a203aSopenharmony_ci} 116020a203aSopenharmony_ci 117020a203aSopenharmony_cistd::string Vendor::SendFaultLog(const WatchPoint &watchPoint, const std::string& logPath, 118020a203aSopenharmony_ci const std::string& type) const 119020a203aSopenharmony_ci{ 120020a203aSopenharmony_ci if (freezeCommon_ == nullptr) { 121020a203aSopenharmony_ci return ""; 122020a203aSopenharmony_ci } 123020a203aSopenharmony_ci std::string packageName = StringUtil::TrimStr(watchPoint.GetPackageName()); 124020a203aSopenharmony_ci std::string processName = StringUtil::TrimStr(watchPoint.GetProcessName()); 125020a203aSopenharmony_ci std::string stringId = watchPoint.GetStringId(); 126020a203aSopenharmony_ci processName = processName.empty() ? (packageName.empty() ? stringId : packageName) : processName; 127020a203aSopenharmony_ci if (stringId == "SCREEN_ON") { 128020a203aSopenharmony_ci processName = stringId; 129020a203aSopenharmony_ci } else { 130020a203aSopenharmony_ci FormatProcessName(processName); 131020a203aSopenharmony_ci } 132020a203aSopenharmony_ci 133020a203aSopenharmony_ci FaultLogInfoInner info; 134020a203aSopenharmony_ci info.time = watchPoint.GetTimestamp(); 135020a203aSopenharmony_ci info.id = watchPoint.GetUid(); 136020a203aSopenharmony_ci info.pid = watchPoint.GetPid(); 137020a203aSopenharmony_ci info.faultLogType = (type == APPFREEZE) ? FaultLogType::APP_FREEZE : ((type == SYSFREEZE) ? 138020a203aSopenharmony_ci FaultLogType::SYS_FREEZE : FaultLogType::SYS_WARNING); 139020a203aSopenharmony_ci info.module = processName; 140020a203aSopenharmony_ci info.reason = stringId; 141020a203aSopenharmony_ci std::string disPlayPowerInfo = GetDisPlayPowerInfo(); 142020a203aSopenharmony_ci info.summary = type + ": " + processName + " " + stringId + 143020a203aSopenharmony_ci " at " + GetTimeString(watchPoint.GetTimestamp()) + "\n"; 144020a203aSopenharmony_ci info.summary += std::string(DISPLAY_POWER_INFO) + disPlayPowerInfo; 145020a203aSopenharmony_ci info.logPath = logPath; 146020a203aSopenharmony_ci info.sectionMaps[FreezeCommon::HIREACE_TIME] = watchPoint.GetHitraceTime(); 147020a203aSopenharmony_ci info.sectionMaps[FreezeCommon::SYSRQ_TIME] = watchPoint.GetSysrqTime(); 148020a203aSopenharmony_ci info.sectionMaps[FORE_GROUND] = watchPoint.GetForeGround(); 149020a203aSopenharmony_ci AddFaultLog(info); 150020a203aSopenharmony_ci return logPath; 151020a203aSopenharmony_ci} 152020a203aSopenharmony_ci 153020a203aSopenharmony_civoid Vendor::DumpEventInfo(std::ostringstream& oss, const std::string& header, const WatchPoint& watchPoint) const 154020a203aSopenharmony_ci{ 155020a203aSopenharmony_ci uint64_t timestamp = watchPoint.GetTimestamp() / TimeUtil::SEC_TO_MILLISEC; 156020a203aSopenharmony_ci oss << header << std::endl; 157020a203aSopenharmony_ci oss << std::string(EVENT_DOMAIN) << std::string(COLON) << watchPoint.GetDomain() << std::endl; 158020a203aSopenharmony_ci oss << std::string(EVENT_STRINGID) << std::string(COLON) << watchPoint.GetStringId() << std::endl; 159020a203aSopenharmony_ci oss << std::string(EVENT_TIMESTAMP) << std::string(COLON) << 160020a203aSopenharmony_ci TimeUtil::TimestampFormatToDate(timestamp, "%Y/%m/%d-%H:%M:%S") << 161020a203aSopenharmony_ci ":" << watchPoint.GetTimestamp() % TimeUtil::SEC_TO_MILLISEC << std::endl; 162020a203aSopenharmony_ci oss << FreezeCommon::EVENT_PID << std::string(COLON) << watchPoint.GetPid() << std::endl; 163020a203aSopenharmony_ci oss << FreezeCommon::EVENT_UID << std::string(COLON) << watchPoint.GetUid() << std::endl; 164020a203aSopenharmony_ci oss << FreezeCommon::EVENT_PACKAGE_NAME << std::string(COLON) << watchPoint.GetPackageName() << std::endl; 165020a203aSopenharmony_ci oss << FreezeCommon::EVENT_PROCESS_NAME << std::string(COLON) << watchPoint.GetProcessName() << std::endl; 166020a203aSopenharmony_ci} 167020a203aSopenharmony_ci 168020a203aSopenharmony_civoid Vendor::MergeFreezeJsonFile(const WatchPoint &watchPoint, const std::vector<WatchPoint>& list) const 169020a203aSopenharmony_ci{ 170020a203aSopenharmony_ci std::ostringstream oss; 171020a203aSopenharmony_ci for (auto node : list) { 172020a203aSopenharmony_ci std::string filePath = FreezeJsonUtil::GetFilePath(node.GetPid(), node.GetUid(), node.GetTimestamp()); 173020a203aSopenharmony_ci if (!FileUtil::FileExists(filePath)) { 174020a203aSopenharmony_ci continue; 175020a203aSopenharmony_ci } 176020a203aSopenharmony_ci std::string realPath; 177020a203aSopenharmony_ci if (!FileUtil::PathToRealPath(filePath, realPath)) { 178020a203aSopenharmony_ci continue; 179020a203aSopenharmony_ci } 180020a203aSopenharmony_ci std::ifstream ifs(realPath, std::ios::in); 181020a203aSopenharmony_ci if (ifs.is_open()) { 182020a203aSopenharmony_ci oss << ifs.rdbuf(); 183020a203aSopenharmony_ci ifs.close(); 184020a203aSopenharmony_ci } 185020a203aSopenharmony_ci FreezeJsonUtil::DelFile(realPath); 186020a203aSopenharmony_ci } 187020a203aSopenharmony_ci 188020a203aSopenharmony_ci std::string mergeFilePath = FreezeJsonUtil::GetFilePath(watchPoint.GetPid(), 189020a203aSopenharmony_ci watchPoint.GetUid(), watchPoint.GetTimestamp()); 190020a203aSopenharmony_ci int jsonFd = FreezeJsonUtil::GetFd(mergeFilePath); 191020a203aSopenharmony_ci if (jsonFd < 0) { 192020a203aSopenharmony_ci HIVIEW_LOGE("fail to open FreezeJsonFile! jsonFd: %{public}d", jsonFd); 193020a203aSopenharmony_ci return; 194020a203aSopenharmony_ci } else { 195020a203aSopenharmony_ci HIVIEW_LOGI("success to open FreezeJsonFile! jsonFd: %{public}d", jsonFd); 196020a203aSopenharmony_ci } 197020a203aSopenharmony_ci HIVIEW_LOGI("MergeFreezeJsonFile oss size: %{public}zu.", oss.str().size()); 198020a203aSopenharmony_ci FileUtil::SaveStringToFd(jsonFd, oss.str()); 199020a203aSopenharmony_ci FreezeJsonUtil::WriteKeyValue(jsonFd, "domain", watchPoint.GetDomain()); 200020a203aSopenharmony_ci FreezeJsonUtil::WriteKeyValue(jsonFd, "stringId", watchPoint.GetStringId()); 201020a203aSopenharmony_ci FreezeJsonUtil::WriteKeyValue(jsonFd, "timestamp", watchPoint.GetTimestamp()); 202020a203aSopenharmony_ci FreezeJsonUtil::WriteKeyValue(jsonFd, "pid", watchPoint.GetPid()); 203020a203aSopenharmony_ci FreezeJsonUtil::WriteKeyValue(jsonFd, "uid", watchPoint.GetUid()); 204020a203aSopenharmony_ci FreezeJsonUtil::WriteKeyValue(jsonFd, "package_name", watchPoint.GetPackageName()); 205020a203aSopenharmony_ci FreezeJsonUtil::WriteKeyValue(jsonFd, "process_name", watchPoint.GetProcessName()); 206020a203aSopenharmony_ci close(jsonFd); 207020a203aSopenharmony_ci HIVIEW_LOGI("success to merge FreezeJsonFiles!"); 208020a203aSopenharmony_ci} 209020a203aSopenharmony_ci 210020a203aSopenharmony_civoid Vendor::FormatProcessName(std::string& processName) 211020a203aSopenharmony_ci{ 212020a203aSopenharmony_ci std::regex regExpress("[\\/:*?\"<>|]"); 213020a203aSopenharmony_ci bool isLegal = !std::regex_search(processName, regExpress); 214020a203aSopenharmony_ci if (isLegal) { 215020a203aSopenharmony_ci return; 216020a203aSopenharmony_ci } 217020a203aSopenharmony_ci processName = std::regex_replace(processName, regExpress, "_"); 218020a203aSopenharmony_ci HIVIEW_LOGD("FormatProcessName processName=%{public}s", processName.c_str()); 219020a203aSopenharmony_ci} 220020a203aSopenharmony_ci 221020a203aSopenharmony_civoid Vendor::InitLogInfo(const WatchPoint& watchPoint, std::string& type, std::string& retPath, 222020a203aSopenharmony_ci std::string& tmpLogPath, std::string& tmpLogName) const 223020a203aSopenharmony_ci{ 224020a203aSopenharmony_ci std::string stringId = watchPoint.GetStringId(); 225020a203aSopenharmony_ci std::string timestamp = GetTimeString(watchPoint.GetTimestamp()); 226020a203aSopenharmony_ci long uid = watchPoint.GetUid(); 227020a203aSopenharmony_ci std::string packageName = StringUtil::TrimStr(watchPoint.GetPackageName()); 228020a203aSopenharmony_ci std::string processName = StringUtil::TrimStr(watchPoint.GetProcessName()); 229020a203aSopenharmony_ci processName = processName.empty() ? (packageName.empty() ? stringId : packageName) : processName; 230020a203aSopenharmony_ci if (stringId == "SCREEN_ON") { 231020a203aSopenharmony_ci processName = stringId; 232020a203aSopenharmony_ci } else { 233020a203aSopenharmony_ci FormatProcessName(processName); 234020a203aSopenharmony_ci } 235020a203aSopenharmony_ci type = freezeCommon_->IsApplicationEvent(watchPoint.GetDomain(), watchPoint.GetStringId()) ? APPFREEZE : 236020a203aSopenharmony_ci (freezeCommon_->IsSystemEvent(watchPoint.GetDomain(), watchPoint.GetStringId()) ? SYSFREEZE : SYSWARNING); 237020a203aSopenharmony_ci std::string pubLogPathName = type + std::string(HYPHEN) + processName + std::string(HYPHEN) + std::to_string(uid) + 238020a203aSopenharmony_ci std::string(HYPHEN) + timestamp; 239020a203aSopenharmony_ci retPath = std::string(FAULT_LOGGER_PATH) + pubLogPathName; 240020a203aSopenharmony_ci tmpLogName = pubLogPathName + std::string(POSTFIX); 241020a203aSopenharmony_ci tmpLogPath = std::string(FREEZE_DETECTOR_PATH) + tmpLogName; 242020a203aSopenharmony_ci} 243020a203aSopenharmony_ci 244020a203aSopenharmony_civoid Vendor::InitLogBody(const std::vector<WatchPoint>& list, std::ostringstream& body, 245020a203aSopenharmony_ci bool& isFileExists) const 246020a203aSopenharmony_ci{ 247020a203aSopenharmony_ci HIVIEW_LOGI("merging list size %{public}zu", list.size()); 248020a203aSopenharmony_ci for (auto node : list) { 249020a203aSopenharmony_ci std::string filePath = node.GetLogPath(); 250020a203aSopenharmony_ci if (filePath == "nolog" || filePath == "") { 251020a203aSopenharmony_ci HIVIEW_LOGI("only header, no content:[%{public}s, %{public}s]", 252020a203aSopenharmony_ci node.GetDomain().c_str(), node.GetStringId().c_str()); 253020a203aSopenharmony_ci DumpEventInfo(body, HEADER, node); 254020a203aSopenharmony_ci continue; 255020a203aSopenharmony_ci } 256020a203aSopenharmony_ci 257020a203aSopenharmony_ci if (FileUtil::FileExists(filePath) == false) { 258020a203aSopenharmony_ci isFileExists = false; 259020a203aSopenharmony_ci HIVIEW_LOGE("[%{public}s, %{public}s] File:%{public}s does not exist", 260020a203aSopenharmony_ci node.GetDomain().c_str(), node.GetStringId().c_str(), filePath.c_str()); 261020a203aSopenharmony_ci return; 262020a203aSopenharmony_ci } 263020a203aSopenharmony_ci 264020a203aSopenharmony_ci HIVIEW_LOGI("merging file:%{public}s.", filePath.c_str()); 265020a203aSopenharmony_ci std::string realPath; 266020a203aSopenharmony_ci if (!FileUtil::PathToRealPath(filePath, realPath)) { 267020a203aSopenharmony_ci HIVIEW_LOGE("PathToRealPath Failed:%{public}s.", filePath.c_str()); 268020a203aSopenharmony_ci continue; 269020a203aSopenharmony_ci } 270020a203aSopenharmony_ci std::ifstream ifs(realPath, std::ios::in); 271020a203aSopenharmony_ci if (!ifs.is_open()) { 272020a203aSopenharmony_ci HIVIEW_LOGE("cannot open log file for reading:%{public}s.", realPath.c_str()); 273020a203aSopenharmony_ci DumpEventInfo(body, HEADER, node); 274020a203aSopenharmony_ci continue; 275020a203aSopenharmony_ci } 276020a203aSopenharmony_ci 277020a203aSopenharmony_ci body << std::string(HEADER) << std::endl; 278020a203aSopenharmony_ci body << ifs.rdbuf(); 279020a203aSopenharmony_ci ifs.close(); 280020a203aSopenharmony_ci } 281020a203aSopenharmony_ci} 282020a203aSopenharmony_ci 283020a203aSopenharmony_cistd::string Vendor::MergeEventLog( 284020a203aSopenharmony_ci const WatchPoint &watchPoint, const std::vector<WatchPoint>& list, 285020a203aSopenharmony_ci const std::vector<FreezeResult>& result) const 286020a203aSopenharmony_ci{ 287020a203aSopenharmony_ci if (freezeCommon_ == nullptr) { 288020a203aSopenharmony_ci return ""; 289020a203aSopenharmony_ci } 290020a203aSopenharmony_ci 291020a203aSopenharmony_ci std::string type; 292020a203aSopenharmony_ci std::string retPath; 293020a203aSopenharmony_ci std::string tmpLogPath; 294020a203aSopenharmony_ci std::string tmpLogName; 295020a203aSopenharmony_ci InitLogInfo(watchPoint, type, retPath, tmpLogPath, tmpLogName); 296020a203aSopenharmony_ci 297020a203aSopenharmony_ci if (FileUtil::FileExists(retPath)) { 298020a203aSopenharmony_ci HIVIEW_LOGW("filename: %{public}s is existed, direct use.", retPath.c_str()); 299020a203aSopenharmony_ci return retPath; 300020a203aSopenharmony_ci } 301020a203aSopenharmony_ci 302020a203aSopenharmony_ci std::ostringstream header; 303020a203aSopenharmony_ci DumpEventInfo(header, TRIGGER_HEADER, watchPoint); 304020a203aSopenharmony_ci 305020a203aSopenharmony_ci std::ostringstream body; 306020a203aSopenharmony_ci bool isFileExists = true; 307020a203aSopenharmony_ci InitLogBody(list, body, isFileExists); 308020a203aSopenharmony_ci HIVIEW_LOGI("After Init --body size: %{public}zu.", body.str().size()); 309020a203aSopenharmony_ci 310020a203aSopenharmony_ci if (!isFileExists) { 311020a203aSopenharmony_ci HIVIEW_LOGE("Failed to open the body file."); 312020a203aSopenharmony_ci return ""; 313020a203aSopenharmony_ci } 314020a203aSopenharmony_ci 315020a203aSopenharmony_ci if (type == APPFREEZE) { 316020a203aSopenharmony_ci MergeFreezeJsonFile(watchPoint, list); 317020a203aSopenharmony_ci } 318020a203aSopenharmony_ci 319020a203aSopenharmony_ci int fd = logStore_->CreateLogFile(tmpLogName); 320020a203aSopenharmony_ci if (fd < 0) { 321020a203aSopenharmony_ci HIVIEW_LOGE("failed to create tmp log file %{public}s.", tmpLogPath.c_str()); 322020a203aSopenharmony_ci return ""; 323020a203aSopenharmony_ci } 324020a203aSopenharmony_ci 325020a203aSopenharmony_ci FileUtil::SaveStringToFd(fd, header.str()); 326020a203aSopenharmony_ci FileUtil::SaveStringToFd(fd, body.str()); 327020a203aSopenharmony_ci close(fd); 328020a203aSopenharmony_ci return SendFaultLog(watchPoint, tmpLogPath, type); 329020a203aSopenharmony_ci} 330020a203aSopenharmony_ci 331020a203aSopenharmony_cibool Vendor::Init() 332020a203aSopenharmony_ci{ 333020a203aSopenharmony_ci if (freezeCommon_ == nullptr) { 334020a203aSopenharmony_ci return false; 335020a203aSopenharmony_ci } 336020a203aSopenharmony_ci logStore_ = std::make_unique<LogStoreEx>(FREEZE_DETECTOR_PATH, true); 337020a203aSopenharmony_ci logStore_->SetMaxSize(MAX_FOLDER_SIZE); 338020a203aSopenharmony_ci logStore_->SetMinKeepingFileNumber(MAX_FILE_NUM); 339020a203aSopenharmony_ci logStore_->Init(); 340020a203aSopenharmony_ci return true; 341020a203aSopenharmony_ci} 342020a203aSopenharmony_ci 343020a203aSopenharmony_cistd::string Vendor::GetDisPlayPowerInfo() 344020a203aSopenharmony_ci{ 345020a203aSopenharmony_ci std::string disPlayPowerInfo; 346020a203aSopenharmony_ci OHOS::PowerMgr::PowerState powerState = OHOS::PowerMgr::PowerMgrClient::GetInstance().GetState(); 347020a203aSopenharmony_ci disPlayPowerInfo = "powerState:" + GetPowerStateString(powerState) + "\n"; 348020a203aSopenharmony_ci return disPlayPowerInfo; 349020a203aSopenharmony_ci} 350020a203aSopenharmony_ci 351020a203aSopenharmony_cistd::string Vendor::GetPowerStateString(OHOS::PowerMgr::PowerState state) 352020a203aSopenharmony_ci{ 353020a203aSopenharmony_ci switch (state) { 354020a203aSopenharmony_ci case OHOS::PowerMgr::PowerState::AWAKE: 355020a203aSopenharmony_ci return std::string("AWAKE"); 356020a203aSopenharmony_ci case OHOS::PowerMgr::PowerState::FREEZE: 357020a203aSopenharmony_ci return std::string("FREEZE"); 358020a203aSopenharmony_ci case OHOS::PowerMgr::PowerState::INACTIVE: 359020a203aSopenharmony_ci return std::string("INACTIVE"); 360020a203aSopenharmony_ci case OHOS::PowerMgr::PowerState::STAND_BY: 361020a203aSopenharmony_ci return std::string("STAND_BY"); 362020a203aSopenharmony_ci case OHOS::PowerMgr::PowerState::DOZE: 363020a203aSopenharmony_ci return std::string("DOZE"); 364020a203aSopenharmony_ci case OHOS::PowerMgr::PowerState::SLEEP: 365020a203aSopenharmony_ci return std::string("SLEEP"); 366020a203aSopenharmony_ci case OHOS::PowerMgr::PowerState::HIBERNATE: 367020a203aSopenharmony_ci return std::string("HIBERNATE"); 368020a203aSopenharmony_ci case OHOS::PowerMgr::PowerState::SHUTDOWN: 369020a203aSopenharmony_ci return std::string("SHUTDOWN"); 370020a203aSopenharmony_ci case OHOS::PowerMgr::PowerState::UNKNOWN: 371020a203aSopenharmony_ci return std::string("UNKNOWN"); 372020a203aSopenharmony_ci default: 373020a203aSopenharmony_ci break; 374020a203aSopenharmony_ci } 375020a203aSopenharmony_ci return std::string("UNKNOWN"); 376020a203aSopenharmony_ci} 377020a203aSopenharmony_ci} // namespace HiviewDFX 378020a203aSopenharmony_ci} // namespace OHOS 379