|
|
|
@ -537,7 +537,7 @@ static void ShowCrashlogWindow();
|
|
|
|
|
* Stack pointer for use when 'starting' the crash handler.
|
|
|
|
|
* Not static as gcc's inline assembly needs it that way.
|
|
|
|
|
*/
|
|
|
|
|
void *_safe_esp = nullptr;
|
|
|
|
|
thread_local void *_safe_esp = nullptr;
|
|
|
|
|
|
|
|
|
|
static LONG WINAPI ExceptionHandler(EXCEPTION_POINTERS *ep)
|
|
|
|
|
{
|
|
|
|
@ -604,6 +604,19 @@ static void CDECL CustomAbort(int signal)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* static */ void CrashLog::InitialiseCrashLog()
|
|
|
|
|
{
|
|
|
|
|
CrashLog::InitThread();
|
|
|
|
|
|
|
|
|
|
/* SIGABRT is not an unhandled exception, so we need to intercept it. */
|
|
|
|
|
signal(SIGABRT, CustomAbort);
|
|
|
|
|
#if defined(_MSC_VER)
|
|
|
|
|
/* Don't show abort message as we will get the crashlog window anyway. */
|
|
|
|
|
_set_abort_behavior(0, _WRITE_ABORT_MSG);
|
|
|
|
|
#endif
|
|
|
|
|
SetUnhandledExceptionFilter(ExceptionHandler);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* static */ void CrashLog::InitThread()
|
|
|
|
|
{
|
|
|
|
|
#if defined(_M_AMD64) || defined(_M_ARM64)
|
|
|
|
|
CONTEXT ctx;
|
|
|
|
@ -613,28 +626,22 @@ static void CDECL CustomAbort(int signal)
|
|
|
|
|
* function. As we are simulating a function call with the safe ESP value,
|
|
|
|
|
* we need to subtract 8 for the imaginary return address otherwise stack
|
|
|
|
|
* alignment would be wrong in the called function. */
|
|
|
|
|
#if defined(_M_ARM64)
|
|
|
|
|
# if defined(_M_ARM64)
|
|
|
|
|
_safe_esp = (void *)(ctx.Sp - 8);
|
|
|
|
|
#else
|
|
|
|
|
# else
|
|
|
|
|
_safe_esp = (void *)(ctx.Rsp - 8);
|
|
|
|
|
#endif
|
|
|
|
|
# endif
|
|
|
|
|
#else
|
|
|
|
|
#if defined(_MSC_VER)
|
|
|
|
|
void *safe_esp;
|
|
|
|
|
# if defined(_MSC_VER)
|
|
|
|
|
_asm {
|
|
|
|
|
mov _safe_esp, esp
|
|
|
|
|
mov safe_esp, esp
|
|
|
|
|
}
|
|
|
|
|
#else
|
|
|
|
|
asm("movl %esp, __safe_esp");
|
|
|
|
|
#endif
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
/* SIGABRT is not an unhandled exception, so we need to intercept it. */
|
|
|
|
|
signal(SIGABRT, CustomAbort);
|
|
|
|
|
#if defined(_MSC_VER)
|
|
|
|
|
/* Don't show abort message as we will get the crashlog window anyway. */
|
|
|
|
|
_set_abort_behavior(0, _WRITE_ABORT_MSG);
|
|
|
|
|
# else
|
|
|
|
|
asm("movl %esp, _safe_esp");
|
|
|
|
|
# endif
|
|
|
|
|
_safe_esp = safe_esp;
|
|
|
|
|
#endif
|
|
|
|
|
SetUnhandledExceptionFilter(ExceptionHandler);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* The crash log GUI */
|
|
|
|
|