Skip to content

Py_DECREF() in interpreter doesn't call _PyReftracerTrack(op, PyRefTracer_DESTROY) #130382

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
colesbury opened this issue Feb 20, 2025 · 1 comment
Labels
3.13 bugs and security fixes 3.14 new features, bugs and security fixes interpreter-core (Objects, Python, Grammar, and Parser dirs) type-bug An unexpected behavior, bug, or error

Comments

@colesbury
Copy link
Contributor

colesbury commented Feb 20, 2025

Bug report

cpython/Python/ceval.c

Lines 72 to 85 in 6c450f4

#undef Py_DECREF
#define Py_DECREF(arg) \
do { \
PyObject *op = _PyObject_CAST(arg); \
if (_Py_IsImmortal(op)) { \
_Py_DECREF_IMMORTAL_STAT_INC(); \
break; \
} \
_Py_DECREF_STAT_INC(); \
if (--op->ob_refcnt == 0) { \
destructor dealloc = Py_TYPE(op)->tp_dealloc; \
(*dealloc)(op); \
} \
} while (0)

Tracemalloc only handles PyRefTracer_CREATE events and we don't have any tests for PyRefTracer_DESTROY events.

EDIT: _testcapimodule.c tests PyRefTracer_DESTROY events, but only through the C API and not the Python interpreter.

Linked PRs

@colesbury colesbury added 3.13 bugs and security fixes 3.14 new features, bugs and security fixes interpreter-core (Objects, Python, Grammar, and Parser dirs) type-bug An unexpected behavior, bug, or error labels Feb 20, 2025
@tom-pytel
Copy link
Contributor

tom-pytel commented Feb 24, 2025

There is a super-basic reftracer test in _testcapimodule.c, but no python interface that I can see, so added one to tracemalloc module to keep track of created and destroyed refs. Do you want this?

Example:

import tracemalloc

tracemalloc.start()

refs = tracemalloc.get_traced_refs()
print(refs)

tracemalloc.reset_peak()
i = []
refs = tracemalloc.get_traced_refs()
print(refs)

tracemalloc.reset_peak()
j = [], []
del j
refs = tracemalloc.get_traced_refs()
print(refs)

import ssl
refs = tracemalloc.get_traced_refs()
print(refs)

tracemalloc.stop()

Run:

$ ./python reftrace.py
(0, 0)
(1, 0)
(3, 3)
(16722, 8671)

tom-pytel added a commit to tom-pytel/cpython that referenced this issue Feb 28, 2025
colesbury added a commit to colesbury/cpython that referenced this issue Feb 28, 2025
colesbury pushed a commit to colesbury/cpython that referenced this issue Mar 13, 2025
…DECREF` (pythonGH-130689)

(cherry picked from commit c5abded)

Co-authored-by: Tomasz Pytel <[email protected]>
colesbury added a commit that referenced this issue Mar 14, 2025
GH-130689) (#131195)

(cherry picked from commit c5abded)

Co-authored-by: Tomasz Pytel <[email protected]>
plashchynski pushed a commit to plashchynski/cpython that referenced this issue Mar 17, 2025
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
3.13 bugs and security fixes 3.14 new features, bugs and security fixes interpreter-core (Objects, Python, Grammar, and Parser dirs) type-bug An unexpected behavior, bug, or error
Projects
None yet
Development

No branches or pull requests

2 participants