From bd07777485294b66c3d238003515697792cb9e44 Mon Sep 17 00:00:00 2001 From: Antony Polukhin Date: Wed, 14 Sep 2016 22:00:19 +0300 Subject: [PATCH] More examples and removed inclusion of some unused headers --- example/getting_started.cpp | 131 +++++++++++++----- .../stacktrace/detail/stacktrace_windows.hpp | 1 - test/Jamfile.v2 | 10 +- 3 files changed, 102 insertions(+), 40 deletions(-) diff --git a/example/getting_started.cpp b/example/getting_started.cpp index 2dff3ea..fd4b222 100644 --- a/example/getting_started.cpp +++ b/example/getting_started.cpp @@ -4,55 +4,118 @@ // accompanying file LICENSE_1_0.txt or copy at // http://www.boost.org/LICENSE_1_0.txt) -#include -struct events { - typedef boost::function callback_type; +#include +BOOST_NOINLINE void oops(std::size_t i); +BOOST_NOINLINE void foo(int i); +BOOST_NOINLINE void bar(int i); - static void from_keyboard(callback_type callback); - static void from_network(callback_type callback); -}; +BOOST_NOINLINE void oops(std::size_t i) { + boost::array a = {{0, 1, 2, 3, 4}}; + foo(a[i]); +} - -#include -#include -BOOST_NOINLINE void validate_positive(float f) { - if (f < 0.f) { - std::cerr << "Negative number " << f << " detected. Call stack:\n" - << boost::stacktrace::stacktrace() << '\n'; +BOOST_NOINLINE void bar(int i) { + boost::array a = {{0, 1, 2, 3, 4}}; + if (i < 5) { + if (i >= 0) { + foo(a[i]); + } else { + oops(i); + } } } - - - -boost::function on_keyboard; -boost::function on_network; - -BOOST_NOINLINE void keyboard_event() { - on_keyboard(-0.1f); +BOOST_NOINLINE void foo(int i) { + bar(--i); } -BOOST_NOINLINE void network_event() { - on_network(1.0f); +/* +../../../boost/array.hpp:123: T& boost::array::operator[](boost::array::size_type) [with T = int; long unsigned int N = 5ul; boost::array::reference = int&; boost::array::size_type = long unsigned int]: Assertion `(i < N)&&("out of range")' failed. +Aborted (core dumped) +*/ + +/* +Expression 'i < N' is false in function 'T& boost::array::operator[](boost::array::size_type) [with T = int; long unsigned int N = 5ul; boost::array::reference = int&; boost::array::size_type = long unsigned int]': out of range +Backtrace: + 0# boost::assertion_failed_msg(char const*, char const*, char const*, char const*, long) + 1# boost::array::operator[](unsigned long) + 2# oops(unsigned long) + 3# bar(int) + 4# foo(int) + 5# bar(int) + 6# foo(int) + 7# bar(int) + 8# foo(int) + 9# bar(int) +10# foo(int) +11# bar(int) +12# foo(int) +13# bar(int) +14# foo(int) +15# main +16# __libc_start_main +17# _start +18# ?? +*/ + +// BOOST_ENABLE_ASSERT_DEBUG_HANDLER is defined for the whole project +#include +#include +#include +#include + +namespace boost { + void assertion_failed_msg(char const* expr, char const* msg, char const* function, char const* file, long line) { + std::cerr << "Expression '" << expr << "' is false in function '" << function << "': " << (msg ? msg : "<...>") << ".\n" + << "Backtrace:\n" << boost::stacktrace::stacktrace() << '\n'; + throw std::logic_error("assertion"); + } + + void assertion_failed(char const* expr, char const* function, char const* file, long line) { + ::boost::assertion_failed_msg(expr, 0 /*nullptr*/, function, file, line); + } +} // namespace boost + + + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +#include // std::set_terminate +#include // ::signal +#include +#include + +void my_terminate_handler() { + std::cerr << "Terminate called: " << boost::stacktrace::stacktrace() << '\n'; + std::abort(); } -void events::from_keyboard(events::callback_type callback) { - on_keyboard = callback; -} - -void events::from_network(events::callback_type callback) { - on_network = callback; +void my_signal_handler(int signum) { + std::cerr << "Signal " << signum << ", backtrace:\n" << boost::stacktrace::stacktrace() << '\n'; + std::abort(); } +void setup_handlers() { + std::set_terminate(&my_terminate_handler); + ::signal(SIGSEGV, &my_signal_handler); +} +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +#include +typedef boost::error_info stacktrace_info; + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +#include int main() { - events::from_keyboard(&validate_positive); - events::from_network(&validate_positive); + setup_handlers(); - keyboard_event(); - network_event(); + BOOST_TRY { + foo(5); // testing assert handler + } BOOST_CATCH(...) { + } BOOST_CATCH_END } - diff --git a/include/boost/stacktrace/detail/stacktrace_windows.hpp b/include/boost/stacktrace/detail/stacktrace_windows.hpp index 0f9bd7f..b933d43 100644 --- a/include/boost/stacktrace/detail/stacktrace_windows.hpp +++ b/include/boost/stacktrace/detail/stacktrace_windows.hpp @@ -14,7 +14,6 @@ #include #include -#include #include #include "DbgHelp.h" diff --git a/test/Jamfile.v2 b/test/Jamfile.v2 index cc14616..41cf128 100644 --- a/test/Jamfile.v2 +++ b/test/Jamfile.v2 @@ -51,12 +51,12 @@ test-suite stacktrace_tests [ run test_noop.cpp : : : .//test_impl_lib_noop $(LINKSHARED_NOOP) : noop_lib ] # Making sure that the examples work - [ run ../example/getting_started.cpp : : : $(LINKSHARED_UNW) : libunwind_getting_started ] - [ run ../example/getting_started.cpp : : : $(LINKSHARED_BT) : backtrace_getting_started ] - [ run ../example/getting_started.cpp : : : $(LINKSHARED_WIND) : windbg_getting_started ] - [ run ../example/getting_started.cpp : : : $(LINKSHARED_NOOP) : noop_getting_started ] + [ run ../example/getting_started.cpp : : : BOOST_ENABLE_ASSERT_DEBUG_HANDLER $(LINKSHARED_UNW) : libunwind_getting_started ] + [ run ../example/getting_started.cpp : : : BOOST_ENABLE_ASSERT_DEBUG_HANDLER $(LINKSHARED_BT) : backtrace_getting_started ] + [ run ../example/getting_started.cpp : : : BOOST_ENABLE_ASSERT_DEBUG_HANDLER $(LINKSHARED_WIND) : windbg_getting_started ] + [ run ../example/getting_started.cpp : : : BOOST_ENABLE_ASSERT_DEBUG_HANDLER $(LINKSHARED_NOOP) : noop_getting_started ] - [ run ../example/getting_started.cpp : : : $(AUTO_DEPS) : auto_getting_started ] + [ run ../example/getting_started.cpp : : : BOOST_ENABLE_ASSERT_DEBUG_HANDLER $(AUTO_DEPS) : autodetect_getting_started ] ;