diff --git a/build/Jamfile.v2 b/build/Jamfile.v2 index d012b28..2895857 100644 --- a/build/Jamfile.v2 +++ b/build/Jamfile.v2 @@ -91,6 +91,21 @@ lib boost_stacktrace_addr2line boost-install boost_stacktrace_addr2line ; +lib boost_stacktrace_basic + : # sources + ../src/basic.cpp + : # requirements + all + linux:dl + shared:BOOST_STACKTRACE_DYN_LINK=1 + [ check-target-builds ../build//WinDbg : no ] + : # default build + : # usage-requirements + #shared:BOOST_STACKTRACE_DYN_LINK=1 + ; + +boost-install boost_stacktrace_basic ; + lib boost_stacktrace_windbg : # sources ../src/windbg.cpp diff --git a/include/boost/stacktrace/detail/backend.ipp b/include/boost/stacktrace/detail/backend.ipp index dabf647..e4521fa 100644 --- a/include/boost/stacktrace/detail/backend.ipp +++ b/include/boost/stacktrace/detail/backend.ipp @@ -1,4 +1,4 @@ -// Copyright Antony Polukhin, 2016. +// Copyright Antony Polukhin, 2016-2017. // // Distributed under the Boost Software License, Version 1.0. (See // accompanying file LICENSE_1_0.txt or copy at @@ -16,12 +16,10 @@ #if defined(BOOST_STACKTRACE_USE_NOOP) # include -#elif defined(BOOST_STACKTRACE_USE_WINDBG) -# include -#elif defined(BOOST_STACKTRACE_USE_BACKTRACE) || defined(BOOST_STACKTRACE_USE_ADDR2LINE) -# include +#elif defined(BOOST_MSVC) +# include #else -# error No suitable backtrace backend found +# include #endif #endif // BOOST_STACKTRACE_DETAIL_BACKEND_IPP diff --git a/include/boost/stacktrace/detail/backend_windows.hpp b/include/boost/stacktrace/detail/backend_msvc.hpp similarity index 97% rename from include/boost/stacktrace/detail/backend_windows.hpp rename to include/boost/stacktrace/detail/backend_msvc.hpp index 04745ee..1c8c014 100644 --- a/include/boost/stacktrace/detail/backend_windows.hpp +++ b/include/boost/stacktrace/detail/backend_msvc.hpp @@ -1,11 +1,11 @@ -// Copyright Antony Polukhin, 2016. +// 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) -#ifndef BOOST_STACKTRACE_DETAIL_BACKEND_WINDOWS_HPP -#define BOOST_STACKTRACE_DETAIL_BACKEND_WINDOWS_HPP +#ifndef BOOST_STACKTRACE_DETAIL_BACKEND_MSVC_HPP +#define BOOST_STACKTRACE_DETAIL_BACKEND_MSVC_HPP #include #ifdef BOOST_HAS_PRAGMA_ONCE @@ -303,4 +303,4 @@ std::size_t frame::source_line() const { }} // namespace boost::stacktrace -#endif // BOOST_STACKTRACE_DETAIL_BACKEND_LINUX_HPP +#endif // BOOST_STACKTRACE_DETAIL_BACKEND_MSVC_HPP diff --git a/include/boost/stacktrace/detail/backend_posix.hpp b/include/boost/stacktrace/detail/backend_unwind.hpp similarity index 95% rename from include/boost/stacktrace/detail/backend_posix.hpp rename to include/boost/stacktrace/detail/backend_unwind.hpp index 47a395f..30634dc 100644 --- a/include/boost/stacktrace/detail/backend_posix.hpp +++ b/include/boost/stacktrace/detail/backend_unwind.hpp @@ -4,8 +4,8 @@ // accompanying file LICENSE_1_0.txt or copy at // http://www.boost.org/LICENSE_1_0.txt) -#ifndef BOOST_STACKTRACE_DETAIL_BACKEND_POSIX_HPP -#define BOOST_STACKTRACE_DETAIL_BACKEND_POSIX_HPP +#ifndef BOOST_STACKTRACE_DETAIL_BACKEND_UNWIND_HPP +#define BOOST_STACKTRACE_DETAIL_BACKEND_UNWIND_HPP #include #ifdef BOOST_HAS_PRAGMA_ONCE @@ -131,4 +131,4 @@ std::string frame::name() const { }} // namespace boost::stacktrace -#endif // BOOST_STACKTRACE_DETAIL_BACKEND_POSIX_HPP +#endif // BOOST_STACKTRACE_DETAIL_BACKEND_UNWIND_HPP diff --git a/include/boost/stacktrace/detail/unwind_base_impls.hpp b/include/boost/stacktrace/detail/unwind_base_impls.hpp index fc1cce9..18a2378 100644 --- a/include/boost/stacktrace/detail/unwind_base_impls.hpp +++ b/include/boost/stacktrace/detail/unwind_base_impls.hpp @@ -17,11 +17,13 @@ namespace boost { namespace stacktrace { namespace detail { struct to_string_using_nothing { + std::string res; + void prepare_function_name(const void* addr) { res = boost::stacktrace::frame(addr).name(); } - bool prepare_source_location() const BOOST_NOEXCEPT { + bool prepare_source_location(const void* /*addr*/) const BOOST_NOEXCEPT { return false; } }; @@ -33,6 +35,8 @@ inline std::string name_impl(const void* /*addr*/) { return std::string(); } +} // namespace detail + std::string frame::source_file() const { return std::string(); } @@ -41,6 +45,6 @@ std::size_t frame::source_line() const { return 0; } -}}} // namespace boost::stacktrace::detail +}} // namespace boost::stacktrace #endif // BOOST_STACKTRACE_DETAIL_UNWIND_BASE_IMPLS_HPP diff --git a/include/boost/stacktrace/frame.hpp b/include/boost/stacktrace/frame.hpp index bc2415b..3c2265d 100644 --- a/include/boost/stacktrace/frame.hpp +++ b/include/boost/stacktrace/frame.hpp @@ -1,4 +1,4 @@ -// Copyright Antony Polukhin, 2016. +// Copyright Antony Polukhin, 2016-2017. // // Distributed under the Boost Software License, Version 1.0. (See // accompanying file LICENSE_1_0.txt or copy at @@ -26,26 +26,6 @@ # define BOOST_STACKTRACE_DYN_LINK #endif -// Backend autodetection -#if !defined(BOOST_STACKTRACE_USE_NOOP) && !defined(BOOST_STACKTRACE_USE_WINDBG) && !defined(BOOST_STACKTRACE_USE_ADDR2LINE) \ - && !defined(BOOST_STACKTRACE_USE_BACKTRACE) && !defined(BOOST_STACKTRACE_USE_HEADER) - -#if defined(__has_include) && (!defined(__GNUC__) || __GNUC__ > 4 || BOOST_CLANG) -# if __has_include("Dbgeng.h") -# define BOOST_STACKTRACE_USE_WINDBG -# else -# define BOOST_STACKTRACE_USE_ADDR2LINE -# endif -#else -# if defined(BOOST_WINDOWS) -# define BOOST_STACKTRACE_USE_WINDBG -# else -# define BOOST_STACKTRACE_USE_ADDR2LINE -# endif -#endif - -#endif - #ifdef BOOST_STACKTRACE_LINK # if defined(BOOST_STACKTRACE_DYN_LINK) # ifdef BOOST_STACKTRACE_INTERNAL_BUILD_LIBS @@ -61,7 +41,6 @@ #endif - namespace boost { namespace stacktrace { class frame; diff --git a/include/boost/stacktrace/stacktrace.hpp b/include/boost/stacktrace/stacktrace.hpp index 4433693..139f172 100644 --- a/include/boost/stacktrace/stacktrace.hpp +++ b/include/boost/stacktrace/stacktrace.hpp @@ -1,4 +1,4 @@ -// Copyright Antony Polukhin, 2016. +// Copyright Antony Polukhin, 2016-2017. // // Distributed under the Boost Software License, Version 1.0. (See // accompanying file LICENSE_1_0.txt or copy at diff --git a/src/basic.cpp b/src/basic.cpp new file mode 100644 index 0000000..cfe6ff2 --- /dev/null +++ b/src/basic.cpp @@ -0,0 +1,9 @@ +// Copyright Antony Polukhin, 2016. +// +// 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) + +#define BOOST_STACKTRACE_INTERNAL_BUILD_LIBS +#define BOOST_STACKTRACE_LINK +#include diff --git a/test/Jamfile.v2 b/test/Jamfile.v2 index e7a7562..3f8a30a 100644 --- a/test/Jamfile.v2 +++ b/test/Jamfile.v2 @@ -24,50 +24,60 @@ project all on always_show_run_output - linux:"-fvisibility=hidden" ; +local RDYNAMIC = freebsd:"-rdynamic" solaris:"-Bdynamic" aix:"-rdynamic" + qnxnto,qcc:"-Bdynamic" qnxnto,gcc:"-rdynamic" + android:"-rdynamic" linux:"-rdynamic" darwin,gcc:"-dynamic" + darwin,clang:"-rdynamic" iphone:"-rdynamic" ; -local BT_DEPS = linux:dl backtrace [ check-target-builds ../build//libbacktrace : : no ] ; -local UNWD_DEPS = linux:dl [ check-target-builds ../build//addr2line : : no ] ; -local WIND_DEPS = Dbghelp [ check-target-builds ../build//WinDbg : : no ] ; -local NOOP_DEPS = ; -local AUTO_DEPS = linux:dl [ check-target-builds ../build//WinDbg : Dbghelp ] ; +local HIDE_SYMBS = linux:"-fvisibility=hidden" ; -local LINKSHARED_BT = shared BOOST_STACKTRACE_DYN_LINK /boost/stacktrace//boost_stacktrace_backtrace $(BT_DEPS) ; -local LINKSHARED_UNWD = 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 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 WIND_DEPS = $(HIDE_SYMBS) Dbghelp [ 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_UNWD = 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) ; lib test_impl_lib_backtrace : test_impl.cpp : $(LINKSHARED_BT) ; lib test_impl_lib_addr2line : test_impl.cpp : $(LINKSHARED_UNWD) ; lib test_impl_lib_windbg : test_impl.cpp : $(LINKSHARED_WIND) ; lib test_impl_lib_noop : test_impl.cpp : $(LINKSHARED_NOOP) ; +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.cpp test_impl.cpp : : : BOOST_STACKTRACE_USE_WINDBG $(WIND_DEPS) : windbg_ho ] - [ run test_noop.cpp test_impl.cpp : : : BOOST_STACKTRACE_USE_NOOP $(NOOP_DEPS) : noop_ho ] - [ run test.cpp test_impl.cpp : : : $(AUTO_DEPS) : autodetect_ho ] + [ 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 backends - [ run test.cpp : : : .//test_impl_lib_backtrace $(LINKSHARED_BT) : backtrace_lib ] - [ run test.cpp : : : .//test_impl_lib_addr2line $(LINKSHARED_UNWD) : 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_backtrace $(LINKSHARED_BT) : backtrace_lib ] + [ run test.cpp : : : .//test_impl_lib_addr2line $(LINKSHARED_UNWD) : 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 ] ; # Assuring that examples compile and run. Adding sources from `examples` directory to the `type_index` test suite. for local p in [ glob ../example/*.cpp ] { - stacktrace_tests += [ run $(p) : : : $(LINKSHARED_BT) : backtrace_$(p[1]:B) ] ; - stacktrace_tests += [ run $(p) : : : $(LINKSHARED_UNWD) : addr2line_$(p[1]:B) ] ; - stacktrace_tests += [ run $(p) : : : $(LINKSHARED_WIND) : windbg_$(p[1]:B) ] ; - stacktrace_tests += [ run $(p) : : : $(LINKSHARED_NOOP) : noop_$(p[1]:B) ] ; - stacktrace_tests += [ run $(p) : : : $(AUTO_DEPS) : autodetect_$(p[1]:B) ] ; + stacktrace_tests += [ run $(p) : : : $(LINKSHARED_BT) : backtrace_$(p[1]:B) ] ; + stacktrace_tests += [ run $(p) : : : $(LINKSHARED_UNWD) : addr2line_$(p[1]:B) ] ; + stacktrace_tests += [ run $(p) : : : $(LINKSHARED_WIND) : windbg_$(p[1]:B) ] ; + stacktrace_tests += [ run $(p) : : : $(LINKSHARED_NOOP) : noop_$(p[1]:B) ] ; + stacktrace_tests += [ run $(p) : : : $(LINKSHARED_BASIC) : basic_$(p[1]:B) ] ; } diff --git a/test/test.cpp b/test/test.cpp index 733109f..6e1b586 100644 --- a/test/test.cpp +++ b/test/test.cpp @@ -82,12 +82,12 @@ void test_nested() { BOOST_TEST(ss1.str().find(" in ") != std::string::npos); BOOST_TEST(ss2.str().find(" in ") != std::string::npos); -#if defined(BOOST_STACKTRACE_DYN_LINK) || !defined(BOOST_STACKTRACE_USE_BACKTRACE) - BOOST_TEST(ss1.str().find("foo1") != std::string::npos); BOOST_TEST(ss1.str().find("foo2") != std::string::npos); - BOOST_TEST(ss2.str().find("foo1") != std::string::npos); BOOST_TEST(ss2.str().find("foo2") != std::string::npos); -#endif + + BOOST_TEST(ss1.str().find("foo1") != std::string::npos); + BOOST_TEST(ss2.str().find("foo1") != std::string::npos); + //BOOST_TEST(false); }