123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869 |
- # -*- coding: utf-8 -
- #
- # This file is part of gunicorn released under the MIT license.
- # See the NOTICE for more information.
- """The debug module contains utilities and functions for better
- debugging Gunicorn."""
- import sys
- import linecache
- import re
- import inspect
- __all__ = ['spew', 'unspew']
- _token_spliter = re.compile(r'\W+')
- class Spew(object):
- def __init__(self, trace_names=None, show_values=True):
- self.trace_names = trace_names
- self.show_values = show_values
- def __call__(self, frame, event, arg):
- if event == 'line':
- lineno = frame.f_lineno
- if '__file__' in frame.f_globals:
- filename = frame.f_globals['__file__']
- if (filename.endswith('.pyc') or
- filename.endswith('.pyo')):
- filename = filename[:-1]
- name = frame.f_globals['__name__']
- line = linecache.getline(filename, lineno)
- else:
- name = '[unknown]'
- try:
- src = inspect.getsourcelines(frame)
- line = src[lineno]
- except IOError:
- line = 'Unknown code named [%s]. VM instruction #%d' % (
- frame.f_code.co_name, frame.f_lasti)
- if self.trace_names is None or name in self.trace_names:
- print('%s:%s: %s' % (name, lineno, line.rstrip()))
- if not self.show_values:
- return self
- details = []
- tokens = _token_spliter.split(line)
- for tok in tokens:
- if tok in frame.f_globals:
- details.append('%s=%r' % (tok, frame.f_globals[tok]))
- if tok in frame.f_locals:
- details.append('%s=%r' % (tok, frame.f_locals[tok]))
- if details:
- print("\t%s" % ' '.join(details))
- return self
- def spew(trace_names=None, show_values=False):
- """Install a trace hook which writes incredibly detailed logs
- about what code is being executed to stdout.
- """
- sys.settrace(Spew(trace_names, show_values))
- def unspew():
- """Remove the trace hook installed by spew.
- """
- sys.settrace(None)
|