From 43f102271dd3dc64b167ee305be5061976bd41d6 Mon Sep 17 00:00:00 2001 From: kwolekr Date: Sun, 1 Feb 2015 03:08:04 -0500 Subject: Create minidump on fatal Win32 exceptions Remove software exception translator function, simplifying exception handler macros. FatalSystemExceptions are left unhandled. --- src/debug.cpp | 160 ++++++++++++++++++++++++++++++++++++++++++++++------------ 1 file changed, 128 insertions(+), 32 deletions(-) (limited to 'src/debug.cpp') diff --git a/src/debug.cpp b/src/debug.cpp index 3b2fb641a..bd970a8e4 100644 --- a/src/debug.cpp +++ b/src/debug.cpp @@ -29,6 +29,13 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "jthread/jmutex.h" #include "jthread/jmutexautolock.h" #include "config.h" + +#ifdef _MSC_VER + #include + #include "version.h" + #include "filesys.h" +#endif + /* Debug output */ @@ -57,7 +64,7 @@ void debugstreams_init(bool disable_stderr, const char *filename) if(filename) g_debugstreams[1] = fopen(filename, "a"); - + if(g_debugstreams[1]) { fprintf(g_debugstreams[1], "\n\n-------------\n"); @@ -91,7 +98,7 @@ public: //TODO: Is this slow? fflush(g_debugstreams[i]); } - + return c; } std::streamsize xsputn(const char *s, std::streamsize n) @@ -111,7 +118,7 @@ public: return n; } - + private: bool m_disable_stderr; }; @@ -133,7 +140,7 @@ void assert_fail(const char *assertion, const char *file, "%s:%u: %s: Assertion '%s' failed.\n", (unsigned long)get_current_thread_id(), file, line, function, assertion); - + debug_stacks_print(); if(g_debugstreams[1]) @@ -151,7 +158,7 @@ struct DebugStack DebugStack(threadid_t id); void print(FILE *file, bool everything); void print(std::ostream &os, bool everything); - + threadid_t threadid; char stack[DEBUG_STACK_SIZE][DEBUG_STACK_TEXT_SIZE]; int stack_i; // Points to the lowest empty position @@ -285,10 +292,10 @@ DebugStacker::DebugStacker(const char *text) DebugStacker::~DebugStacker() { JMutexAutoLock lock(g_debug_stacks_mutex); - + if(m_overflowed == true) return; - + m_stack->stack_i--; if(m_stack->stack_i == 0) @@ -301,35 +308,124 @@ DebugStacker::~DebugStacker() } } - #ifdef _MSC_VER -#if CATCH_UNHANDLED_EXCEPTIONS == 1 -void se_trans_func(unsigned int u, EXCEPTION_POINTERS* pExp) + +const char *Win32ExceptionCodeToString(DWORD exception_code) { - dstream<<"In trans_func.\n"; - if(u == EXCEPTION_ACCESS_VIOLATION) - { - PEXCEPTION_RECORD r = pExp->ExceptionRecord; - dstream<<"Access violation at "<ExceptionAddress - <<" write?="<ExceptionInformation[0] - <<" address="<ExceptionInformation[1] - <ExceptionRecord->ExceptionCode; + _snprintf(buf, sizeof(buf), + " >> === FATAL ERROR ===\n" + " >> %s (Exception 0x%08X) at 0x%p\n", + Win32ExceptionCodeToString(excode), excode, + pExceptInfo->ExceptionRecord->ExceptionAddress); + dstream << buf; + + if (minidump_created) + dstream << " >> Saved dump to " << dumpfile << std::endl; + else + dstream << " >> Failed to save dump" << std::endl; + + return EXCEPTION_EXECUTE_HANDLER; +} + +#endif + +void debug_set_exception_handler() +{ +#ifdef _MSC_VER + SetUnhandledExceptionFilter(Win32ExceptionHandler); +#endif +} -- cgit v1.2.3