mirror of
https://github.com/RGBCube/serenity
synced 2025-05-31 10:48:11 +00:00
HackStudio: Improve backtrace accuracy
We now decrement the return address of the previous frame by one to get the address of the call instruction and use this address in the backtrace. This results in more accurate source position information than what we previously had when using the return address.
This commit is contained in:
parent
d6d48ce936
commit
ce726fe027
2 changed files with 16 additions and 6 deletions
|
@ -36,21 +36,30 @@ Vector<BacktraceModel::FrameInfo> BacktraceModel::create_backtrace(Debug::Proces
|
|||
FlatPtr current_ebp = regs.bp();
|
||||
FlatPtr current_instruction = regs.ip();
|
||||
Vector<BacktraceModel::FrameInfo> frames;
|
||||
size_t frame_index = 0;
|
||||
do {
|
||||
auto lib = inspector.library_at(regs.ip());
|
||||
auto lib = inspector.library_at(current_instruction);
|
||||
if (!lib)
|
||||
continue;
|
||||
String name = lib->debug_info->name_of_containing_function(current_instruction - lib->base_address);
|
||||
|
||||
// After the first frame, current_instruction holds the return address from the function call.
|
||||
// We need to go back to the 'call' instruction to get accurate source position information.
|
||||
if (frame_index > 0)
|
||||
--current_instruction;
|
||||
String name = lib->debug_info->elf().symbolicate(current_instruction - lib->base_address);
|
||||
if (name.is_null()) {
|
||||
dbgln("BacktraceModel: couldn't find containing function for address: {:p}", current_instruction);
|
||||
dbgln("BacktraceModel: couldn't find containing function for address: {:p} (library={})", current_instruction, lib->name);
|
||||
name = "<missing>";
|
||||
}
|
||||
|
||||
frames.append({ name, current_instruction, current_ebp });
|
||||
auto source_position = lib->debug_info->get_source_position(current_instruction - lib->base_address);
|
||||
|
||||
frames.append({ name, current_instruction, current_ebp, source_position });
|
||||
auto frame_info = Debug::StackFrameUtils::get_info(inspector, current_ebp);
|
||||
VERIFY(frame_info.has_value());
|
||||
current_instruction = frame_info.value().return_address;
|
||||
current_ebp = frame_info.value().next_ebp;
|
||||
++frame_index;
|
||||
} while (current_ebp && current_instruction);
|
||||
return frames;
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue