1<chapter xmlns="http://docbook.org/ns/docbook" version="5.0" 2 xml:id="manual.ext.debug_mode" xreflabel="Debug Mode"> 3<?dbhtml filename="debug_mode.html"?> 4 5<info><title>Debug Mode</title> 6 <keywordset> 7 <keyword>C++</keyword> 8 <keyword>library</keyword> 9 <keyword>debug</keyword> 10 </keywordset> 11</info> 12 13 14 15<section xml:id="manual.ext.debug_mode.intro" xreflabel="Intro"><info><title>Intro</title></info> 16 17 <para> 18 By default, libstdc++ is built with efficiency in mind, and 19 therefore performs little or no error checking that is not 20 required by the C++ standard. This means that programs that 21 incorrectly use the C++ standard library will exhibit behavior 22 that is not portable and may not even be predictable, because they 23 tread into implementation-specific or undefined behavior. To 24 detect some of these errors before they can become problematic, 25 libstdc++ offers a debug mode that provides additional checking of 26 library facilities, and will report errors in the use of libstdc++ 27 as soon as they can be detected by emitting a description of the 28 problem to standard error and aborting the program. This debug 29 mode is available with GCC 3.4.0 and later versions. 30 </para> 31 32 <para> 33 The libstdc++ debug mode performs checking for many areas of the 34 C++ standard, but the focus is on checking interactions among 35 standard iterators, containers, and algorithms, including: 36 </para> 37 38 <itemizedlist> 39 <listitem><para><emphasis>Safe iterators</emphasis>: Iterators keep track of the 40 container whose elements they reference, so errors such as 41 incrementing a past-the-end iterator or dereferencing an iterator 42 that points to a container that has been destructed are diagnosed 43 immediately.</para></listitem> 44 45 <listitem><para><emphasis>Algorithm preconditions</emphasis>: Algorithms attempt to 46 validate their input parameters to detect errors as early as 47 possible. For instance, the <code>set_intersection</code> 48 algorithm requires that its iterator 49 parameters <code>first1</code> and <code>last1</code> form a valid 50 iterator range, and that the sequence 51 [<code>first1</code>, <code>last1</code>) is sorted according to 52 the same predicate that was passed 53 to <code>set_intersection</code>; the libstdc++ debug mode will 54 detect an error if the sequence is not sorted or was sorted by a 55 different predicate.</para></listitem> 56 </itemizedlist> 57 58</section> 59 60<section xml:id="manual.ext.debug_mode.semantics" xreflabel="Semantics"><info><title>Semantics</title></info> 61 <?dbhtml filename="debug_mode_semantics.html"?> 62 63 <para> 64 </para> 65 66<para>A program that uses the C++ standard library correctly 67 will maintain the same semantics under debug mode as it had with 68 the normal (release) library. All functional and exception-handling 69 guarantees made by the normal library also hold for the debug mode 70 library, with one exception: performance guarantees made by the 71 normal library may not hold in the debug mode library. For 72 instance, erasing an element in a <code>std::list</code> is a 73 constant-time operation in normal library, but in debug mode it is 74 linear in the number of iterators that reference that particular 75 list. So while your (correct) program won't change its results, it 76 is likely to execute more slowly.</para> 77 78<para>libstdc++ includes many extensions to the C++ standard library. In 79 some cases the extensions are obvious, such as the hashed 80 associative containers, whereas other extensions give predictable 81 results to behavior that would otherwise be undefined, such as 82 throwing an exception when a <code>std::basic_string</code> is 83 constructed from a NULL character pointer. This latter category also 84 includes implementation-defined and unspecified semantics, such as 85 the growth rate of a vector. Use of these extensions is not 86 considered incorrect, so code that relies on them will not be 87 rejected by debug mode. However, use of these extensions may affect 88 the portability of code to other implementations of the C++ standard 89 library, and is therefore somewhat hazardous. For this reason, the 90 libstdc++ debug mode offers a "pedantic" mode (similar to 91 GCC's <code>-pedantic</code> compiler flag) that attempts to emulate 92 the semantics guaranteed by the C++ standard. For 93 instance, constructing a <code>std::basic_string</code> with a NULL 94 character pointer would result in an exception under normal mode or 95 non-pedantic debug mode (this is a libstdc++ extension), whereas 96 under pedantic debug mode libstdc++ would signal an error. To enable 97 the pedantic debug mode, compile your program with 98 both <code>-D_GLIBCXX_DEBUG</code> 99 and <code>-D_GLIBCXX_DEBUG_PEDANTIC</code> . 100 (N.B. In GCC 3.4.x and 4.0.0, due to a bug, 101 <code>-D_GLIBXX_DEBUG_PEDANTIC</code> was also needed. The problem has 102 been fixed in GCC 4.0.1 and later versions.) </para> 103 104<para>The following library components provide extra debugging 105 capabilities in debug mode:</para> 106<itemizedlist> 107 <listitem><para><code>std::basic_string</code> (no safe iterators and see note below)</para></listitem> 108 <listitem><para><code>std::bitset</code></para></listitem> 109 <listitem><para><code>std::deque</code></para></listitem> 110 <listitem><para><code>std::list</code></para></listitem> 111 <listitem><para><code>std::map</code></para></listitem> 112 <listitem><para><code>std::multimap</code></para></listitem> 113 <listitem><para><code>std::multiset</code></para></listitem> 114 <listitem><para><code>std::set</code></para></listitem> 115 <listitem><para><code>std::vector</code></para></listitem> 116 <listitem><para><code>std::unordered_map</code></para></listitem> 117 <listitem><para><code>std::unordered_multimap</code></para></listitem> 118 <listitem><para><code>std::unordered_set</code></para></listitem> 119 <listitem><para><code>std::unordered_multiset</code></para></listitem> 120</itemizedlist> 121 122<para>N.B. although there are precondition checks for some string operations, 123e.g. <code>operator[]</code>, 124they will not always be run when using the <code>char</code> and 125<code>wchar_t</code> specialisations (<code>std::string</code> and 126<code>std::wstring</code>). This is because libstdc++ uses GCC's 127<code>extern template</code> extension to provide explicit instantiations 128of <code>std::string</code> and <code>std::wstring</code>, and those 129explicit instantiations don't include the debug-mode checks. If the 130containing functions are inlined then the checks will run, so compiling 131with <code>-O1</code> might be enough to enable them. Alternatively 132<code>-D_GLIBCXX_EXTERN_TEMPLATE=0</code> will suppress the declarations 133of the explicit instantiations and cause the functions to be instantiated 134with the debug-mode checks included, but this is unsupported and not 135guaranteed to work. For full debug-mode support you can use the 136<code>__gnu_debug::basic_string</code> debugging container directly, 137which always works correctly. 138</para> 139 140</section> 141 142<section xml:id="manual.ext.debug_mode.using" xreflabel="Using"><info><title>Using</title></info> 143 <?dbhtml filename="debug_mode_using.html"?> 144 145 <para> 146 </para> 147<section xml:id="debug_mode.using.mode" xreflabel="Using Mode"><info><title>Using the Debug Mode</title></info> 148 149 150<para>To use the libstdc++ debug mode, compile your application with the 151 compiler flag <code>-D_GLIBCXX_DEBUG</code>. Note that this flag 152 changes the sizes and behavior of standard class templates such 153 as <code>std::vector</code>, and therefore you can only link code 154 compiled with debug mode and code compiled without debug mode if no 155 instantiation of a container is passed between the two translation 156 units.</para> 157 158<para>By default, error messages are formatted to fit on lines of about 159 78 characters. The environment variable 160 <code>GLIBCXX_DEBUG_MESSAGE_LENGTH</code> can be used to request a 161 different length.</para> 162 163</section> 164 165<section xml:id="debug_mode.using.specific" xreflabel="Using Specific"><info><title>Using a Specific Debug Container</title></info> 166 167<para>When it is not feasible to recompile your entire application, or 168 only specific containers need checking, debugging containers are 169 available as GNU extensions. These debugging containers are 170 functionally equivalent to the standard drop-in containers used in 171 debug mode, but they are available in a separate namespace as GNU 172 extensions and may be used in programs compiled with either release 173 mode or with debug mode. The 174 following table provides the names and headers of the debugging 175 containers: 176</para> 177 178<table frame="all"> 179<title>Debugging Containers</title> 180 181<tgroup cols="4" align="left" colsep="1" rowsep="1"> 182<colspec colname="c1"/> 183<colspec colname="c2"/> 184<colspec colname="c3"/> 185<colspec colname="c4"/> 186 187<thead> 188 <row> 189 <entry>Container</entry> 190 <entry>Header</entry> 191 <entry>Debug container</entry> 192 <entry>Debug header</entry> 193 </row> 194</thead> 195<tbody> 196 <row> 197 <entry><classname>std::bitset</classname></entry> 198 <entry><filename class="headerfile">bitset</filename></entry> 199 <entry><classname>__gnu_debug::bitset</classname></entry> 200 <entry><filename class="headerfile"><debug/bitset></filename></entry> 201 </row> 202 <row> 203 <entry><classname>std::deque</classname></entry> 204 <entry><filename class="headerfile">deque</filename></entry> 205 <entry><classname>__gnu_debug::deque</classname></entry> 206 <entry><filename class="headerfile"><debug/deque></filename></entry> 207 </row> 208 <row> 209 <entry><classname>std::list</classname></entry> 210 <entry><filename class="headerfile">list</filename></entry> 211 <entry><classname>__gnu_debug::list</classname></entry> 212 <entry><filename class="headerfile"><debug/list></filename></entry> 213 </row> 214 <row> 215 <entry><classname>std::map</classname></entry> 216 <entry><filename class="headerfile">map</filename></entry> 217 <entry><classname>__gnu_debug::map</classname></entry> 218 <entry><filename class="headerfile"><debug/map></filename></entry> 219 </row> 220 <row> 221 <entry><classname>std::multimap</classname></entry> 222 <entry><filename class="headerfile">map</filename></entry> 223 <entry><classname>__gnu_debug::multimap</classname></entry> 224 <entry><filename class="headerfile"><debug/map></filename></entry> 225 </row> 226 <row> 227 <entry><classname>std::multiset</classname></entry> 228 <entry><filename class="headerfile">set</filename></entry> 229 <entry><classname>__gnu_debug::multiset</classname></entry> 230 <entry><filename class="headerfile"><debug/set></filename></entry> 231 </row> 232 <row> 233 <entry><classname>std::set</classname></entry> 234 <entry><filename class="headerfile">set</filename></entry> 235 <entry><classname>__gnu_debug::set</classname></entry> 236 <entry><filename class="headerfile"><debug/set></filename></entry> 237 </row> 238 <row> 239 <entry><classname>std::string</classname></entry> 240 <entry><filename class="headerfile">string</filename></entry> 241 <entry><classname>__gnu_debug::string</classname></entry> 242 <entry><filename class="headerfile"><debug/string></filename></entry> 243 </row> 244 <row> 245 <entry><classname>std::wstring</classname></entry> 246 <entry><filename class="headerfile">string</filename></entry> 247 <entry><classname>__gnu_debug::wstring</classname></entry> 248 <entry><filename class="headerfile"><debug/string></filename></entry> 249 </row> 250 <row> 251 <entry><classname>std::basic_string</classname></entry> 252 <entry><filename class="headerfile">string</filename></entry> 253 <entry><classname>__gnu_debug::basic_string</classname></entry> 254 <entry><filename class="headerfile"><debug/string></filename></entry> 255 </row> 256 <row> 257 <entry><classname>std::vector</classname></entry> 258 <entry><filename class="headerfile">vector</filename></entry> 259 <entry><classname>__gnu_debug::vector</classname></entry> 260 <entry><filename class="headerfile"><debug/vector></filename></entry> 261 </row> 262</tbody> 263</tgroup> 264</table> 265 266<para>In addition, when compiling in C++11 mode, these additional 267containers have additional debug capability. 268</para> 269 270<table frame="all"> 271<title>Debugging Containers C++11</title> 272 273<tgroup cols="4" align="left" colsep="1" rowsep="1"> 274<colspec colname="c1"/> 275<colspec colname="c2"/> 276<colspec colname="c3"/> 277<colspec colname="c4"/> 278 279<thead> 280 <row> 281 <entry>Container</entry> 282 <entry>Header</entry> 283 <entry>Debug container</entry> 284 <entry>Debug header</entry> 285 </row> 286</thead> 287<tbody> 288 <row> 289 <entry><classname>std::unordered_map</classname></entry> 290 <entry><filename class="headerfile">unordered_map</filename></entry> 291 <entry><classname>__gnu_debug::unordered_map</classname></entry> 292 <entry><filename class="headerfile"><debug/unordered_map></filename></entry> 293 </row> 294 <row> 295 <entry><classname>std::unordered_multimap</classname></entry> 296 <entry><filename class="headerfile">unordered_map</filename></entry> 297 <entry><classname>__gnu_debug::unordered_multimap</classname></entry> 298 <entry><filename class="headerfile"><debug/unordered_map></filename></entry> 299 </row> 300 <row> 301 <entry><classname>std::unordered_set</classname></entry> 302 <entry><filename class="headerfile">unordered_set</filename></entry> 303 <entry><classname>__gnu_debug::unordered_set</classname></entry> 304 <entry><filename class="headerfile"><debug/unordered_set></filename></entry> 305 </row> 306 <row> 307 <entry><classname>std::unordered_multiset</classname></entry> 308 <entry><filename class="headerfile">unordered_set</filename></entry> 309 <entry><classname>__gnu_debug::unordered_multiset</classname></entry> 310 <entry><filename class="headerfile"><debug/unordered_set></filename></entry> 311 </row> 312</tbody> 313</tgroup> 314</table> 315</section> 316</section> 317 318<section xml:id="manual.ext.debug_mode.design" xreflabel="Design"><info><title>Design</title></info> 319 <?dbhtml filename="debug_mode_design.html"?> 320 321 <para> 322 </para> 323 <section xml:id="debug_mode.design.goals" xreflabel="Goals"><info><title>Goals</title></info> 324 325 <para> 326 </para> 327<para> The libstdc++ debug mode replaces unsafe (but efficient) standard 328 containers and iterators with semantically equivalent safe standard 329 containers and iterators to aid in debugging user programs. The 330 following goals directed the design of the libstdc++ debug mode:</para> 331 332 <itemizedlist> 333 334 <listitem><para><emphasis>Correctness</emphasis>: the libstdc++ debug mode must not change 335 the semantics of the standard library for all cases specified in 336 the ANSI/ISO C++ standard. The essence of this constraint is that 337 any valid C++ program should behave in the same manner regardless 338 of whether it is compiled with debug mode or release mode. In 339 particular, entities that are defined in namespace std in release 340 mode should remain defined in namespace std in debug mode, so that 341 legal specializations of namespace std entities will remain 342 valid. A program that is not valid C++ (e.g., invokes undefined 343 behavior) is not required to behave similarly, although the debug 344 mode will abort with a diagnostic when it detects undefined 345 behavior.</para></listitem> 346 347 <listitem><para><emphasis>Performance</emphasis>: the additional of the libstdc++ debug mode 348 must not affect the performance of the library when it is compiled 349 in release mode. Performance of the libstdc++ debug mode is 350 secondary (and, in fact, will be worse than the release 351 mode).</para></listitem> 352 353 <listitem><para><emphasis>Usability</emphasis>: the libstdc++ debug mode should be easy to 354 use. It should be easily incorporated into the user's development 355 environment (e.g., by requiring only a single new compiler switch) 356 and should produce reasonable diagnostics when it detects a 357 problem with the user program. Usability also involves detection 358 of errors when using the debug mode incorrectly, e.g., by linking 359 a release-compiled object against a debug-compiled object if in 360 fact the resulting program will not run correctly.</para></listitem> 361 362 <listitem><para><emphasis>Minimize recompilation</emphasis>: While it is expected that 363 users recompile at least part of their program to use debug 364 mode, the amount of recompilation affects the 365 detect-compile-debug turnaround time. This indirectly affects the 366 usefulness of the debug mode, because debugging some applications 367 may require rebuilding a large amount of code, which may not be 368 feasible when the suspect code may be very localized. There are 369 several levels of conformance to this requirement, each with its 370 own usability and implementation characteristics. In general, the 371 higher-numbered conformance levels are more usable (i.e., require 372 less recompilation) but are more complicated to implement than 373 the lower-numbered conformance levels. 374 <orderedlist inheritnum="ignore" continuation="restarts"> 375 <listitem><para><emphasis>Full recompilation</emphasis>: The user must recompile his or 376 her entire application and all C++ libraries it depends on, 377 including the C++ standard library that ships with the 378 compiler. This must be done even if only a small part of the 379 program can use debugging features.</para></listitem> 380 381 <listitem><para><emphasis>Full user recompilation</emphasis>: The user must recompile 382 his or her entire application and all C++ libraries it depends 383 on, but not the C++ standard library itself. This must be done 384 even if only a small part of the program can use debugging 385 features. This can be achieved given a full recompilation 386 system by compiling two versions of the standard library when 387 the compiler is installed and linking against the appropriate 388 one, e.g., a multilibs approach.</para></listitem> 389 390 <listitem><para><emphasis>Partial recompilation</emphasis>: The user must recompile the 391 parts of his or her application and the C++ libraries it 392 depends on that will use the debugging facilities 393 directly. This means that any code that uses the debuggable 394 standard containers would need to be recompiled, but code 395 that does not use them (but may, for instance, use IOStreams) 396 would not have to be recompiled.</para></listitem> 397 398 <listitem><para><emphasis>Per-use recompilation</emphasis>: The user must recompile the 399 parts of his or her application and the C++ libraries it 400 depends on where debugging should occur, and any other code 401 that interacts with those containers. This means that a set of 402 translation units that accesses a particular standard 403 container instance may either be compiled in release mode (no 404 checking) or debug mode (full checking), but must all be 405 compiled in the same way; a translation unit that does not see 406 that standard container instance need not be recompiled. This 407 also means that a translation unit <emphasis>A</emphasis> that contains a 408 particular instantiation 409 (say, <code>std::vector<int></code>) compiled in release 410 mode can be linked against a translation unit <emphasis>B</emphasis> that 411 contains the same instantiation compiled in debug mode (a 412 feature not present with partial recompilation). While this 413 behavior is technically a violation of the One Definition 414 Rule, this ability tends to be very important in 415 practice. The libstdc++ debug mode supports this level of 416 recompilation. </para></listitem> 417 418 <listitem><para><emphasis>Per-unit recompilation</emphasis>: The user must only 419 recompile the translation units where checking should occur, 420 regardless of where debuggable standard containers are 421 used. This has also been dubbed "<code>-g</code> mode", 422 because the <code>-g</code> compiler switch works in this way, 423 emitting debugging information at a per--translation-unit 424 granularity. We believe that this level of recompilation is in 425 fact not possible if we intend to supply safe iterators, leave 426 the program semantics unchanged, and not regress in 427 performance under release mode because we cannot associate 428 extra information with an iterator (to form a safe iterator) 429 without either reserving that space in release mode 430 (performance regression) or allocating extra memory associated 431 with each iterator with <code>new</code> (changes the program 432 semantics).</para></listitem> 433 </orderedlist> 434 </para></listitem> 435 </itemizedlist> 436 </section> 437 438 <section xml:id="debug_mode.design.methods" xreflabel="Methods"><info><title>Methods</title></info> 439 440 <para> 441 </para> 442<para>This section provides an overall view of the design of the 443 libstdc++ debug mode and details the relationship between design 444 decisions and the stated design goals.</para> 445 446 <section xml:id="debug_mode.design.methods.wrappers" xreflabel="Method Wrapper"><info><title>The Wrapper Model</title></info> 447 448<para>The libstdc++ debug mode uses a wrapper model where the 449 debugging versions of library components (e.g., iterators and 450 containers) form a layer on top of the release versions of the 451 library components. The debugging components first verify that the 452 operation is correct (aborting with a diagnostic if an error is 453 found) and will then forward to the underlying release-mode 454 container that will perform the actual work. This design decision 455 ensures that we cannot regress release-mode performance (because the 456 release-mode containers are left untouched) and partially 457 enables <link linkend="methods.coexistence.link">mixing debug and 458 release code</link> at link time, although that will not be 459 discussed at this time.</para> 460 461<para>Two types of wrappers are used in the implementation of the debug 462 mode: container wrappers and iterator wrappers. The two types of 463 wrappers interact to maintain relationships between iterators and 464 their associated containers, which are necessary to detect certain 465 types of standard library usage errors such as dereferencing 466 past-the-end iterators or inserting into a container using an 467 iterator from a different container.</para> 468 469 <section xml:id="debug_mode.design.methods.safe_iter" xreflabel="Method Safe Iter"><info><title>Safe Iterators</title></info> 470 471<para>Iterator wrappers provide a debugging layer over any iterator that 472 is attached to a particular container, and will manage the 473 information detailing the iterator's state (singular, 474 dereferenceable, etc.) and tracking the container to which the 475 iterator is attached. Because iterators have a well-defined, common 476 interface the iterator wrapper is implemented with the iterator 477 adaptor class template <code>__gnu_debug::_Safe_iterator</code>, 478 which takes two template parameters:</para> 479 480<itemizedlist> 481 <listitem><para><code>Iterator</code>: The underlying iterator type, which must 482 be either the <code>iterator</code> or <code>const_iterator</code> 483 typedef from the sequence type this iterator can reference.</para></listitem> 484 485 <listitem><para><code>Sequence</code>: The type of sequence that this iterator 486 references. This sequence must be a safe sequence (discussed below) 487 whose <code>iterator</code> or <code>const_iterator</code> typedef 488 is the type of the safe iterator.</para></listitem> 489</itemizedlist> 490 </section> 491 492 <section xml:id="debug_mode.design.methods.safe_seq" xreflabel="Method Safe Seq"><info><title>Safe Sequences (Containers)</title></info> 493 494 495<para>Container wrappers provide a debugging layer over a particular 496 container type. Because containers vary greatly in the member 497 functions they support and the semantics of those member functions 498 (especially in the area of iterator invalidation), container 499 wrappers are tailored to the container they reference, e.g., the 500 debugging version of <code>std::list</code> duplicates the entire 501 interface of <code>std::list</code>, adding additional semantic 502 checks and then forwarding operations to the 503 real <code>std::list</code> (a public base class of the debugging 504 version) as appropriate. However, all safe containers inherit from 505 the class template <code>__gnu_debug::_Safe_sequence</code>, 506 instantiated with the type of the safe container itself (an instance 507 of the curiously recurring template pattern).</para> 508 509<para>The iterators of a container wrapper will be 510 <link linkend="debug_mode.design.methods.safe_iter">safe 511 iterators</link> that reference sequences of this type and wrap the 512 iterators provided by the release-mode base class. The debugging 513 container will use only the safe iterators within its own interface 514 (therefore requiring the user to use safe iterators, although this 515 does not change correct user code) and will communicate with the 516 release-mode base class with only the underlying, unsafe, 517 release-mode iterators that the base class exports.</para> 518 519<para> The debugging version of <code>std::list</code> will have the 520 following basic structure:</para> 521 522<programlisting> 523template<typename _Tp, typename _Allocator = allocator<_Tp> 524 class debug-list : 525 public release-list<_Tp, _Allocator>, 526 public __gnu_debug::_Safe_sequence<debug-list<_Tp, _Allocator> > 527 { 528 typedef release-list<_Tp, _Allocator> _Base; 529 typedef debug-list<_Tp, _Allocator> _Self; 530 531 public: 532 typedef __gnu_debug::_Safe_iterator<typename _Base::iterator, _Self> iterator; 533 typedef __gnu_debug::_Safe_iterator<typename _Base::const_iterator, _Self> const_iterator; 534 535 // duplicate std::list interface with debugging semantics 536 }; 537</programlisting> 538 </section> 539 </section> 540 541 <section xml:id="debug_mode.design.methods.precond" xreflabel="Precondition check"><info><title>Precondition Checking</title></info> 542 543<para>The debug mode operates primarily by checking the preconditions of 544 all standard library operations that it supports. Preconditions that 545 are always checked (regardless of whether or not we are in debug 546 mode) are checked via the <code>__check_xxx</code> macros defined 547 and documented in the source 548 file <code>include/debug/debug.h</code>. Preconditions that may or 549 may not be checked, depending on the debug-mode 550 macro <code>_GLIBCXX_DEBUG</code>, are checked via 551 the <code>__requires_xxx</code> macros defined and documented in the 552 same source file. Preconditions are validated using any additional 553 information available at run-time, e.g., the containers that are 554 associated with a particular iterator, the position of the iterator 555 within those containers, the distance between two iterators that may 556 form a valid range, etc. In the absence of suitable information, 557 e.g., an input iterator that is not a safe iterator, these 558 precondition checks will silently succeed.</para> 559 560<para>The majority of precondition checks use the aforementioned macros, 561 which have the secondary benefit of having prewritten debug 562 messages that use information about the current status of the 563 objects involved (e.g., whether an iterator is singular or what 564 sequence it is attached to) along with some static information 565 (e.g., the names of the function parameters corresponding to the 566 objects involved). When not using these macros, the debug mode uses 567 either the debug-mode assertion 568 macro <code>_GLIBCXX_DEBUG_ASSERT</code> , its pedantic 569 cousin <code>_GLIBCXX_DEBUG_PEDASSERT</code>, or the assertion 570 check macro that supports more advance formulation of error 571 messages, <code>_GLIBCXX_DEBUG_VERIFY</code>. These macros are 572 documented more thoroughly in the debug mode source code.</para> 573 </section> 574 575 <section xml:id="debug_mode.design.methods.coexistence" xreflabel="Coexistence"><info><title>Release- and debug-mode coexistence</title></info> 576 577<para>The libstdc++ debug mode is the first debug mode we know of that 578 is able to provide the "Per-use recompilation" (4) guarantee, that 579 allows release-compiled and debug-compiled code to be linked and 580 executed together without causing unpredictable behavior. This 581 guarantee minimizes the recompilation that users are required to 582 perform, shortening the detect-compile-debug bug hunting cycle 583 and making the debug mode easier to incorporate into development 584 environments by minimizing dependencies.</para> 585 586<para>Achieving link- and run-time coexistence is not a trivial 587 implementation task. To achieve this goal we required a small 588 extension to the GNU C++ compiler (since incorporated into the C++11 language specification, described in the GCC Manual for the C++ language as 589 <link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http://gcc.gnu.org/onlinedocs/gcc/Namespace-Association.html#Namespace-Association">namespace 590 association</link>), and a complex organization of debug- and 591 release-modes. The end result is that we have achieved per-use 592 recompilation but have had to give up some checking of the 593 <code>std::basic_string</code> class template (namely, safe 594 iterators). 595</para> 596 597 <section xml:id="methods.coexistence.compile" xreflabel="Compile"><info><title>Compile-time coexistence of release- and debug-mode components</title></info> 598 599 600<para>Both the release-mode components and the debug-mode 601 components need to exist within a single translation unit so that 602 the debug versions can wrap the release versions. However, only one 603 of these components should be user-visible at any particular 604 time with the standard name, e.g., <code>std::list</code>. </para> 605 606<para>In release mode, we define only the release-mode version of the 607 component with its standard name and do not include the debugging 608 component at all. The release mode version is defined within the 609 namespace <code>std</code>. Minus the namespace associations, this 610 method leaves the behavior of release mode completely unchanged from 611 its behavior prior to the introduction of the libstdc++ debug 612 mode. Here's an example of what this ends up looking like, in 613 C++.</para> 614 615<programlisting> 616namespace std 617{ 618 template<typename _Tp, typename _Alloc = allocator<_Tp> > 619 class list 620 { 621 // ... 622 }; 623} // namespace std 624</programlisting> 625 626<para>In debug mode we include the release-mode container (which is now 627defined in the namespace <code>__cxx1998</code>) and also the 628debug-mode container. The debug-mode container is defined within the 629namespace <code>__debug</code>, which is associated with namespace 630<code>std</code> via the C++11 namespace association language feature. This 631method allows the debug and release versions of the same component to 632coexist at compile-time and link-time without causing an unreasonable 633maintenance burden, while minimizing confusion. Again, this boils down 634to C++ code as follows:</para> 635 636<programlisting> 637namespace std 638{ 639 namespace __cxx1998 640 { 641 template<typename _Tp, typename _Alloc = allocator<_Tp> > 642 class list 643 { 644 // ... 645 }; 646 } // namespace __gnu_norm 647 648 namespace __debug 649 { 650 template<typename _Tp, typename _Alloc = allocator<_Tp> > 651 class list 652 : public __cxx1998::list<_Tp, _Alloc>, 653 public __gnu_debug::_Safe_sequence<list<_Tp, _Alloc> > 654 { 655 // ... 656 }; 657 } // namespace __cxx1998 658 659 // namespace __debug __attribute__ ((strong)); 660 inline namespace __debug { } 661} 662</programlisting> 663 </section> 664 665 <section xml:id="methods.coexistence.link" xreflabel="Link"><info><title>Link- and run-time coexistence of release- and 666 debug-mode components</title></info> 667 668 669<para>Because each component has a distinct and separate release and 670debug implementation, there is no issue with link-time 671coexistence: the separate namespaces result in different mangled 672names, and thus unique linkage.</para> 673 674<para>However, components that are defined and used within the C++ 675standard library itself face additional constraints. For instance, 676some of the member functions of <code> std::moneypunct</code> return 677<code>std::basic_string</code>. Normally, this is not a problem, but 678with a mixed mode standard library that could be using either 679debug-mode or release-mode <code> basic_string</code> objects, things 680get more complicated. As the return value of a function is not 681encoded into the mangled name, there is no way to specify a 682release-mode or a debug-mode string. In practice, this results in 683runtime errors. A simplified example of this problem is as follows. 684</para> 685 686<para> Take this translation unit, compiled in debug-mode: </para> 687<programlisting> 688// -D_GLIBCXX_DEBUG 689#include <string> 690 691std::string test02(); 692 693std::string test01() 694{ 695 return test02(); 696} 697 698int main() 699{ 700 test01(); 701 return 0; 702} 703</programlisting> 704 705<para> ... and linked to this translation unit, compiled in release mode:</para> 706 707<programlisting> 708#include <string> 709 710std::string 711test02() 712{ 713 return std::string("toast"); 714} 715</programlisting> 716 717<para> For this reason we cannot easily provide safe iterators for 718 the <code>std::basic_string</code> class template, as it is present 719 throughout the C++ standard library. For instance, locale facets 720 define typedefs that include <code>basic_string</code>: in a mixed 721 debug/release program, should that typedef be based on the 722 debug-mode <code>basic_string</code> or the 723 release-mode <code>basic_string</code>? While the answer could be 724 "both", and the difference hidden via renaming a la the 725 debug/release containers, we must note two things about locale 726 facets:</para> 727 728<orderedlist inheritnum="ignore" continuation="restarts"> 729 <listitem><para>They exist as shared state: one can create a facet in one 730 translation unit and access the facet via the same type name in a 731 different translation unit. This means that we cannot have two 732 different versions of locale facets, because the types would not be 733 the same across debug/release-mode translation unit barriers.</para></listitem> 734 735 <listitem><para>They have virtual functions returning strings: these functions 736 mangle in the same way regardless of the mangling of their return 737 types (see above), and their precise signatures can be relied upon 738 by users because they may be overridden in derived classes.</para></listitem> 739</orderedlist> 740 741<para>With the design of libstdc++ debug mode, we cannot effectively hide 742 the differences between debug and release-mode strings from the 743 user. Failure to hide the differences may result in unpredictable 744 behavior, and for this reason we have opted to only 745 perform <code>basic_string</code> changes that do not require ABI 746 changes. The effect on users is expected to be minimal, as there are 747 simple alternatives (e.g., <code>__gnu_debug::basic_string</code>), 748 and the usability benefit we gain from the ability to mix debug- and 749 release-compiled translation units is enormous.</para> 750 </section> 751 752 <section xml:id="methods.coexistence.alt" xreflabel="Alternatives"><info><title>Alternatives for Coexistence</title></info> 753 754 755<para>The coexistence scheme above was chosen over many alternatives, 756 including language-only solutions and solutions that also required 757 extensions to the C++ front end. The following is a partial list of 758 solutions, with justifications for our rejection of each.</para> 759 760<itemizedlist> 761 <listitem><para><emphasis>Completely separate debug/release libraries</emphasis>: This is by 762 far the simplest implementation option, where we do not allow any 763 coexistence of debug- and release-compiled translation units in a 764 program. This solution has an extreme negative affect on usability, 765 because it is quite likely that some libraries an application 766 depends on cannot be recompiled easily. This would not meet 767 our <emphasis>usability</emphasis> or <emphasis>minimize recompilation</emphasis> criteria 768 well.</para></listitem> 769 770 <listitem><para><emphasis>Add a <code>Debug</code> boolean template parameter</emphasis>: 771 Partial specialization could be used to select the debug 772 implementation when <code>Debug == true</code>, and the state 773 of <code>_GLIBCXX_DEBUG</code> could decide whether the 774 default <code>Debug</code> argument is <code>true</code> 775 or <code>false</code>. This option would break conformance with the 776 C++ standard in both debug <emphasis>and</emphasis> release modes. This would 777 not meet our <emphasis>correctness</emphasis> criteria. </para></listitem> 778 779 <listitem><para><emphasis>Packaging a debug flag in the allocators</emphasis>: We could 780 reuse the <code>Allocator</code> template parameter of containers 781 by adding a sentinel wrapper <code>debug<></code> that 782 signals the user's intention to use debugging, and pick up 783 the <code>debug<></code> allocator wrapper in a partial 784 specialization. However, this has two drawbacks: first, there is a 785 conformance issue because the default allocator would not be the 786 standard-specified <code>std::allocator<T></code>. Secondly 787 (and more importantly), users that specify allocators instead of 788 implicitly using the default allocator would not get debugging 789 containers. Thus this solution fails the <emphasis>correctness</emphasis> 790 criteria.</para></listitem> 791 792 <listitem><para><emphasis>Define debug containers in another namespace, and employ 793 a <code>using</code> declaration (or directive)</emphasis>: This is an 794 enticing option, because it would eliminate the need for 795 the <code>link_name</code> extension by aliasing the 796 templates. However, there is no true template aliasing mechanism 797 in C++, because both <code>using</code> directives and using 798 declarations disallow specialization. This method fails 799 the <emphasis>correctness</emphasis> criteria.</para></listitem> 800 801 <listitem><para><emphasis> Use implementation-specific properties of anonymous 802 namespaces. </emphasis> 803 See <link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http://gcc.gnu.org/ml/libstdc++/2003-08/msg00004.html"> this post 804 </link> 805 This method fails the <emphasis>correctness</emphasis> criteria.</para></listitem> 806 807 <listitem><para><emphasis>Extension: allow reopening on namespaces</emphasis>: This would 808 allow the debug mode to effectively alias the 809 namespace <code>std</code> to an internal namespace, such 810 as <code>__gnu_std_debug</code>, so that it is completely 811 separate from the release-mode <code>std</code> namespace. While 812 this will solve some renaming problems and ensure that 813 debug- and release-compiled code cannot be mixed unsafely, it ensures that 814 debug- and release-compiled code cannot be mixed at all. For 815 instance, the program would have two <code>std::cout</code> 816 objects! This solution would fails the <emphasis>minimize 817 recompilation</emphasis> requirement, because we would only be able to 818 support option (1) or (2).</para></listitem> 819 820 <listitem><para><emphasis>Extension: use link name</emphasis>: This option involves 821 complicated re-naming between debug-mode and release-mode 822 components at compile time, and then a g++ extension called <emphasis> 823 link name </emphasis> to recover the original names at link time. There 824 are two drawbacks to this approach. One, it's very verbose, 825 relying on macro renaming at compile time and several levels of 826 include ordering. Two, ODR issues remained with container member 827 functions taking no arguments in mixed-mode settings resulting in 828 equivalent link names, <code> vector::push_back() </code> being 829 one example. 830 See <link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http://gcc.gnu.org/ml/libstdc++/2003-08/msg00177.html">link 831 name</link> </para></listitem> 832</itemizedlist> 833 834<para>Other options may exist for implementing the debug mode, many of 835 which have probably been considered and others that may still be 836 lurking. This list may be expanded over time to include other 837 options that we could have implemented, but in all cases the full 838 ramifications of the approach (as measured against the design goals 839 for a libstdc++ debug mode) should be considered first. The DejaGNU 840 testsuite includes some testcases that check for known problems with 841 some solutions (e.g., the <code>using</code> declaration solution 842 that breaks user specialization), and additional testcases will be 843 added as we are able to identify other typical problem cases. These 844 test cases will serve as a benchmark by which we can compare debug 845 mode implementations.</para> 846 </section> 847 </section> 848 </section> 849 850 <section xml:id="debug_mode.design.other" xreflabel="Other"><info><title>Other Implementations</title></info> 851 852 <para> 853 </para> 854<para> There are several existing implementations of debug modes for C++ 855 standard library implementations, although none of them directly 856 supports debugging for programs using libstdc++. The existing 857 implementations include:</para> 858<itemizedlist> 859 <listitem><para><link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http://www.cs.sjsu.edu/faculty/horstman/safestl.html">SafeSTL</link>: 860 SafeSTL was the original debugging version of the Standard Template 861 Library (STL), implemented by Cay S. Horstmann on top of the 862 Hewlett-Packard STL. Though it inspired much work in this area, it 863 has not been kept up-to-date for use with modern compilers or C++ 864 standard library implementations.</para></listitem> 865 866 <listitem><para><link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http://www.stlport.org/">STLport</link>: STLport is a free 867 implementation of the C++ standard library derived from the <link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http://www.sgi.com/tech/stl/">SGI implementation</link>, and 868 ported to many other platforms. It includes a debug mode that uses a 869 wrapper model (that in some ways inspired the libstdc++ debug mode 870 design), although at the time of this writing the debug mode is 871 somewhat incomplete and meets only the "Full user recompilation" (2) 872 recompilation guarantee by requiring the user to link against a 873 different library in debug mode vs. release mode.</para></listitem> 874 875 <listitem><para>Metrowerks CodeWarrior: The C++ standard library 876 that ships with Metrowerks CodeWarrior includes a debug mode. It is 877 a full debug-mode implementation (including debugging for 878 CodeWarrior extensions) and is easy to use, although it meets only 879 the "Full recompilation" (1) recompilation 880 guarantee.</para></listitem> 881</itemizedlist> 882 883 </section> 884</section> 885 886</chapter> 887