This is the mail archive of the libstdc++@gcc.gnu.org mailing list for the libstdc++ project.
| Index Nav: | [Date Index] [Subject Index] [Author Index] [Thread Index] | |
|---|---|---|
| Message Nav: | [Date Prev] [Date Next] | [Thread Prev] [Thread Next] |
| Other format: | [Raw text] | |
On 5/29/19 12:06 AM, Jonathan Wakely wrote:
What I want to avoid is PR saying that despite _GLIBCXX_DEBUG_BACKTRACE being defined there isn't any backtrace displayed in the assertion message.On 23/05/19 07:39 +0200, François Dumont wrote:Hi So here what I come up with._GLIBCXX_DEBUG_BACKTRACE controls the feature. If the user defineThanks for making this opt-in.it and there is a detectable issue with libbacktrace then I generate a compilation error. I want to avoid users defining it but having no backtrace in the end in the debug assertion.Why do you want to avoid that? This means users can't just define the macro in their makefiles unconditionally, they have to check if libbacktrace is installed and supported. That might mean having platform-specific conditionals in the makefile to only enable it sometimes. What harm does it do to just ignore the _GLIBCXX_DEBUG_BACKTRACE macro if backtraces can't be enabled? Or just use #warning instead of #error?
Maybe I can still fail to compile if I can't include backtrace-supported.h to make clear that the -I... option is missing but ignore if !BACKTRACE_SUPPORTED. Would it be fine ?
With this new setup I manage to run testsuite with it like that: export LD_LIBRARY_PATH=/home/fdt/dev/gcc/install/lib/make CXXFLAGS='-D_GLIBCXX_DEBUG_BACKTRACE -I/home/fdt/dev/gcc/install/include -lbacktrace' check-debugAn example of result:/home/fdt/dev/gcc/build/x86_64-pc-linux-gnu/libstdc++-v3/include/debug/vector:606:In function: std::__debug::vector<_Tp, _Allocator>::iteratorstd::__debug::vector<_Tp, _Allocator>::insert(std::__debug::vector<_Tp,_Allocator>::const_iterator, _InputIterator, _InputIterator) [with _InputIterator = int*; <template-parameter-2-2> = void; _Tp = int; _Allocator = std::allocator<int>; std::__debug::vector<_Tp, _Allocator>::iterator = __gnu_debug::_Safe_iterator<__gnu_cxx::__normal_iterator<int*, std:: vector<int> >, std::__debug::vector<int>,std::random_access_iterator_tag>; typename std::iterator_traits<typenamestd::vector<_Tp, _Alloc>::iterator>::iterator_category = std::random_access_iterator_tag; typename std::vector<_Tp,_Alloc>::iterator = __gnu_cxx::__normal_iterator<int*, std::vector<int>>; std::__debug::vector<_Tp, _Allocator>::const_iterator = __gnu_debug::_Safe_iterator<__gnu_cxx::__normal_iterator<const int*, std::vector<int> >, std::__debug::vector<int>,std::random_access_iterator_tag>; typename std::iterator_traits<typenamestd::vector<_Tp, _Alloc>::const_iterator>::iterator_category = std::random_access_iterator_tag; typename std::vector<_Tp,_Alloc>::const_iterator = __gnu_cxx::__normal_iterator<const int*, std::vector<int> >] Backtrace:0x402718 __gnu_debug::_Safe_iterator<__gnu_cxx::__normal_iterator<int*, std::vector<int> >> std::__debug::vector<int>::insert<int*, void>(__gnu_debug::_Safe_iterator<__gnu_cxx::__normal_iterator<int const*, std::vector<int> >>, int*, int*) /home/fdt/dev/gcc/build/x86_64-pc-linux-gnu/libstdc++-v3/include/debug/vector:6060x402718 test01()/home/fdt/dev/gcc/git/libstdc++-v3/testsuite/23_containers/vector/debug/57779_neg.cc:290x401428 main/home/fdt/dev/gcc/git/libstdc++-v3/testsuite/23_containers/vector/debug/57779_neg.cc:34Error: attempt to insert with an iterator range [__first, __last) from thiscontainer. Objects involved in the operation: iterator "__first" @ 0x0x7fff730b96b0 { type = int* (mutable iterator); } iterator "__last" @ 0x0x7fff730b96b8 { type = int* (mutable iterator); } sequence "this" @ 0x0x7fff730b9720 { type = std::__debug::vector<int>; }This is nice.
Yes, I forgot to say that I made an effort to clean a little the demangle names but I think you saw it already.
I was surprised to see that the content of the __PRETTY_FUNCTION__ macro is quite different from the demangling of the same symbol, too bad.
diff --git a/libstdc++-v3/doc/xml/manual/debug_mode.xml b/libstdc++-v3/doc/xml/manual/debug_mode.xmlindex 570c17ba28a..27873151dae 100644 --- a/libstdc++-v3/doc/xml/manual/debug_mode.xml +++ b/libstdc++-v3/doc/xml/manual/debug_mode.xml @@ -104,9 +104,11 @@ <para>The following library components provide extra debugging capabilities in debug mode:</para> <itemizedlist>+ <listitem><para><code>std::array</code> (no safe iterators)</para></listitem> <listitem><para><code>std::basic_string</code> (no safe iterators and see note below)</para></listitem><listitem><para><code>std::bitset</code></para></listitem> <listitem><para><code>std::deque</code></para></listitem> + <listitem><para><code>std::forward_list</code></para></listitem> <listitem><para><code>std::list</code></para></listitem> <listitem><para><code>std::map</code></para></listitem> <listitem><para><code>std::multimap</code></para></listitem> @@ -160,6 +162,13 @@ which always works correctly. <code>GLIBCXX_DEBUG_MESSAGE_LENGTH</code> can be used to request a different length.</para> +<para>Starting with GCC 10 libstdc++ has integratedI think "integrated" is the wrong word, because you haven't made libbacktrace and libstdc++ into a single thing. You've just added the ability for libstdc++ to use libbacktrace. I suggest "libstdc++ is able to use"+ <link xmlns:xlink="http://www.w3.org/1999/xlink"+ xlink:href="https://github.com/ianlancetaylor/libbacktrace">libbacktrace</link> + to produce backtrace on error. Use <code>-D_GLIBCXX_DEBUG_BACKTRACE</code> toShould be "produce backtraces".+ activate it. Note that if not properly installed or if libbacktrace is not+ supported compilation will fail. You'll also have to use theComma after "supported". Remove "the" at the end of the line.+ <code>-lbacktrace</code> to build your application.</para> </section>The new _GLIBCXX_DEBUG_BACKTRACE macro should be documented in doc/xml/manual/using.xml too. I think we also have a table in that chapter which lists relevant GCC options, so -lbacktrace could go in there too.
Ok, I'll consider your suggestions accordingly and complete this chapter.
Enabling backtrace support doesn't alter the ABI of the debug mode containers, right? It only affects the size of the _Error_formatter type, which is not a member of any container or iterator
Indeed, no ABI breaking change.
| Index Nav: | [Date Index] [Subject Index] [Author Index] [Thread Index] | |
|---|---|---|
| Message Nav: | [Date Prev] [Date Next] | [Thread Prev] [Thread Next] |