bpo-9263: Dump Python object on GC assertion failure (GH-10062)
- Add _PyObject_AssertFailed() function.
- Add _PyObject_ASSERT() and _PyObject_ASSERT_WITH_MSG() macros.
- gc_decref(): replace assert() with _PyObject_ASSERT_WITH_MSG() to dump the faulty object if the assertion fails.
- _PyMem_DumpTraceback(): try to log the traceback where the object memory has been allocated if tracemalloc is enabled.
- _PyObject_Dump(): log repr(obj).
- Py_FatalError(): log the current Python traceback.
_PyObject_AssertFailed() uses _PyObject_IsFreed() heuristic to check
if the object memory has been freed by a debug hook on Python memory
Initial patch written by David Malcolm.
Co-Authored-By: David Malcolm <firstname.lastname@example.org>