Add Memory debugger

This commit is contained in:
2026-01-04 18:02:45 +01:00
parent 1acecd03ee
commit bed24ff28a
5 changed files with 122 additions and 16 deletions

View File

@@ -7,9 +7,8 @@ set(CMAKE_CXX_STANDARD_REQUIRED true)
option(AMY_GOD_DEV "Turn this on if you think you are god" OFF)
# THis option should be disabled if you use STB_IMAGE in you main project
set(AMY_BUILD_STB_IMAGE 0)
set(AMY_BUILD_STB_TRUETYPE 1)
set(AMY_WITH_MPG123 "Include MP3 Support" CACHE BOOL 1)
option(AMY_BUILD_STB_IMAGE ON)
option(AMY_BUILD_STB_TRUETYPE ON)
add_subdirectory(vendor/libpicasso)
@@ -38,12 +37,13 @@ target_include_directories(${PROJECT_NAME} PRIVATE
)
target_link_libraries(${PROJECT_NAME} PUBLIC pica::pica)
target_link_libraries(${PROJECT_NAME} PUBLIC m z ctru citro3d mpg123)
target_compile_definitions(${PROJECT_NAME} PUBLIC
AMY_3DS
AMY_STB_IMAGE=${AMY_BUILD_STB_IMAGE}
AMY_STB_TT=${AMY_BUILD_STB_TRUETYPE}
AMY_WITH_MPG123=${AMY_WITH_MPG123}
)
if(${AMY_BUILD_STB_IMAGE})
target_compile_definitions(${PROJECT_NAME} PUBLIC AMY_STB_IMAGE)
endif()
if(${AMY_BUILD_STB_TRUETYPE})
target_compile_definitions(${PROJECT_NAME} PUBLIC AMY_STB_TT)
endif()
target_compile_options(${PROJECT_NAME} PUBLIC -Wno-psabi)
add_subdirectory(example)

View File

@@ -10,11 +10,28 @@
#include <amethyst/renderer.hpp>
#include <amethyst/texture.hpp>
#include <amethyst/utils.hpp>
#include <atomic>
namespace Amy {
void RegisterCxxExceptionHandler();
}
void* Malloc(size_t size);
void Free(void* ptr);
namespace Memory {
struct MemMetrics {
std::atomic<ull> Allocated = 0; ///< Total Allocated Memory
std::atomic<ull> Current = 0; ///< Current Allocated Memory
std::atomic<ull> Deleted = 0; ///< Total Deleted Memory
std::atomic<ull> Allocations = 0; ///< Current Allocations count
/// @brief Gets the Currently Allocated Memory
ull CurrentlyAllocated() { return Current; }
};
ull GetTotalAllocated();
ull GetTotalFreed();
ull GetCurrent();
ull GetAllocationCount();
} // namespace Memory
} // namespace Amy
using Iron = Amy::Iron;
using C3D = Amy::C3D;
using GTrace = Amy::GTrace;
using GTrace = Amy::GTrace;

View File

@@ -1,6 +1,10 @@
#include <amethyst.hpp>
#include <exception>
#include <iostream>
#include <map>
#include <vector>
#define TRACK_NEW_DELETE
#ifdef AMY_3DS
#include <3ds.h>
@@ -11,7 +15,7 @@ void NpiD7CxxExceptionHandler() {
std::cout << "[C++ Error Handler]" << std::endl;
try {
std::rethrow_exception(std::current_exception());
} catch (const std::exception& e) {
} catch (const std::exception &e) {
std::cout << "\n\n" << e.what() << std::endl;
}
aptSetHomeAllowed(false);
@@ -26,6 +30,60 @@ void NpiD7CxxExceptionHandler() {
}
#endif
static Amy::Memory::MemMetrics metrics;
#ifdef TRACK_NEW_DELETE
void *operator new(size_t size) {
void *ptr = malloc(size + sizeof(size_t));
if (!ptr) return ptr;
*((size_t *)ptr) = size;
metrics.Allocated.fetch_add(size, std::memory_order_relaxed);
metrics.Current.fetch_add(size, std::memory_order_relaxed);
metrics.Allocations.fetch_add(1, std::memory_order_relaxed);
return ptr + sizeof(size_t);
}
void operator delete(void *ptr, size_t size) noexcept {
void *raw = ptr - sizeof(size_t);
size_t szs = *((size_t *)raw);
metrics.Deleted.fetch_add(szs, std::memory_order_relaxed);
metrics.Current.fetch_sub(szs, std::memory_order_relaxed);
metrics.Allocations.fetch_sub(1, std::memory_order_relaxed);
free(raw);
}
void operator delete(void *ptr) noexcept {
void *raw = ptr - sizeof(size_t);
size_t szs = *((size_t *)raw);
metrics.Deleted.fetch_add(szs, std::memory_order_relaxed);
metrics.Current.fetch_sub(szs, std::memory_order_relaxed);
metrics.Allocations.fetch_sub(1, std::memory_order_relaxed);
free(raw);
}
void *operator new[](size_t size) {
void *ptr = malloc(size + sizeof(size_t));
if (!ptr) return ptr;
*((size_t *)ptr) = size;
metrics.Allocated.fetch_add(size, std::memory_order_relaxed);
metrics.Current.fetch_add(size, std::memory_order_relaxed);
metrics.Allocations.fetch_add(1, std::memory_order_relaxed);
return ptr + sizeof(size_t);
}
void operator delete[](void *ptr) noexcept {
void *raw = ptr - sizeof(size_t);
size_t szs = *((size_t *)raw);
metrics.Deleted.fetch_add(szs, std::memory_order_relaxed);
metrics.Current.fetch_sub(szs, std::memory_order_relaxed);
metrics.Allocations.fetch_sub(1, std::memory_order_relaxed);
free(raw);
}
#endif
namespace Amy {
void RegisterCxxExceptionHandler() {
@@ -33,4 +91,35 @@ void RegisterCxxExceptionHandler() {
std::set_terminate(NpiD7CxxExceptionHandler);
#endif
}
} // namespace Amy
void *Malloc(size_t size) {
#ifdef TRACK_NEW_DELETE
void *ptr = malloc(size + sizeof(size_t));
if (!ptr) return nullptr;
*((size_t *)ptr) = size;
metrics.Allocated.fetch_add(size, std::memory_order_relaxed);
metrics.Current.fetch_add(size, std::memory_order_relaxed);
metrics.Allocations.fetch_add(1, std::memory_order_relaxed);
return ptr + sizeof(size_t);
#else
return malloc(size);
#endif
}
void Free(void *ptr) {
#ifdef TRACK_NEW_DELETE
void *raw = ptr - sizeof(size_t);
size_t szs = *((size_t *)raw);
metrics.Deleted.fetch_add(szs, std::memory_order_relaxed);
metrics.Current.fetch_sub(szs, std::memory_order_relaxed);
metrics.Allocations.fetch_sub(1, std::memory_order_relaxed);
free(raw);
#else
free(ptr);
#endif
}
ull Memory::GetTotalAllocated() { return metrics.Allocated; }
ull Memory::GetTotalFreed() { return metrics.Deleted; }
ull Memory::GetCurrent() { return metrics.CurrentlyAllocated(); }
ull Memory::GetAllocationCount() { return metrics.Allocations; }
} // namespace Amy

View File

@@ -4,7 +4,7 @@
// Only include stb Code if we need it
// Otherwise we just build the header
#if AMY_STB_IMAGE == 1
#ifdef AMY_STB_IMAGE
#define STB_IMAGE_IMPLEMENTATION
#endif
#include <stb_image.h>

View File

@@ -3,9 +3,9 @@
#include <filesystem>
#include <fstream>
#if AMY_STB_TT == 1
//#ifdef AMY_STB_TT
#define STB_TRUETYPE_IMPLEMENTATION
#endif
//#endif
#include <stb_truetype.h>
namespace Amy {