55 lines
1.7 KiB
Python
55 lines
1.7 KiB
Python
# Copyright (C) 2006, Red Hat, Inc.
|
|
#
|
|
# This library is free software; you can redistribute it and/or
|
|
# modify it under the terms of the GNU Lesser General Public
|
|
# License as published by the Free Software Foundation; either
|
|
# version 2 of the License, or (at your option) any later version.
|
|
#
|
|
# This library is distributed in the hope that it will be useful,
|
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
# Lesser General Public License for more details.
|
|
#
|
|
# You should have received a copy of the GNU Lesser General Public
|
|
# License along with this library; if not, write to the
|
|
# Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
|
# Boston, MA 02111-1307, USA.
|
|
|
|
import sys
|
|
import traceback
|
|
import os
|
|
import signal
|
|
|
|
haveThreadframe = True
|
|
try:
|
|
import threadframe
|
|
except ImportError:
|
|
haveThreadframe = False
|
|
|
|
class TracebackHelper(object):
|
|
def __init__(self):
|
|
fname = "%s-%d" % (os.path.basename(sys.argv[0]), os.getpid())
|
|
self._fpath = os.path.join("/tmp", fname)
|
|
print "Tracebacks will be written to %s on SIGUSR1" % self._fpath
|
|
signal.signal(signal.SIGUSR1, self._handler)
|
|
|
|
def __del__(self):
|
|
try:
|
|
os.remove(self._fpath)
|
|
except OSError:
|
|
pass
|
|
|
|
def _handler(self, signum, pframe):
|
|
f = open(self._fpath, "a")
|
|
if not haveThreadframe:
|
|
f.write("Threadframe not installed. No traceback available.\n")
|
|
else:
|
|
frames = threadframe.dict()
|
|
for thread_id, frame in frames.iteritems():
|
|
f.write(('-' * 79) + '\n')
|
|
f.write('[Thread %s] %d' % (thread_id, sys.getrefcount(frame)) + '\n')
|
|
traceback.print_stack(frame, limit=None, file=f)
|
|
f.write("\n")
|
|
f.write('\n')
|
|
f.close()
|