From 6fb7ba7b13f3ee1a07288ad79d451df389c595ce Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Tue, 1 Sep 2026 19:36:47 +0200 Subject: [PATCH] Using the GE debugger before launching a game was a crash. De-claude a bit in Kotcrab's code. --- Common/GhidraClient.cpp | 6 ----- Windows/GEDebugger/GEDebugger.cpp | 44 ++++++++++++++++++++++--------- 2 files changed, 32 insertions(+), 18 deletions(-) diff --git a/Common/GhidraClient.cpp b/Common/GhidraClient.cpp index 9bc40f500a..41e7ae72ed 100644 --- a/Common/GhidraClient.cpp +++ b/Common/GhidraClient.cpp @@ -81,9 +81,6 @@ bool GhidraClient::FetchSymbols() { } const JsonNode *entriesNode = reader.root().getArray("symbols"); if (!entriesNode) { - // Null for a missing key, a non-array value, or a root that isn't an object at all - - // so any JSON that parses but isn't what we expect. The getTag() check below it could - // never catch that, since getArray() already filtered by tag. pendingResult_.error = "symbols is not an array"; return false; } @@ -115,9 +112,6 @@ bool GhidraClient::FetchTypes() { } const JsonNode *entriesNode = reader.root().getArray("types"); if (!entriesNode) { - // Null for a missing key, a non-array value, or a root that isn't an object at all - - // so any JSON that parses but isn't what we expect. The getTag() check below it could - // never catch that, since getArray() already filtered by tag. pendingResult_.error = "types is not an array"; return false; } diff --git a/Windows/GEDebugger/GEDebugger.cpp b/Windows/GEDebugger/GEDebugger.cpp index b446ffc55d..738c565e75 100644 --- a/Windows/GEDebugger/GEDebugger.cpp +++ b/Windows/GEDebugger/GEDebugger.cpp @@ -997,6 +997,9 @@ BOOL CGEDebugger::DlgProc(UINT message, WPARAM wParam, LPARAM lParam) { break; case WM_COMMAND: + if (!gpu) { + break; + } switch (LOWORD(wParam)) { case IDC_GEDBG_STEPDRAW: gpu->SetBreakNext(GPUDebug::BreakNext::DRAW); @@ -1074,13 +1077,18 @@ BOOL CGEDebugger::DlgProc(UINT message, WPARAM wParam, LPARAM lParam) { break; case IDC_GEDBG_TEXLEVELUP: - if (gpu != nullptr) { - UpdateTextureLevel(textureLevel_ + 1); - UpdatePreviews(); + if (!gpu) { + break; } + UpdateTextureLevel(textureLevel_ + 1); + UpdatePreviews(); break; case IDC_GEDBG_RESUME: + if (!gpu) { + break; + } + SetupPreviews(); primaryWindow->Clear(); secondWindow->Clear(); @@ -1088,9 +1096,7 @@ BOOL CGEDebugger::DlgProc(UINT message, WPARAM wParam, LPARAM lParam) { SetDlgItemText(m_hDlg, IDC_GEDBG_TEXADDR, L""); SetDlgItemText(m_hDlg, IDC_GEDBG_PRIMCOUNTER, L""); - if (gpu) { - gpu->SetBreakNext(GPUDebug::BreakNext::NONE); - } + gpu->SetBreakNext(GPUDebug::BreakNext::NONE); break; case IDC_GEDBG_RECORD: @@ -1115,21 +1121,26 @@ BOOL CGEDebugger::DlgProc(UINT message, WPARAM wParam, LPARAM lParam) { break; case IDC_GEDBG_FORCEOPAQUE: - if (gpu) { - forceOpaque_ = SendMessage(GetDlgItem(m_hDlg, IDC_GEDBG_FORCEOPAQUE), BM_GETCHECK, 0, 0) != 0; - UpdatePreviews(); + if (!gpu) { + break; } + forceOpaque_ = SendMessage(GetDlgItem(m_hDlg, IDC_GEDBG_FORCEOPAQUE), BM_GETCHECK, 0, 0) != 0; + UpdatePreviews(); break; case IDC_GEDBG_SHOWCLUT: - if (gpu) { - showClut_ = SendMessage(GetDlgItem(m_hDlg, IDC_GEDBG_SHOWCLUT), BM_GETCHECK, 0, 0) != 0; - UpdatePreviews(); + if (!gpu) { + break; } + showClut_ = SendMessage(GetDlgItem(m_hDlg, IDC_GEDBG_SHOWCLUT), BM_GETCHECK, 0, 0) != 0; + UpdatePreviews(); break; case IDC_GEDBG_SETPRIMFILTER: { + if (!gpu) { + break; + } std::string value; if (InputBox_GetString(GetModuleHandle(NULL), m_hDlg, L"Prim counter ranges", gpu->GetRestrictPrims(), value)) { gpu->SetRestrictPrims(value.c_str()); @@ -1140,10 +1151,16 @@ BOOL CGEDebugger::DlgProc(UINT message, WPARAM wParam, LPARAM lParam) { break; case WM_GEDBG_STEPDISPLAYLIST: + if (!gpu) { + break; + } gpu->SetBreakNext(GPUDebug::BreakNext::OP); break; case WM_GEDBG_TOGGLEPCBREAKPOINT: + if (!gpu) { + break; + } { u32 pc = (u32)wParam; bool temp; @@ -1163,6 +1180,9 @@ BOOL CGEDebugger::DlgProc(UINT message, WPARAM wParam, LPARAM lParam) { break; case WM_GEDBG_RUNTOWPARAM: + if (!gpu) { + break; + } { u32 pc = (u32)wParam; gpu->GetBreakpoints()->AddAddressBreakpoint(pc, true);