Serenity Operating System
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}