mirror of
https://github.com/hrydgard/ppsspp.git
synced 2026-11-15 18:49:51 +01:00
Show module.section+offset next to addresses in exception/stack-trace logs
Added KernelModuleAddressDescription() (Core/HLE/sceKernelModule.cpp), which looks up which currently loaded module (and text/data/bss/segment section within it) an address falls in, e.g. "EBOOT.BIN.text+1234". Wired it into: - Core_MemoryException/Core_ExecException/Core_BreakException (Core/Core.cpp), appended next to every address/pc/ra shown in their log lines. - FormatStackTrace (Core/MemFault.cpp), appended per-frame next to the existing symbol description. This makes crash/exception logs actionable even when there's no symbol at the faulting address - you at least get which module and section it's in, useful for reverse engineering unfamiliar code. Verified live via headless: injected a MIPS break instruction at the current PC (through Tools/wsdbg) and confirmed the log line changed from "break instruction hit at 088040ac" to "break instruction hit at 088040ac [sceDisplayWaitVblank Test.text+ac]". Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01XDNwPPuidmNxQGRJxBuRL6
This commit is contained in:
1 parent
878d2aeb0e
commit
9b577b5f46
4 files changed
+56
-8
No files matched your search
+7
-1
@@ -48,6 +48,7 @@
|
||||
#include "Core/MIPS/MIPSStackWalk.h"
|
||||
#include "Core/MIPS/MIPSDebugInterface.h"
|
||||
#include "Core/HLE/sceKernelThread.h"
|
||||
#include "Core/HLE/sceKernelModule.h"
|
||||
|
||||
namespace Memory {
|
||||
|
||||
@@ -373,7 +374,12 @@ std::string FormatStackTrace(const std::vector<MIPSStackWalk::StackFrame> &frame
|
||||
std::stringstream str;
|
||||
for (const auto &frame : frames) {
|
||||
std::string desc = g_symbolMap->GetDescription(frame.entry);
|
||||
str << StringFromFormat("%s (%08x+%03x, pc: %08x sp: %08x)\n", desc.c_str(), frame.entry, frame.pc - frame.entry, frame.pc, frame.sp);
|
||||
std::string moduleDesc = KernelModuleAddressDescription(frame.pc);
|
||||
if (!moduleDesc.empty()) {
|
||||
str << StringFromFormat("%s [%s] (%08x+%03x, pc: %08x sp: %08x)\n", desc.c_str(), moduleDesc.c_str(), frame.entry, frame.pc - frame.entry, frame.pc, frame.sp);
|
||||
} else {
|
||||
str << StringFromFormat("%s (%08x+%03x, pc: %08x sp: %08x)\n", desc.c_str(), frame.entry, frame.pc - frame.entry, frame.pc, frame.sp);
|
||||
}
|
||||
}
|
||||
return str.str();
|
||||
}
|
||||
Reference in new issue
Block a user