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