mirror of
https://github.com/boostorg/stacktrace.git
synced 2026-01-23 06:02:12 +00:00
Many new tests, including naive thread safety test
This commit is contained in:
107
test/Jamfile.v2
107
test/Jamfile.v2
@@ -23,8 +23,9 @@ lib backtrace
|
||||
project
|
||||
: requirements
|
||||
<toolset>msvc:<asynch-exceptions>on
|
||||
<toolset>gcc:<cxxflags>"-fPIE -fPIC"
|
||||
<toolset>gcc:<linkflags>"-fPIE -fPIC"
|
||||
<warnings>all
|
||||
<debug-symbols>on
|
||||
<test-info>always_show_run_output
|
||||
;
|
||||
|
||||
@@ -36,40 +37,80 @@ local RDYNAMIC = <target-os>freebsd:<linkflags>"-rdynamic" <target-os>solaris:<l
|
||||
local HIDE_SYMBS = <target-os>linux:<cxxflags>"-fvisibility=hidden" ;
|
||||
|
||||
local BT_DEPS = $(HIDE_SYMBS) <target-os>linux:<library>dl <library>backtrace [ check-target-builds ../build//libbacktrace : : <build>no ] ;
|
||||
local UNWD_DEPS = $(HIDE_SYMBS) <target-os>linux:<library>dl [ check-target-builds ../build//addr2line : : <build>no ] ;
|
||||
local AD2L_DEPS = $(HIDE_SYMBS) <target-os>linux:<library>dl [ check-target-builds ../build//addr2line : : <build>no ] ;
|
||||
local WIND_DEPS = $(HIDE_SYMBS) <library>Dbgeng <library>ole32 [ check-target-builds ../build//WinDbg : : <build>no ] ;
|
||||
local NOOP_DEPS = $(HIDE_SYMBS) ;
|
||||
local BASIC_DEPS = $(RDYNAMIC) <target-os>linux:<library>dl [ check-target-builds ../build//WinDbg : <build>no ] ;
|
||||
|
||||
local LINKSHARED_BT = <link>shared <define>BOOST_STACKTRACE_DYN_LINK <library>/boost/stacktrace//boost_stacktrace_backtrace $(BT_DEPS) ;
|
||||
local LINKSHARED_AD2L = <link>shared <define>BOOST_STACKTRACE_DYN_LINK <library>/boost/stacktrace//boost_stacktrace_addr2line $(UNWD_DEPS) ;
|
||||
local LINKSHARED_WIND = <link>shared <define>BOOST_STACKTRACE_DYN_LINK <library>/boost/stacktrace//boost_stacktrace_windbg $(WIND_DEPS) ;
|
||||
local LINKSHARED_NOOP = <link>shared <define>BOOST_STACKTRACE_DYN_LINK <library>/boost/stacktrace//boost_stacktrace_noop $(NOOP_DEPS) ;
|
||||
local LINKSHARED_BASIC = <link>shared <define>BOOST_STACKTRACE_DYN_LINK <library>/boost/stacktrace//boost_stacktrace_basic $(BASIC_DEPS) ;
|
||||
local LINKSHARED_BT = <link>shared <define>BOOST_STACKTRACE_DYN_LINK <library>/boost/stacktrace//boost_stacktrace_backtrace $(BT_DEPS) ;
|
||||
#local LINKSHARED_BT_CACHED = <link>shared <define>BOOST_STACKTRACE_DYN_LINK <library>/boost/stacktrace//boost_stacktrace_backtrace_cached $(BT_DEPS) <define>BOOST_STACKTRACE_USE_CACHING ;
|
||||
local LINKSHARED_AD2L = <link>shared <define>BOOST_STACKTRACE_DYN_LINK <library>/boost/stacktrace//boost_stacktrace_addr2line $(AD2L_DEPS) ;
|
||||
local LINKSHARED_WIND = <link>shared <define>BOOST_STACKTRACE_DYN_LINK <library>/boost/stacktrace//boost_stacktrace_windbg $(WIND_DEPS) ;
|
||||
local LINKSHARED_NOOP = <link>shared <define>BOOST_STACKTRACE_DYN_LINK <library>/boost/stacktrace//boost_stacktrace_noop $(NOOP_DEPS) ;
|
||||
local LINKSHARED_BASIC = <link>shared <define>BOOST_STACKTRACE_DYN_LINK <library>/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 : <debug-symbols>on $(LINKSHARED_BT) ;
|
||||
#lib test_impl_lib_backtrace_cached : test_impl.cpp : <debug-symbols>on $(LINKSHARED_BT_CACHED) ;
|
||||
lib test_impl_lib_addr2line : test_impl.cpp : <debug-symbols>on $(LINKSHARED_AD2L) ;
|
||||
lib test_impl_lib_windbg : test_impl.cpp : <debug-symbols>on $(LINKSHARED_WIND) ;
|
||||
lib test_impl_lib_noop : test_impl.cpp : <debug-symbols>on $(LINKSHARED_NOOP) ;
|
||||
|
||||
obj test_impl_nohide-obj : test_impl.cpp : <debug-symbols>on $(LINKSHARED_BASIC) ;
|
||||
lib test_impl_lib_basic : test_impl_nohide-obj : <debug-symbols>on $(LINKSHARED_BASIC) ;
|
||||
|
||||
|
||||
# Libs without debug symbols
|
||||
lib test_impl_lib_backtrace_no_dbg : test_impl.cpp : <debug-symbols>off $(LINKSHARED_BT) ;
|
||||
lib test_impl_lib_addr2line_no_dbg : test_impl.cpp : <debug-symbols>off $(LINKSHARED_AD2L) ;
|
||||
lib test_impl_lib_windbg_no_dbg : test_impl.cpp : <debug-symbols>off $(LINKSHARED_WIND) ;
|
||||
lib test_impl_lib_noop_no_dbg : test_impl.cpp : <debug-symbols>off $(LINKSHARED_NOOP) ;
|
||||
|
||||
obj test_impl_nohide_no_dbg-obj : test_impl.cpp : <debug-symbols>off $(LINKSHARED_BASIC) ;
|
||||
lib test_impl_lib_basic_no_dbg : test_impl_nohide_no_dbg-obj : <debug-symbols>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 : : : <define>BOOST_STACKTRACE_USE_BACKTRACE $(BT_DEPS) : backtrace_ho ]
|
||||
[ run test.cpp test_impl.cpp : : : <define>BOOST_STACKTRACE_USE_ADDR2LINE $(UNWD_DEPS) : addr2line_ho ]
|
||||
[ run test_noop.cpp test_impl.cpp : : : <define>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 : : : <library>.//test_impl_lib_backtrace $(LINKSHARED_BT) : backtrace_lib ]
|
||||
[ run test.cpp : : : <library>.//test_impl_lib_addr2line $(LINKSHARED_AD2L) : addr2line_lib ]
|
||||
[ run test.cpp : : : <library>.//test_impl_lib_windbg $(LINKSHARED_WIND) : windbg_lib ]
|
||||
[ run test_noop.cpp : : : <library>.//test_impl_lib_noop $(LINKSHARED_NOOP) : noop_lib ]
|
||||
[ run test.cpp : : : <library>.//test_impl_lib_basic $(LINKSHARED_BASIC) : basic_lib ]
|
||||
# Header only tests with debug symbols
|
||||
[ run test.cpp test_impl.cpp : : : <debug-symbols>on <define>BOOST_STACKTRACE_USE_BACKTRACE $(BT_DEPS) : backtrace_ho ]
|
||||
[ run test.cpp test_impl.cpp : : : <debug-symbols>on <define>BOOST_STACKTRACE_USE_ADDR2LINE $(AD2L_DEPS) : addr2line_ho ]
|
||||
[ run test_noop.cpp test_impl.cpp : : : <debug-symbols>on <define>BOOST_STACKTRACE_USE_NOOP $(NOOP_DEPS) : noop_ho ]
|
||||
[ run test.cpp test_impl.cpp : : : <debug-symbols>on $(WIND_DEPS) : windbg_ho ]
|
||||
[ run test.cpp test_impl.cpp : : : <debug-symbols>on $(BASIC_DEPS) : basic_ho ]
|
||||
|
||||
# Test with shared linked implementations with debug symbols
|
||||
[ run test.cpp : : : <debug-symbols>on <library>.//test_impl_lib_backtrace $(LINKSHARED_BT) : backtrace_lib ]
|
||||
[ run test.cpp : : : <debug-symbols>on <library>.//test_impl_lib_addr2line $(LINKSHARED_AD2L) : addr2line_lib ]
|
||||
[ run test.cpp : : : <debug-symbols>on <library>.//test_impl_lib_windbg $(LINKSHARED_WIND) : windbg_lib ]
|
||||
[ run test_noop.cpp : : : <debug-symbols>on <library>.//test_impl_lib_noop $(LINKSHARED_NOOP) : noop_lib ]
|
||||
[ run test.cpp : : : <debug-symbols>on <library>.//test_impl_lib_basic $(LINKSHARED_BASIC) : basic_lib ]
|
||||
|
||||
# Thread safety with debug symbols
|
||||
[ run thread_safety_checking.cpp : : : <debug-symbols>on <library>/boost/thread//boost_thread <library>.//test_impl_lib_backtrace $(LINKSHARED_BT) : backtrace_lib_thread_safety ]
|
||||
[ run thread_safety_checking.cpp : : : <debug-symbols>on <library>/boost/thread//boost_thread <library>.//test_impl_lib_windbg $(LINKSHARED_WIND) : windbg_lib_thread_safety ]
|
||||
[ run thread_safety_checking.cpp : : : <debug-symbols>on <library>/boost/thread//boost_thread <library>.//test_impl_lib_basic $(LINKSHARED_BASIC) : basic_lib_thread_safety ]
|
||||
|
||||
|
||||
# Header only tests without debug symbols
|
||||
[ run test.cpp test_impl.cpp : : : <debug-symbols>off <define>BOOST_STACKTRACE_USE_BACKTRACE <define>BOOST_STACKTRACE_TEST_NO_DEBUG_AT_ALL $(BT_DEPS) : backtrace_ho_no_dbg ]
|
||||
[ run test.cpp test_impl.cpp : : : <debug-symbols>off <define>BOOST_STACKTRACE_USE_ADDR2LINE $(AD2L_DEPS) : addr2line_ho_no_dbg ]
|
||||
[ run test_noop.cpp test_impl.cpp : : : <debug-symbols>off <define>BOOST_STACKTRACE_USE_NOOP $(NOOP_DEPS) : noop_ho_no_dbg ]
|
||||
[ run test.cpp test_impl.cpp : : : <debug-symbols>off $(WIND_DEPS) : windbg_ho_no_dbg ]
|
||||
[ run test.cpp test_impl.cpp : : : <debug-symbols>off $(BASIC_DEPS) : basic_ho_no_dbg ]
|
||||
|
||||
# Test with shared linked implementations without debug symbols
|
||||
[ run test.cpp : : : <debug-symbols>off <library>.//test_impl_lib_backtrace_no_dbg $(LINKSHARED_BT) <define>BOOST_STACKTRACE_TEST_NO_DEBUG_AT_ALL : backtrace_lib_no_dbg ]
|
||||
[ run test.cpp : : : <debug-symbols>off <library>.//test_impl_lib_addr2line_no_dbg $(LINKSHARED_AD2L) : addr2line_lib_no_dbg ]
|
||||
[ run test.cpp : : : <debug-symbols>off <library>.//test_impl_lib_windbg_no_dbg $(LINKSHARED_WIND) : windbg_lib_no_dbg ]
|
||||
[ run test_noop.cpp : : : <debug-symbols>off <library>.//test_impl_lib_noop_no_dbg $(LINKSHARED_NOOP) : noop_lib_no_dbg ]
|
||||
[ run test.cpp : : : <debug-symbols>off <library>.//test_impl_lib_basic_no_dbg $(LINKSHARED_BASIC) : basic_lib_no_dbg ]
|
||||
|
||||
# Thread safety without debug symbols
|
||||
[ run thread_safety_checking.cpp : : : <debug-symbols>off <library>/boost/thread//boost_thread <library>.//test_impl_lib_backtrace $(LINKSHARED_BT) : backtrace_lib_no_dbg_thread_safety ]
|
||||
[ run thread_safety_checking.cpp : : : <debug-symbols>off <library>/boost/thread//boost_thread <library>.//test_impl_lib_windbg $(LINKSHARED_WIND) : windbg_lib_no_dbg_thread_safety ]
|
||||
[ run thread_safety_checking.cpp : : : <debug-symbols>off <library>/boost/thread//boost_thread <library>.//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 = <library>/boost/filesystem//boost_filesystem <library>/boost/system//boost_system <target-os>linux:<library>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) : : : <debug-symbols>on $(LINKSHARED_BT) $(additional_dependency) : backtrace_$(p[1]:B) ] ;
|
||||
stacktrace_tests += [ run $(p) : : : <debug-symbols>on $(LINKSHARED_AD2L) $(additional_dependency) : addr2line_$(p[1]:B) ] ;
|
||||
stacktrace_tests += [ run $(p) : : : <debug-symbols>on $(LINKSHARED_WIND) $(additional_dependency) : windbg_$(p[1]:B) ] ;
|
||||
stacktrace_tests += [ run $(p) : : : <debug-symbols>on $(LINKSHARED_NOOP) $(additional_dependency) : noop_$(p[1]:B) ] ;
|
||||
stacktrace_tests += [ run $(p) : : : <debug-symbols>on $(LINKSHARED_BASIC) $(additional_dependency) : basic_$(p[1]:B) ] ;
|
||||
|
||||
stacktrace_tests += [ run $(p) : : : <debug-symbols>off $(LINKSHARED_BT) $(additional_dependency) : backtrace_$(p[1]:B)_no_dbg ] ;
|
||||
stacktrace_tests += [ run $(p) : : : <debug-symbols>off $(LINKSHARED_AD2L) $(additional_dependency) : addr2line_$(p[1]:B)_no_dbg ] ;
|
||||
stacktrace_tests += [ run $(p) : : : <debug-symbols>off $(LINKSHARED_WIND) $(additional_dependency) : windbg_$(p[1]:B)_no_dbg ] ;
|
||||
stacktrace_tests += [ run $(p) : : : <debug-symbols>off $(LINKSHARED_NOOP) $(additional_dependency) : noop_$(p[1]:B)_no_dbg ] ;
|
||||
stacktrace_tests += [ run $(p) : : : <debug-symbols>off $(LINKSHARED_BASIC) $(additional_dependency) : basic_$(p[1]:B)_no_dbg ] ;
|
||||
|
||||
}
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
67
test/thread_safety_checking.cpp
Normal file
67
test/thread_safety_checking.cpp
Normal file
@@ -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 <boost/stacktrace/stacktrace_fwd.hpp>
|
||||
|
||||
#include <boost/stacktrace.hpp>
|
||||
#include <boost/thread.hpp>
|
||||
#include <boost/optional.hpp>
|
||||
#include <boost/core/lightweight_test.hpp>
|
||||
|
||||
#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<stacktrace, stacktrace> (*foo1_t)(int i);
|
||||
BOOST_ST_API std::pair<stacktrace, stacktrace> foo2(int i, foo1_t foo1);
|
||||
BOOST_ST_API stacktrace return_from_nested_namespaces();
|
||||
|
||||
BOOST_NOINLINE std::pair<stacktrace, stacktrace> foo1(int i) {
|
||||
if (i) {
|
||||
return foo2(i - 1, foo1);
|
||||
}
|
||||
|
||||
std::pair<stacktrace, stacktrace> 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<std::pair<stacktrace, stacktrace> > ethalon;
|
||||
|
||||
while (--loops) {
|
||||
std::pair<stacktrace, stacktrace> 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();
|
||||
}
|
||||
Reference in New Issue
Block a user