106f6ba60Sopenharmony_ci/* 206f6ba60Sopenharmony_ci * Copyright (c) Huawei Technologies Co., Ltd. 2021. All rights reserved. 306f6ba60Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 406f6ba60Sopenharmony_ci * you may not use this file except in compliance with the License. 506f6ba60Sopenharmony_ci * You may obtain a copy of the License at 606f6ba60Sopenharmony_ci * 706f6ba60Sopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 806f6ba60Sopenharmony_ci * 906f6ba60Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software 1006f6ba60Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 1106f6ba60Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1206f6ba60Sopenharmony_ci * See the License for the specific language governing permissions and 1306f6ba60Sopenharmony_ci * limitations under the License. 1406f6ba60Sopenharmony_ci */ 1506f6ba60Sopenharmony_ci#define HILOG_TAG "RuntimeThread" 1606f6ba60Sopenharmony_ci 1706f6ba60Sopenharmony_ci#include "virtual_thread.h" 1806f6ba60Sopenharmony_ci 1906f6ba60Sopenharmony_ci#include <cinttypes> 2006f6ba60Sopenharmony_ci#include <iostream> 2106f6ba60Sopenharmony_ci#include <sstream> 2206f6ba60Sopenharmony_ci#if !is_mingw 2306f6ba60Sopenharmony_ci#include <sys/mman.h> 2406f6ba60Sopenharmony_ci#endif 2506f6ba60Sopenharmony_ci 2606f6ba60Sopenharmony_ci#include "common.h" 2706f6ba60Sopenharmony_ci#include "symbols_file.h" 2806f6ba60Sopenharmony_ci#include "utilities.h" 2906f6ba60Sopenharmony_ci#include "virtual_runtime.h" 3006f6ba60Sopenharmony_cinamespace OHOS { 3106f6ba60Sopenharmony_cinamespace Developtools { 3206f6ba60Sopenharmony_cinamespace NativeDaemon { 3306f6ba60Sopenharmony_ci#ifdef DEBUG_TIME 3406f6ba60Sopenharmony_cibool VirtualThread::IsSorted() const 3506f6ba60Sopenharmony_ci{ 3606f6ba60Sopenharmony_ci for (std::size_t index = 1; index < maps_->size(); ++index) { 3706f6ba60Sopenharmony_ci if ((*maps_)[index - 1].end > (*maps_)[index].begin) { 3806f6ba60Sopenharmony_ci std::cout << "maps_ order error:\n" 3906f6ba60Sopenharmony_ci << " " << (*maps_)[index - 1].begin << "-" << (*maps_)[index - 1].end 4006f6ba60Sopenharmony_ci << " " << (*maps_)[index].begin << "-" << (*maps_)[index].end; 4106f6ba60Sopenharmony_ci return false; 4206f6ba60Sopenharmony_ci } 4306f6ba60Sopenharmony_ci } 4406f6ba60Sopenharmony_ci return true; 4506f6ba60Sopenharmony_ci} 4606f6ba60Sopenharmony_ci#endif 4706f6ba60Sopenharmony_ci 4806f6ba60Sopenharmony_ciconst std::pair<std::shared_ptr<MemMaps>, uint32_t> VirtualThread::FindMemMapsByAddr(uint64_t addr) const 4906f6ba60Sopenharmony_ci{ 5006f6ba60Sopenharmony_ci return virtualruntime_->FindMap(addr); 5106f6ba60Sopenharmony_ci} 5206f6ba60Sopenharmony_ci 5306f6ba60Sopenharmony_ciconst std::shared_ptr<DfxMap> VirtualThread::FindMapByAddr(uint64_t addr) const 5406f6ba60Sopenharmony_ci{ 5506f6ba60Sopenharmony_ci HLOGM("try found vaddr 0x%" PRIx64 " in maps %zu ", addr, maps_->size()); 5606f6ba60Sopenharmony_ci if (maps_->size() == 0) { 5706f6ba60Sopenharmony_ci return nullptr; 5806f6ba60Sopenharmony_ci } 5906f6ba60Sopenharmony_ci if (maps_->front()->begin > addr) { 6006f6ba60Sopenharmony_ci return nullptr; 6106f6ba60Sopenharmony_ci } 6206f6ba60Sopenharmony_ci if (maps_->back()->end <= addr) { 6306f6ba60Sopenharmony_ci return nullptr; 6406f6ba60Sopenharmony_ci } 6506f6ba60Sopenharmony_ci constexpr int two {2}; 6606f6ba60Sopenharmony_ci std::size_t left {0}; 6706f6ba60Sopenharmony_ci std::size_t right {maps_->size()}; 6806f6ba60Sopenharmony_ci std::size_t mid = (right - left) / two + left; 6906f6ba60Sopenharmony_ci while (left < right) { 7006f6ba60Sopenharmony_ci if (addr < (*maps_)[mid]->end) { 7106f6ba60Sopenharmony_ci right = mid; 7206f6ba60Sopenharmony_ci mid = (right - left) / two + left; 7306f6ba60Sopenharmony_ci continue; 7406f6ba60Sopenharmony_ci } 7506f6ba60Sopenharmony_ci if (addr >= (*maps_)[mid]->end) { 7606f6ba60Sopenharmony_ci left = mid + 1; 7706f6ba60Sopenharmony_ci mid = (right - left) / two + left; 7806f6ba60Sopenharmony_ci continue; 7906f6ba60Sopenharmony_ci } 8006f6ba60Sopenharmony_ci } 8106f6ba60Sopenharmony_ci if (addr >= (*maps_)[left]->begin and addr < (*maps_)[left]->end) { 8206f6ba60Sopenharmony_ci if (left > 0) { 8306f6ba60Sopenharmony_ci (*maps_)[left]->prevMap = (*maps_)[left - 1]; 8406f6ba60Sopenharmony_ci } 8506f6ba60Sopenharmony_ci return (*maps_)[left]; 8606f6ba60Sopenharmony_ci } 8706f6ba60Sopenharmony_ci return nullptr; 8806f6ba60Sopenharmony_ci} 8906f6ba60Sopenharmony_ciVirtualThread::VirtualThread(pid_t pid, 9006f6ba60Sopenharmony_ci pid_t tid, 9106f6ba60Sopenharmony_ci const std::unordered_map<std::string, std::unique_ptr<SymbolsFile>>& symbolsFiles, 9206f6ba60Sopenharmony_ci VirtualRuntime* runtime, 9306f6ba60Sopenharmony_ci bool parseFlag) 9406f6ba60Sopenharmony_ci : pid_(pid), tid_(tid), symbolsFiles_(symbolsFiles), virtualruntime_(runtime) 9506f6ba60Sopenharmony_ci{ 9606f6ba60Sopenharmony_ci maps_ = &virtualruntime_->processMaps_; 9706f6ba60Sopenharmony_ci if (parseFlag) { 9806f6ba60Sopenharmony_ci if (virtualruntime_->processMaps_.size() == 0) { 9906f6ba60Sopenharmony_ci this->ParseMap(virtualruntime_->processMaps_); 10006f6ba60Sopenharmony_ci } 10106f6ba60Sopenharmony_ci } 10206f6ba60Sopenharmony_ci 10306f6ba60Sopenharmony_ci this->name_ = ReadThreadName(pid); 10406f6ba60Sopenharmony_ci HLOGM("%d %d map from parent size is %zu", pid, tid, maps_->size()); 10506f6ba60Sopenharmony_ci} 10606f6ba60Sopenharmony_ci 10706f6ba60Sopenharmony_cistd::string VirtualThread::ReadThreadName(pid_t tid) 10806f6ba60Sopenharmony_ci{ 10906f6ba60Sopenharmony_ci std::string comm = ReadFileToString(StringPrintf("/proc/%d/comm", tid)).c_str(); 11006f6ba60Sopenharmony_ci comm.erase(std::remove(comm.begin(), comm.end(), '\r'), comm.end()); 11106f6ba60Sopenharmony_ci comm.erase(std::remove(comm.begin(), comm.end(), '\n'), comm.end()); 11206f6ba60Sopenharmony_ci return comm; 11306f6ba60Sopenharmony_ci} 11406f6ba60Sopenharmony_ci 11506f6ba60Sopenharmony_ciconst std::shared_ptr<DfxMap> VirtualThread::FindMapByFileInfo(const std::string name, uint64_t offset) const 11606f6ba60Sopenharmony_ci{ 11706f6ba60Sopenharmony_ci for (auto map : *maps_) { 11806f6ba60Sopenharmony_ci if (name != map->name) { 11906f6ba60Sopenharmony_ci continue; 12006f6ba60Sopenharmony_ci } 12106f6ba60Sopenharmony_ci // check begin and length 12206f6ba60Sopenharmony_ci if (offset >= map->offset && (offset - map->offset) < (map->end - map->begin)) { 12306f6ba60Sopenharmony_ci HLOGMMM("found fileoffset 0x%" PRIx64 " in map (0x%" PRIx64 " - 0x%" PRIx64 12406f6ba60Sopenharmony_ci " pageoffset 0x%" PRIx64 ") from %s", 12506f6ba60Sopenharmony_ci offset, map->begin, map->end, map->offset, map->name.c_str()); 12606f6ba60Sopenharmony_ci return map; 12706f6ba60Sopenharmony_ci } 12806f6ba60Sopenharmony_ci } 12906f6ba60Sopenharmony_ci HLOGM("NOT found offset 0x%" PRIx64 " in maps %zu ", offset, maps_->size()); 13006f6ba60Sopenharmony_ci return nullptr; 13106f6ba60Sopenharmony_ci} 13206f6ba60Sopenharmony_ci 13306f6ba60Sopenharmony_ciSymbolsFile *VirtualThread::FindSymbolsFileByMap(std::shared_ptr<DfxMap> inMap) const 13406f6ba60Sopenharmony_ci{ 13506f6ba60Sopenharmony_ci auto search = symbolsFiles_.find(inMap->name); 13606f6ba60Sopenharmony_ci if (search != symbolsFiles_.end()) { 13706f6ba60Sopenharmony_ci auto& symbolsFile = search->second; 13806f6ba60Sopenharmony_ci HLOGM("found symbol for map '%s'", inMap->name.c_str()); 13906f6ba60Sopenharmony_ci symbolsFile->LoadDebugInfo(inMap); 14006f6ba60Sopenharmony_ci return symbolsFile.get(); 14106f6ba60Sopenharmony_ci } 14206f6ba60Sopenharmony_ci#ifdef DEBUG_MISS_SYMBOL 14306f6ba60Sopenharmony_ci if (find(missedSymbolFile_.begin(), missedSymbolFile_.end(), inMap->name) == 14406f6ba60Sopenharmony_ci missedSymbolFile_.end()) { 14506f6ba60Sopenharmony_ci missedSymbolFile_.emplace_back(inMap->name); 14606f6ba60Sopenharmony_ci HLOGW("NOT found symbol for map '%s'", inMap->name.c_str()); 14706f6ba60Sopenharmony_ci for (const auto &file : symbolsFiles_) { 14806f6ba60Sopenharmony_ci HLOGW(" we have '%s'", file->filePath_.c_str()); 14906f6ba60Sopenharmony_ci } 15006f6ba60Sopenharmony_ci } 15106f6ba60Sopenharmony_ci#endif 15206f6ba60Sopenharmony_ci return nullptr; 15306f6ba60Sopenharmony_ci} 15406f6ba60Sopenharmony_ci 15506f6ba60Sopenharmony_ciSymbolsFile *VirtualThread::FindSymbolsFileByName(const std::string &name) const 15606f6ba60Sopenharmony_ci{ 15706f6ba60Sopenharmony_ci auto search = symbolsFiles_.find(name); 15806f6ba60Sopenharmony_ci if (search != symbolsFiles_.end()) { 15906f6ba60Sopenharmony_ci auto& symbolsFile = search->second; 16006f6ba60Sopenharmony_ci HLOGM("found symbol for map '%s'", name.c_str()); 16106f6ba60Sopenharmony_ci symbolsFile->LoadDebugInfo(); 16206f6ba60Sopenharmony_ci return symbolsFile.get(); 16306f6ba60Sopenharmony_ci } 16406f6ba60Sopenharmony_ci#ifdef DEBUG_MISS_SYMBOL 16506f6ba60Sopenharmony_ci if (find(missedSymbolFile_.begin(), missedSymbolFile_.end(), name) == 16606f6ba60Sopenharmony_ci missedSymbolFile_.end()) { 16706f6ba60Sopenharmony_ci missedSymbolFile_.emplace_back(name); 16806f6ba60Sopenharmony_ci HLOGW("NOT found symbol for map '%s'", name.c_str()); 16906f6ba60Sopenharmony_ci for (const auto &file : symbolsFiles_) { 17006f6ba60Sopenharmony_ci HLOGW(" we have '%s'", file->filePath_.c_str()); 17106f6ba60Sopenharmony_ci } 17206f6ba60Sopenharmony_ci } 17306f6ba60Sopenharmony_ci#endif 17406f6ba60Sopenharmony_ci return nullptr; 17506f6ba60Sopenharmony_ci} 17606f6ba60Sopenharmony_ci 17706f6ba60Sopenharmony_civoid VirtualThread::ReportVaddrMapMiss(uint64_t vaddr) const 17806f6ba60Sopenharmony_ci{ 17906f6ba60Sopenharmony_ci#ifdef HIPERF_DEBUG 18006f6ba60Sopenharmony_ci if (DebugLogger::GetInstance()->GetLogLevel() <= LEVEL_VERBOSE) { 18106f6ba60Sopenharmony_ci if (missedRuntimeVaddr_.find(vaddr) == missedRuntimeVaddr_.end()) { 18206f6ba60Sopenharmony_ci missedRuntimeVaddr_.insert(vaddr); 18306f6ba60Sopenharmony_ci HLOGV("vaddr %" PRIx64 " not found in any map", vaddr); 18406f6ba60Sopenharmony_ci for (auto &map : *maps_) { 18506f6ba60Sopenharmony_ci HLOGV("map %s ", map->ToString().c_str()); 18606f6ba60Sopenharmony_ci } 18706f6ba60Sopenharmony_ci } 18806f6ba60Sopenharmony_ci } 18906f6ba60Sopenharmony_ci#endif 19006f6ba60Sopenharmony_ci} 19106f6ba60Sopenharmony_ci 19206f6ba60Sopenharmony_cibool VirtualThread::ReadRoMemory(uint64_t vaddr, uint8_t *data, size_t size) const 19306f6ba60Sopenharmony_ci{ 19406f6ba60Sopenharmony_ci auto [curMemMaps, itemIndex] = virtualruntime_->FindMap(vaddr); 19506f6ba60Sopenharmony_ci if (curMemMaps != nullptr) { 19606f6ba60Sopenharmony_ci // found symbols by file name 19706f6ba60Sopenharmony_ci SymbolsFile *symbolsFile = FindSymbolsFileByMap((curMemMaps->GetMaps())[itemIndex]); 19806f6ba60Sopenharmony_ci if (symbolsFile != nullptr) { 19906f6ba60Sopenharmony_ci std::shared_ptr<DfxMap> map = (curMemMaps->GetMaps())[itemIndex]; 20006f6ba60Sopenharmony_ci HLOGM("read vaddr from addr is 0x%" PRIx64 " mapStart :0x%" PRIx64 " mapOffset :0x%" PRIx64 " at '%s'", 20106f6ba60Sopenharmony_ci vaddr - map->begin, map->begin, map->offset, map->name.c_str()); 20206f6ba60Sopenharmony_ci map->elf = symbolsFile->GetElfFile(); 20306f6ba60Sopenharmony_ci if (map->elf != nullptr) { 20406f6ba60Sopenharmony_ci auto fileOffset = map->FileOffsetFromAddr(vaddr); 20506f6ba60Sopenharmony_ci fileOffset -= map->elf->GetBaseOffset(); 20606f6ba60Sopenharmony_ci map->elf->Read(fileOffset, data, size); 20706f6ba60Sopenharmony_ci return true; 20806f6ba60Sopenharmony_ci } 20906f6ba60Sopenharmony_ci HLOGE("ElfFile(%s) is null or read file offset from addr fail", curMemMaps->name_.c_str()); 21006f6ba60Sopenharmony_ci return false; 21106f6ba60Sopenharmony_ci } else { 21206f6ba60Sopenharmony_ci HLOGE("found addr %" PRIx64 " in map but not loaded symbole %s", vaddr, curMemMaps->name_.c_str()); 21306f6ba60Sopenharmony_ci } 21406f6ba60Sopenharmony_ci } else { 21506f6ba60Sopenharmony_ci#ifdef HIPERF_DEBUG 21606f6ba60Sopenharmony_ci ReportVaddrMapMiss(vaddr); 21706f6ba60Sopenharmony_ci#endif 21806f6ba60Sopenharmony_ci } 21906f6ba60Sopenharmony_ci return false; 22006f6ba60Sopenharmony_ci} 22106f6ba60Sopenharmony_ci 22206f6ba60Sopenharmony_cibool VirtualThread::ParseMap(std::vector<std::shared_ptr<DfxMap>>& memMaps, bool update) 22306f6ba60Sopenharmony_ci{ 22406f6ba60Sopenharmony_ci std::string mapPath = StringPrintf("/proc/%d/maps", pid_); 22506f6ba60Sopenharmony_ci std::shared_ptr<DfxMaps> dfxMaps = OHOS::HiviewDFX::DfxMaps::Create(pid_, mapPath); 22606f6ba60Sopenharmony_ci if (dfxMaps == nullptr) { 22706f6ba60Sopenharmony_ci HLOGE("VirtualThread Failed to Parse Map."); 22806f6ba60Sopenharmony_ci return false; 22906f6ba60Sopenharmony_ci } 23006f6ba60Sopenharmony_ci memMaps = dfxMaps->GetMaps(); 23106f6ba60Sopenharmony_ci bool mapsAdded = !update; 23206f6ba60Sopenharmony_ci std::vector<std::shared_ptr<DfxMap>> tempMap; 23306f6ba60Sopenharmony_ci std::string tempMapName; 23406f6ba60Sopenharmony_ci std::shared_ptr<DfxMap> prevMap = nullptr; 23506f6ba60Sopenharmony_ci for (auto memMapItem : memMaps) { 23606f6ba60Sopenharmony_ci if (!update) { 23706f6ba60Sopenharmony_ci virtualruntime_->FillMapsCache(tempMapName, memMapItem); 23806f6ba60Sopenharmony_ci bool updateNormalSymbol = true; 23906f6ba60Sopenharmony_ci if (memMapItem->name.find(".hap") != std::string::npos && (memMapItem->prots & PROT_EXEC)) { 24006f6ba60Sopenharmony_ci memMapItem->prevMap = prevMap; 24106f6ba60Sopenharmony_ci HLOGD("update hap(%s) symbols", memMapItem->name.c_str()); 24206f6ba60Sopenharmony_ci updateNormalSymbol = !virtualruntime_->UpdateHapSymbols(memMapItem); 24306f6ba60Sopenharmony_ci } 24406f6ba60Sopenharmony_ci if (updateNormalSymbol) { 24506f6ba60Sopenharmony_ci virtualruntime_->UpdateSymbols(memMapItem->name, memMapItem); 24606f6ba60Sopenharmony_ci } 24706f6ba60Sopenharmony_ci prevMap = memMapItem; 24806f6ba60Sopenharmony_ci } else if (!virtualruntime_->IsSymbolExist(memMapItem->name)) { 24906f6ba60Sopenharmony_ci virtualruntime_->FillMapsCache(tempMapName, memMapItem); 25006f6ba60Sopenharmony_ci mapsAdded = true; 25106f6ba60Sopenharmony_ci tempMap.push_back(memMapItem); 25206f6ba60Sopenharmony_ci bool updateNormalSymbol = true; 25306f6ba60Sopenharmony_ci if (memMapItem->name.find(".hap") != std::string::npos && (memMapItem->prots & PROT_EXEC)) { 25406f6ba60Sopenharmony_ci memMapItem->prevMap = prevMap; 25506f6ba60Sopenharmony_ci HLOGD("update hap(%s) symbols", memMapItem->name.c_str()); 25606f6ba60Sopenharmony_ci updateNormalSymbol = !virtualruntime_->UpdateHapSymbols(memMapItem); 25706f6ba60Sopenharmony_ci } 25806f6ba60Sopenharmony_ci if (updateNormalSymbol) { 25906f6ba60Sopenharmony_ci virtualruntime_->UpdateSymbols(memMapItem->name, memMapItem); 26006f6ba60Sopenharmony_ci } 26106f6ba60Sopenharmony_ci prevMap = memMapItem; 26206f6ba60Sopenharmony_ci } 26306f6ba60Sopenharmony_ci } 26406f6ba60Sopenharmony_ci 26506f6ba60Sopenharmony_ci // Find if there are duplicate mapping intervals, and if there are, overwrite the old data with the new data. 26606f6ba60Sopenharmony_ci for (auto tempMapIter = tempMap.begin(); tempMapIter != tempMap.end(); ++tempMapIter) { 26706f6ba60Sopenharmony_ci auto memMapIter = std::find_if(memMaps.begin(), memMaps.end(), [&](const std::shared_ptr<DfxMap>& map) { 26806f6ba60Sopenharmony_ci if ((*tempMapIter)->begin == map->begin && (*tempMapIter)->end == map->end) { 26906f6ba60Sopenharmony_ci return true; 27006f6ba60Sopenharmony_ci } 27106f6ba60Sopenharmony_ci return false; 27206f6ba60Sopenharmony_ci }); 27306f6ba60Sopenharmony_ci if (memMapIter != memMaps.end()) { 27406f6ba60Sopenharmony_ci virtualruntime_->DelSymbolFile((*memMapIter)->name); 27506f6ba60Sopenharmony_ci memMaps.erase(memMapIter); 27606f6ba60Sopenharmony_ci } 27706f6ba60Sopenharmony_ci } 27806f6ba60Sopenharmony_ci memMaps.insert(memMaps.end(), tempMap.begin(), tempMap.end()); 27906f6ba60Sopenharmony_ci 28006f6ba60Sopenharmony_ci if (mapsAdded) { 28106f6ba60Sopenharmony_ci PROFILER_LOG_DEBUG(LOG_CORE, "maps changed and need sort"); 28206f6ba60Sopenharmony_ci SortMaps(); 28306f6ba60Sopenharmony_ci } else { 28406f6ba60Sopenharmony_ci PROFILER_LOG_DEBUG(LOG_CORE, "maps no change"); 28506f6ba60Sopenharmony_ci return false; 28606f6ba60Sopenharmony_ci } 28706f6ba60Sopenharmony_ci virtualruntime_->soBegin_ = 0; 28806f6ba60Sopenharmony_ci return true; 28906f6ba60Sopenharmony_ci} 29006f6ba60Sopenharmony_ci 29106f6ba60Sopenharmony_civoid VirtualThread::SortMaps() 29206f6ba60Sopenharmony_ci{ 29306f6ba60Sopenharmony_ci for (size_t currPos = 1; currPos < maps_->size(); ++currPos) { 29406f6ba60Sopenharmony_ci int targetPos = static_cast<int>(currPos - 1); 29506f6ba60Sopenharmony_ci while (targetPos >= 0 && (*maps_)[currPos]->end < (*maps_)[targetPos]->end) { 29606f6ba60Sopenharmony_ci --targetPos; 29706f6ba60Sopenharmony_ci } 29806f6ba60Sopenharmony_ci if (targetPos < static_cast<int>(currPos - 1)) { 29906f6ba60Sopenharmony_ci auto target = (*maps_)[currPos]; 30006f6ba60Sopenharmony_ci for (size_t k = currPos - 1; k > static_cast<size_t>(targetPos); --k) { 30106f6ba60Sopenharmony_ci (*maps_)[k + 1] = (*maps_)[k]; 30206f6ba60Sopenharmony_ci } 30306f6ba60Sopenharmony_ci (*maps_)[targetPos + 1] = target; 30406f6ba60Sopenharmony_ci } 30506f6ba60Sopenharmony_ci } 30606f6ba60Sopenharmony_ci return; 30706f6ba60Sopenharmony_ci} 30806f6ba60Sopenharmony_ci 30906f6ba60Sopenharmony_civoid VirtualThread::CreateMapItem(const std::string filename, uint64_t begin, uint64_t len, 31006f6ba60Sopenharmony_ci uint64_t offset) 31106f6ba60Sopenharmony_ci{ 31206f6ba60Sopenharmony_ci if (!OHOS::HiviewDFX::DfxMaps::IsLegalMapItem(filename)) { 31306f6ba60Sopenharmony_ci return; // skip some memmap 31406f6ba60Sopenharmony_ci } 31506f6ba60Sopenharmony_ci uint32_t prots = PROT_EXEC; 31606f6ba60Sopenharmony_ci 31706f6ba60Sopenharmony_ci std::shared_ptr<DfxMap> map = std::make_shared<DfxMap>(begin, begin + len, offset, prots, filename); 31806f6ba60Sopenharmony_ci maps_->emplace_back(map); 31906f6ba60Sopenharmony_ci std::string tempMapName{" "}; 32006f6ba60Sopenharmony_ci virtualruntime_->FillMapsCache(tempMapName, map); 32106f6ba60Sopenharmony_ci SortMaps(); 32206f6ba60Sopenharmony_ci} 32306f6ba60Sopenharmony_ci} // namespace NativeDaemon 32406f6ba60Sopenharmony_ci} // namespace Developtools 32506f6ba60Sopenharmony_ci} // namespace OHOS