/** * Print a stack backtrace for the current thread to the specified ostream. * * @param os ostream& to receive printed stack backtrace */ void printStackTrace( std::ostream& os ) { CONTEXT context; memset( &context, 0, sizeof(context) ); context.ContextFlags = CONTEXT_CONTROL; RtlCaptureContext( &context ); printWindowsStackTrace( context, os ); }
LONG WINAPI exceptionFilter( struct _EXCEPTION_POINTERS *excPointers ) { char exceptionString[128]; sprintf_s( exceptionString, sizeof( exceptionString ), ( excPointers->ExceptionRecord->ExceptionCode == EXCEPTION_ACCESS_VIOLATION ) ? "(access violation)" : "0x%08X", excPointers->ExceptionRecord->ExceptionCode ); char addressString[32]; sprintf_s( addressString, sizeof( addressString ), "0x%p", excPointers->ExceptionRecord->ExceptionAddress ); log() << "*** unhandled exception " << exceptionString << " at " << addressString << ", terminating" << std::endl; if ( excPointers->ExceptionRecord->ExceptionCode == EXCEPTION_ACCESS_VIOLATION ) { ULONG acType = excPointers->ExceptionRecord->ExceptionInformation[0]; const char* acTypeString; switch ( acType ) { case 0: acTypeString = "read from"; break; case 1: acTypeString = "write to"; break; case 8: acTypeString = "DEP violation at"; break; default: acTypeString = "unknown violation at"; break; } sprintf_s( addressString, sizeof( addressString ), " 0x%p", excPointers->ExceptionRecord->ExceptionInformation[1] ); log() << "*** access violation was a " << acTypeString << addressString << std::endl; } log() << "*** stack trace for unhandled exception:" << std::endl; printWindowsStackTrace( *excPointers->ContextRecord ); doMinidump(excPointers); // Don't go through normal shutdown procedure. It may make things worse. log() << "*** immediate exit due to unhandled exception" << std::endl; ::_exit(EXIT_ABRUPT); // We won't reach here return EXCEPTION_EXECUTE_HANDLER; }