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..653fb44c0 100644 --- a/src/Ryujinx/Program.cs +++ b/src/Ryujinx/Program.cs @@ -382,6 +382,30 @@ namespace Ryujinx.Ava exceptions.Add(initialException); } + 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 = device.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) { string message = $"Unhandled exception caught: {e}";