1 /* 2 * Copyright (c) Huawei Technologies Co., Ltd. 2023. All rights reserved. 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 #ifndef HTRACE_MEM_PARSER_H 16 #define HTRACE_MEM_PARSER_H 17 18 #include <cstdint> 19 #include <limits> 20 #include <map> 21 #include <stdexcept> 22 #include <string> 23 #include "common_types.h" 24 #include "event_parser_base.h" 25 #include "htrace_plugin_time_parser.h" 26 #include "memory_plugin_result.pbreader.h" 27 #include "string_help.h" 28 #include "trace_data_cache.h" 29 #include "trace_streamer_config.h" 30 #include "trace_streamer_filters.h" 31 namespace SysTuning { 32 namespace TraceStreamer { 33 using namespace SysTuning::base; 34 class PbreaderMemParser : public EventParserBase, public HtracePluginTimeParser { 35 public: 36 PbreaderMemParser(TraceDataCache *dataCache, const TraceStreamerFilters *ctx); 37 ~PbreaderMemParser(); 38 void Parse(PbreaderDataSegment &seg, uint64_t, BuiltinClocks clock); 39 void ParseMemoryConfig(PbreaderDataSegment &seg); 40 void Finish(); 41 enum class SmapsMemType { 42 SMAPS_MEM_TYPE_CODE_SYS = 0, // 系统代码段 43 SMAPS_MEM_TYPE_CODE_APP = 1, // 应用代码段 44 SMAPS_MEM_TYPE_DATA_SYS = 2, // 系统数据段 45 SMAPS_MEM_TYPE_DATA_APP = 3, // 应用数据段 46 SMAPS_MEM_TYPE_UNKNOWN_ANON = 4, // 系统未知匿名内存 47 SMAPS_MEM_TYPE_STACK = 5, // 栈 48 SMAPS_MEM_TYPE_JS_HEAP = 6, // js堆 49 SMAPS_MEM_TYPE_JAVA_VM = 7, // java虚拟机 50 SMAPS_MEM_TYPE_NATIVE_HEAP = 8, // native堆 51 SMAPS_MEM_TYPE_ASHMEM = 9, // Ashmem 52 SMAPS_MEM_TYPE_OTHER_SYS = 10, // 系统其他杂类资源 53 SMAPS_MEM_TYPE_OTHER_APP = 11, // 应用其他杂类资源 54 SMAPS_MEM_TYPE_FONT = 12, // Font 55 SMAPS_MEM_TYPE_INVALID = 127, 56 }; 57 enum class MemProcessType { 58 PID_TYPE_COMPOSER = 0, 59 PID_TYPE_RENDER_SERVICES, 60 PID_TYPE_APP, 61 }; 62 enum class MemDeduplicateFlag { 63 MEM_DEDUPLICATE_FLAG_NOMAL = 0, 64 MEM_DEDUPLICATE_FLAG_DUP_SAME_PROCESS, 65 MEM_DEDUPLICATE_FLAG_DUP_DIFF_PROCESS, 66 }; 67 68 private: 69 uint32_t ParseSmapsPathTypeBySuffix(bool hasX, const std::string &path, const bool hasAppName) const; 70 uint32_t ParseSmapsPathTypeByPrefix(bool hasX, const std::string &path, const bool hasAppName) const; 71 void ParseProcessInfo(const ProtoReader::MemoryData_Reader *tracePacket, uint64_t timeStamp) const; 72 void ParseMemInfo(const ProtoReader::MemoryData_Reader *tracePacket, uint64_t timeStamp) const; 73 void ParseMemInfoEasy(const ProtoReader::MemoryData_Reader *tracePacket, uint64_t timeStamp) const; 74 void ParseVMemInfo(const ProtoReader::MemoryData_Reader *tracePacket, uint64_t timeStamp) const; 75 void ParseVMemInfoEasy(const ProtoReader::MemoryData_Reader *tracePacket, uint64_t timeStamp) const; 76 void ParseSmapsInfoEasy(const ProtoReader::ProcessMemoryInfo_Reader *memInfo, 77 uint64_t timeStamp, 78 uint64_t ipid) const; 79 uint32_t ParseSmapsBlockType(ProtoReader::SmapsInfo_Reader &smapsInfo) const; 80 uint32_t ParseSmapsBlockDetail(ProtoReader::SmapsInfo_Reader &smapsInfo, 81 const std::string &path, 82 const bool hasAppName) const; 83 void ParseAshmemInfo(const ProtoReader::MemoryData_Reader *tracePacket, uint64_t timeStamp) const; 84 void ParseDmaMemInfo(const ProtoReader::MemoryData_Reader *tracePacket, uint64_t timeStamp) const; 85 void ParseGpuProcessMemInfo(const ProtoReader::MemoryData_Reader *tracePacket, uint64_t timeStamp) const; 86 void ParseGpuWindowMemInfo(const ProtoReader::MemoryData_Reader *tracePacket, uint64_t timeStamp) const; 87 void AshMemDeduplicate() const; 88 void DmaMemDeduplicate() const; 89 MemProcessType GetMemProcessType(uint64_t ipid) const; 90 void FillGpuWindowMemInfo(const ProtoReader::GpuDumpInfo_Reader &gpuDumpInfo, uint64_t timeStamp) const; 91 void ParseWindowManagerServiceInfo(const ProtoReader::MemoryData_Reader *tracePacket, uint64_t timeStamp); 92 void ParseCpuDumpInfo(const ProtoReader::MemoryData_Reader *tracePacket, uint64_t timeStamp) const; 93 void ParseProfileMemInfo(const ProtoReader::MemoryData_Reader *tracePacket, uint64_t timeStamp) const; 94 void ParseRSImageDumpInfo(const ProtoReader::MemoryData_Reader *tracePacket, uint64_t timeStamp) const; 95 96 void SpecialDataAddition(ProtoReader::ProcessMemoryInfo_Reader &processMemoryInfo, 97 uint64_t timeStamp, 98 uint32_t ipid, 99 uint32_t hasValue) const; 100 101 std::map<MemInfoType, DataIndex> memNameDictMap_ = {}; 102 std::map<uint32_t, DataIndex> sysMemNameDictMap_ = {}; 103 std::map<uint32_t, DataIndex> sysVMemNameDictMap_ = {}; 104 uint64_t zram_ = 0; 105 uint64_t gpuLimit_ = 0; 106 uint64_t gpuUsed_ = 0; 107 const DataIndex zramIndex_ = traceDataCache_->GetDataIndex("sys.mem.zram"); 108 const DataIndex gpuLimitSizeIndex_ = traceDataCache_->GetDataIndex("sys.mem.gpu.limit"); 109 const DataIndex gpuUsedSizeIndex_ = traceDataCache_->GetDataIndex("sys.mem.gpu.used"); 110 std::map<DataIndex, InternalPid> windowIdToipidMap_ = {}; 111 112 TraceStreamerConfig config_{}; 113 }; 114 } // namespace TraceStreamer 115 } // namespace SysTuning 116 117 #endif // HTRACE_MEM_PARSER_H 118