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

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.
Passing ``-X showrefcount`` on the command line causes the interactive
interpreter to print the reference count total as well the number of memory
blocks allocated after each statement:

    >>> 23
    23
    [8288 refs, 14332 blocks]
    >>>

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.

Py_DEBUG implies Py_REF_DEBUG.

Special gimmicks:

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


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

Build option: ``./configure --with-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.

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

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_FinalizeEx() arranges to print a list of all
    still-live heap objects.  This is printed twice, in different formats,
    before and after Py_FinalizeEx 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. Py_DEBUG implies
PYMALLOC_DEBUG (if WITH_PYMALLOC is enabled).

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_FinalizeEx().

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, 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.


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
"__ltrace__".  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.

Py_DEBUG implies LLTRACE.
