17db96d56Sopenharmony_ci:mod:`faulthandler` --- Dump the Python traceback
27db96d56Sopenharmony_ci=================================================
37db96d56Sopenharmony_ci
47db96d56Sopenharmony_ci.. module:: faulthandler
57db96d56Sopenharmony_ci   :synopsis: Dump the Python traceback.
67db96d56Sopenharmony_ci
77db96d56Sopenharmony_ci.. versionadded:: 3.3
87db96d56Sopenharmony_ci
97db96d56Sopenharmony_ci----------------
107db96d56Sopenharmony_ci
117db96d56Sopenharmony_ciThis module contains functions to dump Python tracebacks explicitly, on a fault,
127db96d56Sopenharmony_ciafter a timeout, or on a user signal. Call :func:`faulthandler.enable` to
137db96d56Sopenharmony_ciinstall fault handlers for the :const:`SIGSEGV`, :const:`SIGFPE`,
147db96d56Sopenharmony_ci:const:`SIGABRT`, :const:`SIGBUS`, and :const:`SIGILL` signals. You can also
157db96d56Sopenharmony_cienable them at startup by setting the :envvar:`PYTHONFAULTHANDLER` environment
167db96d56Sopenharmony_civariable or by using the :option:`-X` ``faulthandler`` command line option.
177db96d56Sopenharmony_ci
187db96d56Sopenharmony_ciThe fault handler is compatible with system fault handlers like Apport or the
197db96d56Sopenharmony_ciWindows fault handler. The module uses an alternative stack for signal handlers
207db96d56Sopenharmony_ciif the :c:func:`sigaltstack` function is available. This allows it to dump the
217db96d56Sopenharmony_citraceback even on a stack overflow.
227db96d56Sopenharmony_ci
237db96d56Sopenharmony_ciThe fault handler is called on catastrophic cases and therefore can only use
247db96d56Sopenharmony_cisignal-safe functions (e.g. it cannot allocate memory on the heap). Because of
257db96d56Sopenharmony_cithis limitation traceback dumping is minimal compared to normal Python
267db96d56Sopenharmony_citracebacks:
277db96d56Sopenharmony_ci
287db96d56Sopenharmony_ci* Only ASCII is supported. The ``backslashreplace`` error handler is used on
297db96d56Sopenharmony_ci  encoding.
307db96d56Sopenharmony_ci* Each string is limited to 500 characters.
317db96d56Sopenharmony_ci* Only the filename, the function name and the line number are
327db96d56Sopenharmony_ci  displayed. (no source code)
337db96d56Sopenharmony_ci* It is limited to 100 frames and 100 threads.
347db96d56Sopenharmony_ci* The order is reversed: the most recent call is shown first.
357db96d56Sopenharmony_ci
367db96d56Sopenharmony_ciBy default, the Python traceback is written to :data:`sys.stderr`. To see
377db96d56Sopenharmony_citracebacks, applications must be run in the terminal. A log file can
387db96d56Sopenharmony_cialternatively be passed to :func:`faulthandler.enable`.
397db96d56Sopenharmony_ci
407db96d56Sopenharmony_ciThe module is implemented in C, so tracebacks can be dumped on a crash or when
417db96d56Sopenharmony_ciPython is deadlocked.
427db96d56Sopenharmony_ci
437db96d56Sopenharmony_ciThe :ref:`Python Development Mode <devmode>` calls :func:`faulthandler.enable`
447db96d56Sopenharmony_ciat Python startup.
457db96d56Sopenharmony_ci
467db96d56Sopenharmony_ci.. seealso::
477db96d56Sopenharmony_ci
487db96d56Sopenharmony_ci   Module :mod:`pdb`
497db96d56Sopenharmony_ci      Interactive source code debugger for Python programs.
507db96d56Sopenharmony_ci
517db96d56Sopenharmony_ci   Module :mod:`traceback`
527db96d56Sopenharmony_ci      Standard interface to extract, format and print stack traces of Python programs.
537db96d56Sopenharmony_ci
547db96d56Sopenharmony_ciDumping the traceback
557db96d56Sopenharmony_ci---------------------
567db96d56Sopenharmony_ci
577db96d56Sopenharmony_ci.. function:: dump_traceback(file=sys.stderr, all_threads=True)
587db96d56Sopenharmony_ci
597db96d56Sopenharmony_ci   Dump the tracebacks of all threads into *file*. If *all_threads* is
607db96d56Sopenharmony_ci   ``False``, dump only the current thread.
617db96d56Sopenharmony_ci
627db96d56Sopenharmony_ci   .. seealso:: :func:`traceback.print_tb`, which can be used to print a traceback object.
637db96d56Sopenharmony_ci
647db96d56Sopenharmony_ci   .. versionchanged:: 3.5
657db96d56Sopenharmony_ci      Added support for passing file descriptor to this function.
667db96d56Sopenharmony_ci
677db96d56Sopenharmony_ci
687db96d56Sopenharmony_ciFault handler state
697db96d56Sopenharmony_ci-------------------
707db96d56Sopenharmony_ci
717db96d56Sopenharmony_ci.. function:: enable(file=sys.stderr, all_threads=True)
727db96d56Sopenharmony_ci
737db96d56Sopenharmony_ci   Enable the fault handler: install handlers for the :const:`SIGSEGV`,
747db96d56Sopenharmony_ci   :const:`SIGFPE`, :const:`SIGABRT`, :const:`SIGBUS` and :const:`SIGILL`
757db96d56Sopenharmony_ci   signals to dump the Python traceback. If *all_threads* is ``True``,
767db96d56Sopenharmony_ci   produce tracebacks for every running thread. Otherwise, dump only the current
777db96d56Sopenharmony_ci   thread.
787db96d56Sopenharmony_ci
797db96d56Sopenharmony_ci   The *file* must be kept open until the fault handler is disabled: see
807db96d56Sopenharmony_ci   :ref:`issue with file descriptors <faulthandler-fd>`.
817db96d56Sopenharmony_ci
827db96d56Sopenharmony_ci   .. versionchanged:: 3.5
837db96d56Sopenharmony_ci      Added support for passing file descriptor to this function.
847db96d56Sopenharmony_ci
857db96d56Sopenharmony_ci   .. versionchanged:: 3.6
867db96d56Sopenharmony_ci      On Windows, a handler for Windows exception is also installed.
877db96d56Sopenharmony_ci
887db96d56Sopenharmony_ci   .. versionchanged:: 3.10
897db96d56Sopenharmony_ci      The dump now mentions if a garbage collector collection is running
907db96d56Sopenharmony_ci      if *all_threads* is true.
917db96d56Sopenharmony_ci
927db96d56Sopenharmony_ci.. function:: disable()
937db96d56Sopenharmony_ci
947db96d56Sopenharmony_ci   Disable the fault handler: uninstall the signal handlers installed by
957db96d56Sopenharmony_ci   :func:`enable`.
967db96d56Sopenharmony_ci
977db96d56Sopenharmony_ci.. function:: is_enabled()
987db96d56Sopenharmony_ci
997db96d56Sopenharmony_ci   Check if the fault handler is enabled.
1007db96d56Sopenharmony_ci
1017db96d56Sopenharmony_ci
1027db96d56Sopenharmony_ciDumping the tracebacks after a timeout
1037db96d56Sopenharmony_ci--------------------------------------
1047db96d56Sopenharmony_ci
1057db96d56Sopenharmony_ci.. function:: dump_traceback_later(timeout, repeat=False, file=sys.stderr, exit=False)
1067db96d56Sopenharmony_ci
1077db96d56Sopenharmony_ci   Dump the tracebacks of all threads, after a timeout of *timeout* seconds, or
1087db96d56Sopenharmony_ci   every *timeout* seconds if *repeat* is ``True``.  If *exit* is ``True``, call
1097db96d56Sopenharmony_ci   :c:func:`_exit` with status=1 after dumping the tracebacks.  (Note
1107db96d56Sopenharmony_ci   :c:func:`_exit` exits the process immediately, which means it doesn't do any
1117db96d56Sopenharmony_ci   cleanup like flushing file buffers.) If the function is called twice, the new
1127db96d56Sopenharmony_ci   call replaces previous parameters and resets the timeout. The timer has a
1137db96d56Sopenharmony_ci   sub-second resolution.
1147db96d56Sopenharmony_ci
1157db96d56Sopenharmony_ci   The *file* must be kept open until the traceback is dumped or
1167db96d56Sopenharmony_ci   :func:`cancel_dump_traceback_later` is called: see :ref:`issue with file
1177db96d56Sopenharmony_ci   descriptors <faulthandler-fd>`.
1187db96d56Sopenharmony_ci
1197db96d56Sopenharmony_ci   This function is implemented using a watchdog thread.
1207db96d56Sopenharmony_ci
1217db96d56Sopenharmony_ci   .. versionchanged:: 3.7
1227db96d56Sopenharmony_ci      This function is now always available.
1237db96d56Sopenharmony_ci
1247db96d56Sopenharmony_ci   .. versionchanged:: 3.5
1257db96d56Sopenharmony_ci      Added support for passing file descriptor to this function.
1267db96d56Sopenharmony_ci
1277db96d56Sopenharmony_ci.. function:: cancel_dump_traceback_later()
1287db96d56Sopenharmony_ci
1297db96d56Sopenharmony_ci   Cancel the last call to :func:`dump_traceback_later`.
1307db96d56Sopenharmony_ci
1317db96d56Sopenharmony_ci
1327db96d56Sopenharmony_ciDumping the traceback on a user signal
1337db96d56Sopenharmony_ci--------------------------------------
1347db96d56Sopenharmony_ci
1357db96d56Sopenharmony_ci.. function:: register(signum, file=sys.stderr, all_threads=True, chain=False)
1367db96d56Sopenharmony_ci
1377db96d56Sopenharmony_ci   Register a user signal: install a handler for the *signum* signal to dump
1387db96d56Sopenharmony_ci   the traceback of all threads, or of the current thread if *all_threads* is
1397db96d56Sopenharmony_ci   ``False``, into *file*. Call the previous handler if chain is ``True``.
1407db96d56Sopenharmony_ci
1417db96d56Sopenharmony_ci   The *file* must be kept open until the signal is unregistered by
1427db96d56Sopenharmony_ci   :func:`unregister`: see :ref:`issue with file descriptors <faulthandler-fd>`.
1437db96d56Sopenharmony_ci
1447db96d56Sopenharmony_ci   Not available on Windows.
1457db96d56Sopenharmony_ci
1467db96d56Sopenharmony_ci   .. versionchanged:: 3.5
1477db96d56Sopenharmony_ci      Added support for passing file descriptor to this function.
1487db96d56Sopenharmony_ci
1497db96d56Sopenharmony_ci.. function:: unregister(signum)
1507db96d56Sopenharmony_ci
1517db96d56Sopenharmony_ci   Unregister a user signal: uninstall the handler of the *signum* signal
1527db96d56Sopenharmony_ci   installed by :func:`register`. Return ``True`` if the signal was registered,
1537db96d56Sopenharmony_ci   ``False`` otherwise.
1547db96d56Sopenharmony_ci
1557db96d56Sopenharmony_ci   Not available on Windows.
1567db96d56Sopenharmony_ci
1577db96d56Sopenharmony_ci
1587db96d56Sopenharmony_ci.. _faulthandler-fd:
1597db96d56Sopenharmony_ci
1607db96d56Sopenharmony_ciIssue with file descriptors
1617db96d56Sopenharmony_ci---------------------------
1627db96d56Sopenharmony_ci
1637db96d56Sopenharmony_ci:func:`enable`, :func:`dump_traceback_later` and :func:`register` keep the
1647db96d56Sopenharmony_cifile descriptor of their *file* argument. If the file is closed and its file
1657db96d56Sopenharmony_cidescriptor is reused by a new file, or if :func:`os.dup2` is used to replace
1667db96d56Sopenharmony_cithe file descriptor, the traceback will be written into a different file. Call
1677db96d56Sopenharmony_cithese functions again each time that the file is replaced.
1687db96d56Sopenharmony_ci
1697db96d56Sopenharmony_ci
1707db96d56Sopenharmony_ciExample
1717db96d56Sopenharmony_ci-------
1727db96d56Sopenharmony_ci
1737db96d56Sopenharmony_ciExample of a segmentation fault on Linux with and without enabling the fault
1747db96d56Sopenharmony_cihandler:
1757db96d56Sopenharmony_ci
1767db96d56Sopenharmony_ci.. code-block:: shell-session
1777db96d56Sopenharmony_ci
1787db96d56Sopenharmony_ci    $ python3 -c "import ctypes; ctypes.string_at(0)"
1797db96d56Sopenharmony_ci    Segmentation fault
1807db96d56Sopenharmony_ci
1817db96d56Sopenharmony_ci    $ python3 -q -X faulthandler
1827db96d56Sopenharmony_ci    >>> import ctypes
1837db96d56Sopenharmony_ci    >>> ctypes.string_at(0)
1847db96d56Sopenharmony_ci    Fatal Python error: Segmentation fault
1857db96d56Sopenharmony_ci
1867db96d56Sopenharmony_ci    Current thread 0x00007fb899f39700 (most recent call first):
1877db96d56Sopenharmony_ci      File "/home/python/cpython/Lib/ctypes/__init__.py", line 486 in string_at
1887db96d56Sopenharmony_ci      File "<stdin>", line 1 in <module>
1897db96d56Sopenharmony_ci    Segmentation fault
190