Print stack trace on invalid memory accesses (#461)

* Print stack trace on invalid memory accesses

* Rebased, change code region base address for 39-bits address space, print stack trace on break and undefined instructions too
This commit is contained in:
gdkchan 2018-10-20 19:07:52 -03:00 committed by Ac_K
parent 0e1e094b7a
commit 2cb8541462
5 changed files with 53 additions and 1 deletions

View file

@ -67,6 +67,8 @@ namespace Ryujinx.HLE.HOS
Memory = new AMemory(Device.Memory.RamPointer);
Memory.InvalidAccess += CpuInvalidAccessHandler;
MemoryManager = new KMemoryManager(this);
TlsPages = new List<KTlsPageManager>();
@ -283,11 +285,15 @@ namespace Ryujinx.HLE.HOS
private void BreakHandler(object sender, AInstExceptionEventArgs e)
{
PrintStackTraceForCurrentThread();
throw new GuestBrokeExecutionException();
}
private void UndefinedHandler(object sender, AInstUndefinedEventArgs e)
{
PrintStackTraceForCurrentThread();
throw new UndefinedInstructionException(e.Position, e.RawOpCode);
}
@ -334,6 +340,24 @@ namespace Ryujinx.HLE.HOS
return Translator;
}
private void CpuInvalidAccessHandler(object sender, AInvalidAccessEventArgs e)
{
PrintStackTraceForCurrentThread();
}
private void PrintStackTraceForCurrentThread()
{
foreach (KThread Thread in Threads.Values)
{
if (Thread.Context.IsCurrentThread())
{
PrintStackTrace(Thread.Context.ThreadState);
break;
}
}
}
public void PrintStackTrace(AThreadState ThreadState)
{
StringBuilder Trace = new StringBuilder();