[Python-checkins] cpython: faulthandler: suppress crash reporter directly in test functions written to

victor.stinner python-checkins at python.org
Tue Sep 30 13:51:37 CEST 2014


https://hg.python.org/cpython/rev/4f3ce83eff17
changeset:   92654:4f3ce83eff17
user:        Victor Stinner <victor.stinner at gmail.com>
date:        Tue Sep 30 13:40:12 2014 +0200
summary:
  faulthandler: suppress crash reporter directly in test functions written to
crash.

files:
  Modules/faulthandler.c |  47 ++++++++++++++++++++++++++---
  1 files changed, 41 insertions(+), 6 deletions(-)


diff --git a/Modules/faulthandler.c b/Modules/faulthandler.c
--- a/Modules/faulthandler.c
+++ b/Modules/faulthandler.c
@@ -5,7 +5,13 @@
 #include <frameobject.h>
 #include <signal.h>
 #if defined(HAVE_PTHREAD_SIGMASK) && !defined(HAVE_BROKEN_PTHREAD_SIGMASK)
-#include <pthread.h>
+#  include <pthread.h>
+#endif
+#ifdef MS_WINDOWS
+#  include <windows.h>
+#endif
+#ifdef HAVE_SYS_RESOURCE_H
+#  include <sys/resource.h>
 #endif
 
 /* Allocate at maximum 100 MB of the stack to raise the stack overflow */
@@ -804,6 +810,34 @@
 #endif   /* FAULTHANDLER_USER */
 
 
+static void
+faulthandler_suppress_crash_report(void)
+{
+#ifdef MS_WINDOWS
+    UINT mode;
+
+    /* Configure Windows to not display the Windows Error Reporting dialog */
+    mode = SetErrorMode(SEM_NOGPFAULTERRORBOX);
+    SetErrorMode(mode | SEM_NOGPFAULTERRORBOX);
+#endif
+
+#ifdef HAVE_SYS_RESOURCE_H
+    struct rlimit rl;
+
+    /* Disable creation of core dump */
+    if (getrlimit(RLIMIT_CORE, &rl) != 0) {
+        rl.rlim_cur = 0;
+        setrlimit(RLIMIT_CORE, &rl);
+    }
+#endif
+
+#ifdef _MSC_VER
+    /* Visual Studio: configure abort() to not display an error message nor
+       open a popup asking to report the fault. */
+    _set_abort_behavior(0, _WRITE_ABORT_MSG | _CALL_REPORTFAULT);
+#endif
+}
+
 static PyObject *
 faulthandler_read_null(PyObject *self, PyObject *args)
 {
@@ -813,6 +847,7 @@
     if (!PyArg_ParseTuple(args, "|i:_read_null", &release_gil))
         return NULL;
 
+    faulthandler_suppress_crash_report();
     x = NULL;
     if (release_gil) {
         Py_BEGIN_ALLOW_THREADS
@@ -827,6 +862,7 @@
 static PyObject *
 faulthandler_sigsegv(PyObject *self, PyObject *args)
 {
+    faulthandler_suppress_crash_report();
 #if defined(MS_WINDOWS)
     /* For SIGSEGV, faulthandler_fatal_error() restores the previous signal
        handler and then gives back the execution flow to the program (without
@@ -853,6 +889,7 @@
     /* Do an integer division by zero: raise a SIGFPE on Intel CPU, but not on
        PowerPC. Use volatile to disable compile-time optimizations. */
     volatile int x = 1, y = 0, z;
+    faulthandler_suppress_crash_report();
     z = x / y;
     /* If the division by zero didn't raise a SIGFPE (e.g. on PowerPC),
        raise it manually. */
@@ -865,11 +902,7 @@
 static PyObject *
 faulthandler_sigabrt(PyObject *self, PyObject *args)
 {
-#ifdef _MSC_VER
-    /* Visual Studio: configure abort() to not display an error message nor
-       open a popup asking to report the fault. */
-    _set_abort_behavior(0, _WRITE_ABORT_MSG | _CALL_REPORTFAULT);
-#endif
+    faulthandler_suppress_crash_report();
     abort();
     Py_RETURN_NONE;
 }
@@ -880,6 +913,7 @@
     char *message;
     if (!PyArg_ParseTuple(args, "y:fatal_error", &message))
         return NULL;
+    faulthandler_suppress_crash_report();
     Py_FatalError(message);
     Py_RETURN_NONE;
 }
@@ -905,6 +939,7 @@
     size_t depth, size;
     char *sp = (char *)&depth, *stop;
 
+    faulthandler_suppress_crash_report();
     depth = 0;
     stop = stack_overflow(sp - STACK_OVERFLOW_MAX_SIZE,
                           sp + STACK_OVERFLOW_MAX_SIZE,

-- 
Repository URL: https://hg.python.org/cpython


More information about the Python-checkins mailing list