diff --git a/stepmania/src/arch/ArchHooks/ArchHooks_Unix.cpp b/stepmania/src/arch/ArchHooks/ArchHooks_Unix.cpp index 45b398a500..00a5e6842e 100644 --- a/stepmania/src/arch/ArchHooks/ArchHooks_Unix.cpp +++ b/stepmania/src/arch/ArchHooks/ArchHooks_Unix.cpp @@ -7,6 +7,7 @@ #include "archutils/Unix/GetSysInfo.h" #include "archutils/Unix/LinuxThreadHelpers.h" #include "archutils/Unix/EmergencyShutdown.h" +#include "archutils/Unix/AssertionHandler.h" #include #include "RageUtil.h" #include @@ -110,6 +111,8 @@ ArchHooks_Unix::ArchHooks_Unix() * This might blow up, so be sure to do it after the crash handler. */ SignalHandler::OnClose( EmergencyShutdown ); + InstallExceptionHandler(); + #if defined(HAVE_TLS) TestTLS(); #endif diff --git a/stepmania/src/archutils/Unix/AssertionHandler.cpp b/stepmania/src/archutils/Unix/AssertionHandler.cpp index 0e568a7951..44b711419d 100644 --- a/stepmania/src/archutils/Unix/AssertionHandler.cpp +++ b/stepmania/src/archutils/Unix/AssertionHandler.cpp @@ -44,6 +44,29 @@ extern "C" void __assert_perror_fail( int errnum, const char *file, unsigned int #endif } +/* Catch unhandled C++ exceptions. Note that this works in g++ even with -fno-exceptions, in + * which case it'll be called if any exceptions are thrown at all. */ +#include +void UnexpectedExceptionHandler() +{ + type_info *pException = abi::__cxa_current_exception_type(); + char const *pName = pException->name(); + int iStatus = -1; + char *pDem = abi::__cxa_demangle( pName, 0, 0, &iStatus ); + + const CString error = ssprintf("Unhandled exception: %s", iStatus? pName:pDem); +#if defined(CRASH_HANDLER) + sm_crash( error ); +#else + HandleException( error ); +#endif +} + +void InstallExceptionHandler() +{ + set_terminate( UnexpectedExceptionHandler ); +} + /* * (c) 2003-2004 Glenn Maynard * All rights reserved. diff --git a/stepmania/src/archutils/Unix/AssertionHandler.h b/stepmania/src/archutils/Unix/AssertionHandler.h new file mode 100644 index 0000000000..0477151031 --- /dev/null +++ b/stepmania/src/archutils/Unix/AssertionHandler.h @@ -0,0 +1,31 @@ +#ifndef ASSERTION_HANDLER_H +#define ASSERTION_HANDLER_H + +void InstallExceptionHandler(); + +#endif + +/* + * (c) 2004 Glenn Maynard + * All rights reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, and/or sell copies of the Software, and to permit persons to + * whom the Software is furnished to do so, provided that the above + * copyright notice(s) and this permission notice appear in all copies of + * the Software and that both the above copyright notice(s) and this + * permission notice appear in supporting documentation. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF + * THIRD PARTY RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS + * INCLUDED IN THIS NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT + * OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS + * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR + * OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR + * PERFORMANCE OF THIS SOFTWARE. + */