mirror of
https://github.com/LadybirdBrowser/ladybird.git
synced 2024-11-22 15:40:19 +00:00
6e19ab2bbc
We have a new, improved string type coming up in AK (OOM aware, no null state), and while it's going to use UTF-8, the name UTF8String is a mouthful - so let's free up the String name by renaming the existing class. Making the old one have an annoying name will hopefully also help with quick adoption :^)
62 lines
2.1 KiB
C++
62 lines
2.1 KiB
C++
/*
|
|
* Copyright (c) 2021, Itamar S. <itamar8910@gmail.com>
|
|
*
|
|
* SPDX-License-Identifier: BSD-2-Clause
|
|
*/
|
|
|
|
#include "ProcessInspector.h"
|
|
#include "DebugInfo.h"
|
|
|
|
namespace Debug {
|
|
|
|
LoadedLibrary const* ProcessInspector::library_at(FlatPtr address) const
|
|
{
|
|
LoadedLibrary const* result = nullptr;
|
|
for_each_loaded_library([&result, address](auto const& lib) {
|
|
if (address >= lib.base_address && address < lib.base_address + lib.debug_info->elf().size()) {
|
|
result = &lib;
|
|
return IterationDecision::Break;
|
|
}
|
|
return IterationDecision::Continue;
|
|
});
|
|
return result;
|
|
}
|
|
|
|
Optional<ProcessInspector::SymbolicationResult> ProcessInspector::symbolicate(FlatPtr address) const
|
|
{
|
|
auto* lib = library_at(address);
|
|
if (!lib)
|
|
return {};
|
|
// FIXME: ELF::Image symbolicate() API should return DeprecatedString::empty() if symbol is not found (It currently returns ??)
|
|
auto symbol = lib->debug_info->elf().symbolicate(address - lib->base_address);
|
|
return { { lib->name, symbol } };
|
|
}
|
|
|
|
Optional<DebugInfo::SourcePositionAndAddress> ProcessInspector::get_address_from_source_position(DeprecatedString const& file, size_t line) const
|
|
{
|
|
Optional<DebugInfo::SourcePositionAndAddress> result;
|
|
for_each_loaded_library([file, line, &result](auto& lib) {
|
|
// The loader contains its own definitions for LibC symbols, so we don't want to include it in the search.
|
|
if (lib.name == "Loader.so")
|
|
return IterationDecision::Continue;
|
|
|
|
auto source_position_and_address = lib.debug_info->get_address_from_source_position(file, line);
|
|
if (!source_position_and_address.has_value())
|
|
return IterationDecision::Continue;
|
|
|
|
result = source_position_and_address;
|
|
result.value().address += lib.base_address;
|
|
return IterationDecision::Break;
|
|
});
|
|
return result;
|
|
}
|
|
|
|
Optional<DebugInfo::SourcePosition> ProcessInspector::get_source_position(FlatPtr address) const
|
|
{
|
|
auto* lib = library_at(address);
|
|
if (!lib)
|
|
return {};
|
|
return lib->debug_info->get_source_position(address - lib->base_address);
|
|
}
|
|
|
|
}
|