| 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. All live | |
| heap-allocated objects are traced in a hash table. Most built-in type objects | |
| are not in this list, as they're statically allocated. | |
| 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. | |
| Py_DEBUG | |
| -------- | |
| This is what is generally meant by "a debug build" of Python. | |
| Py_DEBUG implies LLTRACE and Py_REF_DEBUG. 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 | |
| "__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. | |
| Py_DEBUG implies LLTRACE. |