From 3fe39464f12f3ad2d6f7dae298829380b5a265aa Mon Sep 17 00:00:00 2001 From: Max Roncace Date: Fri, 20 Mar 2026 20:59:50 -0400 Subject: [PATCH] Add more heap names for debug --- libs/JSystem/include/JSystem/JKernel/JKRHeap.h | 3 +++ .../src/J3DGraphLoader/J3DModelLoader.cpp | 2 +- libs/JSystem/src/JFramework/JFWSystem.cpp | 1 - libs/JSystem/src/JKernel/JKRExpHeap.cpp | 1 + libs/JSystem/src/JKernel/JKRHeap.cpp | 8 ++++++++ src/d/actor/d_a_alink_swindow.inc | 1 + src/d/actor/d_a_player.cpp | 1 + src/d/actor/d_a_title.cpp | 1 + src/d/d_com_inf_game.cpp | 1 + src/d/d_k_wpillar.cpp | 1 + src/d/d_menu_dmap.cpp | 1 + src/d/d_menu_fmap.cpp | 1 + src/d/d_particle.cpp | 1 + src/d/d_resorce.cpp | 2 ++ src/d/d_s_logo.cpp | 2 ++ src/d/d_s_name.cpp | 1 + src/dusk/imgui/ImGuiHeapOverlay.cpp | 18 +++++++++++++----- src/f_op/f_op_actor_mng.cpp | 11 +++-------- src/m_Do/m_Do_ext.cpp | 1 + src/m_Do/m_Do_graphic.cpp | 1 + 20 files changed, 44 insertions(+), 15 deletions(-) diff --git a/libs/JSystem/include/JSystem/JKernel/JKRHeap.h b/libs/JSystem/include/JSystem/JKernel/JKRHeap.h index db4d40b0a3..2ff883c393 100644 --- a/libs/JSystem/include/JSystem/JKernel/JKRHeap.h +++ b/libs/JSystem/include/JSystem/JKernel/JKRHeap.h @@ -217,11 +217,14 @@ public: #if TARGET_PC void setName(const char* name); + void setNamef(const char* fmt, ...); const char* getName() const; #define JKRHEAP_NAME(heap, name) (heap)->setName(name) +#define JKRHEAP_NAMEF(heap, name, ...) (heap)->setNamef(name, __VA_ARGS__) #else #define JKRHEAP_NAME(heap, name) +#define JKRHEAP_NAMEF(heap, name) #endif }; diff --git a/libs/JSystem/src/J3DGraphLoader/J3DModelLoader.cpp b/libs/JSystem/src/J3DGraphLoader/J3DModelLoader.cpp index b8e412415d..72a48007c0 100644 --- a/libs/JSystem/src/J3DGraphLoader/J3DModelLoader.cpp +++ b/libs/JSystem/src/J3DGraphLoader/J3DModelLoader.cpp @@ -264,7 +264,7 @@ void J3DModelLoader::setupBBoardInfo() { mpModelData->getJointNodePointer(i)->setMtxType(0); break; default: - OSReport("WRONG SHAPE MATRIX TYPE (__FILE__)\n"); + OSReport("WRONG SHAPE MATRIX TYPE (%d)\n", r26->mShapeMtxType); break; } } diff --git a/libs/JSystem/src/JFramework/JFWSystem.cpp b/libs/JSystem/src/JFramework/JFWSystem.cpp index 66a1a19960..e84d19a824 100644 --- a/libs/JSystem/src/JFramework/JFWSystem.cpp +++ b/libs/JSystem/src/JFramework/JFWSystem.cpp @@ -45,7 +45,6 @@ void JFWSystem::firstInit() { OSInit(); DVDInit(); rootHeap = JKRExpHeap::createRoot(CSetUpParam::maxStdHeaps, false); - JKRHEAP_NAME(rootHeap, "Root"); systemHeap = JKRExpHeap::create(CSetUpParam::sysHeapSize, rootHeap, false); JKRHEAP_NAME(systemHeap, "System"); } diff --git a/libs/JSystem/src/JKernel/JKRExpHeap.cpp b/libs/JSystem/src/JKernel/JKRExpHeap.cpp index 7774a33959..4c0c6bf1ae 100644 --- a/libs/JSystem/src/JKernel/JKRExpHeap.cpp +++ b/libs/JSystem/src/JKernel/JKRExpHeap.cpp @@ -51,6 +51,7 @@ JKRExpHeap* JKRExpHeap::createRoot(int maxHeaps, bool errorFlag) { #endif heap = JKR_NEW_ARGS (mem1) JKRExpHeap(start1, alignedSize, NULL, errorFlag); sRootHeap = heap; + JKRHEAP_NAME(sRootHeap, "Root"); } heap->field_0x6e = true; return heap; diff --git a/libs/JSystem/src/JKernel/JKRHeap.cpp b/libs/JSystem/src/JKernel/JKRHeap.cpp index 0670f511e2..bc02d877fb 100644 --- a/libs/JSystem/src/JKernel/JKRHeap.cpp +++ b/libs/JSystem/src/JKernel/JKRHeap.cpp @@ -699,6 +699,14 @@ void JKRHeap::setName(const char* name) { strncpy(mName, name, sizeof(mName) - 1); mName[sizeof(mName) - 1] = '\0'; } + +void JKRHeap::setNamef(const char* fmt, ...) { + va_list args; + va_start(args, fmt); + vsnprintf(mName, sizeof(mName), fmt, args); + va_end(args); +} + const char* JKRHeap::getName() const { return mName; } diff --git a/src/d/actor/d_a_alink_swindow.inc b/src/d/actor/d_a_alink_swindow.inc index cff5ebeb05..cf3593dfce 100644 --- a/src/d/actor/d_a_alink_swindow.inc +++ b/src/d/actor/d_a_alink_swindow.inc @@ -43,6 +43,7 @@ void daAlink_c::setOriginalHeap(JKRExpHeap** i_ppheap, u32 i_size) { JKRHeap* parent = mDoExt_getGameHeap(); JKRExpHeap* heap = JKRExpHeap::create(size + (var_r29 + var_r28), parent, true); + JKRHEAP_NAME(heap, "Alink original"); *i_ppheap = heap; } } diff --git a/src/d/actor/d_a_player.cpp b/src/d/actor/d_a_player.cpp index 1c2383511f..c091fae5dd 100644 --- a/src/d/actor/d_a_player.cpp +++ b/src/d/actor/d_a_player.cpp @@ -260,6 +260,7 @@ void daPy_anmHeap_c::createHeap(daPy_anmHeap_c::daAlinkHEAP_TYPE i_heapType) { JKRHeap* tmp; mAnimeHeap = mDoExt_createSolidHeapFromGameToCurrent(&tmp, size, 0x20); + JKRHEAP_NAMEF(mAnimeHeap, "Alink anime type %d", i_heapType); if (i_heapType == 4) { tmpWork = JKR_NEW_ARRAY(char, size); diff --git a/src/d/actor/d_a_title.cpp b/src/d/actor/d_a_title.cpp index 923365993c..88ce62ec5c 100644 --- a/src/d/actor/d_a_title.cpp +++ b/src/d/actor/d_a_title.cpp @@ -138,6 +138,7 @@ int daTitle_c::create() { m2DHeap = JKRCreateExpHeap(0x8000, mDoExt_getGameHeap(), false); JUT_ASSERT(345, m2DHeap != NULL); + JKRHEAP_NAME(m2DHeap, "daTitle_c::m2DHeap"); loadWait_init(); g_daTitHIO.id = mDoHIO_CREATE_CHILD("タイトルロゴ", &g_daTitHIO); diff --git a/src/d/d_com_inf_game.cpp b/src/d/d_com_inf_game.cpp index 8da33212cf..393b6c9762 100644 --- a/src/d/d_com_inf_game.cpp +++ b/src/d/d_com_inf_game.cpp @@ -2080,6 +2080,7 @@ void dComIfGp_createSubExpHeap2D() { if (dComIfGp_getSubExpHeap2D(i) == NULL) { JKRExpHeap* i_heap = JKRCreateExpHeap(size, dComIfGp_getExpHeap2D(), false); JUT_ASSERT(3576, i_heap != NULL); + JKRHEAP_NAMEF(i_heap, "SubExpHeap2D %d", i); dComIfGp_setSubExpHeap2D(i, i_heap); } } diff --git a/src/d/d_k_wpillar.cpp b/src/d/d_k_wpillar.cpp index 7edc491b44..70efec89a2 100644 --- a/src/d/d_k_wpillar.cpp +++ b/src/d/d_k_wpillar.cpp @@ -38,6 +38,7 @@ int dkWpillar_c::create() { mpHeap = mDoExt_createSolidHeapFromGameToCurrent(0x2200, 0x20); if (mpHeap != NULL) { + JKRHEAP_NAME(mpHeap, "d_k_wpillar::mpModel"); J3DModelData* modelData = (J3DModelData*)dComIfG_getObjectRes(l_arcName, 0x1C); JUT_ASSERT(96, modelData); diff --git a/src/d/d_menu_dmap.cpp b/src/d/d_menu_dmap.cpp index 537d264b3b..109e5aeb20 100644 --- a/src/d/d_menu_dmap.cpp +++ b/src/d/d_menu_dmap.cpp @@ -100,6 +100,7 @@ dMenu_DmapBg_c::dMenu_DmapBg_c(JKRExpHeap* i_heap, STControl* i_stick) { mpTalkHeap = JKRCreateExpHeap(0x32000, mpHeap, false); JUT_ASSERT(624, mpTalkHeap != NULL); + JKRHEAP_NAME(mpTalkHeap, "dMenu_DmapBg_c::mpTalkHeap"); mpItemExplain = NULL; diff --git a/src/d/d_menu_fmap.cpp b/src/d/d_menu_fmap.cpp index cd370a56d7..c8969f2ac3 100644 --- a/src/d/d_menu_fmap.cpp +++ b/src/d/d_menu_fmap.cpp @@ -192,6 +192,7 @@ dMenu_Fmap_c::dMenu_Fmap_c(JKRExpHeap* i_heap, STControl* i_stick, CSTControl* i mpTalkHeap = JKRCreateExpHeap(HEAP_SIZE(0x32000, 0x40000), mpHeap, false); JUT_ASSERT(359, mpTalkHeap != NULL); + JKRHEAP_NAME(mpTalkHeap, "dMenu_Fmap_c::mpTalkHeap"); field_0x200 = 0; mIsWarpMap = false; diff --git a/src/d/d_particle.cpp b/src/d/d_particle.cpp index 2a8e75d82e..6c8d6e3f75 100644 --- a/src/d/d_particle.cpp +++ b/src/d/d_particle.cpp @@ -1173,6 +1173,7 @@ dPa_control_c::dPa_control_c() { size_t heapSize = 0x96000; #endif m_resHeap = JKRCreateExpHeap(heapSize, mDoExt_getArchiveHeap(), false); + JKRHEAP_NAME(m_resHeap, "Particle control"); JUT_ASSERT(2426, m_resHeap != NULL); mHeap = NULL; mSceneHeap = NULL; diff --git a/src/d/d_resorce.cpp b/src/d/d_resorce.cpp index 50192f5a38..1dce982025 100644 --- a/src/d/d_resorce.cpp +++ b/src/d/d_resorce.cpp @@ -606,6 +606,7 @@ int dRes_info_c::setRes() { heap->lock(); mDataHeap = mDoExt_createSolidHeapToCurrent(0, heap, 0x20); JUT_ASSERT(1260, mDataHeap != NULL); + JKRHEAP_NAMEF(mDataHeap, "Resource (%s)", mArchiveName); int rt = loadResource(); mDoExt_restoreCurrentHeap(); @@ -624,6 +625,7 @@ int dRes_info_c::setRes() { OSReport_Error("<%s.arc> mDMCommandsetRes: can't alloc memory\n", mArchiveName); return -1; } + JKRHEAP_NAMEF(mDataHeap, "Resource (%s)", mArchiveName); int rt = loadResource(); mDoExt_restoreCurrentHeap(); r28 = mDoExt_adjustSolidHeap(mDataHeap); diff --git a/src/d/d_s_logo.cpp b/src/d/d_s_logo.cpp index 4923f93d65..a878de8106 100644 --- a/src/d/d_s_logo.cpp +++ b/src/d/d_s_logo.cpp @@ -945,9 +945,11 @@ static int phase_0(dScnLogo_c* i_this) { i_this->mLogoHeap = JKRExpHeap::create(i_this->dummyGameAlloc, var_r29, NULL, false); JUT_ASSERT(1525, i_this->mLogoHeap != NULL); + JKRHEAP_NAME(i_this->mLogoHeap, "Logo"); i_this->mLogo01Heap = JKRCreateExpHeap(var_r28, i_this->mLogoHeap, false); JUT_ASSERT(1528, i_this->mLogo01Heap != NULL); + JKRHEAP_NAME(i_this->mLogo01Heap, "Logo01"); #if VERSION == VERSION_GCN_PAL switch (i_this->getPalLanguage()) { diff --git a/src/d/d_s_name.cpp b/src/d/d_s_name.cpp index 4940d3d604..5f22177654 100644 --- a/src/d/d_s_name.cpp +++ b/src/d/d_s_name.cpp @@ -71,6 +71,7 @@ s32 dScnName_c::create() { if (phase_state == cPhs_COMPLEATE_e) { mHeap = JKRCreateExpHeap(HEAP_SIZE(0x180000, 0x1C0000), mDoExt_getGameHeap(), false); JUT_ASSERT(289, mHeap != NULL); + JKRHEAP_NAME(mHeap, "File select"); field_0x1d0 = (JKRExpHeap*)mDoExt_setCurrentHeap(mHeap); diff --git a/src/dusk/imgui/ImGuiHeapOverlay.cpp b/src/dusk/imgui/ImGuiHeapOverlay.cpp index 43e495587f..588857cedb 100644 --- a/src/dusk/imgui/ImGuiHeapOverlay.cpp +++ b/src/dusk/imgui/ImGuiHeapOverlay.cpp @@ -1,4 +1,5 @@ #include +#include #include "JSystem/JFramework/JFWSystem.h" #include "JSystem/JKernel/JKRHeap.h" @@ -58,10 +59,10 @@ namespace dusk { }; } - static const char* GetHeapName(const JKRHeap* heap) { + static std::optional GetHeapName(const JKRHeap* heap) { const auto name = heap->getName(); if (strlen(name) == 0) { - return "Unknown"; + return std::nullopt; } return name; @@ -74,13 +75,20 @@ namespace dusk { auto indentSize = depth * 16; if (indentSize != 0) ImGui::Indent(indentSize); - ImGui::TextUnformatted(GetHeapName(heap)); + auto heapName = GetHeapName(heap); + if (heapName.has_value()) { + ImGui::TextUnformatted(heapName.value()); + } else { + char unkNameBuf[32]; + snprintf(unkNameBuf, sizeof(unkNameBuf), "Unknown (%p)", heap); + ImGui::TextUnformatted(unkNameBuf); + } if (indentSize != 0) ImGui::Unindent(indentSize); ImGui::TableNextColumn(); ImGui::ProgressBar( - 1 - (f32)heap->getFreeSize() / (f32)heap->getSize(), + heap->getSize() > 0 ? 1 - (f32)heap->getFreeSize() / (f32)heap->getSize() : 0.0f, ImVec2(ImGui::GetContentRegionAvail().x, 0)); ImGui::TableNextColumn(); @@ -100,4 +108,4 @@ namespace dusk { DrawHeap(*iter, depth + 1); } } -} \ No newline at end of file +} diff --git a/src/f_op/f_op_actor_mng.cpp b/src/f_op/f_op_actor_mng.cpp index fa4da69e68..538d8ff544 100644 --- a/src/f_op/f_op_actor_mng.cpp +++ b/src/f_op/f_op_actor_mng.cpp @@ -412,6 +412,7 @@ bool fopAcM_entrySolidHeap_(fopAc_ac_c* i_actor, heapCallbackFunc i_heapCallback if (dummy_heap != NULL) { heap = mDoExt_createSolidHeap(-1, dummy_heap, 0x20); JUT_ASSERT(1211, heap); + JKRHEAP_NAMEF(heap, "Actor mng (%s)", procNameString); if (fopAcM::HeapAdjustVerbose) { // Attempting registration with max dummy heap. @@ -453,6 +454,7 @@ bool fopAcM_entrySolidHeap_(fopAc_ac_c* i_actor, heapCallbackFunc i_heapCallback heap = mDoExt_createSolidHeapFromGame(i_size, 0x20); if (heap != NULL) { + JKRHEAP_NAMEF(heap, "Actor mng (%s)", procNameString); if (fopAcM::HeapAdjustVerbose) { // Attempting registration with estimated heap size. %08x [%s] OS_REPORT("見積もりヒープサイズで登録してみます。%08x [%s]\n", heap, @@ -734,14 +736,7 @@ u8 var_r30 = fopAcM::HeapAdjustEntry; fopAcM::HeapAdjustEntry = var_r30; #if TARGET_PC - char buf[32]; - snprintf( - buf, - sizeof(buf), - "Actor %d (%s)", - i_actor->id, - GetProcName(i_actor->profname)); - JKRHEAP_NAME(i_actor->heap, buf); + JKRHEAP_NAMEF(i_actor->heap, "Actor %d (%s)", i_actor->id, GetProcName(i_actor->profname)); #endif return result; diff --git a/src/m_Do/m_Do_ext.cpp b/src/m_Do/m_Do_ext.cpp index 8d46884de9..a7829bdb50 100644 --- a/src/m_Do/m_Do_ext.cpp +++ b/src/m_Do/m_Do_ext.cpp @@ -659,6 +659,7 @@ static JKRAssertHeap* AssertHeap; JKRAssertHeap* mDoExt_createAssertHeap(JKRHeap* parentHeap) { JUT_ASSERT(1666, AssertHeap == NULL); AssertHeap = JKRAssertHeap::create(parentHeap); + JKRHEAP_NAME(AssertHeap, "Assert"); return AssertHeap; } diff --git a/src/m_Do/m_Do_graphic.cpp b/src/m_Do/m_Do_graphic.cpp index 481bf8efff..72180b3c40 100644 --- a/src/m_Do/m_Do_graphic.cpp +++ b/src/m_Do/m_Do_graphic.cpp @@ -2220,6 +2220,7 @@ static void dummy() { int mDoGph_Create() { JKRSolidHeap* heap = mDoExt_createSolidHeapToCurrent(0, NULL, 0); + JKRHEAP_NAME(heap, "mDoGph"); mDoGph_gInf_c::create(); dComIfGd_init(); u32 var_r30 = mDoExt_adjustSolidHeap(heap);