aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorlizzie <lizzie@eden-emu.dev>2025-11-03 21:08:02 +0100
committercrueter <crueter@eden-emu.dev>2025-11-03 21:08:02 +0100
commitc0663ccd6bee9651db0aecb13e92f461e3d154d3 (patch)
tree9590e4e1d4e12513fb6288b6cded57b245a681c8 /src
parent8a7fe32a2c3a214739fc8f631e96c56b883d673a (diff)
[core/arm] more verbose backtrace showing ALL of the thread's context state (#2924)
Should make backtraces infinitely better :) Signed-off-by: lizzie <lizzie@eden-emu.dev> Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/2924 Reviewed-by: Caio Oliveira <caiooliveirafarias0@gmail.com> Reviewed-by: MaranBr <maranbr@eden-emu.dev> Co-authored-by: lizzie <lizzie@eden-emu.dev> Co-committed-by: lizzie <lizzie@eden-emu.dev>
Diffstat (limited to 'src')
-rw-r--r--src/core/arm/arm_interface.cpp28
1 files changed, 25 insertions, 3 deletions
diff --git a/src/core/arm/arm_interface.cpp b/src/core/arm/arm_interface.cpp
index 5087b92315..4f6bfb2bd1 100644
--- a/src/core/arm/arm_interface.cpp
+++ b/src/core/arm/arm_interface.cpp
@@ -14,11 +14,33 @@ namespace Core {
void ArmInterface::LogBacktrace(Kernel::KProcess* process) const {
Kernel::Svc::ThreadContext ctx;
this->GetContext(ctx);
- LOG_ERROR(Core_ARM, "Backtrace, sp={:016X}, pc={:016X}", ctx.sp, ctx.pc);
- LOG_ERROR(Core_ARM, "{:20}{:20}{:20}{:20}{}", "Module Name", "Address", "Original Address", "Offset", "Symbol");
+
+ std::array<u64, 32> xreg{
+ ctx.r[0], ctx.r[1], ctx.r[2], ctx.r[3],
+ ctx.r[4], ctx.r[5], ctx.r[6], ctx.r[7],
+ ctx.r[8], ctx.r[9], ctx.r[10], ctx.r[11],
+ ctx.r[12], ctx.r[13], ctx.r[14], ctx.r[15],
+ ctx.r[16], ctx.r[17], ctx.r[18], ctx.r[19],
+ ctx.r[20], ctx.r[21], ctx.r[22], ctx.r[23],
+ ctx.r[24], ctx.r[25], ctx.r[26], ctx.r[27],
+ ctx.r[28], ctx.fp, ctx.lr, ctx.sp,
+ };
+
+ std::string msg = fmt::format("Backtrace @ PC={:016X}\n", ctx.pc);
+ for (size_t i = 0; i < 32; i += 4)
+ msg += fmt::format("R{:02}={:016X} R{:02}={:016X} R{:02}={:016X} R{:02}={:016X}\n",
+ i + 0, xreg[i + 0], i + 1, xreg[i + 1],
+ i + 2, xreg[i + 2], i + 3, xreg[i + 3]);
+ for (size_t i = 0; i < 32; i += 2)
+ msg += fmt::format("V{:02}={:016X}_{:016X} V{:02}={:016X}_{:016X}\n",
+ i + 0, ctx.v[i + 0][0], ctx.v[i + 0][1],
+ i + 1, ctx.v[i + 1][0], ctx.v[i + 1][1]);
+ msg += fmt::format("PSTATE={:08X} FPCR={:08X} FPSR={:08X} TPIDR={:016X}\n", ctx.pstate, ctx.fpcr, ctx.fpsr, ctx.tpidr);
+ msg += fmt::format("{:20}{:20}{:20}{:20}{}\n", "Module", "Address", "Original Address", "Offset", "Symbol");
auto const backtrace = GetBacktraceFromContext(process, ctx);
for (auto const& entry : backtrace)
- LOG_ERROR(Core_ARM, "{:20}{:016X} {:016X} {:016X} {}", entry.module, entry.address, entry.original_address, entry.offset, entry.name);
+ msg += fmt::format("{:20}{:016X} {:016X} {:016X} {}\n", entry.module, entry.address, entry.original_address, entry.offset, entry.name);
+ LOG_ERROR(Core_ARM, "{}", msg);
}
const Kernel::DebugWatchpoint* ArmInterface::MatchingWatchpoint(