mirror of
https://git.eden-emu.dev/archive/citron
synced 2026-04-07 11:48:50 -04:00
feat: Enhanced Nintendo SDK crash detection and recovery system
* Enhanced ARM interface backtrace logging with Nintendo SDK crash detection - Detects nnSdk module crashes and initialization-time failures - Provides detailed recovery suggestions and logging - Identifies recoverable vs non-recoverable crashes * Improved physical core crash handling - Enhanced prefetch abort and data abort recovery - Continues execution for Nintendo SDK crashes instead of suspending - Better logging for crash analysis and debugging * Expanded SVC exception handling - Added Nintendo SDK-specific crash recovery logic - Enhanced general crash recovery for low-address and assertion failures - Improved UE4 crash handling integration * Updated Horizon OS version to 20.4.0 - Updated HOS_VERSION_MINOR from 1 to 4 - Updated HOS_VERSION_MICRO from 5 to 0 - Updated version hash and display strings accordingly * Fixed Vulkan turbo mode performance metrics - Added proper type casting for execution time comparisons - Prevents potential integer overflow issues Signed-off-by: Zephyron <zephyron@citron-emu.org>
This commit is contained in:
@@ -18,9 +18,45 @@ void ArmInterface::LogBacktrace(Kernel::KProcess* process) const {
|
||||
"Offset", "Symbol");
|
||||
LOG_ERROR(Core_ARM, "");
|
||||
const auto backtrace = GetBacktraceFromContext(process, ctx);
|
||||
|
||||
// Enhanced Nintendo SDK crash detection and recovery
|
||||
bool is_nintendo_sdk_crash = false;
|
||||
bool is_initialization_crash = false;
|
||||
|
||||
for (const auto& entry : backtrace) {
|
||||
LOG_ERROR(Core_ARM, "{:20}{:016X} {:016X} {:016X} {}", entry.module, entry.address,
|
||||
entry.original_address, entry.offset, entry.name);
|
||||
|
||||
// Check for Nintendo SDK related crashes
|
||||
if (entry.module.find("nnSdk") != std::string::npos ||
|
||||
entry.name.find("nn::diag::detail::Abort") != std::string::npos ||
|
||||
entry.name.find("nn::init::Start") != std::string::npos) {
|
||||
is_nintendo_sdk_crash = true;
|
||||
LOG_WARNING(Core_ARM, "Nintendo SDK crash detected in module: {}", entry.module);
|
||||
}
|
||||
|
||||
// Check for initialization-time crashes
|
||||
if (entry.name.find("nn::init::Start") != std::string::npos ||
|
||||
entry.offset < 0x10000) {
|
||||
is_initialization_crash = true;
|
||||
LOG_WARNING(Core_ARM, "Initialization-time crash detected at offset: 0x{:016X}", entry.offset);
|
||||
}
|
||||
}
|
||||
|
||||
// Log recovery suggestions for Nintendo SDK crashes
|
||||
if (is_nintendo_sdk_crash) {
|
||||
LOG_WARNING(Core_ARM, "Nintendo SDK crash detected - this may be recoverable");
|
||||
LOG_INFO(Core_ARM, "Many Nintendo SDK crashes during initialization can be safely ignored");
|
||||
LOG_INFO(Core_ARM, "The game may continue to function normally despite this crash");
|
||||
|
||||
if (is_initialization_crash) {
|
||||
LOG_INFO(Core_ARM, "This appears to be an initialization-time crash");
|
||||
LOG_INFO(Core_ARM, "Attempting to continue execution...");
|
||||
}
|
||||
|
||||
// Additional recovery information
|
||||
LOG_INFO(Core_ARM, "Recovery strategy: Continue execution and monitor for further issues");
|
||||
LOG_INFO(Core_ARM, "If the game continues to crash, consider restarting the emulator");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user