From de9b588d1dbbfef8cef58bc5af6af7f09148bdfd Mon Sep 17 00:00:00 2001 From: Antony Polukhin Date: Fri, 14 Apr 2017 22:38:48 +0300 Subject: [PATCH] Many new tests, including naive thread safety test --- test/Jamfile.v2 | 107 +++++++++++++++++++++++--------- test/test.cpp | 5 +- test/thread_safety_checking.cpp | 67 ++++++++++++++++++++ 3 files changed, 147 insertions(+), 32 deletions(-) create mode 100644 test/thread_safety_checking.cpp diff --git a/test/Jamfile.v2 b/test/Jamfile.v2 index 18759df..f417e67 100644 --- a/test/Jamfile.v2 +++ b/test/Jamfile.v2 @@ -23,8 +23,9 @@ lib backtrace project : requirements msvc:on + gcc:"-fPIE -fPIC" + gcc:"-fPIE -fPIC" all - on always_show_run_output ; @@ -36,40 +37,80 @@ local RDYNAMIC = freebsd:"-rdynamic" solaris:linux:"-fvisibility=hidden" ; local BT_DEPS = $(HIDE_SYMBS) linux:dl backtrace [ check-target-builds ../build//libbacktrace : : no ] ; -local UNWD_DEPS = $(HIDE_SYMBS) linux:dl [ check-target-builds ../build//addr2line : : no ] ; +local AD2L_DEPS = $(HIDE_SYMBS) linux:dl [ check-target-builds ../build//addr2line : : no ] ; local WIND_DEPS = $(HIDE_SYMBS) Dbgeng ole32 [ check-target-builds ../build//WinDbg : : no ] ; local NOOP_DEPS = $(HIDE_SYMBS) ; local BASIC_DEPS = $(RDYNAMIC) linux:dl [ check-target-builds ../build//WinDbg : no ] ; -local LINKSHARED_BT = shared BOOST_STACKTRACE_DYN_LINK /boost/stacktrace//boost_stacktrace_backtrace $(BT_DEPS) ; -local LINKSHARED_AD2L = shared BOOST_STACKTRACE_DYN_LINK /boost/stacktrace//boost_stacktrace_addr2line $(UNWD_DEPS) ; -local LINKSHARED_WIND = shared BOOST_STACKTRACE_DYN_LINK /boost/stacktrace//boost_stacktrace_windbg $(WIND_DEPS) ; -local LINKSHARED_NOOP = shared BOOST_STACKTRACE_DYN_LINK /boost/stacktrace//boost_stacktrace_noop $(NOOP_DEPS) ; -local LINKSHARED_BASIC = shared BOOST_STACKTRACE_DYN_LINK /boost/stacktrace//boost_stacktrace_basic $(BASIC_DEPS) ; +local LINKSHARED_BT = shared BOOST_STACKTRACE_DYN_LINK /boost/stacktrace//boost_stacktrace_backtrace $(BT_DEPS) ; +#local LINKSHARED_BT_CACHED = shared BOOST_STACKTRACE_DYN_LINK /boost/stacktrace//boost_stacktrace_backtrace_cached $(BT_DEPS) BOOST_STACKTRACE_USE_CACHING ; +local LINKSHARED_AD2L = shared BOOST_STACKTRACE_DYN_LINK /boost/stacktrace//boost_stacktrace_addr2line $(AD2L_DEPS) ; +local LINKSHARED_WIND = shared BOOST_STACKTRACE_DYN_LINK /boost/stacktrace//boost_stacktrace_windbg $(WIND_DEPS) ; +local LINKSHARED_NOOP = shared BOOST_STACKTRACE_DYN_LINK /boost/stacktrace//boost_stacktrace_noop $(NOOP_DEPS) ; +local LINKSHARED_BASIC = shared BOOST_STACKTRACE_DYN_LINK /boost/stacktrace//boost_stacktrace_basic $(BASIC_DEPS) ; -lib test_impl_lib_backtrace : test_impl.cpp : $(LINKSHARED_BT) ; -lib test_impl_lib_addr2line : test_impl.cpp : $(LINKSHARED_AD2L) ; -lib test_impl_lib_windbg : test_impl.cpp : $(LINKSHARED_WIND) ; -lib test_impl_lib_noop : test_impl.cpp : $(LINKSHARED_NOOP) ; +# Libs with debug symbols +lib test_impl_lib_backtrace : test_impl.cpp : on $(LINKSHARED_BT) ; +#lib test_impl_lib_backtrace_cached : test_impl.cpp : on $(LINKSHARED_BT_CACHED) ; +lib test_impl_lib_addr2line : test_impl.cpp : on $(LINKSHARED_AD2L) ; +lib test_impl_lib_windbg : test_impl.cpp : on $(LINKSHARED_WIND) ; +lib test_impl_lib_noop : test_impl.cpp : on $(LINKSHARED_NOOP) ; + +obj test_impl_nohide-obj : test_impl.cpp : on $(LINKSHARED_BASIC) ; +lib test_impl_lib_basic : test_impl_nohide-obj : on $(LINKSHARED_BASIC) ; + + +# Libs without debug symbols +lib test_impl_lib_backtrace_no_dbg : test_impl.cpp : off $(LINKSHARED_BT) ; +lib test_impl_lib_addr2line_no_dbg : test_impl.cpp : off $(LINKSHARED_AD2L) ; +lib test_impl_lib_windbg_no_dbg : test_impl.cpp : off $(LINKSHARED_WIND) ; +lib test_impl_lib_noop_no_dbg : test_impl.cpp : off $(LINKSHARED_NOOP) ; + +obj test_impl_nohide_no_dbg-obj : test_impl.cpp : off $(LINKSHARED_BASIC) ; +lib test_impl_lib_basic_no_dbg : test_impl_nohide_no_dbg-obj : off $(LINKSHARED_BASIC) ; -obj test_impl_nohide-obj : test_impl.cpp : $(LINKSHARED_BASIC) ; -lib test_impl_lib_basic : test_impl_nohide-obj : $(LINKSHARED_BASIC) ; test-suite stacktrace_tests : - # Header only tests - [ run test.cpp test_impl.cpp : : : BOOST_STACKTRACE_USE_BACKTRACE $(BT_DEPS) : backtrace_ho ] - [ run test.cpp test_impl.cpp : : : BOOST_STACKTRACE_USE_ADDR2LINE $(UNWD_DEPS) : addr2line_ho ] - [ run test_noop.cpp test_impl.cpp : : : BOOST_STACKTRACE_USE_NOOP $(NOOP_DEPS) : noop_ho ] - [ run test.cpp test_impl.cpp : : : $(WIND_DEPS) : windbg_ho ] - [ run test.cpp test_impl.cpp : : : $(BASIC_DEPS) : basic_ho ] - # Test with shared linked implementations - [ run test.cpp : : : .//test_impl_lib_backtrace $(LINKSHARED_BT) : backtrace_lib ] - [ run test.cpp : : : .//test_impl_lib_addr2line $(LINKSHARED_AD2L) : addr2line_lib ] - [ run test.cpp : : : .//test_impl_lib_windbg $(LINKSHARED_WIND) : windbg_lib ] - [ run test_noop.cpp : : : .//test_impl_lib_noop $(LINKSHARED_NOOP) : noop_lib ] - [ run test.cpp : : : .//test_impl_lib_basic $(LINKSHARED_BASIC) : basic_lib ] + # Header only tests with debug symbols + [ run test.cpp test_impl.cpp : : : on BOOST_STACKTRACE_USE_BACKTRACE $(BT_DEPS) : backtrace_ho ] + [ run test.cpp test_impl.cpp : : : on BOOST_STACKTRACE_USE_ADDR2LINE $(AD2L_DEPS) : addr2line_ho ] + [ run test_noop.cpp test_impl.cpp : : : on BOOST_STACKTRACE_USE_NOOP $(NOOP_DEPS) : noop_ho ] + [ run test.cpp test_impl.cpp : : : on $(WIND_DEPS) : windbg_ho ] + [ run test.cpp test_impl.cpp : : : on $(BASIC_DEPS) : basic_ho ] + + # Test with shared linked implementations with debug symbols + [ run test.cpp : : : on .//test_impl_lib_backtrace $(LINKSHARED_BT) : backtrace_lib ] + [ run test.cpp : : : on .//test_impl_lib_addr2line $(LINKSHARED_AD2L) : addr2line_lib ] + [ run test.cpp : : : on .//test_impl_lib_windbg $(LINKSHARED_WIND) : windbg_lib ] + [ run test_noop.cpp : : : on .//test_impl_lib_noop $(LINKSHARED_NOOP) : noop_lib ] + [ run test.cpp : : : on .//test_impl_lib_basic $(LINKSHARED_BASIC) : basic_lib ] + + # Thread safety with debug symbols + [ run thread_safety_checking.cpp : : : on /boost/thread//boost_thread .//test_impl_lib_backtrace $(LINKSHARED_BT) : backtrace_lib_thread_safety ] + [ run thread_safety_checking.cpp : : : on /boost/thread//boost_thread .//test_impl_lib_windbg $(LINKSHARED_WIND) : windbg_lib_thread_safety ] + [ run thread_safety_checking.cpp : : : on /boost/thread//boost_thread .//test_impl_lib_basic $(LINKSHARED_BASIC) : basic_lib_thread_safety ] + + + # Header only tests without debug symbols + [ run test.cpp test_impl.cpp : : : off BOOST_STACKTRACE_USE_BACKTRACE BOOST_STACKTRACE_TEST_NO_DEBUG_AT_ALL $(BT_DEPS) : backtrace_ho_no_dbg ] + [ run test.cpp test_impl.cpp : : : off BOOST_STACKTRACE_USE_ADDR2LINE $(AD2L_DEPS) : addr2line_ho_no_dbg ] + [ run test_noop.cpp test_impl.cpp : : : off BOOST_STACKTRACE_USE_NOOP $(NOOP_DEPS) : noop_ho_no_dbg ] + [ run test.cpp test_impl.cpp : : : off $(WIND_DEPS) : windbg_ho_no_dbg ] + [ run test.cpp test_impl.cpp : : : off $(BASIC_DEPS) : basic_ho_no_dbg ] + + # Test with shared linked implementations without debug symbols + [ run test.cpp : : : off .//test_impl_lib_backtrace_no_dbg $(LINKSHARED_BT) BOOST_STACKTRACE_TEST_NO_DEBUG_AT_ALL : backtrace_lib_no_dbg ] + [ run test.cpp : : : off .//test_impl_lib_addr2line_no_dbg $(LINKSHARED_AD2L) : addr2line_lib_no_dbg ] + [ run test.cpp : : : off .//test_impl_lib_windbg_no_dbg $(LINKSHARED_WIND) : windbg_lib_no_dbg ] + [ run test_noop.cpp : : : off .//test_impl_lib_noop_no_dbg $(LINKSHARED_NOOP) : noop_lib_no_dbg ] + [ run test.cpp : : : off .//test_impl_lib_basic_no_dbg $(LINKSHARED_BASIC) : basic_lib_no_dbg ] + + # Thread safety without debug symbols + [ run thread_safety_checking.cpp : : : off /boost/thread//boost_thread .//test_impl_lib_backtrace $(LINKSHARED_BT) : backtrace_lib_no_dbg_thread_safety ] + [ run thread_safety_checking.cpp : : : off /boost/thread//boost_thread .//test_impl_lib_windbg $(LINKSHARED_WIND) : windbg_lib_no_dbg_thread_safety ] + [ run thread_safety_checking.cpp : : : off /boost/thread//boost_thread .//test_impl_lib_basic $(LINKSHARED_BASIC) : basic_lib_no_dbg_thread_safety ] ; # Assuring that examples compile and run. Adding sources from `examples` directory to the `type_index` test suite. @@ -82,11 +123,17 @@ for local p in [ glob ../example/*.cpp ] additional_dependency = /boost/filesystem//boost_filesystem /boost/system//boost_system linux:rt ; } - stacktrace_tests += [ run $(p) : : : $(LINKSHARED_BT) $(additional_dependency) : backtrace_$(p[1]:B) ] ; - stacktrace_tests += [ run $(p) : : : $(LINKSHARED_AD2L) $(additional_dependency) : addr2line_$(p[1]:B) ] ; - stacktrace_tests += [ run $(p) : : : $(LINKSHARED_WIND) $(additional_dependency) : windbg_$(p[1]:B) ] ; - stacktrace_tests += [ run $(p) : : : $(LINKSHARED_NOOP) $(additional_dependency) : noop_$(p[1]:B) ] ; - stacktrace_tests += [ run $(p) : : : $(LINKSHARED_BASIC) $(additional_dependency) : basic_$(p[1]:B) ] ; + stacktrace_tests += [ run $(p) : : : on $(LINKSHARED_BT) $(additional_dependency) : backtrace_$(p[1]:B) ] ; + stacktrace_tests += [ run $(p) : : : on $(LINKSHARED_AD2L) $(additional_dependency) : addr2line_$(p[1]:B) ] ; + stacktrace_tests += [ run $(p) : : : on $(LINKSHARED_WIND) $(additional_dependency) : windbg_$(p[1]:B) ] ; + stacktrace_tests += [ run $(p) : : : on $(LINKSHARED_NOOP) $(additional_dependency) : noop_$(p[1]:B) ] ; + stacktrace_tests += [ run $(p) : : : on $(LINKSHARED_BASIC) $(additional_dependency) : basic_$(p[1]:B) ] ; + + stacktrace_tests += [ run $(p) : : : off $(LINKSHARED_BT) $(additional_dependency) : backtrace_$(p[1]:B)_no_dbg ] ; + stacktrace_tests += [ run $(p) : : : off $(LINKSHARED_AD2L) $(additional_dependency) : addr2line_$(p[1]:B)_no_dbg ] ; + stacktrace_tests += [ run $(p) : : : off $(LINKSHARED_WIND) $(additional_dependency) : windbg_$(p[1]:B)_no_dbg ] ; + stacktrace_tests += [ run $(p) : : : off $(LINKSHARED_NOOP) $(additional_dependency) : noop_$(p[1]:B)_no_dbg ] ; + stacktrace_tests += [ run $(p) : : : off $(LINKSHARED_BASIC) $(additional_dependency) : basic_$(p[1]:B)_no_dbg ] ; } diff --git a/test/test.cpp b/test/test.cpp index 62ea4b5..86dbd15 100644 --- a/test/test.cpp +++ b/test/test.cpp @@ -25,8 +25,9 @@ using boost::stacktrace::frame; #endif -#if defined(BOOST_GCC) && defined(BOOST_WINDOWS) && !defined(BOOST_STACKTRACE_USE_BACKTRACE) && !defined(BOOST_STACKTRACE_USE_ADDR2LINE) - // MinGW with basic functionality +#if (defined(BOOST_GCC) && defined(BOOST_WINDOWS) && !defined(BOOST_STACKTRACE_USE_BACKTRACE) && !defined(BOOST_STACKTRACE_USE_ADDR2LINE)) \ + || defined(BOOST_STACKTRACE_TEST_NO_DEBUG_AT_ALL) + # define BOOST_STACKTRACE_SYMNAME 0 #else # define BOOST_STACKTRACE_SYMNAME 1 diff --git a/test/thread_safety_checking.cpp b/test/thread_safety_checking.cpp new file mode 100644 index 0000000..38a7d68 --- /dev/null +++ b/test/thread_safety_checking.cpp @@ -0,0 +1,67 @@ +// Copyright Antony Polukhin, 2016-2017. +// +// Distributed under the Boost Software License, Version 1.0. (See +// accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) + +#include + +#include +#include +#include +#include + +#ifdef BOOST_STACKTRACE_DYN_LINK +# define BOOST_ST_API BOOST_SYMBOL_IMPORT +#else +# define BOOST_ST_API +#endif + +using boost::stacktrace::stacktrace; + +typedef std::pair (*foo1_t)(int i); +BOOST_ST_API std::pair foo2(int i, foo1_t foo1); +BOOST_ST_API stacktrace return_from_nested_namespaces(); + +BOOST_NOINLINE std::pair foo1(int i) { + if (i) { + return foo2(i - 1, foo1); + } + + std::pair ret; + try { + throw std::logic_error("test"); + } catch (const std::logic_error& /*e*/) { + ret.second = stacktrace(); + return ret; + } +} + +void main_test_loop() { + std::size_t loops = 100; + std::size_t Depth = 21; + + boost::optional > ethalon; + + while (--loops) { + std::pair res = foo2(Depth, foo1); + if (ethalon) { + BOOST_TEST(res == *ethalon); + } else { + ethalon = res; + } + } +} + +int main() { + boost::thread t1(main_test_loop); + boost::thread t2(main_test_loop); + boost::thread t3(main_test_loop); + main_test_loop(); + + t1.join(); + t2.join(); + t3.join(); + + return boost::report_errors(); +}