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]
    API ID.  See PEP 445.  This is a character, but seems undocumented.
p[-S+1: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 (eval_frame in
2.3 and 2.2, eval_code2 before that) 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.
