mirror of
https://github.com/LadybirdBrowser/ladybird.git
synced 2025-06-10 18:10:56 +09:00
LibCoreDump: Don't subtract one from the first stack frame's EIP
The first stack frame represents the current instruction pointer rather than the return address so we shouldn't subtract one from it. Fixes #8162.
This commit is contained in:
parent
995594b403
commit
25c73159ce
Notes:
sideshowbarker
2024-07-18 12:00:24 +09:00
Author: https://github.com/gunnarbeutner
Commit: 25c73159ce
Pull-request: https://github.com/SerenityOS/serenity/pull/8163
Issue: https://github.com/SerenityOS/serenity/issues/8162
2 changed files with 12 additions and 2 deletions
|
@ -53,11 +53,16 @@ Backtrace::Backtrace(const Reader& coredump, const ELF::Core::ThreadInfo& thread
|
||||||
{
|
{
|
||||||
uint32_t* ebp = (uint32_t*)m_thread_info.regs.ebp;
|
uint32_t* ebp = (uint32_t*)m_thread_info.regs.ebp;
|
||||||
uint32_t* eip = (uint32_t*)m_thread_info.regs.eip;
|
uint32_t* eip = (uint32_t*)m_thread_info.regs.eip;
|
||||||
|
bool first_frame = true;
|
||||||
while (ebp && eip) {
|
while (ebp && eip) {
|
||||||
// We use eip - 1 because the return address from a function frame
|
// We use eip - 1 because the return address from a function frame
|
||||||
// is the instruction that comes after the 'call' instruction.
|
// is the instruction that comes after the 'call' instruction.
|
||||||
|
// However, because the first frame represents the faulting
|
||||||
|
// instruction rather than the return address we don't subtract
|
||||||
|
// 1 there.
|
||||||
VERIFY((FlatPtr)eip > 0);
|
VERIFY((FlatPtr)eip > 0);
|
||||||
add_entry(coredump, (FlatPtr)eip - 1);
|
add_entry(coredump, (FlatPtr)eip - (first_frame ? 0 : 1));
|
||||||
|
first_frame = false;
|
||||||
auto next_eip = coredump.peek_memory((FlatPtr)(ebp + 1));
|
auto next_eip = coredump.peek_memory((FlatPtr)(ebp + 1));
|
||||||
auto next_ebp = coredump.peek_memory((FlatPtr)(ebp));
|
auto next_ebp = coredump.peek_memory((FlatPtr)(ebp));
|
||||||
if (!next_eip.has_value() || !next_ebp.has_value())
|
if (!next_eip.has_value() || !next_ebp.has_value())
|
||||||
|
|
|
@ -148,6 +148,7 @@ Vector<Symbol> symbolicate_thread(pid_t pid, pid_t tid)
|
||||||
}
|
}
|
||||||
|
|
||||||
Vector<Symbol> symbols;
|
Vector<Symbol> symbols;
|
||||||
|
bool first_frame = true;
|
||||||
|
|
||||||
for (auto address : stack) {
|
for (auto address : stack) {
|
||||||
const RegionWithSymbols* found_region = nullptr;
|
const RegionWithSymbols* found_region = nullptr;
|
||||||
|
@ -171,7 +172,11 @@ Vector<Symbol> symbolicate_thread(pid_t pid, pid_t tid)
|
||||||
|
|
||||||
// We're subtracting 1 from the address because this is the return address,
|
// We're subtracting 1 from the address because this is the return address,
|
||||||
// i.e. it is one instruction past the call instruction.
|
// i.e. it is one instruction past the call instruction.
|
||||||
auto result = symbolicate(found_region->path, adjusted_address - 1);
|
// However, because the first frame represents the current
|
||||||
|
// instruction pointer rather than the return address we don't
|
||||||
|
// subtract 1 for that.
|
||||||
|
auto result = symbolicate(found_region->path, adjusted_address - (first_frame ? 0 : 1));
|
||||||
|
first_frame = false;
|
||||||
if (!result.has_value()) {
|
if (!result.has_value()) {
|
||||||
symbols.append(Symbol {
|
symbols.append(Symbol {
|
||||||
.address = address,
|
.address = address,
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue