aboutsummaryrefslogtreecommitdiffstats
path: root/netlib/debug.py
diff options
context:
space:
mode:
authorAldo Cortesi <aldo@nullcube.com>2016-06-11 23:07:42 +1200
committerAldo Cortesi <aldo@nullcube.com>2016-06-11 23:07:42 +1200
commit7b86560dedaad88baaab87bd5c1be7719ec1810e (patch)
tree224e00917aaee4204e1d827d85c50a4f98a97e55 /netlib/debug.py
parent8489c01ac81479e48c2ff2c3ab308e07e3d2bacd (diff)
downloadmitmproxy-7b86560dedaad88baaab87bd5c1be7719ec1810e.tar.gz
mitmproxy-7b86560dedaad88baaab87bd5c1be7719ec1810e.tar.bz2
mitmproxy-7b86560dedaad88baaab87bd5c1be7719ec1810e.zip
debug: On SIGUSR2, we dump tracebacks for all threads to screen
Diffstat (limited to 'netlib/debug.py')
-rw-r--r--netlib/debug.py16
1 files changed, 15 insertions, 1 deletions
diff --git a/netlib/debug.py b/netlib/debug.py
index 6f6b0460..792ff52e 100644
--- a/netlib/debug.py
+++ b/netlib/debug.py
@@ -4,6 +4,7 @@ import sys
import threading
import signal
import platform
+import traceback
import psutil
@@ -76,5 +77,18 @@ def dump_info(sig, frm, file=sys.stdout): # pragma: no cover
print("****************************************************", file=file)
-def register_info_dumper(): # pragma: no cover
+def dump_stacks(signal, frame, file=sys.stdout):
+ id2name = dict([(th.ident, th.name) for th in threading.enumerate()])
+ code = []
+ for threadId, stack in sys._current_frames().items():
+ code.append("\n# Thread: %s(%d)" % (id2name.get(threadId,""), threadId))
+ for filename, lineno, name, line in traceback.extract_stack(stack):
+ code.append('File: "%s", line %d, in %s' % (filename, lineno, name))
+ if line:
+ code.append(" %s" % (line.strip()))
+ print("\n".join(code), file=file)
+
+
+def register_info_dumpers(): # pragma: no cover
signal.signal(signal.SIGUSR1, dump_info)
+ signal.signal(signal.SIGUSR2, dump_stacks)