debug.cc [...]: Include execinfo.h.
authorFrançois Dumont <fdumont@gcc.gnu.org>
Tue, 8 May 2018 20:00:52 +0000 (20:00 +0000)
committerFrançois Dumont <fdumont@gcc.gnu.org>
Tue, 8 May 2018 20:00:52 +0000 (20:00 +0000)
2018-05-08  François Dumont  <fdumont@gcc.gnu.org>

* src/c++11/debug.cc [_GLIBCXX_HAVE_EXECINFO_H]: Include execinfo.h.
[_GLIBCXX_HAVE_EXECINFO_H](_Error_formatter::_M_error): Render
backtrace.

From-SVN: r260054

libstdc++-v3/ChangeLog
libstdc++-v3/src/c++11/debug.cc

index bf1e80333beb9cb27b44c4721f419ea0bc5083be..25430fd9e512ba581f7eef459424c60bbd974634 100644 (file)
@@ -1,5 +1,9 @@
 2018-05-08  François Dumont  <fdumont@gcc.gnu.org>
 
+       * src/c++11/debug.cc [_GLIBCXX_HAVE_EXECINFO_H]: Include execinfo.h.
+       [_GLIBCXX_HAVE_EXECINFO_H](_Error_formatter::_M_error): Render
+       backtrace.
+
        * include/debug/macros.h (__glibcxx_check_valid_range_at): New.
        * include/debug/functions.h (__check_valid_range): Use latter.
        * include/debug/macros.h (__glibcxx_check_valid_constructor_range): New,
index 89d387cdea5688fb2409bd011711fedf5bb49056..ede6b703aae4bf93821b625fe6ad1281f5a4a4e4 100644 (file)
 
 #include <cxxabi.h> // for __cxa_demangle
 
+#if defined _GLIBCXX_HAVE_EXECINFO_H
+# include <execinfo.h> // for backtrace
+#endif
+
 #include "mutex_pool.h"
 
 using namespace std;
@@ -1043,6 +1047,29 @@ namespace __gnu_debug
        print_literal(ctx, "\n");
       }
 
+#if defined _GLIBCXX_HAVE_EXECINFO_H
+    {
+      void* stack[32];
+      int nb = backtrace(stack, 32);
+
+      // Note that we skip current method symbol.
+      if (nb > 1)
+       {
+         print_literal(ctx, "Backtrace:\n");
+         auto symbols = backtrace_symbols(stack, nb);
+         for (int i = 1; i < nb; ++i)
+           {
+             print_word(ctx, symbols[i]);
+             print_literal(ctx, "\n");
+           }
+
+         free(symbols);
+         ctx._M_first_line = true;
+         print_literal(ctx, "\n");
+       }
+    }
+#endif
+
     print_literal(ctx, "Error: ");
 
     // Print the error message