gdb: Show thread names

Reference: d8a37b4b71/libraries/libstratosphere/source/osdbg/impl/osdbg_thread_type.os.horizon.hpp
This commit is contained in:
Coxxs 2025-06-21 10:22:08 +08:00
parent 5cad23f793
commit 9506eba982
2 changed files with 151 additions and 6 deletions

View file

@ -34,6 +34,8 @@ namespace Ryujinx.HLE.Debugger
private ulong? cThread;
private ulong? gThread;
private string previousThreadListXml = "";
public Debugger(Switch device, ushort port)
{
Device = device;
@ -368,7 +370,7 @@ namespace Ryujinx.HLE.Debugger
if (ss.ConsumePrefix("Supported:") || ss.ConsumeRemaining("Supported"))
{
Reply("PacketSize=10000;qXfer:features:read+");
Reply("PacketSize=10000;qXfer:features:read+;qXfer:threads:read+");
break;
}
@ -404,10 +406,43 @@ namespace Ryujinx.HLE.Debugger
break;
}
if (ss.ConsumePrefix("Xfer:threads:read:"))
{
ss.ReadUntil(':');
ulong offset = ss.ReadUntilAsHex(',');
ulong len = ss.ReadRemainingAsHex();
var data = "";
if (offset > 0)
{
data = previousThreadListXml;
} else
{
previousThreadListXml = data = GetThreadListXml();
}
if (offset >= (ulong)data.Length)
{
Reply("l");
break;
}
if (len >= (ulong)data.Length - offset)
{
Reply("l" + ToBinaryFormat(data.Substring((int)offset)));
break;
}
else
{
Reply("m" + ToBinaryFormat(data.Substring((int)offset, (int)len)));
break;
}
}
if (ss.ConsumePrefix("Xfer:features:read:"))
{
string feature = ss.ReadUntil(':');
ulong addr = ss.ReadUntilAsHex(',');
ulong offset = ss.ReadUntilAsHex(',');
ulong len = ss.ReadRemainingAsHex();
if (feature == "target.xml")
@ -418,20 +453,20 @@ namespace Ryujinx.HLE.Debugger
string data;
if (RegisterInformation.Features.TryGetValue(feature, out data))
{
if (addr >= (ulong)data.Length)
if (offset >= (ulong)data.Length)
{
Reply("l");
break;
}
if (len >= (ulong)data.Length - addr)
if (len >= (ulong)data.Length - offset)
{
Reply("l" + ToBinaryFormat(data.Substring((int)addr)));
Reply("l" + ToBinaryFormat(data.Substring((int)offset)));
break;
}
else
{
Reply("m" + ToBinaryFormat(data.Substring((int)addr, (int)len)));
Reply("m" + ToBinaryFormat(data.Substring((int)offset, (int)len)));
break;
}
}
@ -469,6 +504,21 @@ namespace Ryujinx.HLE.Debugger
}
}
private string GetThreadListXml()
{
var sb = new StringBuilder();
sb.Append("<?xml version=\"1.0\"?><threads>\n");
foreach (var thread in GetThreads())
{
string threadName = System.Security.SecurityElement.Escape(thread.GetThreadName());
sb.Append($"<thread id=\"{thread.ThreadUid:x}\" name=\"{threadName}\" />\n");
}
sb.Append("</threads>");
return sb.ToString();
}
void CommandQuery()
{
// GDB is performing initial contact. Stop everything.