mirror of
https://github.com/RGBCube/serenity
synced 2025-05-18 10:55:07 +00:00

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.
56 lines
1.5 KiB
C++
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;
|
|
};
|
|
|
|
}
|