You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							69 lines
						
					
					
						
							2.2 KiB
						
					
					
				
			
		
		
	
	
							69 lines
						
					
					
						
							2.2 KiB
						
					
					
				| # -*- 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)
 | |
| 
 |