mirror of
https://github.com/LadybirdBrowser/ladybird.git
synced 2025-04-22 12:35:14 +00:00
ProfileViewer: Symbolicate the disassembled instructions
Instead of "call 0x0811d6ac", we now say "call 0x0811d6ac <malloc>" :^)
This commit is contained in:
parent
e880e4c2d2
commit
477bacddad
Notes:
sideshowbarker
2024-07-19 07:41:14 +09:00
Author: https://github.com/awesomekling Commit: https://github.com/SerenityOS/serenity/commit/477bacddadd
1 changed files with 19 additions and 1 deletions
|
@ -50,6 +50,22 @@ static Color color_for_percent(int percent)
|
|||
return heat_gradient().get_pixel(percent, 0);
|
||||
}
|
||||
|
||||
class ELFSymbolProvider final : public X86::SymbolProvider {
|
||||
public:
|
||||
ELFSymbolProvider(ELF::Loader& loader)
|
||||
: m_loader(loader)
|
||||
{
|
||||
}
|
||||
|
||||
virtual String symbolicate(FlatPtr address, u32* offset = nullptr) const
|
||||
{
|
||||
return m_loader.symbolicate(address, offset);
|
||||
}
|
||||
|
||||
private:
|
||||
ELF::Loader& m_loader;
|
||||
};
|
||||
|
||||
DisassemblyModel::DisassemblyModel(Profile& profile, ProfileNode& node)
|
||||
: m_profile(profile)
|
||||
, m_node(node)
|
||||
|
@ -72,6 +88,8 @@ DisassemblyModel::DisassemblyModel(Profile& profile, ProfileNode& node)
|
|||
ASSERT(symbol.has_value());
|
||||
|
||||
auto view = symbol.value().raw_data();
|
||||
|
||||
ELFSymbolProvider symbol_provider(*elf_loader);
|
||||
X86::SimpleInstructionStream stream((const u8*)view.characters_without_null_termination(), view.length());
|
||||
X86::Disassembler disassembler(stream);
|
||||
|
||||
|
@ -82,7 +100,7 @@ DisassemblyModel::DisassemblyModel(Profile& profile, ProfileNode& node)
|
|||
break;
|
||||
FlatPtr address_in_profiled_program = symbol.value().value() + offset_into_symbol;
|
||||
|
||||
auto disassembly = insn.value().to_string(address_in_profiled_program);
|
||||
auto disassembly = insn.value().to_string(address_in_profiled_program, &symbol_provider);
|
||||
|
||||
StringView instruction_bytes = view.substring_view(offset_into_symbol, insn.value().length());
|
||||
size_t samples_at_this_instruction = m_node.events_per_address().get(address_in_profiled_program).value_or(0);
|
||||
|
|
Loading…
Add table
Reference in a new issue