diff options
author | Antony Riakiotakis <kalast@gmail.com> | 2015-03-03 15:39:15 +0300 |
---|---|---|
committer | Antony Riakiotakis <kalast@gmail.com> | 2015-03-03 15:39:15 +0300 |
commit | d58a15c0a603a83a416f84def21d5603653e3cba (patch) | |
tree | bf925292c812b13f9f7d1bb3080cca17c4dcc8d0 | |
parent | b42a3d24853195150130df513353c034ac528933 (diff) |
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.
-rw-r--r-- | CMakeLists.txt | 4 | ||||
-rw-r--r-- | build_files/scons/config/win32-mingw-config.py | 2 | ||||
-rw-r--r-- | build_files/scons/config/win32-vc-config.py | 2 | ||||
-rw-r--r-- | build_files/scons/config/win64-mingw-config.py | 2 | ||||
-rw-r--r-- | build_files/scons/config/win64-vc-config.py | 2 | ||||
-rw-r--r-- | source/blender/blenlib/intern/system.c | 15 | ||||
-rw-r--r-- | source/creator/creator.c | 87 |
7 files changed, 103 insertions, 11 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt index cdef12cb923..e3fb9584749 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 0fb84bfa4a5..87c35e179cb 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 8e66e931ee9..9f3b3440628 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 ab39568df55..57eaae81d49 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 19e9667d597..9ac0173537e 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 d83077e0e78..b6b0f14a4e2 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 4b523b66b04..547ca3f5ab5 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; |