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)