From a45ce0c6ebb5a3230a84da3a8646b8c541e0eb14 Mon Sep 17 00:00:00 2001 From: Itamar Date: Sat, 19 Jun 2021 11:32:08 +0300 Subject: [PATCH] LibCoreDump: Use "eip - 1" when creating backtrace entries We need to do this because the return address from a function frame is the instruction that comes after the 'call' instruction. --- Userland/Libraries/LibCoreDump/Backtrace.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/Userland/Libraries/LibCoreDump/Backtrace.cpp b/Userland/Libraries/LibCoreDump/Backtrace.cpp index 52378e33d0..ea16b7c68b 100644 --- a/Userland/Libraries/LibCoreDump/Backtrace.cpp +++ b/Userland/Libraries/LibCoreDump/Backtrace.cpp @@ -54,7 +54,10 @@ Backtrace::Backtrace(const Reader& coredump, const ELF::Core::ThreadInfo& thread uint32_t* ebp = (uint32_t*)m_thread_info.regs.ebp; uint32_t* eip = (uint32_t*)m_thread_info.regs.eip; while (ebp && eip) { - add_entry(coredump, (FlatPtr)eip); + // We use eip - 1 because the return address from a function frame + // is the instruction that comes after the 'call' instruction. + VERIFY((FlatPtr)eip > 0); + add_entry(coredump, (FlatPtr)eip - 1); auto next_eip = coredump.peek_memory((FlatPtr)(ebp + 1)); auto next_ebp = coredump.peek_memory((FlatPtr)(ebp)); if (!next_eip.has_value() || !next_ebp.has_value())