mirror of
https://github.com/facebook/sapling.git
synced 2024-10-11 09:17:30 +03:00
f260c80298
Upstream has added devel warnings that require us to register all the configs and remove the defaults that are specified at read time. This doesn't fix all the cases, but is the start. Differential Revision: https://phab.mercurial-scm.org/D1206
53 lines
1.3 KiB
Python
53 lines
1.3 KiB
Python
# sigtrace.py
|
|
#
|
|
# Copyright 2017 Facebook, Inc.
|
|
#
|
|
# This software may be used and distributed according to the terms of the
|
|
# GNU General Public License version 2 or any later version.
|
|
|
|
"""sigtrace - dump stack traces on signal
|
|
|
|
By default, SIGUSR1 will make hg dump stacks of all threads to /tmp.
|
|
|
|
Config::
|
|
|
|
[sigtrace]
|
|
signal = USR1
|
|
pathformat = /tmp/trace-%(pid)s-%(time)s.log
|
|
"""
|
|
|
|
import os
|
|
import signal
|
|
import sys
|
|
import time
|
|
import traceback
|
|
|
|
from mercurial import (
|
|
registrar,
|
|
)
|
|
|
|
pathformat = '/tmp/trace-%(pid)s-%(time)s.log'
|
|
|
|
configtable = {}
|
|
configitem = registrar.configitem(configtable)
|
|
|
|
configitem('sigtrace', 'pathformat', default=pathformat)
|
|
configitem('sigtrace', 'signal', default='USR1')
|
|
|
|
def printstacks(sig, currentframe):
|
|
content = ''
|
|
for tid, frame in sys._current_frames().iteritems():
|
|
content += ('Thread %s:\n%s\n'
|
|
% (tid, ''.join(traceback.format_stack(frame))))
|
|
|
|
with open(pathformat % {'time': time.time(), 'pid': os.getpid()}, 'w') as f:
|
|
f.write(content)
|
|
|
|
def uisetup(ui):
|
|
global pathformat
|
|
pathformat = ui.config('sigtrace', 'pathformat')
|
|
signame = ui.config('sigtrace', 'signal')
|
|
sig = getattr(signal, 'SIG' + signame, None)
|
|
if sig is not None:
|
|
signal.signal(sig, printstacks)
|