Fix #8860: [Win32] Crashlog window wasn't reliably shown for crashes not on the main thread.

This commit is contained in:
Michael Lutz
2021-03-13 21:34:51 +01:00
parent 062eeb9810
commit 13011e00c6
5 changed files with 46 additions and 23 deletions

View File

@@ -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)
{
@@ -605,28 +605,7 @@ static void CDECL CustomAbort(int signal)
/* static */ void CrashLog::InitialiseCrashLog()
{
#if defined(_M_AMD64) || defined(_M_ARM64)
CONTEXT ctx;
RtlCaptureContext(&ctx);
/* The stack pointer for AMD64 must always be 16-byte aligned inside a
* 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)
_safe_esp = (void *)(ctx.Sp - 8);
#else
_safe_esp = (void *)(ctx.Rsp - 8);
#endif
#else
#if defined(_MSC_VER)
_asm {
mov _safe_esp, esp
}
#else
asm("movl %esp, __safe_esp");
#endif
#endif
CrashLog::InitThread();
/* SIGABRT is not an unhandled exception, so we need to intercept it. */
signal(SIGABRT, CustomAbort);
@@ -637,6 +616,34 @@ static void CDECL CustomAbort(int signal)
SetUnhandledExceptionFilter(ExceptionHandler);
}
/* static */ void CrashLog::InitThread()
{
#if defined(_M_AMD64) || defined(_M_ARM64)
CONTEXT ctx;
RtlCaptureContext(&ctx);
/* The stack pointer for AMD64 must always be 16-byte aligned inside a
* 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)
_safe_esp = (void *)(ctx.Sp - 8);
# else
_safe_esp = (void *)(ctx.Rsp - 8);
# endif
#else
void *safe_esp;
# if defined(_MSC_VER)
_asm {
mov safe_esp, esp
}
# else
asm("movl %esp, _safe_esp");
# endif
_safe_esp = safe_esp;
#endif
}
/* The crash log GUI */
static bool _expanded;