bpo-9263: Dump Python object on GC assertion failure by vstinner · Pull Request #10062 · python/cpython (original) (raw)

x.py example:

from test.support import gc_collect
a = [1, 2, 3]
b = [a]

# Simulate the refcount of "a" being too low (compared to the
# references held on it by live data), but keeping it above zero
# (to avoid deallocating it):
import ctypes
ctypes.pythonapi.Py_DecRef(ctypes.py_object(a))

# The garbage collector should now have a fatal error
# when it reaches the broken object
gc_collect()

Output on a debug build:

vstinner@apu$ ./python x.py
Modules/gcmodule.c:109: gc_decref: Assertion "gc_get_refs(g) > 0" failed; refcount is too small.
object  : [1, 2, 3]
type    : list
refcount: 1
address : 0x7f6100197ae0
Fatal Python error: _PyObject_AssertFailed

Current thread 0x00007f610ddc0080 (most recent call first):
  File "/home/vstinner/prog/python/master/Lib/test/support/__init__.py", line 1572 in gc_collect
  File "x.py", line 13 in <module>
Aborted (core dumped)

But tracemalloc doesn't seem to report the traceback of the "a" list object, but a different list in sre_parse.py: "data = []". I don't understand why.

$ ./python -X tracemalloc=50 x.py 
Modules/gcmodule.c:109: gc_decref: Assertion "gc_get_refs(g) > 0" failed; refcount is too small.
Memory block allocated at (most recent call first):
  File "/home/vstinner/prog/python/master/Lib/sre_parse.py", line 114
  File "/home/vstinner/prog/python/master/Lib/sre_parse.py", line 501
  File "/home/vstinner/prog/python/master/Lib/sre_parse.py", line 449
  File "/home/vstinner/prog/python/master/Lib/sre_parse.py", line 840
  File "/home/vstinner/prog/python/master/Lib/sre_parse.py", line 449
  File "/home/vstinner/prog/python/master/Lib/sre_parse.py", line 954
  File "/home/vstinner/prog/python/master/Lib/sre_compile.py", line 764
  File "/home/vstinner/prog/python/master/Lib/re.py", line 286
  File "/home/vstinner/prog/python/master/Lib/re.py", line 234
  File "/home/vstinner/prog/python/master/Lib/gettext.py", line 73
  File "<frozen importlib._bootstrap>", line 219
  File "<frozen importlib._bootstrap_external>", line 777
  File "<frozen importlib._bootstrap>", line 677
  File "<frozen importlib._bootstrap>", line 967
  File "<frozen importlib._bootstrap>", line 983
  File "/home/vstinner/prog/python/master/Lib/argparse.py", line 91
  File "<frozen importlib._bootstrap>", line 219
  File "<frozen importlib._bootstrap_external>", line 777
  File "<frozen importlib._bootstrap>", line 677
  File "<frozen importlib._bootstrap>", line 967
  File "<frozen importlib._bootstrap>", line 983
  File "/home/vstinner/prog/python/master/Lib/unittest/main.py", line 4
  File "<frozen importlib._bootstrap>", line 219
  File "<frozen importlib._bootstrap_external>", line 777
  File "<frozen importlib._bootstrap>", line 677
  File "<frozen importlib._bootstrap>", line 967
  File "<frozen importlib._bootstrap>", line 983
  File "/home/vstinner/prog/python/master/Lib/unittest/__init__.py", line 64
  File "<frozen importlib._bootstrap>", line 219
  File "<frozen importlib._bootstrap_external>", line 777
  File "<frozen importlib._bootstrap>", line 677
  File "<frozen importlib._bootstrap>", line 967
  File "<frozen importlib._bootstrap>", line 983
  File "/home/vstinner/prog/python/master/Lib/test/support/__init__.py", line 35
  File "<frozen importlib._bootstrap>", line 219
  File "<frozen importlib._bootstrap_external>", line 777
  File "<frozen importlib._bootstrap>", line 677
  File "<frozen importlib._bootstrap>", line 967
  File "<frozen importlib._bootstrap>", line 983
  File "x.py", line 1

object  : [1, 2, 3]
type    : list
refcount: 1
address : 0x7f6d43f85a78
Fatal Python error: _PyObject_AssertFailed

Current thread 0x00007f6d51c2f080 (most recent call first):
  File "/home/vstinner/prog/python/master/Lib/test/support/__init__.py", line 1572 in gc_collect
  File "x.py", line 13 in <module>
Aborted (core dumped)