From 2c01f30f415313e5bfbeca66eaf36e56845bd5ee Mon Sep 17 00:00:00 2001 From: Coxxs <58-coxxs@users.noreply.git.ryujinx.app> Date: Sat, 21 Jun 2025 01:04:44 +0800 Subject: [PATCH 1/5] gdb: Fix crash on exit when not using Debugger --- src/Ryujinx.HLE/Switch.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Ryujinx.HLE/Switch.cs b/src/Ryujinx.HLE/Switch.cs index ed6d57b2d..e1aa8e0e4 100644 --- a/src/Ryujinx.HLE/Switch.cs +++ b/src/Ryujinx.HLE/Switch.cs @@ -176,7 +176,7 @@ namespace Ryujinx.HLE AudioDeviceDriver.Dispose(); FileSystem.Dispose(); Memory.Dispose(); - Debugger.Dispose(); + Debugger?.Dispose(); TitleIDs.CurrentApplication.Value = null; Shared = null; From 84e078f94c89131a30116d9920d0c62e6be7d13b Mon Sep 17 00:00:00 2001 From: Coxxs <58-coxxs@users.noreply.git.ryujinx.app> Date: Sat, 21 Jun 2025 01:05:25 +0800 Subject: [PATCH 2/5] gdb: Wait for the application to start if user connect gdb too early --- src/Ryujinx.HLE/Debugger/Debugger.cs | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/src/Ryujinx.HLE/Debugger/Debugger.cs b/src/Ryujinx.HLE/Debugger/Debugger.cs index 3eebb0b38..3ec4dbb93 100644 --- a/src/Ryujinx.HLE/Debugger/Debugger.cs +++ b/src/Ryujinx.HLE/Debugger/Debugger.cs @@ -47,7 +47,7 @@ namespace Ryujinx.HLE.Debugger MessageHandlerThread.Start(); } - private IDebuggableProcess DebugProcess => Device.System.DebugGetApplicationProcess(); + private IDebuggableProcess DebugProcess => Device.System?.DebugGetApplicationProcess(); private KThread[] GetThreads() => DebugProcess.GetThreadUids().Select(x => DebugProcess.GetThread(x)).ToArray(); private bool IsProcessAarch32 => DebugProcess.GetThread(gThread.Value).Context.IsAarch32; private KernelContext KernelContext => Device.System.KernelContext; @@ -761,6 +761,20 @@ namespace Ryujinx.HLE.Debugger { return; } + + // If the user connects before the application is running, wait for the application to start. + int retries = 10; + while (DebugProcess == null && retries-- > 0) + { + Thread.Sleep(200); + } + if (DebugProcess == null) + { + Logger.Warning?.Print(LogClass.GdbStub, "Application is not running, cannot accept GDB client connection"); + ClientSocket.Close(); + continue; + } + ClientSocket.NoDelay = true; ReadStream = new NetworkStream(ClientSocket, System.IO.FileAccess.Read); WriteStream = new NetworkStream(ClientSocket, System.IO.FileAccess.Write); From 2e18008d4b264c9e1054210760b9b3749330d1ce Mon Sep 17 00:00:00 2001 From: Coxxs <58-coxxs@users.noreply.git.ryujinx.app> Date: Sat, 21 Jun 2025 01:05:43 +0800 Subject: [PATCH 3/5] gdb: Add notice when application is suspended on start --- src/Ryujinx.HLE/HOS/Kernel/Process/KProcess.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Ryujinx.HLE/HOS/Kernel/Process/KProcess.cs b/src/Ryujinx.HLE/HOS/Kernel/Process/KProcess.cs index 0c400b425..249e9720a 100644 --- a/src/Ryujinx.HLE/HOS/Kernel/Process/KProcess.cs +++ b/src/Ryujinx.HLE/HOS/Kernel/Process/KProcess.cs @@ -689,6 +689,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Process { mainThread.Suspend(ThreadSchedState.ThreadPauseFlag); debugState = (int)DebugState.Stopped; + Logger.Notice.Print(LogClass.Kernel, $"Application is suspended on start for debugging."); } result = mainThread.Start(); From 745200373b5c9a3616ba5f1adfdda0880d2379aa Mon Sep 17 00:00:00 2001 From: Coxxs <58-coxxs@users.noreply.git.ryujinx.app> Date: Sat, 21 Jun 2025 01:24:06 +0800 Subject: [PATCH 4/5] gdb: Remove unused using --- src/ARMeilleure/Instructions/NativeInterface.cs | 1 - src/ARMeilleure/State/ExecutionContext.cs | 2 -- src/Ryujinx.Cpu/Jit/JitExecutionContext.cs | 1 - 3 files changed, 4 deletions(-) diff --git a/src/ARMeilleure/Instructions/NativeInterface.cs b/src/ARMeilleure/Instructions/NativeInterface.cs index c44f24b7c..d43e20d83 100644 --- a/src/ARMeilleure/Instructions/NativeInterface.cs +++ b/src/ARMeilleure/Instructions/NativeInterface.cs @@ -3,7 +3,6 @@ using ARMeilleure.State; using ARMeilleure.Translation; using System; using System.Runtime.InteropServices; -using System.Threading; using ExecutionContext = ARMeilleure.State.ExecutionContext; namespace ARMeilleure.Instructions diff --git a/src/ARMeilleure/State/ExecutionContext.cs b/src/ARMeilleure/State/ExecutionContext.cs index 2978bf27a..0b0a83c9f 100644 --- a/src/ARMeilleure/State/ExecutionContext.cs +++ b/src/ARMeilleure/State/ExecutionContext.cs @@ -1,6 +1,4 @@ using ARMeilleure.Memory; -using System.Collections.Concurrent; -using System.Diagnostics; using System.Threading; namespace ARMeilleure.State diff --git a/src/Ryujinx.Cpu/Jit/JitExecutionContext.cs b/src/Ryujinx.Cpu/Jit/JitExecutionContext.cs index d4775f3ed..f00acc1d7 100644 --- a/src/Ryujinx.Cpu/Jit/JitExecutionContext.cs +++ b/src/Ryujinx.Cpu/Jit/JitExecutionContext.cs @@ -1,6 +1,5 @@ using ARMeilleure.Memory; using ARMeilleure.State; -using System.Threading; using ExecutionContext = ARMeilleure.State.ExecutionContext; namespace Ryujinx.Cpu.Jit From eb41143988ddc313fabf4ca0fd0d6b0a2716fe2a Mon Sep 17 00:00:00 2001 From: Coxxs <58-coxxs@users.noreply.git.ryujinx.app> Date: Sat, 21 Jun 2025 01:47:19 +0800 Subject: [PATCH 5/5] gdb: Fix crash on stop emulation if gdb stub is enabled with app running --- src/Ryujinx.HLE/HOS/Kernel/Process/KProcess.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Ryujinx.HLE/HOS/Kernel/Process/KProcess.cs b/src/Ryujinx.HLE/HOS/Kernel/Process/KProcess.cs index 249e9720a..7edf263e2 100644 --- a/src/Ryujinx.HLE/HOS/Kernel/Process/KProcess.cs +++ b/src/Ryujinx.HLE/HOS/Kernel/Process/KProcess.cs @@ -743,7 +743,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Process ExceptionCallback breakCallback = null; ExceptionCallbackNoArgs stepCallback = null; - if (KernelContext.Device.Configuration.EnableGdbStub) + if (KernelContext.Device.Configuration.EnableGdbStub && KernelContext.Device.Debugger != null) { breakCallback = KernelContext.Device.Debugger.BreakHandler; stepCallback = KernelContext.Device.Debugger.StepHandler;