summaryrefslogtreecommitdiff
path: root/Userland/Libraries/LibCoreDump/Reader.h
diff options
context:
space:
mode:
authorAndreas Kling <kling@serenityos.org>2021-08-22 14:51:04 +0200
committerAndreas Kling <kling@serenityos.org>2021-08-23 00:02:09 +0200
commitbcd2025311b97d45aeb23960e17fcae2bc5b7f2e (patch)
treefacb4e412cdfcc5a9f5177c9f3cd0cd1e27a2f67 /Userland/Libraries/LibCoreDump/Reader.h
parenta930877f31fb117ce4b38d4782dd288093700d8a (diff)
downloadserenity-bcd2025311b97d45aeb23960e17fcae2bc5b7f2e.zip
Everywhere: Core dump => Coredump
We all know what a coredump is, and it feels more natural to refer to it as a coredump (most code already does), so let's be consistent.
Diffstat (limited to 'Userland/Libraries/LibCoreDump/Reader.h')
-rw-r--r--Userland/Libraries/LibCoreDump/Reader.h109
1 files changed, 0 insertions, 109 deletions
diff --git a/Userland/Libraries/LibCoreDump/Reader.h b/Userland/Libraries/LibCoreDump/Reader.h
deleted file mode 100644
index fbfbde3537..0000000000
--- a/Userland/Libraries/LibCoreDump/Reader.h
+++ /dev/null
@@ -1,109 +0,0 @@
-/*
- * Copyright (c) 2020, Itamar S. <itamar8910@gmail.com>
- *
- * SPDX-License-Identifier: BSD-2-Clause
- */
-
-#pragma once
-
-#include <AK/HashMap.h>
-#include <AK/MappedFile.h>
-#include <AK/Noncopyable.h>
-#include <AK/OwnPtr.h>
-#include <LibELF/CoreDump.h>
-#include <LibELF/Image.h>
-
-namespace CoreDump {
-
-class Reader {
- AK_MAKE_NONCOPYABLE(Reader);
- AK_MAKE_NONMOVABLE(Reader);
-
-public:
- static OwnPtr<Reader> create(const String&);
- ~Reader();
-
- template<typename Func>
- void for_each_memory_region_info(Func func) const;
-
- template<typename Func>
- void for_each_thread_info(Func func) const;
-
- const ELF::Image& image() const { return m_coredump_image; }
-
- Optional<FlatPtr> peek_memory(FlatPtr address) const;
- ELF::Core::MemoryRegionInfo const* first_region_for_object(StringView object_name) const;
- const ELF::Core::MemoryRegionInfo* region_containing(FlatPtr address) const;
-
- struct LibraryData {
- String name;
- FlatPtr base_address { 0 };
- NonnullRefPtr<MappedFile> file;
- ELF::Image lib_elf;
- };
- const LibraryData* library_containing(FlatPtr address) const;
-
- int process_pid() const;
- u8 process_termination_signal() const;
- String process_executable_path() const;
- Vector<String> process_arguments() const;
- Vector<String> process_environment() const;
- HashMap<String, String> metadata() const;
-
-private:
- Reader(ReadonlyBytes);
-
- static ByteBuffer decompress_coredump(const ReadonlyBytes&);
-
- class NotesEntryIterator {
- public:
- NotesEntryIterator(const u8* notes_data);
-
- ELF::Core::NotesEntryHeader::Type type() const;
- const ELF::Core::NotesEntry* current() const;
-
- void next();
- bool at_end() const;
-
- private:
- const ELF::Core::NotesEntry* m_current { nullptr };
- const u8* start { nullptr };
- };
-
- // Private as we don't need anyone poking around in this JsonObject
- // manually - we know very well what should be included and expose that
- // as getters with the appropriate (non-JsonValue) types.
- const JsonObject process_info() const;
-
- ByteBuffer m_coredump_buffer;
- ELF::Image m_coredump_image;
- ssize_t m_notes_segment_index { -1 };
-};
-
-template<typename Func>
-void Reader::for_each_memory_region_info(Func func) const
-{
- for (NotesEntryIterator it((const u8*)m_coredump_image.program_header(m_notes_segment_index).raw_data()); !it.at_end(); it.next()) {
- if (it.type() != ELF::Core::NotesEntryHeader::Type::MemoryRegionInfo)
- continue;
- auto& memory_region_info = reinterpret_cast<const ELF::Core::MemoryRegionInfo&>(*it.current());
- IterationDecision decision = func(memory_region_info);
- if (decision == IterationDecision::Break)
- return;
- }
-}
-
-template<typename Func>
-void Reader::for_each_thread_info(Func func) const
-{
- for (NotesEntryIterator it((const u8*)m_coredump_image.program_header(m_notes_segment_index).raw_data()); !it.at_end(); it.next()) {
- if (it.type() != ELF::Core::NotesEntryHeader::Type::ThreadInfo)
- continue;
- auto& thread_info = reinterpret_cast<const ELF::Core::ThreadInfo&>(*it.current());
- IterationDecision decision = func(thread_info);
- if (decision == IterationDecision::Break)
- return;
- }
-}
-
-}