summaryrefslogtreecommitdiff
path: root/coverage
diff options
context:
space:
mode:
Diffstat (limited to 'coverage')
-rw-r--r--coverage/collector.py6
-rw-r--r--coverage/misc.py6
2 files changed, 10 insertions, 2 deletions
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.