From e11eff0f41ae7bf8f77a88856f16f1343e521397 Mon Sep 17 00:00:00 2001 From: GreemDev Date: Sat, 18 Oct 2025 03:01:21 -0500 Subject: [PATCH] gdb: more cleanups - convert GdbRegisters utilities into extensions on IExecutionContext - add a Write/Read Register helper on Debugger that handles 32/64 bit instead of doing that for every usage of register reading/writing --- src/Ryujinx.HLE/Debugger/Debugger.cs | 20 ++++++++++------- src/Ryujinx.HLE/Debugger/Gdb/Commands.cs | 22 ++++++------------- src/Ryujinx.HLE/Debugger/Gdb/Registers.cs | 8 +++---- .../Debugger/RegisterInformation.cs | 9 +++----- 4 files changed, 26 insertions(+), 33 deletions(-) diff --git a/src/Ryujinx.HLE/Debugger/Debugger.cs b/src/Ryujinx.HLE/Debugger/Debugger.cs index 1c28870b7..e8eef26a3 100644 --- a/src/Ryujinx.HLE/Debugger/Debugger.cs +++ b/src/Ryujinx.HLE/Debugger/Debugger.cs @@ -112,15 +112,22 @@ namespace Ryujinx.HLE.Debugger } } + internal bool WriteRegister(IExecutionContext ctx, int gdbRegId, StringStream ss) => + IsProcess32Bit + ? ctx.WriteRegister32(gdbRegId, ss) + : ctx.WriteRegister64(gdbRegId, ss); + + internal string ReadRegister(IExecutionContext ctx, int gdbRegId) => + IsProcess32Bit + ? ctx.ReadRegister32(gdbRegId) + : ctx.ReadRegister64(gdbRegId); + public string GetStackTrace() { if (GThread == null) return "No thread selected\n"; - if (Process == null) - return "No application process found\n"; - - return Process.Debugger.GetGuestStackTrace(DebugProcess.GetThread(GThread.Value)); + return Process?.Debugger?.GetGuestStackTrace(DebugProcess.GetThread(GThread.Value)) ?? "No application process found\n"; } public string GetRegisters() @@ -128,10 +135,7 @@ namespace Ryujinx.HLE.Debugger if (GThread == null) return "No thread selected\n"; - if (Process == null) - return "No application process found\n"; - - return Process.Debugger.GetCpuRegisterPrintout(DebugProcess.GetThread(GThread.Value)); + return Process?.Debugger?.GetCpuRegisterPrintout(DebugProcess.GetThread(GThread.Value)) ?? "No application process found\n"; } public string GetMinidump() diff --git a/src/Ryujinx.HLE/Debugger/Gdb/Commands.cs b/src/Ryujinx.HLE/Debugger/Gdb/Commands.cs index 33c7f3675..6468e1452 100644 --- a/src/Ryujinx.HLE/Debugger/Gdb/Commands.cs +++ b/src/Ryujinx.HLE/Debugger/Gdb/Commands.cs @@ -105,14 +105,14 @@ namespace Ryujinx.HLE.Debugger.Gdb { for (int i = 0; i < GdbRegisterCount32; i++) { - registers += GdbRegisters.Read32(ctx, i); + registers += ctx.ReadRegister32(i); } } else { for (int i = 0; i < GdbRegisterCount64; i++) { - registers += GdbRegisters.Read64(ctx, i); + registers += ctx.ReadRegister64(i); } } @@ -132,7 +132,7 @@ namespace Ryujinx.HLE.Debugger.Gdb { for (int i = 0; i < GdbRegisterCount32; i++) { - if (!GdbRegisters.Write32(ctx, i, ss)) + if (!ctx.WriteRegister32(i, ss)) { Processor.ReplyError(); return; @@ -143,7 +143,7 @@ namespace Ryujinx.HLE.Debugger.Gdb { for (int i = 0; i < GdbRegisterCount64; i++) { - if (!GdbRegisters.Write64(ctx, i, ss)) + if (!ctx.WriteRegister64(i, ss)) { Processor.ReplyError(); return; @@ -236,9 +236,7 @@ namespace Ryujinx.HLE.Debugger.Gdb } IExecutionContext ctx = Debugger.DebugProcess.GetThread(Debugger.GThread.Value).Context; - string result = Debugger.IsProcess32Bit - ? GdbRegisters.Read32(ctx, gdbRegId) - : GdbRegisters.Read64(ctx, gdbRegId); + string result = Debugger.ReadRegister(ctx, gdbRegId); Processor.Reply(result != null, result); } @@ -252,14 +250,8 @@ namespace Ryujinx.HLE.Debugger.Gdb } IExecutionContext ctx = Debugger.DebugProcess.GetThread(Debugger.GThread.Value).Context; - if (Debugger.IsProcess32Bit) - { - Processor.Reply(GdbRegisters.Write32(ctx, gdbRegId, ss) && ss.IsEmpty()); - } - else - { - Processor.Reply(GdbRegisters.Write64(ctx, gdbRegId, ss) && ss.IsEmpty()); - } + + Processor.Reply(Debugger.WriteRegister(ctx, gdbRegId, ss) && ss.IsEmpty()); } internal void Step(ulong? newPc) diff --git a/src/Ryujinx.HLE/Debugger/Gdb/Registers.cs b/src/Ryujinx.HLE/Debugger/Gdb/Registers.cs index f9ce7b153..ebd89459f 100644 --- a/src/Ryujinx.HLE/Debugger/Gdb/Registers.cs +++ b/src/Ryujinx.HLE/Debugger/Gdb/Registers.cs @@ -13,7 +13,7 @@ namespace Ryujinx.HLE.Debugger.Gdb */ private const uint FpcrMask = 0xfc1fffff; - public static string Read64(IExecutionContext state, int gdbRegId) + public static string ReadRegister64(this IExecutionContext state, int gdbRegId) { switch (gdbRegId) { @@ -34,7 +34,7 @@ namespace Ryujinx.HLE.Debugger.Gdb } } - public static bool Write64(IExecutionContext state, int gdbRegId, StringStream ss) + public static bool WriteRegister64(this IExecutionContext state, int gdbRegId, StringStream ss) { switch (gdbRegId) { @@ -80,7 +80,7 @@ namespace Ryujinx.HLE.Debugger.Gdb } } - public static string Read32(IExecutionContext state, int gdbRegId) + public static string ReadRegister32(this IExecutionContext state, int gdbRegId) { switch (gdbRegId) { @@ -106,7 +106,7 @@ namespace Ryujinx.HLE.Debugger.Gdb } } - public static bool Write32(IExecutionContext state, int gdbRegId, StringStream ss) + public static bool WriteRegister32(this IExecutionContext state, int gdbRegId, StringStream ss) { switch (gdbRegId) { diff --git a/src/Ryujinx.HLE/Debugger/RegisterInformation.cs b/src/Ryujinx.HLE/Debugger/RegisterInformation.cs index c1c576558..5c6fa105c 100644 --- a/src/Ryujinx.HLE/Debugger/RegisterInformation.cs +++ b/src/Ryujinx.HLE/Debugger/RegisterInformation.cs @@ -17,12 +17,9 @@ namespace Ryujinx.HLE.Debugger private static string GetEmbeddedResourceContent(string resourceName) { - Stream stream = System.Reflection.Assembly.GetExecutingAssembly().GetManifestResourceStream("Ryujinx.HLE.Debugger.Gdb.Xml." + resourceName); - StreamReader reader = new(stream); - string result = reader.ReadToEnd(); - reader.Dispose(); - stream.Dispose(); - return result; + using Stream stream = System.Reflection.Assembly.GetExecutingAssembly().GetManifestResourceStream("Ryujinx.HLE.Debugger.Gdb.Xml." + resourceName); + using StreamReader reader = new(stream); + return reader.ReadToEnd(); } } }