Implement stack trace dump for all running threads on SIGQUIT
This is handy when we're debugging the thread locks: we can try to understand which thread does what and how it was called. Signed-off-by: Eygene Ryabinkin <rea@codelabs.ru>
This commit is contained in:
25
offlineimap/utils/stacktrace.py
Normal file
25
offlineimap/utils/stacktrace.py
Normal file
@ -0,0 +1,25 @@
|
||||
# Copyright 2013 Eygene A. Ryabinkin
|
||||
# Functions to perform stack tracing (for multithreaded programs
|
||||
# as well as for single-threaded ones).
|
||||
|
||||
import sys
|
||||
import threading
|
||||
import traceback
|
||||
|
||||
|
||||
def dump(out):
|
||||
""" Dumps current stack trace into I/O object 'out' """
|
||||
id2name = {}
|
||||
for th in threading.enumerate():
|
||||
id2name[th.ident] = th.name
|
||||
n = 0
|
||||
for i, stack in sys._current_frames().items():
|
||||
out.write ("\n# Thread #%d (id=%d), %s\n" % \
|
||||
(n, i, id2name[i]))
|
||||
n = n + 1
|
||||
for f, lno, name, line in traceback.extract_stack (stack):
|
||||
out.write ('File: "%s", line %d, in %s' % \
|
||||
(f, lno, name))
|
||||
if line:
|
||||
out.write (" %s" % (line.strip()))
|
||||
out.write ("\n")
|
Reference in New Issue
Block a user