// Find the containing map info for the PC. const MapEntry* MapData::find(uintptr_t pc, uintptr_t* rel_pc) { for (auto* entry : entries_) { if ((pc >= entry->start) && (pc < entry->end)) { if (!entry->load_base_read) { read_loadbase(entry); } if (rel_pc) { *rel_pc = pc - entry->start + entry->load_base; } return entry; } } if (rel_pc) { *rel_pc = pc; } return nullptr; }
// Find the containing map info for the PC. const MapEntry* MapData::find(uintptr_t pc, uintptr_t* rel_pc) { MapEntry pc_entry(pc); std::lock_guard<std::mutex> lock(m_); auto it = entries_.find(&pc_entry); if (it == entries_.end()) { ReadMaps(); } it = entries_.find(&pc_entry); if (it == entries_.end()) { return nullptr; } MapEntry *entry = *it; if (!entry->load_base_read) { read_loadbase(entry); } if (rel_pc) { *rel_pc = pc - entry->start + entry->load_base; } return entry; }