From e95a74fda222c1de9586d46b758afdc8dc50c394 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Fran=C3=A7ois=20Dumont?= Date: Tue, 8 May 2018 20:00:52 +0000 Subject: [PATCH] debug.cc [...]: Include execinfo.h. MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit 2018-05-08 François Dumont * 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 | 4 ++++ libstdc++-v3/src/c++11/debug.cc | 27 +++++++++++++++++++++++++++ 2 files changed, 31 insertions(+) diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index bf1e80333beb..25430fd9e512 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,5 +1,9 @@ 2018-05-08 François Dumont + * 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, diff --git a/libstdc++-v3/src/c++11/debug.cc b/libstdc++-v3/src/c++11/debug.cc index 89d387cdea56..ede6b703aae4 100644 --- a/libstdc++-v3/src/c++11/debug.cc +++ b/libstdc++-v3/src/c++11/debug.cc @@ -40,6 +40,10 @@ #include // for __cxa_demangle +#if defined _GLIBCXX_HAVE_EXECINFO_H +# include // 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 -- 2.47.2