Serenity Operating System
at master 62 lines 2.2 kB view raw
1/* 2 * Copyright (c) 2021, Itamar S. <itamar8910@gmail.com> 3 * 4 * SPDX-License-Identifier: BSD-2-Clause 5 */ 6 7#include "ProcessInspector.h" 8#include "DebugInfo.h" 9 10namespace Debug { 11 12LoadedLibrary const* ProcessInspector::library_at(FlatPtr address) const 13{ 14 LoadedLibrary const* result = nullptr; 15 for_each_loaded_library([&result, address](auto const& lib) { 16 if (address >= lib.base_address && address < lib.base_address + lib.debug_info->elf().size()) { 17 result = &lib; 18 return IterationDecision::Break; 19 } 20 return IterationDecision::Continue; 21 }); 22 return result; 23} 24 25Optional<ProcessInspector::SymbolicationResult> ProcessInspector::symbolicate(FlatPtr address) const 26{ 27 auto* lib = library_at(address); 28 if (!lib) 29 return {}; 30 // FIXME: ELF::Image symbolicate() API should return DeprecatedString::empty() if symbol is not found (It currently returns ??) 31 auto symbol = lib->debug_info->elf().symbolicate(address - lib->base_address); 32 return { { lib->name, symbol } }; 33} 34 35Optional<DebugInfo::SourcePositionAndAddress> ProcessInspector::get_address_from_source_position(DeprecatedString const& file, size_t line) const 36{ 37 Optional<DebugInfo::SourcePositionAndAddress> result; 38 for_each_loaded_library([file, line, &result](auto& lib) { 39 // The loader contains its own definitions for LibC symbols, so we don't want to include it in the search. 40 if (lib.name == "Loader.so") 41 return IterationDecision::Continue; 42 43 auto source_position_and_address = lib.debug_info->get_address_from_source_position(file, line); 44 if (!source_position_and_address.has_value()) 45 return IterationDecision::Continue; 46 47 result = source_position_and_address; 48 result.value().address += lib.base_address; 49 return IterationDecision::Break; 50 }); 51 return result; 52} 53 54Optional<DebugInfo::SourcePosition> ProcessInspector::get_source_position(FlatPtr address) const 55{ 56 auto* lib = library_at(address); 57 if (!lib) 58 return {}; 59 return lib->debug_info->get_source_position(address - lib->base_address); 60} 61 62}