|
@@ -3,6 +3,7 @@ from datetime import datetime
|
|
|
from hashlib import sha256
|
|
|
from operator import attrgetter
|
|
|
import argparse
|
|
|
+import faulthandler
|
|
|
import functools
|
|
|
import inspect
|
|
|
import os
|
|
@@ -2021,6 +2022,11 @@ def sig_info_handler(sig_no, stack): # pragma: no cover
|
|
|
break
|
|
|
|
|
|
|
|
|
+def sig_trace_handler(sig_no, stack): # pragma: no cover
|
|
|
+ print('\nReceived SIGUSR2 at %s, dumping trace...' % datetime.now().replace(microsecond=0), file=sys.stderr)
|
|
|
+ faulthandler.dump_traceback()
|
|
|
+
|
|
|
+
|
|
|
def main(): # pragma: no cover
|
|
|
# Make sure stdout and stderr have errors='replace') to avoid unicode
|
|
|
# issues when print()-ing unicode file names
|
|
@@ -2032,10 +2038,14 @@ def main(): # pragma: no cover
|
|
|
# SIGHUP is important especially for systemd systems, where logind
|
|
|
# sends it when a session exits, in addition to any traditional use.
|
|
|
# Output some info if we receive SIGUSR1 or SIGINFO (ctrl-t).
|
|
|
+
|
|
|
+ # Register fault handler for SIGSEGV, SIGFPE, SIGABRT, SIGBUS and SIGILL.
|
|
|
+ faulthandler.enable()
|
|
|
with signal_handler('SIGINT', raising_signal_handler(KeyboardInterrupt)), \
|
|
|
signal_handler('SIGHUP', raising_signal_handler(SigHup)), \
|
|
|
signal_handler('SIGTERM', raising_signal_handler(SigTerm)), \
|
|
|
signal_handler('SIGUSR1', sig_info_handler), \
|
|
|
+ signal_handler('SIGUSR2', sig_trace_handler), \
|
|
|
signal_handler('SIGINFO', sig_info_handler):
|
|
|
archiver = Archiver()
|
|
|
msg = None
|