Repository navigation
sys.settrace does not receive opcode events in 3.12.x #114480
Copy link
Copy link
Closed
Labels
type-bugAn unexpected behavior, bug, or errorAn unexpected behavior, bug, or error
Description
Bug report
Bug description:
import sys
from types import FrameType
from typing import Any
def trace(frame: FrameType, event: str, arg: Any):
frame.f_trace_opcodes = True
print(frame, event, arg)
return trace
sys.settrace(trace)
eval('"-".join([x for x in "hello"])')When running in versions 3.11.7 and 3.13.0a3, opcode events are emitted, though they differ:
podman run --rm -it -v (pwd)/tracetest.py:/tracetest.py:Z python:3.11.7 python /tracetest.py
<frame at 0x7fd3ac579bc0, file '<string>', line 0, code <module>> call None
<frame at 0x7fd3ac579bc0, file '<string>', line 1, code <module>> line None
<frame at 0x7fd3ac579bc0, file '<string>', line 1, code <module>> opcode None
<frame at 0x7fd3ac579bc0, file '<string>', line 1, code <module>> opcode None
<frame at 0x7fd3ac579bc0, file '<string>', line 1, code <module>> opcode None
<frame at 0x7fd3ac579bc0, file '<string>', line 1, code <module>> opcode None
<frame at 0x7fd3ac579bc0, file '<string>', line 1, code <module>> opcode None
<frame at 0x7fd3ac579bc0, file '<string>', line 1, code <module>> opcode None
<frame at 0x7fd3ac579bc0, file '<string>', line 1, code <module>> opcode None
<frame at 0x7fd3ac579bc0, file '<string>', line 1, code <module>> opcode None
<frame at 0x7fd3ac57a400, file '<string>', line 1, code <listcomp>> call None
<frame at 0x7fd3ac57a400, file '<string>', line 1, code <listcomp>> line None
<frame at 0x7fd3ac57a400, file '<string>', line 1, code <listcomp>> opcode None
<frame at 0x7fd3ac57a400, file '<string>', line 1, code <listcomp>> opcode None
<frame at 0x7fd3ac57a400, file '<string>', line 1, code <listcomp>> opcode None
<frame at 0x7fd3ac57a400, file '<string>', line 1, code <listcomp>> opcode None
<frame at 0x7fd3ac57a400, file '<string>', line 1, code <listcomp>> opcode None
<frame at 0x7fd3ac57a400, file '<string>', line 1, code <listcomp>> opcode None
<frame at 0x7fd3ac57a400, file '<string>', line 1, code <listcomp>> opcode None
<frame at 0x7fd3ac57a400, file '<string>', line 1, code <listcomp>> line None
<frame at 0x7fd3ac57a400, file '<string>', line 1, code <listcomp>> opcode None
<frame at 0x7fd3ac57a400, file '<string>', line 1, code <listcomp>> opcode None
<frame at 0x7fd3ac57a400, file '<string>', line 1, code <listcomp>> opcode None
<frame at 0x7fd3ac57a400, file '<string>', line 1, code <listcomp>> opcode None
<frame at 0x7fd3ac57a400, file '<string>', line 1, code <listcomp>> opcode None
<frame at 0x7fd3ac57a400, file '<string>', line 1, code <listcomp>> line None
<frame at 0x7fd3ac57a400, file '<string>', line 1, code <listcomp>> opcode None
<frame at 0x7fd3ac57a400, file '<string>', line 1, code <listcomp>> opcode None
<frame at 0x7fd3ac57a400, file '<string>', line 1, code <listcomp>> opcode None
<frame at 0x7fd3ac57a400, file '<string>', line 1, code <listcomp>> opcode None
<frame at 0x7fd3ac57a400, file '<string>', line 1, code <listcomp>> opcode None
<frame at 0x7fd3ac57a400, file '<string>', line 1, code <listcomp>> line None
<frame at 0x7fd3ac57a400, file '<string>', line 1, code <listcomp>> opcode None
<frame at 0x7fd3ac57a400, file '<string>', line 1, code <listcomp>> opcode None
<frame at 0x7fd3ac57a400, file '<string>', line 1, code <listcomp>> opcode None
<frame at 0x7fd3ac57a400, file '<string>', line 1, code <listcomp>> opcode None
<frame at 0x7fd3ac57a400, file '<string>', line 1, code <listcomp>> opcode None
<frame at 0x7fd3ac57a400, file '<string>', line 1, code <listcomp>> line None
<frame at 0x7fd3ac57a400, file '<string>', line 1, code <listcomp>> opcode None
<frame at 0x7fd3ac57a400, file '<string>', line 1, code <listcomp>> opcode None
<frame at 0x7fd3ac57a400, file '<string>', line 1, code <listcomp>> opcode None
<frame at 0x7fd3ac57a400, file '<string>', line 1, code <listcomp>> opcode None
<frame at 0x7fd3ac57a400, file '<string>', line 1, code <listcomp>> opcode None
<frame at 0x7fd3ac57a400, file '<string>', line 1, code <listcomp>> line None
<frame at 0x7fd3ac57a400, file '<string>', line 1, code <listcomp>> opcode None
<frame at 0x7fd3ac57a400, file '<string>', line 1, code <listcomp>> opcode None
<frame at 0x7fd3ac57a400, file '<string>', line 1, code <listcomp>> return ['h', 'e', 'l', 'l', 'o']
<frame at 0x7fd3ac579bc0, file '<string>', line 1, code <module>> opcode None
<frame at 0x7fd3ac579bc0, file '<string>', line 1, code <module>> opcode None
<frame at 0x7fd3ac579bc0, file '<string>', line 1, code <module>> opcode None
<frame at 0x7fd3ac579bc0, file '<string>', line 1, code <module>> return h-e-l-l-o
podman run --rm -it -v (pwd)/tracetest.py:/tracetest.py:Z python:3.13.0a3 python /tracetest.py
<frame at 0x7f79bcabca00, file '<string>', line 0, code <module>> call None
<frame at 0x7f79bcabca00, file '<string>', line 1, code <module>> line None
<frame at 0x7f79bcabca00, file '<string>', line 1, code <module>> opcode None
<frame at 0x7f79bcabca00, file '<string>', line 1, code <module>> opcode None
<frame at 0x7f79bcabca00, file '<string>', line 1, code <module>> opcode None
<frame at 0x7f79bcabca00, file '<string>', line 1, code <module>> opcode None
<frame at 0x7f79bcabca00, file '<string>', line 1, code <module>> opcode None
<frame at 0x7f79bcabca00, file '<string>', line 1, code <module>> opcode None
<frame at 0x7f79bcabca00, file '<string>', line 1, code <module>> opcode None
<frame at 0x7f79bcabca00, file '<string>', line 1, code <module>> opcode None
<frame at 0x7f79bcabca00, file '<string>', line 1, code <module>> opcode None
<frame at 0x7f79bcabca00, file '<string>', line 1, code <module>> opcode None
<frame at 0x7f79bcabca00, file '<string>', line 1, code <module>> opcode None
<frame at 0x7f79bcabca00, file '<string>', line 1, code <module>> opcode None
<frame at 0x7f79bcabca00, file '<string>', line 1, code <module>> line None
<frame at 0x7f79bcabca00, file '<string>', line 1, code <module>> opcode None
<frame at 0x7f79bcabca00, file '<string>', line 1, code <module>> opcode None
<frame at 0x7f79bcabca00, file '<string>', line 1, code <module>> opcode None
<frame at 0x7f79bcabca00, file '<string>', line 1, code <module>> opcode None
<frame at 0x7f79bcabca00, file '<string>', line 1, code <module>> line None
<frame at 0x7f79bcabca00, file '<string>', line 1, code <module>> opcode None
<frame at 0x7f79bcabca00, file '<string>', line 1, code <module>> opcode None
<frame at 0x7f79bcabca00, file '<string>', line 1, code <module>> opcode None
<frame at 0x7f79bcabca00, file '<string>', line 1, code <module>> opcode None
<frame at 0x7f79bcabca00, file '<string>', line 1, code <module>> line None
<frame at 0x7f79bcabca00, file '<string>', line 1, code <module>> opcode None
<frame at 0x7f79bcabca00, file '<string>', line 1, code <module>> opcode None
<frame at 0x7f79bcabca00, file '<string>', line 1, code <module>> opcode None
<frame at 0x7f79bcabca00, file '<string>', line 1, code <module>> opcode None
<frame at 0x7f79bcabca00, file '<string>', line 1, code <module>> line None
<frame at 0x7f79bcabca00, file '<string>', line 1, code <module>> opcode None
<frame at 0x7f79bcabca00, file '<string>', line 1, code <module>> opcode None
<frame at 0x7f79bcabca00, file '<string>', line 1, code <module>> opcode None
<frame at 0x7f79bcabca00, file '<string>', line 1, code <module>> opcode None
<frame at 0x7f79bcabca00, file '<string>', line 1, code <module>> line None
<frame at 0x7f79bcabca00, file '<string>', line 1, code <module>> opcode None
<frame at 0x7f79bcabca00, file '<string>', line 1, code <module>> opcode None
<frame at 0x7f79bcabca00, file '<string>', line 1, code <module>> opcode None
<frame at 0x7f79bcabca00, file '<string>', line 1, code <module>> opcode None
<frame at 0x7f79bcabca00, file '<string>', line 1, code <module>> opcode None
<frame at 0x7f79bcabca00, file '<string>', line 1, code <module>> return h-e-l-l-o
However on 3.12.0 and 3.12.1, only call, line and return are emitted:
podman run --rm -it -v (pwd)/tracetest.py:/tracetest.py:Z python:3.12.1 python /tracetest.py
<frame at 0x7ff4180afc40, file '<string>', line 0, code <module>> call None
<frame at 0x7ff4180afc40, file '<string>', line 1, code <module>> line None
<frame at 0x7ff4180afc40, file '<string>', line 1, code <module>> line None
<frame at 0x7ff4180afc40, file '<string>', line 1, code <module>> line None
<frame at 0x7ff4180afc40, file '<string>', line 1, code <module>> line None
<frame at 0x7ff4180afc40, file '<string>', line 1, code <module>> line None
<frame at 0x7ff4180afc40, file '<string>', line 1, code <module>> line None
<frame at 0x7ff4180afc40, file '<string>', line 1, code <module>> return h-e-l-l-o
CPython versions tested on:
3.12
Operating systems tested on:
Linux
Linked PRs
Reactions are currently unavailable
Metadata
Metadata
Assignees
Labels
type-bugAn unexpected behavior, bug, or errorAn unexpected behavior, bug, or error
Activity
terryjreedy commentedon Jan 23, 2024
Verified on Windows.
gaogaotiantian commentedon Jan 23, 2024
dup #103615 which is fixed in main by #109472
This is an issue introduced by PEP 669 and it's a design issue. The workaround is to set any
f_trace_opcodesbeforesys.settrace. I doubt if we can backport the fix to 3.12 because it's a relatively large design level change. I would guess we will "leave 3.12 as it is".rijenkii commentedon Jan 23, 2024
If fix is not backportable then I would prefer this bug and the workaround to be documented somewhere, preferrably in the
settracedocumentation.gaogaotiantian commentedon Jan 23, 2024
I'm not against documenting this for 3.12 only. We need to consult docs team about how to do this properly.
jasfvcb commentedon Jan 24, 2024
[3.12] gh-114480: Add docs for f_trace_opcodes behavior on 3.12 (#114540
gaogaotiantian commentedon Feb 4, 2024
This behavior is documented in 3.12, so close this issue.