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