101 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			ReStructuredText
		
	
	
	
			
		
		
	
	
			101 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			ReStructuredText
		
	
	
	
| ==========
 | |
| 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.
 |