Home | History | Annotate | Line # | Download | only in DesignDocs
      1  1.1  joerg ==========
      2  1.1  joerg Debug Mode
      3  1.1  joerg ==========
      4  1.1  joerg 
      5  1.1  joerg .. contents::
      6  1.1  joerg    :local:
      7  1.1  joerg 
      8  1.1  joerg .. _using-debug-mode:
      9  1.1  joerg 
     10  1.1  joerg Using Debug Mode
     11  1.1  joerg ================
     12  1.1  joerg 
     13  1.1  joerg Libc++ provides a debug mode that enables assertions meant to detect incorrect
     14  1.1  joerg usage of the standard library. By default these assertions are disabled but
     15  1.1  joerg they can be enabled using the ``_LIBCPP_DEBUG`` macro.
     16  1.1  joerg 
     17  1.1  joerg **_LIBCPP_DEBUG** Macro
     18  1.1  joerg -----------------------
     19  1.1  joerg 
     20  1.1  joerg **_LIBCPP_DEBUG**:
     21  1.1  joerg   This macro is used to enable assertions and iterator debugging checks within
     22  1.1  joerg   libc++. By default it is undefined.
     23  1.1  joerg 
     24  1.1  joerg   **Values**: ``0``, ``1``
     25  1.1  joerg 
     26  1.1  joerg   Defining ``_LIBCPP_DEBUG`` to ``0`` or greater enables most of libc++'s
     27  1.1  joerg   assertions. Defining ``_LIBCPP_DEBUG`` to ``1`` enables "iterator debugging"
     28  1.1  joerg   which provides additional assertions about the validity of iterators used by
     29  1.1  joerg   the program.
     30  1.1  joerg 
     31  1.1  joerg   Note that this option has no effect on libc++'s ABI; but it does have broad
     32  1.1  joerg   ODR implications. Users should compile their whole program at the same
     33  1.1  joerg   debugging level.
     34  1.1  joerg 
     35  1.1  joerg Handling Assertion Failures
     36  1.1  joerg ---------------------------
     37  1.1  joerg 
     38  1.1  joerg When a debug assertion fails the assertion handler is called via the
     39  1.1  joerg ``std::__libcpp_debug_function`` function pointer. It is possible to override
     40  1.1  joerg this function pointer using a different handler function. Libc++ provides a
     41  1.1  joerg the default handler, ``std::__libcpp_abort_debug_handler``, which aborts the
     42  1.1  joerg program. The handler may not return. Libc++ can be changed to use a custom
     43  1.1  joerg assertion handler as follows.
     44  1.1  joerg 
     45  1.1  joerg .. code-block:: cpp
     46  1.1  joerg 
     47  1.1  joerg   #define _LIBCPP_DEBUG 1
     48  1.1  joerg   #include <string>
     49  1.1  joerg   void my_handler(std::__libcpp_debug_info const&);
     50  1.1  joerg   int main(int, char**) {
     51  1.1  joerg     std::__libcpp_debug_function = &my_handler;
     52  1.1  joerg 
     53  1.1  joerg     std::string::iterator bad_it;
     54  1.1  joerg     std::string str("hello world");
     55  1.1  joerg     str.insert(bad_it, '!'); // causes debug assertion
     56  1.1  joerg     // control flow doesn't return
     57  1.1  joerg   }
     58  1.1  joerg 
     59  1.1  joerg Debug Mode Checks
     60  1.1  joerg =================
     61  1.1  joerg 
     62  1.1  joerg Libc++'s debug mode offers two levels of checking. The first enables various
     63  1.1  joerg precondition checks throughout libc++. The second additionally enables
     64  1.1  joerg "iterator debugging" which checks the validity of iterators used by the program.
     65  1.1  joerg 
     66  1.1  joerg Basic Checks
     67  1.1  joerg ============
     68  1.1  joerg 
     69  1.1  joerg These checks are enabled when ``_LIBCPP_DEBUG`` is defined to either 0 or 1.
     70  1.1  joerg 
     71  1.1  joerg The following checks are enabled by ``_LIBCPP_DEBUG``:
     72  1.1  joerg 
     73  1.1  joerg   * Many algorithms, such as ``binary_search``, ``merge``, ``next_permutation``, and ``sort``,
     74  1.1  joerg     wrap the user-provided comparator to assert that `!comp(y, x)` whenever
     75  1.1  joerg     `comp(x, y)`. This can cause the user-provided comparator to be evaluated
     76  1.1  joerg     up to twice as many times as it would be without ``_LIBCPP_DEBUG``, and
     77  1.1  joerg     causes the library to violate some of the Standard's complexity clauses.
     78  1.1  joerg 
     79  1.1  joerg   * FIXME: Update this list
     80  1.1  joerg 
     81  1.1  joerg Iterator Debugging Checks
     82  1.1  joerg =========================
     83  1.1  joerg 
     84  1.1  joerg These checks are enabled when ``_LIBCPP_DEBUG`` is defined to 1.
     85  1.1  joerg 
     86  1.1  joerg The following containers and STL classes support iterator debugging:
     87  1.1  joerg 
     88  1.1  joerg   * ``std::string``
     89  1.1  joerg   * ``std::vector<T>`` (``T != bool``)
     90  1.1  joerg   * ``std::list``
     91  1.1  joerg   * ``std::unordered_map``
     92  1.1  joerg   * ``std::unordered_multimap``
     93  1.1  joerg   * ``std::unordered_set``
     94  1.1  joerg   * ``std::unordered_multiset``
     95  1.1  joerg 
     96  1.1  joerg The remaining containers do not currently support iterator debugging.
     97  1.1  joerg Patches welcome.
     98