diff options
Diffstat (limited to 'Ryujinx.HLE/HOS/Kernel')
| -rw-r--r-- | Ryujinx.HLE/HOS/Kernel/Process/HleProcessDebugger.cs | 17 | ||||
| -rw-r--r-- | Ryujinx.HLE/HOS/Kernel/SupervisorCall/SvcIpc.cs | 1 | ||||
| -rw-r--r-- | Ryujinx.HLE/HOS/Kernel/Threading/KThread.cs | 14 |
3 files changed, 22 insertions, 10 deletions
diff --git a/Ryujinx.HLE/HOS/Kernel/Process/HleProcessDebugger.cs b/Ryujinx.HLE/HOS/Kernel/Process/HleProcessDebugger.cs index 0268de7d..d31f95b4 100644 --- a/Ryujinx.HLE/HOS/Kernel/Process/HleProcessDebugger.cs +++ b/Ryujinx.HLE/HOS/Kernel/Process/HleProcessDebugger.cs @@ -4,6 +4,7 @@ using Ryujinx.Common.Logging; using Ryujinx.HLE.HOS.Diagnostics.Demangler; using Ryujinx.HLE.HOS.Kernel.Memory; using Ryujinx.HLE.Loaders.Elf; +using System; using System.Collections.Generic; using System.Linq; using System.Text; @@ -41,14 +42,12 @@ namespace Ryujinx.HLE.HOS.Kernel.Process _images = new List<Image>(); } - public void PrintGuestStackTrace(CpuThreadState threadState) + public string GetGuestStackTrace(CpuThreadState threadState) { EnsureLoaded(); StringBuilder trace = new StringBuilder(); - trace.AppendLine("Guest stack trace:"); - void AppendTrace(long address) { Image image = GetImage(address, out int imageIndex); @@ -68,22 +67,22 @@ namespace Ryujinx.HLE.HOS.Kernel.Process string imageName = GetGuessedNsoNameFromIndex(imageIndex); - string imageNameAndOffset = $"[{_owner.Name}] {imageName}:0x{offset:x8}"; - - trace.AppendLine($" {imageNameAndOffset} {subName}"); + trace.AppendLine($" {imageName}:0x{offset:x8} {subName}"); } else { - trace.AppendLine($" [{_owner.Name}] ??? {subName}"); + trace.AppendLine($" ??? {subName}"); } } //TODO: ARM32. long framePointer = (long)threadState.X29; + trace.AppendLine($"Process: {_owner.Name}, PID: {_owner.Pid}"); + while (framePointer != 0) { - if ((framePointer & 7) != 0 || + if ((framePointer & 7) != 0 || !_owner.CpuMemory.IsMapped(framePointer) || !_owner.CpuMemory.IsMapped(framePointer + 8)) { @@ -97,7 +96,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Process framePointer = _owner.CpuMemory.ReadInt64(framePointer); } - Logger.PrintInfo(LogClass.Cpu, trace.ToString()); + return trace.ToString(); } private bool TryGetSubName(Image image, long address, out string name) diff --git a/Ryujinx.HLE/HOS/Kernel/SupervisorCall/SvcIpc.cs b/Ryujinx.HLE/HOS/Kernel/SupervisorCall/SvcIpc.cs index e19d9d26..eb7595c0 100644 --- a/Ryujinx.HLE/HOS/Kernel/SupervisorCall/SvcIpc.cs +++ b/Ryujinx.HLE/HOS/Kernel/SupervisorCall/SvcIpc.cs @@ -143,6 +143,7 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall _device, _process, _process.CpuMemory, + ipcMessage.Thread, ipcMessage.Session, ipcMessage.Message, ipcMessage.MessagePtr); diff --git a/Ryujinx.HLE/HOS/Kernel/Threading/KThread.cs b/Ryujinx.HLE/HOS/Kernel/Threading/KThread.cs index 17e0f3c3..ebde34ba 100644 --- a/Ryujinx.HLE/HOS/Kernel/Threading/KThread.cs +++ b/Ryujinx.HLE/HOS/Kernel/Threading/KThread.cs @@ -1,10 +1,12 @@ using ChocolArm64; using ChocolArm64.Memory; +using Ryujinx.Common.Logging; using Ryujinx.HLE.HOS.Kernel.Common; using Ryujinx.HLE.HOS.Kernel.Process; using System; using System.Collections.Generic; using System.Linq; +using System.Text; namespace Ryujinx.HLE.HOS.Kernel.Threading { @@ -1009,9 +1011,19 @@ namespace Ryujinx.HLE.HOS.Kernel.Threading ReleaseAndResume(); } + public string GetGuestStackTrace() + { + return Owner.Debugger.GetGuestStackTrace(Context.ThreadState); + } + public void PrintGuestStackTrace() { - Owner.Debugger.PrintGuestStackTrace(Context.ThreadState); + StringBuilder trace = new StringBuilder(); + + trace.AppendLine("Guest stack trace:"); + trace.AppendLine(GetGuestStackTrace()); + + Logger.PrintInfo(LogClass.Cpu, trace.ToString()); } private void ThreadFinishedHandler(object sender, EventArgs e) |
