|  | ========== | 
|  | Debug Mode | 
|  | ========== | 
|  |  | 
|  | .. contents:: | 
|  | :local: | 
|  |  | 
|  | .. _using-debug-mode: | 
|  |  | 
|  | Using Debug Mode | 
|  | ================ | 
|  |  | 
|  | Libc++ provides a debug mode that enables assertions meant to detect incorrect | 
|  | usage of the standard library. By default these assertions are disabled but | 
|  | they can be enabled using the ``_LIBCPP_DEBUG`` macro. | 
|  |  | 
|  | **_LIBCPP_DEBUG** Macro | 
|  | ----------------------- | 
|  |  | 
|  | **_LIBCPP_DEBUG**: | 
|  | This macro is used to enable assertions and iterator debugging checks within | 
|  | libc++. By default it is undefined. | 
|  |  | 
|  | **Values**: ``0``, ``1`` | 
|  |  | 
|  | Defining ``_LIBCPP_DEBUG`` to ``0`` or greater enables most of libc++'s | 
|  | assertions. Defining ``_LIBCPP_DEBUG`` to ``1`` enables "iterator debugging" | 
|  | which provides additional assertions about the validity of iterators used by | 
|  | the program. | 
|  |  | 
|  | Note that this option has no effect on libc++'s ABI | 
|  |  | 
|  | **_LIBCPP_DEBUG_USE_EXCEPTIONS**: | 
|  | When this macro is defined ``_LIBCPP_ASSERT`` failures throw | 
|  | ``__libcpp_debug_exception`` instead of aborting. Additionally this macro | 
|  | disables exception specifications on functions containing ``_LIBCPP_ASSERT`` | 
|  | checks. This allows assertion failures to correctly throw through these | 
|  | functions. | 
|  |  | 
|  | Handling Assertion Failures | 
|  | --------------------------- | 
|  |  | 
|  | When a debug assertion fails the assertion handler is called via the | 
|  | ``std::__libcpp_debug_function`` function pointer. It is possible to override | 
|  | this function pointer using a different handler function. Libc++ provides two | 
|  | different assertion handlers, the default handler | 
|  | ``std::__libcpp_abort_debug_handler`` which aborts the program, and | 
|  | ``std::__libcpp_throw_debug_handler`` which throws an instance of | 
|  | ``std::__libcpp_debug_exception``. Libc++ can be changed to use the throwing | 
|  | assertion handler as follows: | 
|  |  | 
|  | .. code-block:: cpp | 
|  |  | 
|  | #define _LIBCPP_DEBUG 1 | 
|  | #include <string> | 
|  | int main() { | 
|  | std::__libcpp_debug_function = std::__libcpp_throw_debug_function; | 
|  | try { | 
|  | std::string::iterator bad_it; | 
|  | std::string str("hello world"); | 
|  | str.insert(bad_it, '!'); // causes debug assertion | 
|  | } catch (std::__libcpp_debug_exception const&) { | 
|  | return EXIT_SUCCESS; | 
|  | } | 
|  | return EXIT_FAILURE; | 
|  | } | 
|  |  | 
|  | Debug Mode Checks | 
|  | ================= | 
|  |  | 
|  | Libc++'s debug mode offers two levels of checking. The first enables various | 
|  | precondition checks throughout libc++. The second additionally enables | 
|  | "iterator debugging" which checks the validity of iterators used by the program. | 
|  |  | 
|  | Basic Checks | 
|  | ============ | 
|  |  | 
|  | These checks are enabled when ``_LIBCPP_DEBUG`` is defined to either 0 or 1. | 
|  |  | 
|  | The following checks are enabled by ``_LIBCPP_DEBUG``: | 
|  |  | 
|  | * FIXME: Update this list | 
|  |  | 
|  | Iterator Debugging Checks | 
|  | ========================= | 
|  |  | 
|  | These checks are enabled when ``_LIBCPP_DEBUG`` is defined to 1. | 
|  |  | 
|  | The following containers and STL classes support iterator debugging: | 
|  |  | 
|  | * ``std::string`` | 
|  | * ``std::vector<T>`` (``T != bool``) | 
|  | * ``std::list`` | 
|  | * ``std::unordered_map`` | 
|  | * ``std::unordered_multimap`` | 
|  | * ``std::unordered_set`` | 
|  | * ``std::unordered_multiset`` | 
|  |  | 
|  | The remaining containers do not currently support iterator debugging. | 
|  | Patches welcome. |