commit a4751b2dbc692dd100cd678b23b51f1f5c08f1f9 Author: Damian Johnson atagar@torproject.org Date: Tue Apr 16 09:09:29 2019 -0700
Note thread names rather than idents
Thread ident numbers are unhelpful for troubleshooting hangs. If a thread hangs I need to know its name, not its internal numeric identifier.
Also cleaning up the pid bits a tad. The pgid variable was unused, and there's no need to pass the pid of ourselves as an argument (it's static for the interpreter, so we can fetch it as needed). --- run_tests.py | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-)
diff --git a/run_tests.py b/run_tests.py index e1b42744..220208b4 100755 --- a/run_tests.py +++ b/run_tests.py @@ -88,15 +88,18 @@ def disable_signal_handlers(): signal.signal(signal.SIGUSR1, signal.SIG_IGN)
-def format_traceback(pid, ident, frame): +def format_traceback(thread): """ Format the traceback for process pid and thread ident using the stack frame. """ + + frame = sys._current_frames().get(thread.ident, None) + if frame is not None: - return ('Traceback for thread %d in process %d:\n\n%s' % - (ident, pid, ''.join(traceback.format_stack(frame)))) + return ('Traceback for thread %s in process %d:\n\n%s' % + (thread.name, os.getpid(), ''.join(traceback.format_stack(frame)))) else: - return ('No traceback for thread %d in process %d.' % (ident, pid)) + return ('No traceback for thread %s in process %d.' % (thread.name, os.getpid()))
def log_traceback(sig, frame): @@ -113,18 +116,16 @@ def log_traceback(sig, frame): disable_signal_handlers()
# format and log tracebacks - pid = os.getpid() - thread_tracebacks = [format_traceback(pid, ident, frame_) - for ident, frame_ in sys._current_frames().items()] - print('Signal %s received by thread %d in process %d:\n\n%s' % - (sig, threading.current_thread().ident, pid, + thread_tracebacks = [format_traceback(thread) + for thread in threading.enumerate()] + print('Signal %s received by thread %s in process %d:\n\n%s' % + (sig, threading.current_thread().name, os.getpid(), '\n\n'.join(thread_tracebacks)))
# we're about to signal our children, and maybe do a hard abort, so flush sys.stdout.flush()
# propagate the signal to any multiprocessing children - pgid = os.getpgid(pid) for p in multiprocessing.active_children(): # avoid race conditions if p.is_alive():