2016-06-11 07:52:24 +00:00
|
|
|
from __future__ import (absolute_import, print_function, division)
|
|
|
|
|
2016-10-04 05:22:01 +00:00
|
|
|
import gc
|
2016-06-14 01:06:44 +00:00
|
|
|
import os
|
2016-06-11 07:52:24 +00:00
|
|
|
import sys
|
|
|
|
import threading
|
|
|
|
import signal
|
2016-06-11 04:40:21 +00:00
|
|
|
import platform
|
2016-06-11 11:07:42 +00:00
|
|
|
import traceback
|
2016-06-11 07:52:24 +00:00
|
|
|
|
2016-06-11 04:40:21 +00:00
|
|
|
from netlib import version
|
|
|
|
|
2016-06-11 09:26:38 +00:00
|
|
|
from OpenSSL import SSL
|
2016-06-11 09:06:41 +00:00
|
|
|
|
2016-06-11 04:40:21 +00:00
|
|
|
|
|
|
|
def sysinfo():
|
|
|
|
data = [
|
2016-06-11 09:04:13 +00:00
|
|
|
"Mitmproxy version: %s" % version.VERSION,
|
2016-06-11 07:52:24 +00:00
|
|
|
"Python version: %s" % platform.python_version(),
|
|
|
|
"Platform: %s" % platform.platform(),
|
2016-07-10 11:16:23 +00:00
|
|
|
"SSL version: %s" % SSL.SSLeay_version(SSL.SSLEAY_VERSION).decode(),
|
2016-06-11 04:40:21 +00:00
|
|
|
]
|
|
|
|
d = platform.linux_distribution()
|
2016-06-11 07:52:24 +00:00
|
|
|
t = "Linux distro: %s %s %s" % d
|
|
|
|
if d[0]: # pragma: no-cover
|
2016-06-11 05:56:17 +00:00
|
|
|
data.append(t)
|
2016-06-11 04:40:21 +00:00
|
|
|
|
|
|
|
d = platform.mac_ver()
|
2016-06-11 07:52:24 +00:00
|
|
|
t = "Mac version: %s %s %s" % d
|
|
|
|
if d[0]: # pragma: no-cover
|
2016-06-11 05:56:17 +00:00
|
|
|
data.append(t)
|
2016-06-11 04:40:21 +00:00
|
|
|
|
|
|
|
d = platform.win32_ver()
|
2016-06-11 07:52:24 +00:00
|
|
|
t = "Windows version: %s %s %s %s" % d
|
|
|
|
if d[0]: # pragma: no-cover
|
2016-06-11 05:56:17 +00:00
|
|
|
data.append(t)
|
2016-06-11 04:40:21 +00:00
|
|
|
|
|
|
|
return "\n".join(data)
|
2016-06-11 07:52:24 +00:00
|
|
|
|
|
|
|
|
2016-10-04 05:48:13 +00:00
|
|
|
def dump_info(signal=None, frame=None, file=sys.stdout, testing=False): # pragma: no cover
|
2016-06-11 07:52:24 +00:00
|
|
|
print("****************************************************", file=file)
|
|
|
|
print("Summary", file=file)
|
|
|
|
print("=======", file=file)
|
2016-07-08 22:49:38 +00:00
|
|
|
|
|
|
|
try:
|
|
|
|
import psutil
|
|
|
|
except:
|
|
|
|
print("(psutil not installed, skipping some debug info)", file=file)
|
|
|
|
else:
|
|
|
|
p = psutil.Process()
|
|
|
|
print("num threads: ", p.num_threads(), file=file)
|
|
|
|
if hasattr(p, "num_fds"):
|
|
|
|
print("num fds: ", p.num_fds(), file=file)
|
|
|
|
print("memory: ", p.memory_info(), file=file)
|
|
|
|
|
|
|
|
print(file=file)
|
|
|
|
print("Files", file=file)
|
|
|
|
print("=====", file=file)
|
|
|
|
for i in p.open_files():
|
|
|
|
print(i, file=file)
|
|
|
|
|
|
|
|
print(file=file)
|
|
|
|
print("Connections", file=file)
|
|
|
|
print("===========", file=file)
|
|
|
|
for i in p.connections():
|
|
|
|
print(i, file=file)
|
2016-06-11 07:52:24 +00:00
|
|
|
|
|
|
|
print(file=file)
|
|
|
|
print("Threads", file=file)
|
|
|
|
print("=======", file=file)
|
|
|
|
bthreads = []
|
|
|
|
for i in threading.enumerate():
|
|
|
|
if hasattr(i, "_threadinfo"):
|
|
|
|
bthreads.append(i)
|
|
|
|
else:
|
|
|
|
print(i.name, file=file)
|
|
|
|
bthreads.sort(key=lambda x: x._thread_started)
|
|
|
|
for i in bthreads:
|
|
|
|
print(i._threadinfo(), file=file)
|
|
|
|
|
2016-10-04 05:22:01 +00:00
|
|
|
print()
|
|
|
|
print("Memory", file=file)
|
|
|
|
print("=======", file=file)
|
|
|
|
gc.collect()
|
|
|
|
d = {}
|
|
|
|
for i in gc.get_objects():
|
|
|
|
t = str(type(i))
|
|
|
|
if "mitmproxy" in t or "netlib" in t:
|
|
|
|
d[t] = d.setdefault(t, 0) + 1
|
|
|
|
itms = list(d.items())
|
|
|
|
itms.sort(key=lambda x: x[1])
|
|
|
|
for i in itms[-20:]:
|
|
|
|
print(i[1], i[0])
|
2016-06-11 07:52:24 +00:00
|
|
|
print("****************************************************", file=file)
|
|
|
|
|
2016-10-04 05:48:13 +00:00
|
|
|
if not testing:
|
|
|
|
sys.exit(1)
|
2016-06-11 07:52:24 +00:00
|
|
|
|
2016-10-04 05:48:13 +00:00
|
|
|
|
|
|
|
def dump_stacks(signal=None, frame=None, file=sys.stdout, testing=False):
|
2016-06-11 11:07:42 +00:00
|
|
|
id2name = dict([(th.ident, th.name) for th in threading.enumerate()])
|
|
|
|
code = []
|
|
|
|
for threadId, stack in sys._current_frames().items():
|
2016-06-11 11:13:41 +00:00
|
|
|
code.append(
|
|
|
|
"\n# Thread: %s(%d)" % (
|
|
|
|
id2name.get(threadId, ""), threadId
|
|
|
|
)
|
|
|
|
)
|
2016-06-11 11:07:42 +00:00
|
|
|
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)
|
2016-10-04 05:48:13 +00:00
|
|
|
if not testing:
|
|
|
|
sys.exit(1)
|
2016-06-11 11:07:42 +00:00
|
|
|
|
|
|
|
|
2016-06-14 01:06:44 +00:00
|
|
|
def register_info_dumpers():
|
|
|
|
if os.name != "nt":
|
|
|
|
signal.signal(signal.SIGUSR1, dump_info)
|
|
|
|
signal.signal(signal.SIGUSR2, dump_stacks)
|