From 4bd46c50be85c0f906528b112dadf599e20bcc81 Mon Sep 17 00:00:00 2001 From: Coxxs <58-coxxs@users.noreply.git.ryujinx.app> Date: Thu, 23 Oct 2025 23:39:39 +0800 Subject: [PATCH 1/3] Create minidump at ProcessUnhandledException --- src/Ryujinx.HLE/HOS/Horizon.cs | 5 +++++ src/Ryujinx/Program.cs | 30 ++++++++++++++++++++++++++++++ 2 files changed, 35 insertions(+) diff --git a/src/Ryujinx.HLE/HOS/Horizon.cs b/src/Ryujinx.HLE/HOS/Horizon.cs index 83aaa1f4d..895d0c2bf 100644 --- a/src/Ryujinx.HLE/HOS/Horizon.cs +++ b/src/Ryujinx.HLE/HOS/Horizon.cs @@ -510,6 +510,11 @@ namespace Ryujinx.HLE.HOS } } + public string DebugGetApplicationProcessMinidump() + { + return DebugGetApplicationProcess()?.Debugger?.GetMinidump(); + } + internal KProcess DebugGetApplicationProcess() { lock (KernelContext.Processes) diff --git a/src/Ryujinx/Program.cs b/src/Ryujinx/Program.cs index d77e79756..90fc568d5 100644 --- a/src/Ryujinx/Program.cs +++ b/src/Ryujinx/Program.cs @@ -382,6 +382,11 @@ namespace Ryujinx.Ava exceptions.Add(initialException); } + if (isTerminating) + { + TryWriteApplicationMinidump(); + } + foreach (Exception e in exceptions) { string message = $"Unhandled exception caught: {e}"; @@ -400,6 +405,31 @@ namespace Ryujinx.Ava } } + private static void TryWriteApplicationMinidump() + { + try + { + if (HLE.Switch.Shared is not { } device) + { + return; + } + + var minidump = device?.System?.DebugGetApplicationProcessMinidump(); + + if (minidump == null) + { + Logger.Warning?.Print(LogClass.Application, "Failed to create minidump"); + return; + } + + Logger.Info?.Print(LogClass.Application, minidump); + } + catch (Exception e) + { + Logger.Error?.Print(LogClass.Application, $"Failed to create minidump: {e.Message}"); + } + } + internal static void Exit() { DiscordIntegrationModule.Exit(); From c65fed8af7cb0cf12217a4432f2671985adbb866 Mon Sep 17 00:00:00 2001 From: Coxxs <58-coxxs@users.noreply.git.ryujinx.app> Date: Thu, 13 Nov 2025 17:30:22 +0800 Subject: [PATCH 2/3] Print a message first in case it crashes again during minidump creation --- src/Ryujinx/Program.cs | 46 ++++++++++++++++++------------------------ 1 file changed, 20 insertions(+), 26 deletions(-) diff --git a/src/Ryujinx/Program.cs b/src/Ryujinx/Program.cs index 90fc568d5..68a871f51 100644 --- a/src/Ryujinx/Program.cs +++ b/src/Ryujinx/Program.cs @@ -384,7 +384,26 @@ namespace Ryujinx.Ava if (isTerminating) { - TryWriteApplicationMinidump(); + try + { + // Print a short message first just in case it crashes again during minidump creation (should not happen) + Logger.Error?.Print(LogClass.Application, $"Unhandled exception caught: {initialException.GetType().Name}. Creating guest program minidump..."); + + var minidump = HLE.Switch.Shared?.System?.DebugGetApplicationProcessMinidump(); + + if (minidump == null) + { + Logger.Warning?.Print(LogClass.Application, "Failed to create minidump"); + } + else + { + Logger.Info?.Print(LogClass.Application, minidump); + } + } + catch (Exception e) + { + Logger.Error?.Print(LogClass.Application, $"Failed to create minidump: {e.Message}"); + } } foreach (Exception e in exceptions) @@ -405,31 +424,6 @@ namespace Ryujinx.Ava } } - private static void TryWriteApplicationMinidump() - { - try - { - if (HLE.Switch.Shared is not { } device) - { - return; - } - - var minidump = device?.System?.DebugGetApplicationProcessMinidump(); - - if (minidump == null) - { - Logger.Warning?.Print(LogClass.Application, "Failed to create minidump"); - return; - } - - Logger.Info?.Print(LogClass.Application, minidump); - } - catch (Exception e) - { - Logger.Error?.Print(LogClass.Application, $"Failed to create minidump: {e.Message}"); - } - } - internal static void Exit() { DiscordIntegrationModule.Exit(); From e1e1fe40dfd4197bc79c7f609c92544c12923697 Mon Sep 17 00:00:00 2001 From: Coxxs <58-coxxs@users.noreply.git.ryujinx.app> Date: Sat, 15 Nov 2025 03:46:25 +0800 Subject: [PATCH 3/3] Check if Switch is running before creating minidump --- src/Ryujinx/Program.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Ryujinx/Program.cs b/src/Ryujinx/Program.cs index 68a871f51..653fb44c0 100644 --- a/src/Ryujinx/Program.cs +++ b/src/Ryujinx/Program.cs @@ -382,14 +382,14 @@ namespace Ryujinx.Ava exceptions.Add(initialException); } - if (isTerminating) + if (isTerminating && HLE.Switch.Shared is { } device) { try { // Print a short message first just in case it crashes again during minidump creation (should not happen) Logger.Error?.Print(LogClass.Application, $"Unhandled exception caught: {initialException.GetType().Name}. Creating guest program minidump..."); - var minidump = HLE.Switch.Shared?.System?.DebugGetApplicationProcessMinidump(); + var minidump = device.System?.DebugGetApplicationProcessMinidump(); if (minidump == null) {