# HG changeset patch # User Augie Fackler # Date 1538596996 14400 # Node ID acf5dbe394787d171fef2a5398a3169d26604649 # Parent 7a347d362a455d84bccf34347171d89724b9c9df showstack: also handle SIGALRM This is looking *very* handy when debugging mysterious hangs in a test: you can wrap a hanging invocation in `perl -e 'alarm shift @ARGV; exec @ARGV' 1` for example, a hanging `hg pull` becomes `perl -e 'alarm shift @ARGV; exec @ARGV' 1 hg pull` where the `1` is the timeout in seconds before the process will be hit with SIGALRM. After making that edit to the test file, you can then use --extra-config-opt on run-tests.py to globaly enable showstack during the test run, so you'll get full stack traces as you force your hg to exit. I wonder (but only a little, not enough to take action just yet) if we should wire up some scaffolding in run-tests itself to automatically wrap all commands in alarm(3) somehow to avoid hangs in the future? Differential Revision: https://phab.mercurial-scm.org/D4870 diff -r 7a347d362a45 -r acf5dbe39478 contrib/showstack.py --- a/contrib/showstack.py Wed Oct 03 13:54:31 2018 -0700 +++ b/contrib/showstack.py Wed Oct 03 16:03:16 2018 -0400 @@ -4,7 +4,7 @@ """dump stack trace when receiving SIGQUIT (Ctrl-\) and SIGINFO (Ctrl-T on BSDs) """ -from __future__ import absolute_import +from __future__ import absolute_import, print_function import signal import sys import traceback @@ -14,8 +14,14 @@ traceback.print_stack(args[1], limit=10, file=sys.stderr) sys.stderr.write("----\n") +def sigexit(*args): + sigshow(*args) + print('alarm!') + sys.exit(1) + def extsetup(ui): signal.signal(signal.SIGQUIT, sigshow) + signal.signal(signal.SIGALRM, sigexit) try: signal.signal(signal.SIGINFO, sigshow) except AttributeError: