Windows: Fix BLI_assert backtrace.
With the recent backtrace overhaul, the fact that BLI_assert calls BLI_system_backtrace slipped somehow trough the cracks, causing issues for debug builds. This change allows BLI_system_backtrace to run again without having an exception record. Also minor improvements to the comments.
This commit is contained in:
		@@ -28,7 +28,7 @@
 | 
			
		||||
 | 
			
		||||
#include "MEM_guardedalloc.h"
 | 
			
		||||
 | 
			
		||||
static EXCEPTION_POINTERS *current_exception;
 | 
			
		||||
static EXCEPTION_POINTERS *current_exception = NULL;
 | 
			
		||||
 | 
			
		||||
static const char *bli_windows_get_exception_description(const DWORD exceptioncode)
 | 
			
		||||
{
 | 
			
		||||
@@ -212,20 +212,25 @@ static bool BLI_windows_system_backtrace_run_trace(FILE *fp, HANDLE hThread, PCO
 | 
			
		||||
  return result;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void bli_windows_system_backtrace_stack_thread(FILE *fp, HANDLE hThread)
 | 
			
		||||
static bool bli_windows_system_backtrace_stack_thread(FILE *fp, HANDLE hThread)
 | 
			
		||||
{
 | 
			
		||||
  CONTEXT context = {0};
 | 
			
		||||
  context.ContextFlags = CONTEXT_ALL;
 | 
			
		||||
  /* GetThreadContext requires the thread to be in a suspended state, which is problematic for the
 | 
			
		||||
   * currently running thread, RtlCaptureContext is used as an alternative to sidestep this */
 | 
			
		||||
  if (hThread != GetCurrentThread()) {
 | 
			
		||||
    SuspendThread(hThread);
 | 
			
		||||
  }
 | 
			
		||||
  CONTEXT context;
 | 
			
		||||
  context.ContextFlags = CONTEXT_ALL;
 | 
			
		||||
  if (!GetThreadContext(hThread, &context)) {
 | 
			
		||||
    fprintf(fp, "Cannot get thread context : 0x0%.8x\n", GetLastError());
 | 
			
		||||
  }
 | 
			
		||||
  BLI_windows_system_backtrace_run_trace(fp, hThread, &context);
 | 
			
		||||
  if (hThread != GetCurrentThread()) {
 | 
			
		||||
    bool success = GetThreadContext(hThread, &context);
 | 
			
		||||
    ResumeThread(hThread);
 | 
			
		||||
    if (!success) {
 | 
			
		||||
      fprintf(fp, "Cannot get thread context : 0x0%.8x\n", GetLastError());
 | 
			
		||||
      return false;
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
  else {
 | 
			
		||||
    RtlCaptureContext(&context);
 | 
			
		||||
  }
 | 
			
		||||
  return BLI_windows_system_backtrace_run_trace(fp, hThread, &context);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void bli_windows_system_backtrace_modules(FILE *fp)
 | 
			
		||||
@@ -287,8 +292,16 @@ static void bli_windows_system_backtrace_threads(FILE *fp)
 | 
			
		||||
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) {
 | 
			
		||||
    /* 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 {
 | 
			
		||||
    return bli_windows_system_backtrace_stack_thread(fp, GetCurrentThread());
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static bool bli_private_symbols_loaded()
 | 
			
		||||
@@ -350,7 +363,9 @@ void BLI_system_backtrace(FILE *fp)
 | 
			
		||||
{
 | 
			
		||||
  SymInitialize(GetCurrentProcess(), NULL, TRUE);
 | 
			
		||||
  bli_load_symbols();
 | 
			
		||||
  if (current_exception) {
 | 
			
		||||
    bli_windows_system_backtrace_exception_record(fp, current_exception->ExceptionRecord);
 | 
			
		||||
  }
 | 
			
		||||
  if (BLI_windows_system_backtrace_stack(fp)) {
 | 
			
		||||
    /* When the blender symbols are missing the stack traces will be unreliable
 | 
			
		||||
     * so only run if the previous step completed successfully. */
 | 
			
		||||
@@ -363,6 +378,7 @@ void BLI_system_backtrace(FILE *fp)
 | 
			
		||||
void BLI_windows_handle_exception(EXCEPTION_POINTERS *exception)
 | 
			
		||||
{
 | 
			
		||||
  current_exception = exception;
 | 
			
		||||
  if (current_exception) {
 | 
			
		||||
    fprintf(stderr,
 | 
			
		||||
            "Error   : %s\n",
 | 
			
		||||
            bli_windows_get_exception_description(exception->ExceptionRecord->ExceptionCode));
 | 
			
		||||
@@ -374,5 +390,6 @@ 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);
 | 
			
		||||
  }
 | 
			
		||||
  fflush(stderr);
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user