1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-26 20:47:45 +00:00

Profiler: Fix disassembly view to work with shared libraries

Also, update path to kernel image from "boot/kernel" to "boot/Kernel".

Fixes #4555
This commit is contained in:
Itamar 2021-01-09 11:11:02 +02:00 committed by Andreas Kling
parent 1af2f65df5
commit 4728d0dd6a
2 changed files with 28 additions and 15 deletions

View file

@ -55,26 +55,39 @@ DisassemblyModel::DisassemblyModel(Profile& profile, ProfileNode& node)
: m_profile(profile) : m_profile(profile)
, m_node(node) , m_node(node)
{ {
String path; OwnPtr<ELF::Image> kernel_elf;
if (m_node.address() >= 0xc0000000) const ELF::Image* elf;
path = "/boot/Kernel"; FlatPtr base_address = 0;
else if (m_node.address() >= 0xc0000000) {
path = profile.executable_path(); if (!m_kernel_file) {
m_file = make<MappedFile>(path); m_kernel_file = new MappedFile("/boot/Kernel");
if (!m_kernel_file->is_valid())
if (!m_file->is_valid())
return; return;
}
auto elf = ELF::Image((const u8*)m_file->data(), m_file->size()); kernel_elf = make<ELF::Image>((const u8*)m_kernel_file->data(), m_kernel_file->size());
elf = kernel_elf.ptr();
auto symbol = elf.find_symbol(node.address()); } else {
if (!symbol.has_value()) auto library_data = profile.coredump().library_containing(node.address());
if (!library_data) {
dbgln("no library data");
return; return;
}
elf = &library_data->lib_elf;
base_address = library_data->base_address;
}
ASSERT(elf != nullptr);
auto symbol = elf->find_symbol(node.address() - base_address);
if (!symbol.has_value()) {
dbgln("DisassemblyModel: symbol not found");
return;
}
ASSERT(symbol.has_value()); ASSERT(symbol.has_value());
auto view = symbol.value().raw_data(); auto view = symbol.value().raw_data();
X86::ELFSymbolProvider symbol_provider(elf); X86::ELFSymbolProvider symbol_provider(*elf);
X86::SimpleInstructionStream stream((const u8*)view.characters_without_null_termination(), view.length()); X86::SimpleInstructionStream stream((const u8*)view.characters_without_null_termination(), view.length());
X86::Disassembler disassembler(stream); X86::Disassembler disassembler(stream);

View file

@ -69,7 +69,7 @@ private:
Profile& m_profile; Profile& m_profile;
ProfileNode& m_node; ProfileNode& m_node;
OwnPtr<MappedFile> m_file; OwnPtr<MappedFile> m_kernel_file;
Vector<InstructionData> m_instructions; Vector<InstructionData> m_instructions;
}; };