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();