From 1010a07f65aba3f42c2f51345376230784c90159 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Sun, 12 Jul 2020 16:47:53 +0200 Subject: [PATCH] Expose more information on the crash screen (current kernel thread) --- Core/HLE/sceKernel.cpp | 6 ++++++ Core/HLE/sceKernel.h | 4 ++++ Core/HLE/sceKernelThread.cpp | 24 +++++++++++++----------- Core/HLE/sceKernelThread.h | 3 +++ UI/EmuScreen.cpp | 27 ++++++++++++++++++--------- 5 files changed, 44 insertions(+), 20 deletions(-) diff --git a/Core/HLE/sceKernel.cpp b/Core/HLE/sceKernel.cpp index ae804a452..70d1f13ca 100644 --- a/Core/HLE/sceKernel.cpp +++ b/Core/HLE/sceKernel.cpp @@ -297,6 +297,12 @@ bool __KernelIsRunning() { return kernelRunning; } +std::string __KernelStateSummary() { + std::string threadSummary = __KernelThreadingSummary(); + return StringFromFormat("%s", threadSummary.c_str()); +} + + void sceKernelExitGame() { INFO_LOG(SCEKERNEL, "sceKernelExitGame"); diff --git a/Core/HLE/sceKernel.h b/Core/HLE/sceKernel.h index 96e94cb76..692d23ec8 100644 --- a/Core/HLE/sceKernel.h +++ b/Core/HLE/sceKernel.h @@ -18,6 +18,7 @@ #pragma once #include +#include #include "Common/Common.h" #include "Common/Swap.h" @@ -374,6 +375,9 @@ void __KernelDoState(PointerWrap &p); bool __KernelIsRunning(); bool __KernelLoadExec(const char *filename, SceKernelLoadExecParam *param); +// For crash reporting. +std::string __KernelStateSummary(); + int sceKernelLoadExec(const char *filename, u32 paramPtr); void sceKernelExitGame(); diff --git a/Core/HLE/sceKernelThread.cpp b/Core/HLE/sceKernelThread.cpp index c125764a8..d892b2c1e 100644 --- a/Core/HLE/sceKernelThread.cpp +++ b/Core/HLE/sceKernelThread.cpp @@ -372,6 +372,8 @@ public: class PSPThread : public KernelObject { public: + PSPThread() : debug(currentMIPS, context) {} + const char *GetName() override { return nt.name; } const char *GetTypeName() override { return "Thread"; } void GetQuickInfo(char *ptr, int size) override @@ -491,10 +493,6 @@ public: return true; } - PSPThread() : debug(currentMIPS, context) { - currentStack.start = 0; - } - // Can't use a destructor since savestates will call that too. void Cleanup() { @@ -573,14 +571,14 @@ public: } } - NativeThread nt; + NativeThread nt{}; - ThreadWaitInfo waitInfo; - SceUID moduleId; + ThreadWaitInfo waitInfo{}; + SceUID moduleId = -1; - bool isProcessingCallbacks; - u32 currentMipscallId; - SceUID currentCallbackId; + bool isProcessingCallbacks = false; + u32 currentMipscallId = -1; + SceUID currentCallbackId = -1; PSPThreadContext context; KernelThreadDebugInterface debug; @@ -597,7 +595,7 @@ public: // These are stacks that aren't "active" right now, but will pop off once the func returns. std::vector pushedStacks; - StackInfo currentStack; + StackInfo currentStack{}; // For thread end. std::vector waitingThreads; @@ -1184,6 +1182,10 @@ void __KernelThreadingShutdown() { pendingDeleteThreads.clear(); } +std::string __KernelThreadingSummary() { + return StringFromFormat("Cur thread: %s", __GetCurrentThread()->GetName()); +} + const char *__KernelGetThreadName(SceUID threadID) { u32 error; diff --git a/Core/HLE/sceKernelThread.h b/Core/HLE/sceKernelThread.h index a3fbbf1ae..4c3041f65 100644 --- a/Core/HLE/sceKernelThread.h +++ b/Core/HLE/sceKernelThread.h @@ -155,6 +155,9 @@ void __KernelThreadingInit(); void __KernelThreadingDoState(PointerWrap &p); void __KernelThreadingDoStateLate(PointerWrap &p); void __KernelThreadingShutdown(); + +std::string __KernelThreadingSummary(); + KernelObject *__KernelThreadObject(); KernelObject *__KernelCallbackObject(); diff --git a/UI/EmuScreen.cpp b/UI/EmuScreen.cpp index e7367eda9..28c215967 100644 --- a/UI/EmuScreen.cpp +++ b/UI/EmuScreen.cpp @@ -1273,34 +1273,43 @@ static void DrawCrashDump(DrawBuffer *draw2d) { char versionString[256]; sprintf(versionString, "%s", PPSSPP_GIT_VERSION); // TODO: Draw a lot more information. Full register set, and so on. + +#ifdef _DEBUG + char build[] = "Debug"; +#else + char build[] = "Release"; +#endif snprintf(statbuf, sizeof(statbuf), R"(%s -Game ID: %s -Game Title: %s -PPSSPP: %s +Game ID (Title): %s (%s) +PPSSPP build: %s (%s) )", ExceptionTypeAsString(info.type), g_paramSFO.GetDiscID().c_str(), g_paramSFO.GetValueString("TITLE").c_str(), - versionString + versionString, + build ); draw2d->SetFontScale(.7f, .7f); int x = 20; int y = 50; draw2d->DrawTextShadow(ubuntu24, statbuf, x, y, 0xFFFFFFFF, FLAG_DYNAMIC_ASCII); + y += 100; if (info.type == ExceptionType::MEMORY) { snprintf(statbuf, sizeof(statbuf), R"( -Access Type: % s -Address: % 08x -PC: % 08x)", +Access: %s at %08x +PC: %08x)", MemoryExceptionTypeAsString(info.memory_type), info.address, info.pc); - - y += 150; draw2d->DrawTextShadow(ubuntu24, statbuf, x, y, 0xFFFFFFFF, FLAG_DYNAMIC_ASCII); + y += 120; } + + std::string kernelState = __KernelStateSummary(); + + draw2d->DrawTextShadow(ubuntu24, kernelState.c_str(), x, y, 0xFFFFFFFF, FLAG_DYNAMIC_ASCII); } static void DrawAudioDebugStats(DrawBuffer *draw2d, const Bounds &bounds) {