Issue #23034: The output of a special Python build with defined COUNT_ALLOCS,

SHOW_ALLOC_COUNT or SHOW_TRACK_COUNT macros is now off by  default.  It can
be re-enabled using the "-X showalloccount" option.  It now outputs to stderr
instead of stdout.
This commit is contained in:
Serhiy Storchaka 2016-07-03 21:03:53 +03:00
parent 6c94d10a19
commit 7e160ce356
7 changed files with 50 additions and 1 deletions

View File

@ -397,6 +397,8 @@ Miscellaneous options
stored in a traceback of a trace. Use ``-X tracemalloc=NFRAME`` to start stored in a traceback of a trace. Use ``-X tracemalloc=NFRAME`` to start
tracing with a traceback limit of *NFRAME* frames. See the tracing with a traceback limit of *NFRAME* frames. See the
:func:`tracemalloc.start` for more information. :func:`tracemalloc.start` for more information.
* ``-X showalloccount`` to enable the output of the total count of allocated
objects for each type (only works when built with ``COUNT_ALLOCS`` defined);
It also allows passing arbitrary values and retrieving them through the It also allows passing arbitrary values and retrieving them through the
:data:`sys._xoptions` dictionary. :data:`sys._xoptions` dictionary.
@ -410,6 +412,9 @@ Miscellaneous options
.. versionadded:: 3.4 .. versionadded:: 3.4
The ``-X showrefcount`` and ``-X tracemalloc`` options. The ``-X showrefcount`` and ``-X tracemalloc`` options.
.. versionadded:: 3.6
The ``-X showalloccount`` option.
Options you shouldn't use Options you shouldn't use
~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~

View File

@ -646,6 +646,16 @@ Porting to Python 3.6
This section lists previously described changes and other bugfixes This section lists previously described changes and other bugfixes
that may require changes to your code. that may require changes to your code.
Changes in 'python' Command Behavior
------------------------------------
* The output of a special Python build with defined ``COUNT_ALLOCS``,
``SHOW_ALLOC_COUNT`` or ``SHOW_TRACK_COUNT`` macros is now off by
default. It can be re-enabled using the ``-X showalloccount`` option.
It now outputs to ``stderr`` instead of ``stdout``.
(Contributed by Serhiy Storchaka in :issue:`23034`.)
Changes in the Python API Changes in the Python API
------------------------- -------------------------

View File

@ -10,6 +10,11 @@ What's New in Python 3.6.0 alpha 3
Core and Builtins Core and Builtins
----------------- -----------------
- Issue #23034: The output of a special Python build with defined COUNT_ALLOCS,
SHOW_ALLOC_COUNT or SHOW_TRACK_COUNT macros is now off by default. It can
be re-enabled using the "-X showalloccount" option. It now outputs to stderr
instead of stdout.
- Issue #27443: __length_hint__() of bytearray itearator no longer return - Issue #27443: __length_hint__() of bytearray itearator no longer return
negative integer for resized bytearray. negative integer for resized bytearray.

View File

@ -82,6 +82,16 @@ static size_t count_reuse = 0;
static void static void
show_alloc(void) show_alloc(void)
{ {
PyObject *xoptions, *value;
_Py_IDENTIFIER(showalloccount);
xoptions = PySys_GetXOptions();
if (xoptions == NULL)
return;
value = _PyDict_GetItemId(xoptions, &PyId_showalloccount);
if (value != Py_True)
return;
fprintf(stderr, "List allocations: %" PY_FORMAT_SIZE_T "d\n", fprintf(stderr, "List allocations: %" PY_FORMAT_SIZE_T "d\n",
count_alloc); count_alloc);
fprintf(stderr, "List reuse through freelist: %" PY_FORMAT_SIZE_T fprintf(stderr, "List reuse through freelist: %" PY_FORMAT_SIZE_T

View File

@ -109,6 +109,15 @@ void
dump_counts(FILE* f) dump_counts(FILE* f)
{ {
PyTypeObject *tp; PyTypeObject *tp;
PyObject *xoptions, *value;
_Py_IDENTIFIER(showalloccount);
xoptions = PySys_GetXOptions();
if (xoptions == NULL)
return;
value = _PyDict_GetItemId(xoptions, &PyId_showalloccount);
if (value != Py_True)
return;
for (tp = type_list; tp; tp = tp->tp_next) for (tp = type_list; tp; tp = tp->tp_next)
fprintf(f, "%s alloc'd: %" PY_FORMAT_SIZE_T "d, " fprintf(f, "%s alloc'd: %" PY_FORMAT_SIZE_T "d, "

View File

@ -36,6 +36,16 @@ static Py_ssize_t count_tracked = 0;
static void static void
show_track(void) show_track(void)
{ {
PyObject *xoptions, *value;
_Py_IDENTIFIER(showalloccount);
xoptions = PySys_GetXOptions();
if (xoptions == NULL)
return;
value = _PyDict_GetItemId(xoptions, &PyId_showalloccount);
if (value != Py_True)
return;
fprintf(stderr, "Tuples created: %" PY_FORMAT_SIZE_T "d\n", fprintf(stderr, "Tuples created: %" PY_FORMAT_SIZE_T "d\n",
count_tracked + count_untracked); count_tracked + count_untracked);
fprintf(stderr, "Tuples tracked by the GC: %" PY_FORMAT_SIZE_T fprintf(stderr, "Tuples tracked by the GC: %" PY_FORMAT_SIZE_T

View File

@ -626,7 +626,7 @@ Py_FinalizeEx(void)
/* Debugging stuff */ /* Debugging stuff */
#ifdef COUNT_ALLOCS #ifdef COUNT_ALLOCS
dump_counts(stdout); dump_counts(stderr);
#endif #endif
/* dump hash stats */ /* dump hash stats */
_PyHash_Fini(); _PyHash_Fini();