1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-05-18 10:55:07 +00:00
serenity/Userland/Libraries/LibCoredump/Backtrace.h
Daniel Bertalan 3c3df95958 LibCoredump: Show frames from Loader.so if the crash occurs in it
Previously we rejected all entries from Loader.so even if the faulting
address was located in it, i.e. the actual issue was with the dynamic
loader. We no longer do that to make debugging Loader crashes easier.
2021-10-17 17:09:58 +01:00

56 lines
1.5 KiB
C++

/*
* Copyright (c) 2020, Linus Groh <linusg@serenityos.org>
*
* SPDX-License-Identifier: BSD-2-Clause
*/
#pragma once
#include <AK/Types.h>
#include <LibCoredump/Reader.h>
#include <LibDebug/DebugInfo.h>
#include <LibELF/Core.h>
namespace Coredump {
struct ELFObjectInfo {
ELFObjectInfo(NonnullRefPtr<MappedFile> file, NonnullOwnPtr<Debug::DebugInfo>&& debug_info, NonnullOwnPtr<ELF::Image> image)
: file(move(file))
, debug_info(move(debug_info))
, image(move(image))
{
}
NonnullRefPtr<MappedFile> file;
NonnullOwnPtr<Debug::DebugInfo> debug_info;
NonnullOwnPtr<ELF::Image> image;
};
class Backtrace {
public:
struct Entry {
FlatPtr eip;
String object_name;
String function_name;
Debug::DebugInfo::SourcePositionWithInlines source_position_with_inlines;
String to_string(bool color = false) const;
};
Backtrace(const Reader&, const ELF::Core::ThreadInfo&, Function<void(size_t, size_t)> on_progress = {});
~Backtrace();
ELF::Core::ThreadInfo const& thread_info() const { return m_thread_info; }
Vector<Entry> const& entries() const { return m_entries; }
private:
void add_entry(const Reader&, FlatPtr ip);
ELFObjectInfo const* object_info_for_region(ELF::Core::MemoryRegionInfo const&);
bool m_skip_loader_so { false };
ELF::Core::ThreadInfo m_thread_info;
Vector<Entry> m_entries;
HashMap<String, NonnullOwnPtr<ELFObjectInfo>> m_debug_info_cache;
};
}