1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-05-31 09:48:11 +00:00
serenity/Userland/DevTools/Profiler/Process.h
Daniel Bertalan b883652a83 Profiler: Cache parsed DWARF debug information in disassembly view
This changes browsing through disassembled functions in Profiler from a
painfully sluggish experience into quite a swift one. It's especially
true for profiling the kernel, as it has more than 10 megabytes of DWARF
data to churn through.
2021-10-31 16:54:02 +01:00

77 lines
1.9 KiB
C++

/*
* Copyright (c) 2018-2021, Andreas Kling <kling@serenityos.org>
*
* SPDX-License-Identifier: BSD-2-Clause
*/
#pragma once
#include "EventSerialNumber.h"
#include <AK/HashMap.h>
#include <AK/MappedFile.h>
#include <AK/OwnPtr.h>
#include <AK/Vector.h>
#include <LibDebug/DebugInfo.h>
#include <LibELF/Image.h>
namespace Profiler {
struct MappedObject {
NonnullRefPtr<MappedFile> file;
ELF::Image elf;
};
extern HashMap<String, OwnPtr<MappedObject>> g_mapped_object_cache;
class LibraryMetadata {
public:
struct Library {
FlatPtr base;
size_t size;
String name;
MappedObject* object { nullptr };
// This is loaded lazily because we only need it in disassembly view
mutable OwnPtr<Debug::DebugInfo> debug_info;
String symbolicate(FlatPtr, u32* offset) const;
const Debug::DebugInfo& load_debug_info(FlatPtr base_address) const;
};
void handle_mmap(FlatPtr base, size_t size, const String& name);
const Library* library_containing(FlatPtr) const;
private:
mutable HashMap<String, NonnullOwnPtr<Library>> m_libraries;
};
struct Thread {
pid_t tid;
EventSerialNumber start_valid;
EventSerialNumber end_valid;
bool valid_at(EventSerialNumber serial) const
{
return serial >= start_valid && (end_valid == EventSerialNumber {} || serial <= end_valid);
}
};
struct Process {
pid_t pid {};
String executable;
String basename;
HashMap<int, Vector<Thread>> threads {};
LibraryMetadata library_metadata {};
EventSerialNumber start_valid;
EventSerialNumber end_valid;
Thread* find_thread(pid_t tid, EventSerialNumber serial);
void handle_thread_create(pid_t tid, EventSerialNumber serial);
void handle_thread_exit(pid_t tid, EventSerialNumber serial);
bool valid_at(EventSerialNumber serial) const
{
return serial >= start_valid && (end_valid == EventSerialNumber {} || serial <= end_valid);
}
};
}