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
--- 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: