ProcessInspector.cpp 2.1 KB

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