Skip to content

sys.settrace does not receive opcode events in 3.12.x #114480

Closed

Description

@rijenkii

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

Activity

  1. terryjreedy commented on Jan 23, 2024

    @terryjreedy
    Member

    Verified on Windows.

  2. gaogaotiantian commented on Jan 23, 2024

    @gaogaotiantian
    Member

    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_opcodes before sys.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".

  3. rijenkii commented on Jan 23, 2024

    @rijenkii
    Author

    If fix is not backportable then I would prefer this bug and the workaround to be documented somewhere, preferrably in the settrace documentation.

  4. gaogaotiantian commented on Jan 23, 2024

    @gaogaotiantian
    Member

    I'm not against documenting this for 3.12 only. We need to consult docs team about how to do this properly.

  5. jasfvcb commented on Jan 24, 2024

    @jasfvcb
  6. added a commit that references this issue on Feb 4, 2024
  7. gaogaotiantian commented on Feb 4, 2024

    @gaogaotiantian
    Member

    This behavior is documented in 3.12, so close this issue.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Labels

type-bugAn unexpected behavior, bug, or error

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions