========== 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 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 != 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.