diff options
Diffstat (limited to 'coverage/debug.py')
-rw-r--r-- | coverage/debug.py | 42 |
1 files changed, 39 insertions, 3 deletions
diff --git a/coverage/debug.py b/coverage/debug.py index 5b41bc40..4076b9b2 100644 --- a/coverage/debug.py +++ b/coverage/debug.py @@ -1,6 +1,15 @@ +# Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0 +# For details: https://bitbucket.org/ned/coveragepy/src/default/NOTICE.txt + """Control of and utilities for debugging.""" +import inspect import os +import sys + +from coverage.misc import isolate_module + +os = isolate_module(os) # When debugging, it can be helpful to force some options, especially when @@ -8,6 +17,9 @@ import os # This is a list of forced debugging options. FORCED_DEBUG = [] +# A hack for debugging testing in sub-processes. +_TEST_NAME_FILE = "" # "/tmp/covtest.txt" + class DebugControl(object): """Control and output for debugging.""" @@ -18,9 +30,7 @@ class DebugControl(object): self.output = output def __repr__(self): - return "<DebugControl options=%r output=%r>" % ( - self.options, self.output - ) + return "<DebugControl options=%r output=%r>" % (self.options, self.output) def should(self, option): """Decide whether to output debug information in category `option`.""" @@ -31,6 +41,8 @@ class DebugControl(object): if self.should('pid'): msg = "pid %5d: %s" % (os.getpid(), msg) self.output.write(msg+"\n") + if self.should('callers'): + dump_stack_frames(self.output) self.output.flush() def write_formatted_info(self, header, info): @@ -66,3 +78,27 @@ def info_formatter(info): prefix = "" else: yield "%*s: %s" % (label_len, label, data) + + +def short_stack(): # pragma: debugging + """Return a string summarizing the call stack. + + The string is multi-line, with one line per stack frame. Each line shows + the function name, the file name, and the line number: + + ... + start_import_stop : /Users/ned/coverage/trunk/tests/coveragetest.py @95 + import_local_file : /Users/ned/coverage/trunk/tests/coveragetest.py @81 + import_local_file : /Users/ned/coverage/trunk/coverage/backward.py @159 + ... + + """ + stack = inspect.stack()[:0:-1] + return "\n".join("%30s : %s @%d" % (t[3], t[1], t[2]) for t in stack) + + +def dump_stack_frames(out=None): # pragma: debugging + """Print a summary of the stack to stdout, or some place else.""" + out = out or sys.stdout + out.write(short_stack()) + out.write("\n") |