This file describes some special Python build types enabled via compile-time
preprocessor defines.

IMPORTANT: if you want to build a debug-enabled Python, it is recommended that
you use ``./configure --with-pydebug``, rather than the options listed here.

However, if you wish to define some of these options individually, it is best
to define them in the EXTRA_CFLAGS make variable;
``make EXTRA_CFLAGS="-DPy_REF_DEBUG"``.


Py_REF_DEBUG
------------

Turn on aggregate reference counting.  This arranges that extern _Py_RefTotal
hold a count of all references, the sum of ob_refcnt across all objects.  In a
debug-mode build, this is where the "8288" comes from in

    >>> 23
    23
    [8288 refs]
    >>>

Note that if this count increases when you're not storing away new objects,
there's probably a leak.  Remember, though, that in interactive mode the special
name "_" holds a reference to the last result displayed!

Py_REF_DEBUG also checks after every decref to verify that the refcount hasn't
gone negative, and causes an immediate fatal error if it has.

Special gimmicks:

sys.gettotalrefcount()
    Return current total of all refcounts.


Py_TRACE_REFS
-------------

Turn on heavy reference debugging.  This is major surgery.  Every PyObject grows
two more pointers, to maintain a doubly-linked list of all live heap-allocated
objects.  Most built-in type objects are not in this list, as they're statically
allocated.  Starting in Python 2.3, if COUNT_ALLOCS (see below) is also defined,
a static type object T does appear in this list if at least one object of type T
has been created.

Note that because the fundamental PyObject layout changes, Python modules
compiled with Py_TRACE_REFS are incompatible with modules compiled without it.

Py_TRACE_REFS implies Py_REF_DEBUG.

Special gimmicks:

sys.getobjects(max[, type])
    Return list of the (no more than) max most-recently allocated objects, most
    recently allocated first in the list, least-recently allocated last in the
    list.  max=0 means no limit on list length.  If an optional type object is
    passed, the list is also restricted to objects of that type.  The return
    list itself, and some temp objects created just to call sys.getobjects(),
    are excluded from the return list.  Note that the list returned is just
    another object, though, so may appear in the return list the next time you
    call getobjects(); note that every object in the list is kept alive too,
    simply by virtue of being in the list.

envvar PYTHONDUMPREFS
    If this envvar exists, Py_Finalize() arranges to print a list of all
    still-live heap objects.  This is printed twice, in different formats,
    before and after Py_Finalize has cleaned up everything it can clean up.  The
    first output block produces the repr() of each object so is more
    informative; however, a lot of stuff destined to die is still alive then.
    The second output block is much harder to work with (repr() can't be invoked
    anymore -- the interpreter has been torn down too far), but doesn't list any
    objects that will die.  The tool script combinerefs.py can be run over this
    to combine the info from both output blocks.  The second output block, and
    combinerefs.py, were new in Python 2.3b1.


PYMALLOC_DEBUG
--------------

When pymalloc is enabled (WITH_PYMALLOC is defined), calls to the PyObject_
memory routines are handled by Python's own small-object allocator, while calls
to the PyMem_ memory routines are directed to the system malloc/ realloc/free.
If PYMALLOC_DEBUG is also defined, calls to both PyObject_ and PyMem_ memory
routines are directed to a special debugging mode of Python's small-object
allocator.

This mode fills dynamically allocated memory blocks with special, recognizable
bit patterns, and adds debugging info on each end of dynamically allocated
memory blocks.  The special bit patterns are:

#define CLEANBYTE     0xCB   /* clean (newly allocated) memory */
#define DEADBYTE      0xDB   /* dead (newly freed) memory */
#define FORBIDDENBYTE 0xFB   /* forbidden -- untouchable bytes */

Strings of these bytes are unlikely to be valid addresses, floats, or 7-bit
ASCII strings.

Let S = sizeof(size_t). 2*S bytes are added at each end of each block of N bytes
requested.  The memory layout is like so, where p represents the address
returned by a malloc-like or realloc-like function (p[i:j] means the slice of
bytes from *(p+i) inclusive up to *(p+j) exclusive; note that the treatment of
negative indices differs from a Python slice):

p[-2*S:-S]
    Number of bytes originally asked for.  This is a size_t, big-endian (easier
    to read in a memory dump).
p[-S:0]
    Copies of FORBIDDENBYTE.  Used to catch under- writes and reads.
p[0:N]
    The requested memory, filled with copies of CLEANBYTE, used to catch
    reference to uninitialized memory.  When a realloc-like function is called
    requesting a larger memory block, the new excess bytes are also filled with
    CLEANBYTE.  When a free-like function is called, these are overwritten with
    DEADBYTE, to catch reference to freed memory.  When a realloc- like function
    is called requesting a smaller memory block, the excess old bytes are also
    filled with DEADBYTE.
p[N:N+S]
    Copies of FORBIDDENBYTE.  Used to catch over- writes and reads.
p[N+S:N+2*S]
    A serial number, incremented by 1 on each call to a malloc-like or
    realloc-like function.  Big-endian size_t.  If "bad memory" is detected
    later, the serial number gives an excellent way to set a breakpoint on the
    next run, to capture the instant at which this block was passed out.  The
    static function bumpserialno() in obmalloc.c is the only place the serial
    number is incremented, and exists so you can set such a breakpoint easily.

A realloc-like or free-like function first checks that the FORBIDDENBYTEs at
each end are intact.  If they've been altered, diagnostic output is written to
stderr, and the program is aborted via Py_FatalError().  The other main failure
mode is provoking a memory error when a program reads up one of the special bit
patterns and tries to use it as an address.  If you get in a debugger then and
look at the object, you're likely to see that it's entirely filled with 0xDB
(meaning freed memory is getting used) or 0xCB (meaning uninitialized memory is
getting used).

Note that PYMALLOC_DEBUG requires WITH_PYMALLOC.

Special gimmicks:

envvar PYTHONMALLOCSTATS
    If this envvar exists, a report of pymalloc summary statistics is printed to
    stderr whenever a new arena is allocated, and also by Py_Finalize().

Changed in 2.5:  The number of extra bytes allocated is 4*sizeof(size_t).
Before it was 16 on all boxes, reflecting that Python couldn't make use of
allocations >= 2**32 bytes even on 64-bit boxes before 2.5.


Py_DEBUG
--------

This is what is generally meant by "a debug build" of Python.

Py_DEBUG implies LLTRACE, Py_REF_DEBUG, Py_TRACE_REFS, and PYMALLOC_DEBUG (if
WITH_PYMALLOC is enabled).  In addition, C assert()s are enabled (via the C way:
by not defining NDEBUG), and some routines do additional sanity checks inside
"#ifdef Py_DEBUG" blocks.


COUNT_ALLOCS
------------

Each type object grows three new members:

    /* Number of times an object of this type was allocated. */
    int tp_allocs;

    /* Number of times an object of this type was deallocated. */
    int tp_frees;

    /* Highwater mark:  the maximum value of tp_allocs - tp_frees so
     * far; or, IOW, the largest number of objects of this type alive at
     * the same time.
     */
    int tp_maxalloc;

Allocation and deallocation code keeps these counts up to date.  Py_Finalize()
displays a summary of the info returned by sys.getcounts() (see below), along
with assorted other special allocation counts (like the number of tuple
allocations satisfied by a tuple free-list, the number of 1-character strings
allocated, etc).

Before Python 2.2, type objects were immortal, and the COUNT_ALLOCS
implementation relies on that.  As of Python 2.2, heap-allocated type/ class
objects can go away.  COUNT_ALLOCS can blow up in 2.2 and 2.2.1 because of this;
this was fixed in 2.2.2.  Use of COUNT_ALLOCS makes all heap-allocated type
objects immortal, except for those for which no object of that type is ever
allocated.

Starting with Python 2.3, If Py_TRACE_REFS is also defined, COUNT_ALLOCS
arranges to ensure that the type object for each allocated object appears in the
doubly-linked list of all objects maintained by Py_TRACE_REFS.

Special gimmicks:

sys.getcounts()
    Return a list of 4-tuples, one entry for each type object for which at least
    one object of that type was allocated.  Each tuple is of the form:

        (tp_name, tp_allocs, tp_frees, tp_maxalloc)

    Each distinct type object gets a distinct entry in this list, even if two or
    more type objects have the same tp_name (in which case there's no way to
    distinguish them by looking at this list).  The list is ordered by time of
    first object allocation: the type object for which the first allocation of
    an object of that type occurred most recently is at the front of the list.


LLTRACE
-------

Compile in support for Low Level TRACE-ing of the main interpreter loop.

When this preprocessor symbol is defined, before PyEval_EvalFrame executes a
frame's code it checks the frame's global namespace for a variable
"__lltrace__".  If such a variable is found, mounds of information about what
the interpreter is doing are sprayed to stdout, such as every opcode and opcode
argument and values pushed onto and popped off the value stack.

Not useful very often, but very useful when needed.


CALL_PROFILE
------------

Count the number of function calls executed.

When this symbol is defined, the ceval mainloop and helper functions count the
number of function calls made.  It keeps detailed statistics about what kind of
object was called and whether the call hit any of the special fast paths in the
code.


WITH_TSC
--------

Super-lowlevel profiling of the interpreter.  When enabled, the sys module grows
a new function:

settscdump(bool)
    If true, tell the Python interpreter to dump VM measurements to stderr.  If
    false, turn off dump.  The measurements are based on the processor's
    time-stamp counter.

This build option requires a small amount of platform specific code.  Currently
this code is present for linux/x86 and any PowerPC platform that uses GCC
(i.e. OS X and linux/ppc).

On the PowerPC the rate at which the time base register is incremented is not
defined by the architecture specification, so you'll need to find the manual for
your specific processor.  For the 750CX, 750CXe and 750FX (all sold as the G3)
we find:

    The time base counter is clocked at a frequency that is one-fourth that of
    the bus clock.

This build is enabled by the --with-tsc flag to configure.
