Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/source
diff options
context:
space:
mode:
authorAntony Riakiotakis <kalast@gmail.com>2015-03-03 15:39:15 +0300
committerAntony Riakiotakis <kalast@gmail.com>2015-03-03 15:39:15 +0300
commitd58a15c0a603a83a416f84def21d5603653e3cba (patch)
treebf925292c812b13f9f7d1bb3080cca17c4dcc8d0 /source
parentb42a3d24853195150130df513353c034ac528933 (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.
Diffstat (limited to 'source')
-rw-r--r--source/blender/blenlib/intern/system.c15
-rw-r--r--source/creator/creator.c87
2 files changed, 97 insertions, 5 deletions
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;