summaryrefslogtreecommitdiff
path: root/sal
diff options
context:
space:
mode:
authorHerbert Dürr <hdu@apache.org>2013-11-25 13:29:47 +0000
committerCaolán McNamara <caolanm@redhat.com>2013-11-25 14:20:37 +0000
commite79af02bb0e8de14c881f5071a519f6fadedc828 (patch)
tree23c5596248969b025426caba84aaec41af9913ed /sal
parent871d8e0f278dab646e1877a505577edc730a26cf (diff)
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 c9d10b167b37a9cb0bb310cafc8e80b6cce8ea7a) Conflicts: sal/osl/w32/signal.cxx Change-Id: I25324d6e02ab8acd8fd2b036b77039aac87cf262
Diffstat (limited to 'sal')
-rw-r--r--sal/osl/w32/signal.cxx41
1 files changed, 41 insertions, 0 deletions
diff --git a/sal/osl/w32/signal.cxx b/sal/osl/w32/signal.cxx
index f13a78ad27a3..51e08bcec67b 100644
--- a/sal/osl/w32/signal.cxx
+++ b/sal/osl/w32/signal.cxx
@@ -33,6 +33,8 @@
#include <errorrep.h>
#include <systools/win32/uwinapi.h>
#include <sal/macros.h>
+#include <eh.h>
+#include <stdexcept>
typedef struct _oslSignalHandlerImpl
{
@@ -398,11 +400,50 @@ oslSignalAction SAL_CALL osl_raiseSignal(sal_Int32 UserSignal, void* UserData)
/*****************************************************************************/
/* 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;
}