| 
									
										
										
										
											2011-03-31 01:31:06 +02:00
										 |  |  | :mod:`faulthandler` --- Dump the Python traceback
 | 
					
						
							|  |  |  | =================================================
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | .. module:: faulthandler
 | 
					
						
							|  |  |  |    :synopsis: Dump the Python traceback.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-06-17 19:54:52 -05:00
										 |  |  | This module contains functions to dump Python tracebacks explicitly, on a fault,
 | 
					
						
							|  |  |  | after a timeout, or on a user signal. Call :func:`faulthandler.enable` to
 | 
					
						
							|  |  |  | install fault handlers for the :const:`SIGSEGV`, :const:`SIGFPE`,
 | 
					
						
							|  |  |  | :const:`SIGABRT`, :const:`SIGBUS`, and :const:`SIGILL` signals. You can also
 | 
					
						
							|  |  |  | enable them at startup by setting the :envvar:`PYTHONFAULTHANDLER` environment
 | 
					
						
							|  |  |  | variable or by using :option:`-X` ``faulthandler`` command line option.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | The fault handler is compatible with system fault handlers like Apport or the
 | 
					
						
							|  |  |  | Windows fault handler. The module uses an alternative stack for signal handlers
 | 
					
						
							|  |  |  | if the :c:func:`sigaltstack` function is available. This allows it to dump the
 | 
					
						
							|  |  |  | traceback even on a stack overflow.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | The fault handler is called on catastrophic cases and therefore can only use
 | 
					
						
							|  |  |  | signal-safe functions (e.g. it cannot allocate memory on the heap). Because of
 | 
					
						
							|  |  |  | this limitation traceback dumping is minimal compared to normal Python
 | 
					
						
							|  |  |  | tracebacks:
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | * Only ASCII is supported. The ``backslashreplace`` error handler is used on
 | 
					
						
							|  |  |  |   encoding.
 | 
					
						
							|  |  |  | * Each string is limited to 100 characters.
 | 
					
						
							| 
									
										
										
										
											2011-06-19 16:07:20 +02:00
										 |  |  | * Only the filename, the function name and the line number are
 | 
					
						
							| 
									
										
										
										
											2011-06-17 19:54:52 -05:00
										 |  |  |   displayed. (no source code)
 | 
					
						
							|  |  |  | * It is limited to 100 frames and 100 threads.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | By default, the Python traceback is written to :data:`sys.stderr`. To see
 | 
					
						
							|  |  |  | tracebacks, applications must be run in the terminal. A log file can
 | 
					
						
							|  |  |  | alternatively be passed to :func:`faulthandler.enable`.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | The module is implemented in C, so tracebacks can be dumped on a crash or when
 | 
					
						
							|  |  |  | Python is deadlocked.
 | 
					
						
							| 
									
										
										
										
											2011-03-31 01:31:06 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | .. versionadded:: 3.3
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Dump the traceback
 | 
					
						
							|  |  |  | ------------------
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-05-07 12:43:00 +02:00
										 |  |  | .. function:: dump_traceback(file=sys.stderr, all_threads=True)
 | 
					
						
							| 
									
										
										
										
											2011-03-31 01:31:06 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-06-19 09:37:18 -05:00
										 |  |  |    Dump the tracebacks of all threads into *file*. If *all_threads* is
 | 
					
						
							|  |  |  |    ``False``, dump only the current thread.
 | 
					
						
							| 
									
										
										
										
											2011-03-31 01:31:06 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Fault handler state
 | 
					
						
							|  |  |  | -------------------
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-05-07 12:43:00 +02:00
										 |  |  | .. function:: enable(file=sys.stderr, all_threads=True)
 | 
					
						
							| 
									
										
										
										
											2011-03-31 01:31:06 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-06-17 19:54:52 -05:00
										 |  |  |    Enable the fault handler: install handlers for the :const:`SIGSEGV`,
 | 
					
						
							| 
									
										
										
										
											2011-04-01 12:13:55 +02:00
										 |  |  |    :const:`SIGFPE`, :const:`SIGABRT`, :const:`SIGBUS` and :const:`SIGILL`
 | 
					
						
							| 
									
										
										
										
											2011-06-17 19:54:52 -05:00
										 |  |  |    signals to dump the Python traceback. If *all_threads* is ``True``,
 | 
					
						
							|  |  |  |    produce tracebacks for every running thread. Otherwise, dump only the current
 | 
					
						
							|  |  |  |    thread.
 | 
					
						
							| 
									
										
										
										
											2011-03-31 01:31:06 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | .. function:: disable()
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    Disable the fault handler: uninstall the signal handlers installed by
 | 
					
						
							|  |  |  |    :func:`enable`.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | .. function:: is_enabled()
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    Check if the fault handler is enabled.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Dump the tracebacks after a timeout
 | 
					
						
							|  |  |  | -----------------------------------
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | .. function:: dump_tracebacks_later(timeout, repeat=False, file=sys.stderr, exit=False)
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    Dump the tracebacks of all threads, after a timeout of *timeout* seconds, or
 | 
					
						
							| 
									
										
										
										
											2011-06-17 19:54:52 -05:00
										 |  |  |    every *timeout* seconds if *repeat* is ``True``.  If *exit* is ``True``, call
 | 
					
						
							|  |  |  |    :c:func:`_exit` with status=1 after dumping the tracebacks.  (Note
 | 
					
						
							| 
									
										
										
										
											2011-06-19 09:37:18 -05:00
										 |  |  |    :c:func:`_exit` exits the process immediately, which means it doesn't do any
 | 
					
						
							|  |  |  |    cleanup like flushing file buffers.) If the function is called twice, the new
 | 
					
						
							|  |  |  |    call replaces previous parameters and resets the timeout. The timer has a
 | 
					
						
							|  |  |  |    sub-second resolution.
 | 
					
						
							| 
									
										
										
										
											2011-06-17 19:54:52 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  |    This function is implemented using a watchdog thread and therefore is not
 | 
					
						
							|  |  |  |    available if Python is compiled with threads disabled.
 | 
					
						
							| 
									
										
										
										
											2011-03-31 01:31:06 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-03-31 03:42:34 +02:00
										 |  |  | .. function:: cancel_dump_tracebacks_later()
 | 
					
						
							| 
									
										
										
										
											2011-03-31 01:31:06 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-03-31 03:42:34 +02:00
										 |  |  |    Cancel the last call to :func:`dump_tracebacks_later`.
 | 
					
						
							| 
									
										
										
										
											2011-03-31 01:31:06 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Dump the traceback on a user signal
 | 
					
						
							|  |  |  | -----------------------------------
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-07-13 23:39:53 +02:00
										 |  |  | .. function:: register(signum, file=sys.stderr, all_threads=True, chain=False)
 | 
					
						
							| 
									
										
										
										
											2011-03-31 01:31:06 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |    Register a user signal: install a handler for the *signum* signal to dump
 | 
					
						
							| 
									
										
										
										
											2011-05-07 12:43:00 +02:00
										 |  |  |    the traceback of all threads, or of the current thread if *all_threads* is
 | 
					
						
							| 
									
										
										
										
											2011-07-13 23:39:53 +02:00
										 |  |  |    ``False``, into *file*. Call the previous handler if chain is ``True``.
 | 
					
						
							| 
									
										
										
										
											2011-03-31 01:31:06 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |    Not available on Windows.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | .. function:: unregister(signum)
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    Unregister a user signal: uninstall the handler of the *signum* signal
 | 
					
						
							| 
									
										
										
										
											2011-04-08 12:48:15 +02:00
										 |  |  |    installed by :func:`register`. Return ``True`` if the signal was registered,
 | 
					
						
							|  |  |  |    ``False`` otherwise.
 | 
					
						
							| 
									
										
										
										
											2011-03-31 01:31:06 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |    Not available on Windows.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | File descriptor issue
 | 
					
						
							|  |  |  | ---------------------
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-03-31 03:42:34 +02:00
										 |  |  | :func:`enable`, :func:`dump_tracebacks_later` and :func:`register` keep the
 | 
					
						
							| 
									
										
										
										
											2011-03-31 01:31:06 +02:00
										 |  |  | file descriptor of their *file* argument. If the file is closed and its file
 | 
					
						
							|  |  |  | descriptor is reused by a new file, or if :func:`os.dup2` is used to replace
 | 
					
						
							|  |  |  | the file descriptor, the traceback will be written into a different file. Call
 | 
					
						
							|  |  |  | these functions again each time that the file is replaced.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Example
 | 
					
						
							|  |  |  | -------
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Example of a segmentation fault on Linux: ::
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     $ python -q -X faulthandler
 | 
					
						
							|  |  |  |     >>> import ctypes
 | 
					
						
							|  |  |  |     >>> ctypes.string_at(0)
 | 
					
						
							|  |  |  |     Fatal Python error: Segmentation fault
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-05-07 12:43:00 +02:00
										 |  |  |     Current thread 0x00007fb899f39700:
 | 
					
						
							| 
									
										
										
										
											2011-03-31 01:31:06 +02:00
										 |  |  |       File "/home/python/cpython/Lib/ctypes/__init__.py", line 486 in string_at
 | 
					
						
							|  |  |  |       File "<stdin>", line 1 in <module>
 | 
					
						
							|  |  |  |     Segmentation fault
 | 
					
						
							|  |  |  | 
 |