Kaydet (Commit) e79af02b authored tarafından Herbert Dürr's avatar Herbert Dürr Kaydeden (comit) Caolán McNamara

Resolves: #i123747# allow treating Window's SEH events as C++ exceptions

The crash reporter facility can provide much better details about crashes.
But if that facility is disabled then handling SEH events such as div-by-zero
as C++ exceptions is a worthwhile alternative. It can provide a few interesting
details and it allows a graceful shutdown of the application.

(cherry picked from commit c9d10b16)

Conflicts:
	sal/osl/w32/signal.cxx

Change-Id: I25324d6e02ab8acd8fd2b036b77039aac87cf262
üst 871d8e0f
...@@ -1488,11 +1488,8 @@ int Desktop::Main() ...@@ -1488,11 +1488,8 @@ int Desktop::Main()
// set static variable to enabled/disable crash reporter // set static variable to enabled/disable crash reporter
retrieveCrashReporterState(); retrieveCrashReporterState();
if ( !isCrashReporterEnabled() ) const bool bCrashReporterEnabled = isCrashReporterEnabled();
{ osl_setErrorReporting( !bCrashReporterEnabled );
osl_setErrorReporting( sal_False );
// disable stack trace feature
}
// create title string // create title string
LanguageTag aLocale( LANGUAGE_SYSTEM); LanguageTag aLocale( LANGUAGE_SYSTEM);
......
...@@ -33,6 +33,8 @@ ...@@ -33,6 +33,8 @@
#include <errorrep.h> #include <errorrep.h>
#include <systools/win32/uwinapi.h> #include <systools/win32/uwinapi.h>
#include <sal/macros.h> #include <sal/macros.h>
#include <eh.h>
#include <stdexcept>
typedef struct _oslSignalHandlerImpl typedef struct _oslSignalHandlerImpl
{ {
...@@ -398,11 +400,50 @@ oslSignalAction SAL_CALL osl_raiseSignal(sal_Int32 UserSignal, void* UserData) ...@@ -398,11 +400,50 @@ oslSignalAction SAL_CALL osl_raiseSignal(sal_Int32 UserSignal, void* UserData)
/*****************************************************************************/ /*****************************************************************************/
/* osl_setErrorReporting */ /* osl_setErrorReporting */
/*****************************************************************************/ /*****************************************************************************/
void win_seh_translator( unsigned nSEHCode, _EXCEPTION_POINTERS* pExcPtrs)
{
const char* pSEHName = NULL;
switch( nSEHCode) {
case EXCEPTION_ACCESS_VIOLATION: pSEHName = "SEH Exception: ACCESS VIOLATION"; break;
case EXCEPTION_DATATYPE_MISALIGNMENT: pSEHName = "SEH Exception: DATATYPE MISALIGNMENT"; break;
// case EXCEPTION_BREAKPOINT: pSEHName = "SEH Exception: BREAKPOINT"; break;
// case EXCEPTION_SINGLE_STEP: pSEHName = "SEH Exception: SINGLE STEP"; break;
case EXCEPTION_ARRAY_BOUNDS_EXCEEDED: pSEHName = "SEH Exception: ARRAY BOUNDS EXCEEDED"; break;
case EXCEPTION_FLT_DENORMAL_OPERAND: pSEHName = "SEH Exception: DENORMAL FLOAT OPERAND"; break;
case EXCEPTION_FLT_DIVIDE_BY_ZERO: pSEHName = "SEH Exception: FLOAT DIVIDE_BY_ZERO"; break;
case EXCEPTION_FLT_INEXACT_RESULT: pSEHName = "SEH Exception: FLOAT INEXACT RESULT"; break;
case EXCEPTION_FLT_INVALID_OPERATION: pSEHName = "SEH Exception: INVALID FLOAT OPERATION"; break;
case EXCEPTION_FLT_OVERFLOW: pSEHName = "SEH Exception: FLOAT OVERFLOW"; break;
case EXCEPTION_FLT_STACK_CHECK: pSEHName = "SEH Exception: FLOAT STACK_CHECK"; break;
case EXCEPTION_FLT_UNDERFLOW: pSEHName = "SEH Exception: FLOAT UNDERFLOW"; break;
case EXCEPTION_INT_DIVIDE_BY_ZERO: pSEHName = "SEH Exception: INTEGER DIVIDE_BY_ZERO"; break;
case EXCEPTION_INT_OVERFLOW: pSEHName = "SEH Exception: INTEGER OVERFLOW"; break;
case EXCEPTION_PRIV_INSTRUCTION: pSEHName = "SEH Exception: PRIVILEDGED INSTRUCTION"; break;
case EXCEPTION_IN_PAGE_ERROR: pSEHName = "SEH Exception: IN_PAGE_ERROR"; break;
case EXCEPTION_ILLEGAL_INSTRUCTION: pSEHName = "SEH Exception: ILLEGAL INSTRUCTION"; break;
case EXCEPTION_NONCONTINUABLE_EXCEPTION: pSEHName = "SEH Exception: NONCONTINUABLE EXCEPTION"; break;
case EXCEPTION_STACK_OVERFLOW: pSEHName = "SEH Exception: STACK OVERFLOW"; break;
case EXCEPTION_INVALID_DISPOSITION: pSEHName = "SEH Exception: INVALID DISPOSITION"; break;
case EXCEPTION_GUARD_PAGE: pSEHName = "SEH Exception: GUARD PAGE"; break;
case EXCEPTION_INVALID_HANDLE: pSEHName = "SEH Exception: INVALID HANDLE"; break;
// case EXCEPTION_POSSIBLE_DEADLOCK: pSEHName = "SEH Exception: POSSIBLE DEADLOCK"; break;
default: pSEHName = "Unknown SEH Exception"; break;
}
throw std::runtime_error( pSEHName);
}
sal_Bool SAL_CALL osl_setErrorReporting( sal_Bool bEnable ) sal_Bool SAL_CALL osl_setErrorReporting( sal_Bool bEnable )
{ {
sal_Bool bOld = bErrorReportingEnabled; sal_Bool bOld = bErrorReportingEnabled;
bErrorReportingEnabled = bEnable; bErrorReportingEnabled = bEnable;
if( !bEnable) // if the crash reporter is disabled
{
// fall back to handle Window's SEH events as C++ exceptions
_set_se_translator( win_seh_translator);
}
return bOld; return bOld;
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment