Disabled coverage CTracer may rise from the dead · Issue #436 · nedbat/coveragepy (original) (raw)
Originally reported by David MacIver (Bitbucket: david_maciver_, GitHub: Unknown)
The following code causes an issue for me where I have changed away from the coverage tracer to a tracer of my own devising, but the coverage CTracer mysteriously reappears.
import sys
def tracer(frame, event, arg): return tracer
def begin(): sys.settrace(tracer)
def collect(): t = sys.gettrace() assert t is tracer, t
def test_unsets_trace(): begin() collect()
if name == 'main': test_unsets_trace()
Running the above code under 'python -m coverage run test_coverage_unset_trace.py' (or whatever you call the file) under Python 3.4.3 or 3.5.0 with coverage 4.0.1 produces the following error for me:
Traceback (most recent call last):
File "test_coverage_regression.py", line 23, in <module>
test_unsets_trace()
File "test_coverage_regression.py", line 19, in test_unsets_trace
collect()
File "test_coverage_regression.py", line 14, in collect
assert t is tracer, t
AssertionError: <coverage.CTracer object at 0x7fbdfa585a40>
Note: I do not see this issue on Coverage 4.0.0, or on Python 2.7 running 4.0.1. This seems to be specifically 4.0.1 and Python 3 together that cause the problem.
I originally believed this to be related to the fix for https://bitbucket.org/ned/coveragepy/issues/397/stopping-and-resuming-coverage-with, but I can't see why the tracer object would be running via settrace at this point rather than C level tracing, so this might be a red herring.
If I run this with --timid I get the "trace function changed" warning but do not see this problem.