1 /* 2 * Copyright (c) 2024 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 16 #ifndef FAULT_LOGGER_SERVICE_H_ 17 #define FAULT_LOGGER_SERVICE_H_ 18 19 #include "string" 20 #include "vector" 21 #include "csignal" 22 #include "cstdint" 23 #include "dfx_socket_request.h" 24 #include "temp_file_manager.h" 25 #include "dfx_exception.h" 26 27 namespace OHOS { 28 namespace HiviewDFX { 29 30 class IFaultLoggerService { 31 public: 32 virtual int32_t OnReceiveMsg(const std::string& socketName, int32_t connectionFd, 33 ssize_t nRead, const std::vector<uint8_t>& buf) = 0; 34 virtual ~IFaultLoggerService() = default; 35 }; 36 37 template<typename T> 38 class FaultLoggerService : public IFaultLoggerService { 39 public: 40 FaultLoggerService() = default; OnReceiveMsg(const std::string & socketName,int32_t connectionFd,const ssize_t nRead,const std::vector<uint8_t> & buf)41 int32_t OnReceiveMsg(const std::string& socketName, int32_t connectionFd, 42 const ssize_t nRead, const std::vector<uint8_t>& buf) final 43 { 44 if (nRead != sizeof(T)) { 45 return ResponseCode::INVALID_REQUEST_DATA; 46 } 47 return OnRequest(socketName, connectionFd, *(reinterpret_cast<const T*>(buf.data()))); 48 }; 49 protected: 50 virtual int32_t OnRequest(const std::string& socketName, int32_t connectionFd, const T& requestData) = 0; 51 }; 52 53 class FileDesService : public FaultLoggerService<FaultLoggerdRequest> { 54 public: 55 int32_t OnRequest(const std::string& socketName, int32_t connectionFd, 56 const FaultLoggerdRequest& requestData) override; 57 private: 58 static bool Filter(const std::string& socketName, int32_t connectionFd, const FaultLoggerdRequest& requestData); 59 }; 60 61 #ifndef HISYSEVENT_DISABLE 62 class ExceptionReportService : public FaultLoggerService<CrashDumpException> { 63 public: 64 int32_t OnRequest(const std::string& socketName, int32_t connectionFd, 65 const CrashDumpException& requestData) override; 66 private: 67 static bool Filter(int32_t connectionFd, const CrashDumpException& requestData); 68 }; 69 70 struct DumpStats { 71 int32_t pid = 0; 72 uint64_t requestTime = 0; 73 uint64_t signalTime = 0; 74 uint64_t processdumpStartTime = 0; 75 uint64_t processdumpFinishTime = 0; 76 uint64_t dumpCatcherFinishTime = 0; 77 int32_t result = 0; 78 uint32_t targetProcessThreadCount = 0; 79 uint32_t writeDumpInfoCost = 0; 80 std::string summary; 81 std::string callerProcessName; 82 std::string callerElfName; 83 std::string targetProcessName; 84 }; 85 86 class StatsService : public FaultLoggerService<FaultLoggerdStatsRequest> { 87 public: 88 int32_t OnRequest(const std::string& socketName, int32_t connectionFd, 89 const FaultLoggerdStatsRequest& requestData) override; 90 private: 91 void RemoveTimeoutDumpStats(); 92 void ReportDumpStats(const DumpStats& stat); 93 static std::string GetElfName(const FaultLoggerdStatsRequest& request); 94 void StartDelayTask(std::function<void()> workFunc, int32_t delayTime); 95 std::list<DumpStats> stats_{}; 96 }; 97 #endif 98 99 #ifndef is_ohos_lite 100 class SdkDumpService : public FaultLoggerService<SdkDumpRequestData> { 101 public: 102 103 int32_t OnRequest(const std::string& socketName, int32_t connectionFd, 104 const SdkDumpRequestData& requestData) override; 105 private: 106 static int32_t Filter(const std::string& socketName, const SdkDumpRequestData& requestData, uint32_t uid); 107 }; 108 109 class LitePerfPipeService : public FaultLoggerService<LitePerfFdRequestData> { 110 public: 111 int32_t OnRequest(const std::string& socketName, int32_t connectionFd, 112 const LitePerfFdRequestData& requestData) override; 113 private: 114 static bool Filter(const std::string& socketName, int32_t connectionFd, const LitePerfFdRequestData& requestData); 115 void StartDelayTask(std::function<void()> workFunc, int32_t delayTime); 116 }; 117 118 class PipeService : public FaultLoggerService<PipFdRequestData> { 119 public: 120 int32_t OnRequest(const std::string& socketName, int32_t connectionFd, 121 const PipFdRequestData& requestData) override; 122 private: 123 static bool Filter(const std::string& socketName, int32_t connectionFd, const PipFdRequestData& requestData); 124 }; 125 #endif 126 } 127 } 128 #endif // FAULT_LOGGER_SERVICE_H_ 129