Commit: d58a15c0a603a83a416f84def21d5603653e3cba
Author: Antony Riakiotakis
Date:   Tue Mar 3 13:39:15 2015 +0100
Branches: master
https://developer.blender.org/rBd58a15c0a603a83a416f84def21d5603653e3cba

Windows: Add stacktrace support when unhandled exception occurs.

We need to register the exception handler slightly differently here, as
well as adding DbgHelp as a library, but according to docs it should be
supported in recent Windows editions (Win XP included even).

We can try it first and revert if there are issues.

===================================================================

M       CMakeLists.txt
M       build_files/scons/config/win32-mingw-config.py
M       build_files/scons/config/win32-vc-config.py
M       build_files/scons/config/win64-mingw-config.py
M       build_files/scons/config/win64-vc-config.py
M       source/blender/blenlib/intern/system.c
M       source/creator/creator.c

===================================================================

diff --git a/CMakeLists.txt b/CMakeLists.txt
index cdef12c..e3fb958 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -1168,7 +1168,7 @@ elseif(WIN32)
                set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} 
/SAFESEH:NO")
                set(CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} 
/SAFESEH:NO")
 
-               list(APPEND PLATFORM_LINKLIBS ws2_32 vfw32 winmm kernel32 
user32 gdi32 comdlg32 advapi32 shfolder shell32 ole32 oleaut32 uuid psapi)
+               list(APPEND PLATFORM_LINKLIBS ws2_32 vfw32 winmm kernel32 
user32 gdi32 comdlg32 advapi32 shfolder shell32 ole32 oleaut32 uuid psapi 
Dbghelp)
 
                if(WITH_INPUT_IME)
                        list(APPEND PLATFORM_LINKLIBS imm32)
@@ -1541,7 +1541,7 @@ elseif(WIN32)
                        endif()
                endif()
                
-               list(APPEND PLATFORM_LINKLIBS -lshell32 -lshfolder -lgdi32 
-lmsvcrt -lwinmm -lmingw32 -lm -lws2_32 -lz -lstdc++ -lole32 -luuid -lwsock32 
-lpsapi)
+               list(APPEND PLATFORM_LINKLIBS -lshell32 -lshfolder -lgdi32 
-lmsvcrt -lwinmm -lmingw32 -lm -lws2_32 -lz -lstdc++ -lole32 -luuid -lwsock32 
-lpsapi -ldbghelp)
 
                if(WITH_INPUT_IME)
                        list(APPEND PLATFORM_LINKLIBS -limm32)
diff --git a/build_files/scons/config/win32-mingw-config.py 
b/build_files/scons/config/win32-mingw-config.py
index 0fb84bf..87c35e1 100644
--- a/build_files/scons/config/win32-mingw-config.py
+++ b/build_files/scons/config/win32-mingw-config.py
@@ -198,7 +198,7 @@ C_WARN = ['-Wno-char-subscripts', 
'-Wdeclaration-after-statement', '-Wstrict-pro
 
 CC_WARN = [ '-Wall' ]
 
-LLIBS = ['-lshell32', '-lshfolder', '-lgdi32', '-lmsvcrt', '-lwinmm', 
'-lmingw32', '-lm', '-lws2_32', '-lz', '-lstdc++','-lole32','-luuid', 
'-lwsock32', '-lpsapi']
+LLIBS = ['-lshell32', '-lshfolder', '-lgdi32', '-lmsvcrt', '-lwinmm', 
'-lmingw32', '-lm', '-lws2_32', '-lz', '-lstdc++','-lole32','-luuid', 
'-lwsock32', '-lpsapi', '-ldbghelp']
 
 if WITH_BF_IME:
     LLIBS.append('-limm32')
diff --git a/build_files/scons/config/win32-vc-config.py 
b/build_files/scons/config/win32-vc-config.py
index 8e66e93..9f3b344 100644
--- a/build_files/scons/config/win32-vc-config.py
+++ b/build_files/scons/config/win32-vc-config.py
@@ -237,7 +237,7 @@ C_WARN = []
 CC_WARN = []
 CXX_WARN = []
 
-LLIBS = ['ws2_32', 'vfw32', 'winmm', 'kernel32', 'user32', 'gdi32', 
'comdlg32', 'advapi32', 'shfolder', 'shell32', 'ole32', 'oleaut32', 'uuid', 
'psapi']
+LLIBS = ['ws2_32', 'vfw32', 'winmm', 'kernel32', 'user32', 'gdi32', 
'comdlg32', 'advapi32', 'shfolder', 'shell32', 'ole32', 'oleaut32', 'uuid', 
'psapi', 'Dbghelp']
 
 if WITH_BF_IME:
     LLIBS.append('imm32')
diff --git a/build_files/scons/config/win64-mingw-config.py 
b/build_files/scons/config/win64-mingw-config.py
index ab39568..57eaae8 100644
--- a/build_files/scons/config/win64-mingw-config.py
+++ b/build_files/scons/config/win64-mingw-config.py
@@ -193,7 +193,7 @@ C_WARN = ['-Wno-char-subscripts', 
'-Wdeclaration-after-statement', '-Wstrict-pro
 
 CC_WARN = [ '-Wall', '-Wno-char-subscripts' ]
 
-LLIBS = ['-lshell32', '-lshfolder', '-lgdi32', '-lmsvcrt', '-lwinmm', 
'-lmingw32', '-lm', '-lws2_32', '-lz', '-lstdc++','-lole32','-luuid', 
'-lwsock32', '-lpsapi', '-lpthread']
+LLIBS = ['-lshell32', '-lshfolder', '-lgdi32', '-lmsvcrt', '-lwinmm', 
'-lmingw32', '-lm', '-lws2_32', '-lz', '-lstdc++','-lole32','-luuid', 
'-lwsock32', '-lpsapi', '-lpthread', '-ldbghelp']
 
 if WITH_BF_IME:
     LLIBS.append('-limm32')
diff --git a/build_files/scons/config/win64-vc-config.py 
b/build_files/scons/config/win64-vc-config.py
index 19e9667..9ac0173 100644
--- a/build_files/scons/config/win64-vc-config.py
+++ b/build_files/scons/config/win64-vc-config.py
@@ -244,7 +244,7 @@ C_WARN = []
 CC_WARN = []
 CXX_WARN = []
 
-LLIBS = ['ws2_32', 'vfw32', 'winmm', 'kernel32', 'user32', 'gdi32', 
'comdlg32', 'advapi32', 'shfolder', 'shell32', 'ole32', 'oleaut32', 'uuid', 
'psapi']
+LLIBS = ['ws2_32', 'vfw32', 'winmm', 'kernel32', 'user32', 'gdi32', 
'comdlg32', 'advapi32', 'shfolder', 'shell32', 'ole32', 'oleaut32', 'uuid', 
'psapi', 'Dbghelp']
 
 if WITH_BF_IME:
     LLIBS.append('imm32')
diff --git a/source/blender/blenlib/intern/system.c 
b/source/blender/blenlib/intern/system.c
index d83077e..b6b0f14 100644
--- a/source/blender/blenlib/intern/system.c
+++ b/source/blender/blenlib/intern/system.c
@@ -27,10 +27,13 @@
 
 #include "BLI_system.h"
 
+#include "MEM_guardedalloc.h"
+
 /* for backtrace */
 #if defined(__linux__) || defined(__APPLE__)
 #  include <execinfo.h>
-#elif defined(_MSV_VER)
+#elif defined(WIN32)
+#  include <windows.h>
 #  include <DbgHelp.h>
 #endif
 
@@ -97,17 +100,18 @@ void BLI_system_backtrace(FILE *fp)
 #elif defined(_MSC_VER)
 
        (void)fp;
-#if 0
+#if defined WIN32
 #define MAXSYMBOL 256
-       unsigned short  i;
+#define SIZE 100
+       unsigned short i;
        void *stack[SIZE];
        unsigned short nframes;
-       SYMBOL_INFO     *symbolinfo;
+       SYMBOL_INFO *symbolinfo;
        HANDLE process;
 
        process = GetCurrentProcess();
 
-       SymInitialize(process, NULL, true);
+       SymInitialize(process, NULL, TRUE);
 
        nframes = CaptureStackBackTrace(0, SIZE, stack, NULL);
        symbolinfo = MEM_callocN(sizeof(SYMBOL_INFO) + MAXSYMBOL * 
sizeof(char), "crash Symbol table");
@@ -122,6 +126,7 @@ void BLI_system_backtrace(FILE *fp)
 
        MEM_freeN(symbolinfo);
 #undef MAXSYMBOL
+#undef SIZE
 #endif
 
        /* ------------------ */
diff --git a/source/creator/creator.c b/source/creator/creator.c
index 4b523b6..547ca3f 100644
--- a/source/creator/creator.c
+++ b/source/creator/creator.c
@@ -597,6 +597,88 @@ static void blender_crash_handler(int signum)
 #endif
 }
 
+#ifdef WIN32
+LONG WINAPI windows_exception_handler(EXCEPTION_POINTERS * ExceptionInfo)
+{
+  switch(ExceptionInfo->ExceptionRecord->ExceptionCode)
+  {
+    case EXCEPTION_ACCESS_VIOLATION:
+      fputs("Error: EXCEPTION_ACCESS_VIOLATION\n", stderr);
+      break;
+    case EXCEPTION_ARRAY_BOUNDS_EXCEEDED:
+      fputs("Error: EXCEPTION_ARRAY_BOUNDS_EXCEEDED\n", stderr);
+      break;
+    case EXCEPTION_BREAKPOINT:
+      fputs("Error: EXCEPTION_BREAKPOINT\n", stderr);
+      break;
+    case EXCEPTION_DATATYPE_MISALIGNMENT:
+      fputs("Error: EXCEPTION_DATATYPE_MISALIGNMENT\n", stderr);
+      break;
+    case EXCEPTION_FLT_DENORMAL_OPERAND:
+      fputs("Error: EXCEPTION_FLT_DENORMAL_OPERAND\n", stderr);
+      break;
+    case EXCEPTION_FLT_DIVIDE_BY_ZERO:
+      fputs("Error: EXCEPTION_FLT_DIVIDE_BY_ZERO\n", stderr);
+      break;
+    case EXCEPTION_FLT_INEXACT_RESULT:
+      fputs("Error: EXCEPTION_FLT_INEXACT_RESULT\n", stderr);
+      break;
+    case EXCEPTION_FLT_INVALID_OPERATION:
+      fputs("Error: EXCEPTION_FLT_INVALID_OPERATION\n", stderr);
+      break;
+    case EXCEPTION_FLT_OVERFLOW:
+      fputs("Error: EXCEPTION_FLT_OVERFLOW\n", stderr);
+      break;
+    case EXCEPTION_FLT_STACK_CHECK:
+      fputs("Error: EXCEPTION_FLT_STACK_CHECK\n", stderr);
+      break;
+    case EXCEPTION_FLT_UNDERFLOW:
+      fputs("Error: EXCEPTION_FLT_UNDERFLOW\n", stderr);
+      break;
+    case EXCEPTION_ILLEGAL_INSTRUCTION:
+      fputs("Error: EXCEPTION_ILLEGAL_INSTRUCTION\n", stderr);
+      break;
+    case EXCEPTION_IN_PAGE_ERROR:
+      fputs("Error: EXCEPTION_IN_PAGE_ERROR\n", stderr);
+      break;
+    case EXCEPTION_INT_DIVIDE_BY_ZERO:
+      fputs("Error: EXCEPTION_INT_DIVIDE_BY_ZERO\n", stderr);
+      break;
+    case EXCEPTION_INT_OVERFLOW:
+      fputs("Error: EXCEPTION_INT_OVERFLOW\n", stderr);
+      break;
+    case EXCEPTION_INVALID_DISPOSITION:
+      fputs("Error: EXCEPTION_INVALID_DISPOSITION\n", stderr);
+      break;
+    case EXCEPTION_NONCONTINUABLE_EXCEPTION:
+      fputs("Error: EXCEPTION_NONCONTINUABLE_EXCEPTION\n", stderr);
+      break;
+    case EXCEPTION_PRIV_INSTRUCTION:
+      fputs("Error: EXCEPTION_PRIV_INSTRUCTION\n", stderr);
+      break;
+    case EXCEPTION_SINGLE_STEP:
+      fputs("Error: EXCEPTION_SINGLE_STEP\n", stderr);
+      break;
+    case EXCEPTION_STACK_OVERFLOW:
+      fputs("Error: EXCEPTION_STACK_OVERFLOW\n", stderr);
+      break;
+    default:
+      fputs("Error: Unrecognized Exception\n", stderr);
+      break;
+  }
+  fflush(stderr);
+  /* If this is a stack overflow then we can't walk the stack, so just show
+   * where the error happened */
+  if (EXCEPTION_STACK_OVERFLOW != 
ExceptionInfo->ExceptionRecord->ExceptionCode)
+  {
+         blender_crash_handler(SIGSEGV);
+  }
+
+  return EXCEPTION_EXECUTE_HANDLER;
+}
+#endif
+
+
 static void blender_abort_handler(int UNUSED(signum))
 {
        /* Delete content of temp dir! */
@@ -1624,13 +1706,18 @@ int main(
        BLI_argsParse(ba, 1, NULL, NULL);
 
        if (use_crash_handler) {
+#ifdef WIN32
+               SetUnhandledExceptionFilter(windows_exception_handler);
+#else
                /* after parsing args */
                signal(SIGSEGV, blender_crash_handler);
+#endif
        }
 
        if (use_abort_handler) {
                signal(SIGABRT, blender_abort_handler);
        }
+
 #else
        G.factory_startup = true;  /* using preferences or user startup makes 
no sense for py-as-module */
        (void)syshandle;

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to