• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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