summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Doc/library/faulthandler.rst21
-rw-r--r--Lib/test/test_faulthandler.py12
-rw-r--r--Modules/faulthandler.c12
-rw-r--r--Python/pythonrun.c2
4 files changed, 24 insertions, 23 deletions
diff --git a/Doc/library/faulthandler.rst b/Doc/library/faulthandler.rst
index c0b662502f..0c00f8f298 100644
--- a/Doc/library/faulthandler.rst
+++ b/Doc/library/faulthandler.rst
@@ -36,21 +36,22 @@ when Python is blocked (e.g. deadlock).
Dump the traceback
------------------
-.. function:: dump_traceback(file=sys.stderr, all_threads=False)
+.. function:: dump_traceback(file=sys.stderr, all_threads=True)
- Dump the traceback of the current thread, or of all threads if *all_threads*
- is ``True``, into *file*.
+ Dump the traceback of all threads, or of the current thread if *all_threads*
+ is ``False``, into *file*.
Fault handler state
-------------------
-.. function:: enable(file=sys.stderr, all_threads=False)
+.. function:: enable(file=sys.stderr, all_threads=True)
Enable the fault handler: install handlers for :const:`SIGSEGV`,
:const:`SIGFPE`, :const:`SIGABRT`, :const:`SIGBUS` and :const:`SIGILL`
- signals to dump the Python traceback. It dumps the traceback of the current
- thread, or all threads if *all_threads* is ``True``, into *file*.
+ signals to dump the Python traceback. It dumps the traceback of the all
+ threads, or of the current thread if *all_threads* is ``False``, into
+ *file*.
.. function:: disable()
@@ -86,11 +87,11 @@ Dump the tracebacks after a timeout
Dump the traceback on a user signal
-----------------------------------
-.. function:: register(signum, file=sys.stderr, all_threads=False)
+.. function:: register(signum, file=sys.stderr, all_threads=True)
Register a user signal: install a handler for the *signum* signal to dump
- the traceback of the current thread, or of all threads if *all_threads* is
- ``True``, into *file*.
+ the traceback of all threads, or of the current thread if *all_threads* is
+ ``False``, into *file*.
Not available on Windows.
@@ -123,7 +124,7 @@ Example of a segmentation fault on Linux: ::
>>> ctypes.string_at(0)
Fatal Python error: Segmentation fault
- Traceback (most recent call first):
+ Current thread 0x00007fb899f39700:
File "/home/python/cpython/Lib/ctypes/__init__.py", line 486 in string_at
File "<stdin>", line 1 in <module>
Segmentation fault
diff --git a/Lib/test/test_faulthandler.py b/Lib/test/test_faulthandler.py
index d08347d90e..dbc19178a1 100644
--- a/Lib/test/test_faulthandler.py
+++ b/Lib/test/test_faulthandler.py
@@ -75,7 +75,7 @@ class FaultHandlerTests(unittest.TestCase):
return output.splitlines(), exitcode
def check_fatal_error(self, code, line_number, name_regex,
- filename=None, all_threads=False, other_regex=None):
+ filename=None, all_threads=True, other_regex=None):
"""
Check that the fault handler for fatal errors is enabled and check the
traceback from the child process output.
@@ -204,15 +204,15 @@ faulthandler._read_null()
'(?:Segmentation fault|Bus error)',
filename=filename)
- def test_enable_threads(self):
+ def test_enable_single_thread(self):
self.check_fatal_error("""
import faulthandler
-faulthandler.enable(all_threads=True)
+faulthandler.enable(all_threads=False)
faulthandler._read_null()
""".strip(),
3,
'(?:Segmentation fault|Bus error)',
- all_threads=True)
+ all_threads=False)
def test_disable(self):
code = """
@@ -252,9 +252,9 @@ import faulthandler
def funcB():
if {has_filename}:
with open({filename}, "wb") as fp:
- faulthandler.dump_traceback(fp)
+ faulthandler.dump_traceback(fp, all_threads=False)
else:
- faulthandler.dump_traceback()
+ faulthandler.dump_traceback(all_threads=False)
def funcA():
funcB()
diff --git a/Modules/faulthandler.c b/Modules/faulthandler.c
index 8f83ab8e41..6041485b54 100644
--- a/Modules/faulthandler.c
+++ b/Modules/faulthandler.c
@@ -186,7 +186,7 @@ faulthandler_dump_traceback_py(PyObject *self,
{
static char *kwlist[] = {"file", "all_threads", NULL};
PyObject *file = NULL;
- int all_threads = 0;
+ int all_threads = 1;
PyThreadState *tstate;
const char *errmsg;
int fd;
@@ -306,7 +306,7 @@ faulthandler_enable(PyObject *self, PyObject *args, PyObject *kwargs)
{
static char *kwlist[] = {"file", "all_threads", NULL};
PyObject *file = NULL;
- int all_threads = 0;
+ int all_threads = 1;
unsigned int i;
fault_handler_t *handler;
#ifdef HAVE_SIGACTION
@@ -648,7 +648,7 @@ faulthandler_register(PyObject *self,
static char *kwlist[] = {"signum", "file", "all_threads", NULL};
int signum;
PyObject *file = NULL;
- int all_threads = 0;
+ int all_threads = 1;
int fd;
user_signal_t *user;
_Py_sighandler_t previous;
@@ -916,7 +916,7 @@ PyDoc_STRVAR(module_doc,
static PyMethodDef module_methods[] = {
{"enable",
(PyCFunction)faulthandler_enable, METH_VARARGS|METH_KEYWORDS,
- PyDoc_STR("enable(file=sys.stderr, all_threads=False): "
+ PyDoc_STR("enable(file=sys.stderr, all_threads=True): "
"enable the fault handler")},
{"disable", (PyCFunction)faulthandler_disable_py, METH_NOARGS,
PyDoc_STR("disable(): disable the fault handler")},
@@ -924,7 +924,7 @@ static PyMethodDef module_methods[] = {
PyDoc_STR("is_enabled()->bool: check if the handler is enabled")},
{"dump_traceback",
(PyCFunction)faulthandler_dump_traceback_py, METH_VARARGS|METH_KEYWORDS,
- PyDoc_STR("dump_traceback(file=sys.stderr, all_threads=False): "
+ PyDoc_STR("dump_traceback(file=sys.stderr, all_threads=True): "
"dump the traceback of the current thread, or of all threads "
"if all_threads is True, into file")},
#ifdef FAULTHANDLER_LATER
@@ -943,7 +943,7 @@ static PyMethodDef module_methods[] = {
#ifdef FAULTHANDLER_USER
{"register",
(PyCFunction)faulthandler_register, METH_VARARGS|METH_KEYWORDS,
- PyDoc_STR("register(signum, file=sys.stderr, all_threads=False): "
+ PyDoc_STR("register(signum, file=sys.stderr, all_threads=True): "
"register an handler for the signal 'signum': dump the "
"traceback of the current thread, or of all threads if "
"all_threads is True, into file")},
diff --git a/Python/pythonrun.c b/Python/pythonrun.c
index ebc4f1cf17..6ebc823b80 100644
--- a/Python/pythonrun.c
+++ b/Python/pythonrun.c
@@ -2144,7 +2144,7 @@ Py_FatalError(const char *msg)
if (tstate != NULL) {
fputc('\n', stderr);
fflush(stderr);
- _Py_DumpTraceback(fd, tstate);
+ _Py_DumpTracebackThreads(fd, tstate->interp, tstate);
}
_PyFaulthandler_Fini();
}