Author: hdu
Date: Mon Nov 25 13:29:47 2013
New Revision: 1545268

URL: http://svn.apache.org/r1545268
Log:
#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.

Modified:
    openoffice/trunk/main/desktop/source/app/app.cxx
    openoffice/trunk/main/sal/osl/w32/signal.cxx

Modified: openoffice/trunk/main/desktop/source/app/app.cxx
URL: 
http://svn.apache.org/viewvc/openoffice/trunk/main/desktop/source/app/app.cxx?rev=1545268&r1=1545267&r2=1545268&view=diff
==============================================================================
--- openoffice/trunk/main/desktop/source/app/app.cxx (original)
+++ openoffice/trunk/main/desktop/source/app/app.cxx Mon Nov 25 13:29:47 2013
@@ -1935,11 +1935,8 @@ void Desktop::Main()
 
         // set static variable to enabled/disable crash reporter
         retrieveCrashReporterState();
-        if ( !isCrashReporterEnabled() )
-        {
-            osl_setErrorReporting( sal_False );
-            // disable stack trace feature
-        }
+        const bool bCrashReporterEnabled = isCrashReporterEnabled();
+        osl_setErrorReporting( !bCrashReporterEnabled );
 
         // create title string
         sal_Bool bCheckOk = sal_False;

Modified: openoffice/trunk/main/sal/osl/w32/signal.cxx
URL: 
http://svn.apache.org/viewvc/openoffice/trunk/main/sal/osl/w32/signal.cxx?rev=1545268&r1=1545267&r2=1545268&view=diff
==============================================================================
--- openoffice/trunk/main/sal/osl/w32/signal.cxx (original)
+++ openoffice/trunk/main/sal/osl/w32/signal.cxx Mon Nov 25 13:29:47 2013
@@ -36,6 +36,8 @@
 #endif
 #include <ErrorRep.h>
 #include <systools/win32/uwinapi.h>
+#include <eh.h>
+#include <stdexcept>
 
 typedef struct _oslSignalHandlerImpl
 {
@@ -423,10 +425,49 @@ oslSignalAction SAL_CALL osl_raiseSignal
 /*****************************************************************************/
 /* 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 bOld = bErrorReportingEnabled;
        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;
 }


Reply via email to