Windows: Ignore context record for backtrace is address is 0.

T76602 reported a crash with the exception address being 0,
this stack naturally could not be walked and no backtrace was
reported for the main thread. Which would have been helpful.

This change modifies the behaviour of the crash handler to ignore
the context record if it contains no useful information and
walk the current stack to get some information about what lead
to the crash.
This commit is contained in:
Ray molenkamp 2020-05-09 18:12:14 -06:00
parent f2178b7f97
commit 76e56e2ba7
Notes: blender-bot 2023-06-26 11:58:59 +02:00
Referenced by issue #76602, Blender 2.8 Crashes on Startup
1 changed files with 3 additions and 1 deletions

View File

@ -307,13 +307,14 @@ static bool BLI_windows_system_backtrace_stack(FILE *fp)
{
fprintf(fp, "Stack trace:\n");
/* If we are handling an exception use the context record from that. */
if (current_exception) {
if (current_exception && current_exception->ExceptionRecord->ExceptionAddress) {
/* The back trace code will write to the context record, to protect the original record from
* modifications give the backtrace a copy to work on. */
CONTEXT TempContext = *current_exception->ContextRecord;
return BLI_windows_system_backtrace_run_trace(fp, GetCurrentThread(), &TempContext);
}
else {
/* If there is no current exception or the address is not set, walk the current stack. */
return bli_windows_system_backtrace_stack_thread(fp, GetCurrentThread());
}
}
@ -403,6 +404,7 @@ void BLI_windows_handle_exception(EXCEPTION_POINTERS *exception)
CHAR modulename[MAX_PATH];
bli_windows_get_module_name(address, modulename, sizeof(modulename));
fprintf(stderr, "Module : %s\n", modulename);
fprintf(stderr, "Thread : %.8x\n", GetCurrentThreadId());
}
fflush(stderr);
}