From 741e21203b77547906babf0f04edf7eb5dedf723 Mon Sep 17 00:00:00 2001 From: Ned Batchelder Date: Thu, 20 Dec 2012 07:02:12 -0500 Subject: Debugging to understand why 'trace function changed' appears. --- coverage/collector.py | 6 ++++-- coverage/misc.py | 6 ++++++ 2 files changed, 10 insertions(+), 2 deletions(-) (limited to 'coverage') diff --git a/coverage/collector.py b/coverage/collector.py index 1b807b27..bf465939 100644 --- a/coverage/collector.py +++ b/coverage/collector.py @@ -2,6 +2,8 @@ import os, sys, threading +from coverage.misc import short_stack + try: # Use the C extension code when we can, for speed. from coverage.tracer import CTracer # pylint: disable=F0401,E0611 @@ -124,8 +126,8 @@ class PyTracer(object): """Stop this Tracer.""" if hasattr(sys, "gettrace") and self.warn: if sys.gettrace() != self._trace: - msg = "Trace function changed, measurement is likely wrong: %r" - self.warn(msg % sys.gettrace()) + msg = "Trace function changed, measurement is likely wrong: %r\n%s" + self.warn(msg % (sys.gettrace(), short_stack())) sys.settrace(None) def get_stats(self): diff --git a/coverage/misc.py b/coverage/misc.py index 3ed854a7..b4d1c833 100644 --- a/coverage/misc.py +++ b/coverage/misc.py @@ -54,6 +54,12 @@ def format_lines(statements, lines): return ret +def short_stack(): + """Return a string summarizing the call stack.""" + stack = inspect.stack()[:0:-1] + return "\n".join("%30s : %s @%d" % (t[3],t[1],t[2]) for t in stack) + + def expensive(fn): """A decorator to cache the result of an expensive operation. -- cgit v1.2.1