12
def stacktrace_line(frame):
13
return '%s:%s (in %s)' % (frame.f_code.co_name, frame.f_lineno, frame.f_code.co_filename)
15
def dump_trace(frame):
17
while frame is not None:
18
out.append(' ' + stacktrace_line(frame))
22
def tracer(frame, kind, obj):
24
_trace[threading.currentThread()] = frame
25
if (kind != 'exception') and (kind != 'c_exception') and kind != 'c_call' and kind != 'c_return':
28
def dump_thread(thread):
30
out = [ 'Stack trace for thread %r:' % (thread,) ]
31
frame = _trace.get(thread, None)
33
out.append(' <unable to find stack trace>')
35
out.append(dump_trace(frame))
38
def sigquit(signal, frame):
39
sys.stderr.write('\nSIGQUIT - THREAD STACKS:\n')
40
for thread in threading.enumerate():
41
sys.stderr.write('\n')
42
sys.stderr.write(dump_thread(thread))
43
sys.stderr.write('\n')
47
#threading.settrace(tracer)
48
sys.setprofile(tracer)
49
threading.setprofile(tracer)
50
#atexit.register(lambda: sys.settrace(None))
51
atexit.register(lambda: sys.setprofile(None))
52
signal.signal(signal.SIGQUIT, sigquit)