• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2021 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 NATIVE_MEMORY_STDTYPE_H
17 #define NATIVE_MEMORY_STDTYPE_H
18 #include "base_stdtype.h"
19 #include <unordered_map>
20 
21 namespace SysTuning {
22 namespace TraceStdtype {
23 class NativeHookSampleBase : public CacheBase {
24 public:
25     void AppendNativeHookSampleBase(uint32_t callChainId, uint32_t ipid, uint32_t itid, uint64_t timeStamp);
26     void AppendNativeHookSampleBase(uint32_t callChainId, uint32_t ipid, uint64_t timeStamp);
27     const std::deque<uint32_t>& CallChainIds() const;
28     const std::deque<uint32_t>& Ipids() const;
29     const std::deque<uint64_t>& LastCallerPathIndexs() const;
30     const std::deque<uint64_t>& LastSymbolIndexs() const;
31     void UpdateLastCallerPathAndSymbolIndexs(
32         std::unordered_map<uint32_t, std::tuple<DataIndex, DataIndex>>& callIdToLasLibId);
Clear()33     void Clear() override
34     {
35         CacheBase::Clear();
36         callChainIds_.clear();
37         ipids_.clear();
38         lastCallerPathIndexs_.clear();
39         lastSymbolIndexs_.clear();
40     }
41 
42 public:
43     std::deque<uint32_t> callChainIds_ = {};
44     std::deque<uint32_t> ipids_ = {};
45     std::deque<DataIndex> lastCallerPathIndexs_ = {};
46     std::deque<DataIndex> lastSymbolIndexs_ = {};
47 };
48 class NativeHook : public NativeHookSampleBase {
49 public:
50     size_t AppendNewNativeHookData(uint32_t callChainId,
51                                    uint32_t ipid,
52                                    uint32_t itid,
53                                    std::string eventType,
54                                    DataIndex subType,
55                                    uint64_t timeStamp,
56                                    uint64_t endTimeStamp,
57                                    uint64_t duration,
58                                    uint64_t addr,
59                                    int64_t memSize);
60     void UpdateCallChainId(size_t row, uint32_t callChainId);
61     void UpdateEndTimeStampAndDuration(size_t row, uint64_t endTimeStamp);
62     void UpdateCurrentSizeDur(size_t row, uint64_t timeStamp);
63     void UpdateMemMapSubType(uint64_t row, uint64_t tagId);
64     const std::deque<std::string>& EventTypes() const;
65     const std::deque<DataIndex>& SubTypes() const;
66     const std::deque<uint64_t>& EndTimeStamps() const;
67     const std::deque<uint64_t>& Durations() const;
68     const std::deque<uint64_t>& Addrs() const;
69     const std::deque<int64_t>& MemSizes() const;
70     const std::deque<int64_t>& AllMemSizes() const;
71     const std::deque<uint64_t>& CurrentSizeDurs() const;
Clear()72     void Clear() override
73     {
74         NativeHookSampleBase::Clear();
75         eventTypes_.clear();
76         subTypes_.clear();
77         endTimeStamps_.clear();
78         durations_.clear();
79         addrs_.clear();
80         memSizes_.clear();
81         allMemSizes_.clear();
82         currentSizeDurs_.clear();
83     }
GetAddrToAllocEventRow()84     std::unordered_map<uint64_t, uint64_t>* GetAddrToAllocEventRow()
85     {
86         return &addrToAllocEventRow_;
87     }
GetAddrToMmapEventRow()88     std::unordered_map<uint64_t, uint64_t>* GetAddrToMmapEventRow()
89     {
90         return &addrToMmapEventRow_;
91     }
GetLastMallocEventRaw()92     uint64_t& GetLastMallocEventRaw()
93     {
94         return lastMallocEventRaw_;
95     }
GetLastMmapEventRaw()96     uint64_t& GetLastMmapEventRaw()
97     {
98         return lastMmapEventRaw_;
99     }
100 
101 private:
102     std::deque<std::string> eventTypes_ = {};
103     std::deque<DataIndex> subTypes_ = {};
104     std::deque<uint64_t> endTimeStamps_ = {};
105     std::deque<uint64_t> durations_ = {};
106     std::deque<uint64_t> addrs_ = {};
107     std::deque<int64_t> memSizes_ = {};
108     std::deque<int64_t> allMemSizes_ = {};
109     std::deque<uint64_t> currentSizeDurs_ = {};
110     int64_t countHeapSizes_ = 0;
111     int64_t countMmapSizes_ = 0;
112     const std::string ALLOC_EVET = "AllocEvent";
113     const std::string FREE_EVENT = "FreeEvent";
114     const std::string MMAP_EVENT = "MmapEvent";
115     const std::string MUNMAP_EVENT = "MunmapEvent";
116     std::unordered_map<uint64_t, uint64_t> addrToAllocEventRow_ = {};
117     std::unordered_map<uint64_t, uint64_t> addrToMmapEventRow_ = {};
118     uint64_t lastMallocEventRaw_ = INVALID_UINT64;
119     uint64_t lastMmapEventRaw_ = INVALID_UINT64;
120 };
121 
122 class NativeHookFrame {
123 public:
124     size_t AppendNewNativeHookFrame(uint32_t callChainId,
125                                     uint16_t depth,
126                                     uint64_t ip,
127                                     DataIndex symbolName,
128                                     DataIndex filePath,
129                                     uint64_t offset,
130                                     uint64_t symbolOffset);
131     size_t AppendNewNativeHookFrame(uint32_t callChainId,
132                                     uint16_t depth,
133                                     uint64_t ip,
134                                     DataIndex symbolName,
135                                     DataIndex filePath,
136                                     uint64_t offset,
137                                     uint64_t symbolOffset,
138                                     const std::string& vaddr);
139     void UpdateFrameInfo(size_t row,
140                          DataIndex symbolIndex,
141                          DataIndex filePathIndex,
142                          uint64_t offset,
143                          uint64_t symbolOffset);
144     void UpdateSymbolIdToNameMap(uint64_t originSymbolId, uint64_t symbolId);
145     void UpdateSymbolId();
146     void UpdateSymbolId(size_t index, DataIndex symbolId);
147     void UpdateFileId(std::map<uint32_t, uint64_t>& filePathIdToFilePathName);
148     void UpdateVaddrs(std::deque<std::string>& vaddrs);
149     const std::deque<uint32_t>& CallChainIds() const;
150     const std::deque<uint16_t>& Depths() const;
151     const std::deque<uint64_t>& Ips() const;
152     const std::deque<DataIndex>& SymbolNames() const;
153     const std::deque<DataIndex>& FilePaths() const;
154     const std::deque<uint64_t>& Offsets() const;
155     const std::deque<uint64_t>& SymbolOffsets() const;
156     const std::deque<std::string>& Vaddrs() const;
Size()157     size_t Size() const
158     {
159         return callChainIds_.size();
160     }
Clear()161     void Clear()
162     {
163         callChainIds_.clear();
164         depths_.clear();
165         ips_.clear();
166         symbolNames_.clear();
167         filePaths_.clear();
168         offsets_.clear();
169         symbolOffsets_.clear();
170         vaddrs_.clear();
171     }
172 
173 private:
174     std::deque<uint32_t> callChainIds_ = {};
175     std::deque<uint16_t> depths_ = {};
176     std::deque<uint64_t> ips_ = {};
177     std::deque<DataIndex> symbolNames_ = {};
178     std::deque<DataIndex> filePaths_ = {};
179     std::deque<uint64_t> offsets_ = {};
180     std::deque<uint64_t> symbolOffsets_ = {};
181     std::deque<std::string> vaddrs_ = {};
182     std::map<uint32_t, uint64_t> symbolIdToSymbolName_ = {};
183 };
184 
185 class NativeHookStatistic : public NativeHookSampleBase {
186 public:
187     size_t AppendNewNativeHookStatistic(uint32_t ipid,
188                                         uint64_t timeStamp,
189                                         uint32_t callChainId,
190                                         uint32_t memoryType,
191                                         DataIndex subMemType,
192                                         uint64_t applyCount,
193                                         uint64_t releaseCount,
194                                         uint64_t applySize,
195                                         uint64_t releaseSize);
196     const std::deque<uint32_t>& MemoryTypes() const;
197     const std::deque<DataIndex>& MemorySubTypes() const;
198     const std::deque<uint64_t>& ApplyCounts() const;
199     const std::deque<uint64_t>& ReleaseCounts() const;
200     const std::deque<uint64_t>& ApplySizes() const;
201     const std::deque<uint64_t>& ReleaseSizes() const;
Clear()202     void Clear() override
203     {
204         NativeHookSampleBase::Clear();
205         memoryTypes_.clear();
206         applyCounts_.clear();
207         releaseCounts_.clear();
208         applySizes_.clear();
209         releaseSizes_.clear();
210     }
211 
212 private:
213     std::deque<uint32_t> memoryTypes_ = {};
214     std::deque<DataIndex> memSubTypes_ = {};
215     std::deque<uint64_t> applyCounts_ = {};
216     std::deque<uint64_t> releaseCounts_ = {};
217     std::deque<uint64_t> applySizes_ = {};
218     std::deque<uint64_t> releaseSizes_ = {};
219 };
220 } // namespace TraceStdtype
221 } // namespace SysTuning
222 
223 #endif // NATIVE_MEMORY_STDTYPE_H
224