1 /* 2 * Copyright (c) Huawei Technologies Co., Ltd. 2021. 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 16 #ifndef MEMORY_DATA_PLUGIN_H 17 #define MEMORY_DATA_PLUGIN_H 18 19 #include <algorithm> 20 #include <dirent.h> 21 #include <fcntl.h> 22 #include <inttypes.h> 23 #include <iomanip> 24 #include <sstream> 25 #include <string> 26 #include <sys/stat.h> 27 #include <sys/types.h> 28 #include <unistd.h> 29 #include <unordered_map> 30 #include <utility> 31 #include <v1_0/imemory_tracker_interface.h> 32 33 #include "buffer_splitter.h" 34 #include "logging.h" 35 #include "memory_plugin_config.pb.h" 36 #include "memory_plugin_result.pb.h" 37 #include "plugin_module_api.h" 38 #include "smaps_stats.h" 39 #include "graphic_memory_collector.h" 40 41 struct Proto2StrMapping { 42 int protobufid; 43 const char* procstr; 44 }; 45 46 constexpr Proto2StrMapping meminfoMapping[] = { 47 {SysMeminfoType::PMEM_UNSPECIFIED, "MemUnspecified"}, 48 {SysMeminfoType::PMEM_MEM_TOTAL, "MemTotal"}, 49 {SysMeminfoType::PMEM_MEM_FREE, "MemFree"}, 50 {SysMeminfoType::PMEM_MEM_AVAILABLE, "MemAvailable"}, 51 {SysMeminfoType::PMEM_BUFFERS, "Buffers"}, 52 {SysMeminfoType::PMEM_CACHED, "Cached"}, 53 {SysMeminfoType::PMEM_SWAP_CACHED, "SwapCached"}, 54 {SysMeminfoType::PMEM_ACTIVE, "Active"}, 55 {SysMeminfoType::PMEM_INACTIVE, "Inactive"}, 56 {SysMeminfoType::PMEM_ACTIVE_ANON, "Active(anon)"}, 57 {SysMeminfoType::PMEM_INACTIVE_ANON, "Inactive(anon)"}, 58 {SysMeminfoType::PMEM_ACTIVE_FILE, "Active(file)"}, 59 {SysMeminfoType::PMEM_INACTIVE_FILE, "Inactive(file)"}, 60 {SysMeminfoType::PMEM_ACTIVE_PURG, "Active(purg)"}, 61 {SysMeminfoType::PMEM_INACTIVE_PURG, "Inactive(purg)"}, 62 {SysMeminfoType::PMEM_PINED_PURG, "Pined(purg)"}, 63 {SysMeminfoType::PMEM_UNEVICTABLE, "Unevictable"}, 64 {SysMeminfoType::PMEM_MLOCKED, "Mlocked"}, 65 {SysMeminfoType::PMEM_SWAP_TOTAL, "SwapTotal"}, 66 {SysMeminfoType::PMEM_SWAP_FREE, "SwapFree"}, 67 {SysMeminfoType::PMEM_DIRTY, "Dirty"}, 68 {SysMeminfoType::PMEM_WRITEBACK, "Writeback"}, 69 {SysMeminfoType::PMEM_ANON_PAGES, "AnonPages"}, 70 {SysMeminfoType::PMEM_MAPPED, "Mapped"}, 71 {SysMeminfoType::PMEM_SHMEM, "Shmem"}, 72 {SysMeminfoType::PMEM_SLAB, "Slab"}, 73 {SysMeminfoType::PMEM_SLAB_RECLAIMABLE, "SReclaimable"}, 74 {SysMeminfoType::PMEM_SLAB_UNRECLAIMABLE, "SUnreclaim"}, 75 {SysMeminfoType::PMEM_KERNEL_STACK, "KernelStack"}, 76 {SysMeminfoType::PMEM_PAGE_TABLES, "PageTables"}, 77 {SysMeminfoType::PMEM_COMMIT_LIMIT, "CommitLimit"}, 78 {SysMeminfoType::PMEM_COMMITED_AS, "Committed_AS"}, 79 {SysMeminfoType::PMEM_VMALLOC_TOTAL, "VmallocTotal"}, 80 {SysMeminfoType::PMEM_VMALLOC_USED, "VmallocUsed"}, 81 {SysMeminfoType::PMEM_VMALLOC_CHUNK, "VmallocChunk"}, 82 {SysMeminfoType::PMEM_CMA_TOTAL, "CmaTotal"}, 83 {SysMeminfoType::PMEM_CMA_FREE, "CmaFree"}, 84 {SysMeminfoType::PMEM_KERNEL_RECLAIMABLE, "KReclaimable"}, 85 }; 86 87 constexpr Proto2StrMapping vmeminfoMapping[] = { 88 {SysVMeminfoType::VMEMINFO_UNSPECIFIED, "unspecified"}, 89 {SysVMeminfoType::VMEMINFO_NR_FREE_PAGES, "nr_free_pages"}, 90 {SysVMeminfoType::VMEMINFO_NR_ALLOC_BATCH, "nr_alloc_batch"}, 91 {SysVMeminfoType::VMEMINFO_NR_INACTIVE_ANON, "nr_inactive_anon"}, 92 {SysVMeminfoType::VMEMINFO_NR_ACTIVE_ANON, "nr_active_anon"}, 93 {SysVMeminfoType::VMEMINFO_NR_INACTIVE_FILE, "nr_inactive_file"}, 94 {SysVMeminfoType::VMEMINFO_NR_ACTIVE_FILE, "nr_active_file"}, 95 {SysVMeminfoType::VMEMINFO_NR_UNEVICTABLE, "nr_unevictable"}, 96 {SysVMeminfoType::VMEMINFO_NR_MLOCK, "nr_mlock"}, 97 {SysVMeminfoType::VMEMINFO_NR_ANON_PAGES, "nr_anon_pages"}, 98 {SysVMeminfoType::VMEMINFO_NR_MAPPED, "nr_mapped"}, 99 {SysVMeminfoType::VMEMINFO_NR_FILE_PAGES, "nr_file_pages"}, 100 {SysVMeminfoType::VMEMINFO_NR_DIRTY, "nr_dirty"}, 101 {SysVMeminfoType::VMEMINFO_NR_WRITEBACK, "nr_writeback"}, 102 {SysVMeminfoType::VMEMINFO_NR_SLAB_RECLAIMABLE, "nr_slab_reclaimable"}, 103 {SysVMeminfoType::VMEMINFO_NR_SLAB_UNRECLAIMABLE, "nr_slab_unreclaimable"}, 104 {SysVMeminfoType::VMEMINFO_NR_PAGE_TABLE_PAGES, "nr_page_table_pages"}, 105 {SysVMeminfoType::VMEMINFO_NR_KERNEL_STACK, "nr_kernel_stack"}, 106 {SysVMeminfoType::VMEMINFO_NR_OVERHEAD, "nr_overhead"}, 107 {SysVMeminfoType::VMEMINFO_NR_UNSTABLE, "nr_unstable"}, 108 {SysVMeminfoType::VMEMINFO_NR_BOUNCE, "nr_bounce"}, 109 {SysVMeminfoType::VMEMINFO_NR_VMSCAN_WRITE, "nr_vmscan_write"}, 110 {SysVMeminfoType::VMEMINFO_NR_VMSCAN_IMMEDIATE_RECLAIM, "nr_vmscan_immediate_reclaim"}, 111 {SysVMeminfoType::VMEMINFO_NR_WRITEBACK_TEMP, "nr_writeback_temp"}, 112 {SysVMeminfoType::VMEMINFO_NR_ISOLATED_ANON, "nr_isolated_anon"}, 113 {SysVMeminfoType::VMEMINFO_NR_ISOLATED_FILE, "nr_isolated_file"}, 114 {SysVMeminfoType::VMEMINFO_NR_SHMEM, "nr_shmem"}, 115 {SysVMeminfoType::VMEMINFO_NR_DIRTIED, "nr_dirtied"}, 116 {SysVMeminfoType::VMEMINFO_NR_WRITTEN, "nr_written"}, 117 {SysVMeminfoType::VMEMINFO_NR_PAGES_SCANNED, "nr_pages_scanned"}, 118 {SysVMeminfoType::VMEMINFO_WORKINGSET_REFAULT, "workingset_refault"}, 119 {SysVMeminfoType::VMEMINFO_WORKINGSET_ACTIVATE, "workingset_activate"}, 120 {SysVMeminfoType::VMEMINFO_WORKINGSET_NODERECLAIM, "workingset_nodereclaim"}, 121 {SysVMeminfoType::VMEMINFO_NR_ANON_TRANSPARENT_HUGEPAGES, "nr_anon_transparent_hugepages"}, 122 {SysVMeminfoType::VMEMINFO_NR_FREE_CMA, "nr_free_cma"}, 123 {SysVMeminfoType::VMEMINFO_NR_SWAPCACHE, "nr_swapcache"}, 124 {SysVMeminfoType::VMEMINFO_NR_DIRTY_THRESHOLD, "nr_dirty_threshold"}, 125 {SysVMeminfoType::VMEMINFO_NR_DIRTY_BACKGROUND_THRESHOLD, "nr_dirty_background_threshold"}, 126 {SysVMeminfoType::VMEMINFO_PGPGIN, "pgpgin"}, 127 {SysVMeminfoType::VMEMINFO_PGPGOUT, "pgpgout"}, 128 {SysVMeminfoType::VMEMINFO_PGPGOUTCLEAN, "pgpgoutclean"}, 129 {SysVMeminfoType::VMEMINFO_PSWPIN, "pswpin"}, 130 {SysVMeminfoType::VMEMINFO_PSWPOUT, "pswpou"}, 131 {SysVMeminfoType::VMEMINFO_PGALLOC_DMA, "pgalloc_dma"}, 132 {SysVMeminfoType::VMEMINFO_PGALLOC_NORMAL, "pgalloc_normal"}, 133 {SysVMeminfoType::VMEMINFO_PGALLOC_MOVABLE, "pgalloc_movable"}, 134 {SysVMeminfoType::VMEMINFO_PGFREE, "pgfree"}, 135 {SysVMeminfoType::VMEMINFO_PGACTIVATE, "pgactivate"}, 136 {SysVMeminfoType::VMEMINFO_PGDEACTIVATE, "pgdeactivate"}, 137 {SysVMeminfoType::VMEMINFO_PGFAULT, "pgfault"}, 138 {SysVMeminfoType::VMEMINFO_PGMAJFAULT, "pgmajfault"}, 139 {SysVMeminfoType::VMEMINFO_PGREFILL_DMA, "pgrefill_dma"}, 140 {SysVMeminfoType::VMEMINFO_PGREFILL_NORMAL, "pgrefill_normal"}, 141 {SysVMeminfoType::VMEMINFO_PGREFILL_MOVABLE, "pgrefill_movable"}, 142 {SysVMeminfoType::VMEMINFO_PGSTEAL_KSWAPD_DMA, "pgsteal_kswapd_dma"}, 143 {SysVMeminfoType::VMEMINFO_PGSTEAL_KSWAPD_NORMAL, "pgsteal_kswapd_normal"}, 144 {SysVMeminfoType::VMEMINFO_PGSTEAL_KSWAPD_MOVABLE, "pgsteal_kswapd_movable"}, 145 {SysVMeminfoType::VMEMINFO_PGSTEAL_DIRECT_DMA, "pgsteal_direct_dma"}, 146 {SysVMeminfoType::VMEMINFO_PGSTEAL_DIRECT_NORMAL, "pgsteal_direct_normal"}, 147 {SysVMeminfoType::VMEMINFO_PGSTEAL_DIRECT_MOVABLE, "pgsteal_direct_movable"}, 148 {SysVMeminfoType::VMEMINFO_PGSCAN_KSWAPD_DMA, "pgscan_kswapd_dma"}, 149 {SysVMeminfoType::VMEMINFO_PGSCAN_KSWAPD_NORMAL, "pgscan_kswapd_normal"}, 150 {SysVMeminfoType::VMEMINFO_PGSCAN_KSWAPD_MOVABLE, "pgscan_kswapd_movable"}, 151 {SysVMeminfoType::VMEMINFO_PGSCAN_DIRECT_DMA, "pgscan_direct_dma"}, 152 {SysVMeminfoType::VMEMINFO_PGSCAN_DIRECT_NORMAL, "pgscan_direct_normal"}, 153 {SysVMeminfoType::VMEMINFO_PGSCAN_DIRECT_MOVABLE, "pgscan_direct_movable"}, 154 {SysVMeminfoType::VMEMINFO_PGSCAN_DIRECT_THROTTLE, "pgscan_direct_throttle"}, 155 {SysVMeminfoType::VMEMINFO_PGINODESTEAL, "pginodesteal"}, 156 {SysVMeminfoType::VMEMINFO_SLABS_SCANNED, "slabs_scanned"}, 157 {SysVMeminfoType::VMEMINFO_KSWAPD_INODESTEAL, "kswapd_inodesteal"}, 158 {SysVMeminfoType::VMEMINFO_KSWAPD_LOW_WMARK_HIT_QUICKLY, "kswapd_low_wmark_hit_quickly"}, 159 {SysVMeminfoType::VMEMINFO_KSWAPD_HIGH_WMARK_HIT_QUICKLY, "kswapd_high_wmark_hit_quickly"}, 160 {SysVMeminfoType::VMEMINFO_PAGEOUTRUN, "pageoutrun"}, 161 {SysVMeminfoType::VMEMINFO_ALLOCSTALL, "allocstall"}, 162 {SysVMeminfoType::VMEMINFO_PGROTATED, "pgrotated"}, 163 {SysVMeminfoType::VMEMINFO_DROP_PAGECACHE, "drop_pagecache"}, 164 {SysVMeminfoType::VMEMINFO_DROP_SLAB, "drop_slab"}, 165 {SysVMeminfoType::VMEMINFO_PGMIGRATE_SUCCESS, "pgmigrate_success"}, 166 {SysVMeminfoType::VMEMINFO_PGMIGRATE_FAIL, "pgmigrate_fail"}, 167 {SysVMeminfoType::VMEMINFO_COMPACT_MIGRATE_SCANNED, "compact_migrate_scanned"}, 168 {SysVMeminfoType::VMEMINFO_COMPACT_FREE_SCANNED, "compact_free_scanned"}, 169 {SysVMeminfoType::VMEMINFO_COMPACT_ISOLATED, "compact_isolated"}, 170 {SysVMeminfoType::VMEMINFO_COMPACT_STALL, "compact_stall"}, 171 {SysVMeminfoType::VMEMINFO_COMPACT_FAIL, "compact_fail"}, 172 {SysVMeminfoType::VMEMINFO_COMPACT_SUCCESS, "compact_success"}, 173 {SysVMeminfoType::VMEMINFO_COMPACT_DAEMON_WAKE, "compact_daemon_wake"}, 174 {SysVMeminfoType::VMEMINFO_UNEVICTABLE_PGS_CULLED, "unevictable_pgs_culled"}, 175 {SysVMeminfoType::VMEMINFO_UNEVICTABLE_PGS_SCANNED, "unevictable_pgs_scanned"}, 176 {SysVMeminfoType::VMEMINFO_UNEVICTABLE_PGS_RESCUED, "unevictable_pgs_rescued"}, 177 {SysVMeminfoType::VMEMINFO_UNEVICTABLE_PGS_MLOCKED, "unevictable_pgs_mlocked"}, 178 {SysVMeminfoType::VMEMINFO_UNEVICTABLE_PGS_MUNLOCKED, "unevictable_pgs_munlocked"}, 179 {SysVMeminfoType::VMEMINFO_UNEVICTABLE_PGS_CLEARED, "unevictable_pgs_cleared"}, 180 {SysVMeminfoType::VMEMINFO_UNEVICTABLE_PGS_STRANDED, "unevictable_pgs_stranded"}, 181 {SysVMeminfoType::VMEMINFO_NR_ZSPAGES, "nr_zspages"}, 182 {SysVMeminfoType::VMEMINFO_NR_ION_HEAP, "nr_ion_heap"}, 183 {SysVMeminfoType::VMEMINFO_NR_GPU_HEAP, "nr_gpu_heap"}, 184 {SysVMeminfoType::VMEMINFO_ALLOCSTALL_DMA, "allocstall_dma"}, 185 {SysVMeminfoType::VMEMINFO_ALLOCSTALL_MOVABLE, "allocstall_movable"}, 186 {SysVMeminfoType::VMEMINFO_ALLOCSTALL_NORMAL, "allocstall_normal"}, 187 {SysVMeminfoType::VMEMINFO_COMPACT_DAEMON_FREE_SCANNED, "compact_daemon_free_scanned"}, 188 {SysVMeminfoType::VMEMINFO_COMPACT_DAEMON_MIGRATE_SCANNED, "compact_daemon_migrate_scanned"}, 189 {SysVMeminfoType::VMEMINFO_NR_FASTRPC, "nr_fastrpc"}, 190 {SysVMeminfoType::VMEMINFO_NR_INDIRECTLY_RECLAIMABLE, "nr_indirectly_reclaimable"}, 191 {SysVMeminfoType::VMEMINFO_NR_ION_HEAP_POOL, "nr_ion_heap_pool"}, 192 {SysVMeminfoType::VMEMINFO_NR_KERNEL_MISC_RECLAIMABLE, "nr_kernel_misc_reclaimable"}, 193 {SysVMeminfoType::VMEMINFO_NR_SHADOW_CALL_STACK_BYTES, "nr_shadow_call_stack_bytes"}, 194 {SysVMeminfoType::VMEMINFO_NR_SHMEM_HUGEPAGES, "nr_shmem_hugepages"}, 195 {SysVMeminfoType::VMEMINFO_NR_SHMEM_PMDMAPPED, "nr_shmem_pmdmapped"}, 196 {SysVMeminfoType::VMEMINFO_NR_UNRECLAIMABLE_PAGES, "nr_unreclaimable_pages"}, 197 {SysVMeminfoType::VMEMINFO_NR_ZONE_ACTIVE_ANON, "nr_zone_active_anon"}, 198 {SysVMeminfoType::VMEMINFO_NR_ZONE_ACTIVE_FILE, "nr_zone_active_file"}, 199 {SysVMeminfoType::VMEMINFO_NR_ZONE_INACTIVE_ANON, "nr_zone_inactive_anon"}, 200 {SysVMeminfoType::VMEMINFO_NR_ZONE_INACTIVE_FILE, "nr_zone_inactive_file"}, 201 {SysVMeminfoType::VMEMINFO_NR_ZONE_UNEVICTABLE, "nr_zone_unevictable"}, 202 {SysVMeminfoType::VMEMINFO_NR_ZONE_WRITE_PENDING, "nr_zone_write_pending"}, 203 {SysVMeminfoType::VMEMINFO_OOM_KILL, "oom_kill"}, 204 {SysVMeminfoType::VMEMINFO_PGLAZYFREE, "pglazyfree"}, 205 {SysVMeminfoType::VMEMINFO_PGLAZYFREED, "pglazyfreed"}, 206 {SysVMeminfoType::VMEMINFO_PGREFILL, "pgrefill"}, 207 {SysVMeminfoType::VMEMINFO_PGSCAN_DIRECT, "pgscan_direct"}, 208 {SysVMeminfoType::VMEMINFO_PGSCAN_KSWAPD, "pgscan_kswapd"}, 209 {SysVMeminfoType::VMEMINFO_PGSKIP_DMA, "pgskip_dma"}, 210 {SysVMeminfoType::VMEMINFO_PGSKIP_MOVABLE, "pgskip_movable"}, 211 {SysVMeminfoType::VMEMINFO_PGSKIP_NORMAL, "pgskip_normal"}, 212 {SysVMeminfoType::VMEMINFO_PGSTEAL_DIRECT, "pgsteal_direct"}, 213 {SysVMeminfoType::VMEMINFO_PGSTEAL_KSWAPD, "pgsteal_kswapd"}, 214 {SysVMeminfoType::VMEMINFO_SWAP_RA, "swap_ra"}, 215 {SysVMeminfoType::VMEMINFO_SWAP_RA_HIT, "swap_ra_hit"}, 216 {SysVMeminfoType::VMEMINFO_WORKINGSET_RESTORE, "workingset_restore"}, 217 }; 218 219 struct ProcStatusMapping { 220 int procid; 221 const char* procstr; 222 }; 223 224 enum StatusType { 225 PRO_TGID = 1, 226 PRO_NAME, 227 PRO_VMSIZE, 228 PRO_VMRSS, 229 PRO_RSSANON, 230 PRO_RSSFILE, 231 PRO_RSSSHMEM, 232 PRO_VMSWAP, 233 PRO_VMLCK, 234 PRO_VMHWM, 235 PRO_PURGSUM, 236 PRO_PURGPIN, 237 }; 238 239 constexpr ProcStatusMapping procStatusMapping[] = { 240 {StatusType::PRO_TGID, "Tgid"}, {StatusType::PRO_NAME, "Name"}, {StatusType::PRO_VMSIZE, "VmSize"}, 241 {StatusType::PRO_VMRSS, "VmRSS"}, {StatusType::PRO_RSSANON, "RssAnon"}, {StatusType::PRO_RSSFILE, "RssFile"}, 242 {StatusType::PRO_RSSSHMEM, "RssShmem"}, {StatusType::PRO_VMSWAP, "VmSwap"}, {StatusType::PRO_VMLCK, "VmLck"}, 243 {StatusType::PRO_VMHWM, "VmHWM"}, {StatusType::PRO_PURGSUM, "PurgSum"}, 244 {StatusType::PRO_PURGPIN, "PurgPin"}, 245 }; 246 247 enum ErrorType { 248 RET_NULL_ADDR, 249 RET_IVALID_PID, 250 RET_TGID_VALUE_NULL, 251 RET_FAIL = -1, 252 RET_SUCC = 0, 253 }; 254 255 enum FileType { 256 FILE_STATUS = 0, 257 FILE_OOM, 258 FILE_SMAPS, 259 }; 260 261 struct ProcfdMapping { 262 int procid; 263 const char* file; 264 }; 265 266 constexpr ProcfdMapping procfdMapping[] = { 267 {FileType::FILE_STATUS, "status"}, 268 {FileType::FILE_OOM, "oom_score_adj"}, 269 {FileType::FILE_SMAPS, "smaps"}, 270 }; 271 272 enum AshmemType { 273 ASHMEM_PROCESS_NAME = 1, 274 ASHMEM_PID, 275 ASHMEM_FD, 276 ASHMEM_ADJ, 277 ASHMEM_NAME, 278 ASHMEM_SIZE, 279 ASHMEM_ID, 280 ASHMEM_TIME, 281 ASHMEM_REF_COUNT, 282 ASHMEM_PURGED, 283 }; 284 285 enum DmaType { 286 DMA_NAME = 1, 287 DMA_PID, 288 DMA_FD, 289 DMA_SIZE, 290 DMA_INO, 291 DMA_EXP_PID, 292 DMA_EXP_TASK_COMM, 293 DMA_BUF_NAME, 294 DMA_EXP_NAME, 295 }; 296 297 enum GpuMemoryType { 298 GPU_NAME = 1, 299 GPU_SIZE, 300 }; 301 302 enum GpuCtxType { 303 GPU_ADDR = 1, 304 GPU_TID, 305 GPU_PID, 306 GPU_USED_SIZE, 307 }; 308 309 enum RSImageDumpType { 310 RS_SIZE = 1, 311 RS_TYPE, 312 RS_PID, 313 RS_SURFACENAME = 5, 314 }; 315 316 enum WinMgrSvcType { 317 WINDOW_NAME = 1, 318 WINDOW_PID = 3, 319 }; 320 321 struct GraphicsMemory { 322 uint64_t gl = 0; 323 uint64_t graph = 0; 324 }; 325 326 const std::vector<std::pair<OHOS::HDI::Memorytracker::V1_0::MemoryTrackerType, std::string>> MEMORY_TRACKER_TYPES = { 327 {OHOS::HDI::Memorytracker::V1_0::MEMORY_TRACKER_TYPE_GL, "GL"}, 328 {OHOS::HDI::Memorytracker::V1_0::MEMORY_TRACKER_TYPE_GRAPH, "Graph"}, 329 {OHOS::HDI::Memorytracker::V1_0::MEMORY_TRACKER_TYPE_OTHER, "Other"} 330 }; 331 332 class MemoryDataPlugin { 333 public: 334 MemoryDataPlugin(); 335 ~MemoryDataPlugin(); 336 int Start(const uint8_t* configData, uint32_t configSize); 337 int Report(uint8_t* data, uint32_t dataSize); 338 int ReportOptimize(RandomWriteCtx* randomWrite); 339 int Stop(); SetPath(char* path)340 void SetPath(char* path) 341 { 342 testpath_ = path; 343 }; 344 345 // for UT SetProtoConfig(MemoryConfig protoConfig)346 void SetProtoConfig(MemoryConfig protoConfig) 347 { 348 protoConfig_ = protoConfig; 349 }; 350 351 template <typename T> void WriteProcesseList(T& memoryData); 352 353 template <typename T> void WriteProcinfoByPidfds(T& processMemoryInfo, int32_t pid); 354 355 DIR* OpenDestDir(const char* dirPath); 356 int32_t GetValidPid(DIR* dirp); 357 // for test change static 358 int ParseNumber(std::string line); 359 360 private: 361 /* data */ 362 MemoryConfig protoConfig_; 363 364 std::unique_ptr<uint8_t[]> buffer_; 365 366 int meminfoFd_ = -1; 367 int vmstatFd_ = -1; 368 std::map<std::string, int> meminfoCounters_ = {}; 369 std::map<std::string, int> vmstatCounters_ = {}; 370 371 void InitProto2StrVector(); 372 std::vector<const char*> meminfoStrList_ = {}; 373 std::vector<const char*> vmstatStrList_ = {}; 374 375 // SmapsStats * 376 template <typename T> void WriteVmstat(T& memoryData); 377 378 template <typename T> void WriteMeminfo(T& memoryData); 379 380 template <typename T> void WriteZramData(T& memoryData); 381 382 std::unordered_map<int32_t, std::vector<int>> pidFds_ = {}; 383 std::vector<int32_t> seenPids_ = {}; 384 char* testpath_; 385 int32_t err_ = -1; 386 int32_t ReadFile(int fd); 387 std::string ReadFile(const std::string& path); 388 std::vector<int> OpenProcPidFiles(int32_t pid); 389 int32_t ReadProcPidFile(int32_t pid, const char* pFileName); 390 391 template <typename T> void WriteProcessInfo(T& memoryData, int32_t pid); 392 393 template <typename T> void WriteOomInfo(T& processMemoryInfo, int32_t pid); 394 395 template <typename T> void WriteProcess(T& processMemoryInfo, const char* pFile, uint32_t fileLen, int32_t pid); 396 397 template <typename T> void WriteAppsummary(T& processMemoryInfo, SmapsStats& smapInfo); 398 399 template <typename T> void SetProcessInfo(T& processMemoryInfo, int key, const char* word); 400 401 bool StringToUll(const char* word, uint64_t& value); 402 403 bool BufnCmp(const char* src, int srcLen, const char* key, int keyLen); 404 bool addPidBySort(int32_t pid); 405 int GetProcStatusId(const char* src, int srcLen); 406 ParseMemInfo(const char* data, T& processMemoryInfo)407 template <typename T> bool ParseMemInfo(const char* data, T& processMemoryInfo) 408 { 409 bool ready = false; 410 bool done = false; 411 std::istringstream ss(data); 412 std::string line; 413 414 auto memsummary = processMemoryInfo.mutable_memsummary(); 415 while (std::getline(ss, line)) { 416 std::string s(line); 417 if (s.find("App Summary") != s.npos) { 418 ready = true; 419 continue; 420 } 421 422 if (ready) { 423 if (s.find("Java Heap:") != s.npos) { 424 memsummary->set_java_heap(ParseNumber(s)); 425 continue; 426 } 427 if (s.find("Native Heap:") != s.npos) { 428 memsummary->set_native_heap(ParseNumber(s)); 429 continue; 430 } 431 if (s.find("Code:") != s.npos) { 432 memsummary->set_code(ParseNumber(s)); 433 continue; 434 } 435 if (s.find("Stack:") != s.npos) { 436 memsummary->set_stack(ParseNumber(s)); 437 continue; 438 } 439 if (s.find("Graphics:") != s.npos) { 440 memsummary->set_graphics(ParseNumber(s)); 441 continue; 442 } 443 if (s.find("Private Other:") != s.npos) { 444 memsummary->set_private_other(ParseNumber(s)); 445 continue; 446 } 447 if (s.find("System:") != s.npos) { 448 memsummary->set_system(ParseNumber(s)); 449 done = true; 450 break; 451 } 452 } 453 } 454 return done; 455 } 456 int InitMemVmemFd(); 457 458 template <typename T, typename S> void WriteMemoryData(T& memoryDataProto, S smapsInfo); 459 460 std::string RunCommand(const std::string& cmd); 461 int GetIndentNum(const std::string& line); 462 uint64_t SizeToBytes(const std::string& sizeStr, const std::string& type); 463 bool isRenderService(int pid); 464 bool GetRenderServiceGlSize(int32_t pid, GraphicsMemory& graphicsMemory); 465 466 bool GetGraphicsMemory(int32_t pid, GraphicsMemory &graphicsMemory, OHOS::HiviewDFX::GraphicType graphicType); 467 468 template <typename T> void WriteAshmemInfo(T& dataProto); 469 template <typename T> void WriteDmaInfo(T& dataProto); 470 template <typename T> void WriteGpuMemInfo(T& dataProto); 471 template <typename T> void WriteGpuDumpInfo(T& dataProto); 472 template <typename T> void WriteDumpProcessInfo(T& dataProto); 473 template <typename T> void WriteManagerServiceInfo(T& dataProto); 474 template <typename T> void WriteProfileMemInfo(T& dataProto); 475 476 template <typename T> void SetAshmemInfo(T& ashmemInfo, int key, const char* word); 477 template <typename T> void SetDmaInfo(T& dmaInfo, int key, const char* word); 478 template <typename T> void SetGpuProcessInfo(T& gpuProcessInfo, int key, const char* word); 479 template <typename T> bool SetGpuDumpInfo(T& gpuDumpInfo, BufferSplitter& totalBuffer); 480 template <typename T> void SetRSImageDumpInfo(T& rsDumpInfo, int key, const char* word); 481 template <typename T> void SetManagerServiceInfo(T& windowInfo, int key, const char* word); 482 }; 483 484 #endif 485