diff --git a/.travis.yml b/.travis.yml index ea5b3bf..0791bc6 100644 --- a/.travis.yml +++ b/.travis.yml @@ -8,7 +8,7 @@ # See https://svn.boost.org/trac/boost/wiki/TravisCoverals for description of this file # and how it can be used with Boost libraries. # -# File revision #6 +# File revision #7 sudo: false language: cpp @@ -99,7 +99,7 @@ after_success: - find ../../../bin.v2/ -name "*.gcno" -exec cp "{}" $TRAVIS_BUILD_DIR/coverals/ \; # Preparing Coveralls data by changind data format to a readable one - - lcov --directory $TRAVIS_BUILD_DIR/coverals --base-directory ./ --capture --output-file $TRAVIS_BUILD_DIR/coverals/coverage.info + - lcov --gcov-tool gcov-6 --directory $TRAVIS_BUILD_DIR/coverals --base-directory ./ --capture --output-file $TRAVIS_BUILD_DIR/coverals/coverage.info # ... erasing /test/ /example/ folder data - cd $BOOST diff --git a/include/boost/stacktrace/detail/backend.hpp b/include/boost/stacktrace/detail/backend.hpp index 04f6bd0..4096544 100644 --- a/include/boost/stacktrace/detail/backend.hpp +++ b/include/boost/stacktrace/detail/backend.hpp @@ -76,7 +76,7 @@ class backend { } public: - BOOST_STACKTRACE_FUNCTION backend(void* memory, std::size_t size) BOOST_NOEXCEPT; + BOOST_STACKTRACE_FUNCTION backend(void** memory, std::size_t size) BOOST_NOEXCEPT; BOOST_STACKTRACE_FUNCTION static std::string get_name(const void* addr); const void* get_address(std::size_t frame_no) const BOOST_NOEXCEPT { return frame_no < frames_count_ ? data_[frame_no] : 0; @@ -86,10 +86,10 @@ public: BOOST_STACKTRACE_FUNCTION bool operator< (const backend& rhs) const BOOST_NOEXCEPT; BOOST_STACKTRACE_FUNCTION bool operator==(const backend& rhs) const BOOST_NOEXCEPT; - backend(const backend& b, void* memory) BOOST_NOEXCEPT + backend(const backend& b, void** memory) BOOST_NOEXCEPT : hash_code_(b.hash_code_) , frames_count_(b.frames_count_) - , data_(static_cast(memory)) + , data_(memory) { copy_frames_from(b); } diff --git a/include/boost/stacktrace/detail/backend_linux.hpp b/include/boost/stacktrace/detail/backend_linux.hpp index 2ba2e20..9f12886 100644 --- a/include/boost/stacktrace/detail/backend_linux.hpp +++ b/include/boost/stacktrace/detail/backend_linux.hpp @@ -174,17 +174,20 @@ inline _Unwind_Reason_Code unwind_callback(struct _Unwind_Context* context, void -backend::backend(void* memory, std::size_t size) BOOST_NOEXCEPT +backend::backend(void** memory, std::size_t size) BOOST_NOEXCEPT : hash_code_(0) , frames_count_(0) - , data_(static_cast(memory)) + , data_(memory) { + if (!size) { + return; + } #if defined(BOOST_STACKTRACE_USE_UNWIND) - unwind_state state = { data_, data_ + frames_count_ }; + unwind_state state = { data_, data_ + size }; _Unwind_Backtrace(&unwind_callback, &state); frames_count_ = state.current - data_; #elif defined(BOOST_STACKTRACE_USE_BACKTRACE) - frames_count_ = ::backtrace(data_, size / sizeof(void*)); + frames_count_ = ::backtrace(data_, size); if (data_[frames_count_ - 1] == 0) { -- frames_count_; } diff --git a/include/boost/stacktrace/detail/backend_noop.hpp b/include/boost/stacktrace/detail/backend_noop.hpp index 075f31d..a6c0082 100644 --- a/include/boost/stacktrace/detail/backend_noop.hpp +++ b/include/boost/stacktrace/detail/backend_noop.hpp @@ -15,7 +15,7 @@ namespace boost { namespace stacktrace { namespace detail { -backend::backend(void* /*memory*/, std::size_t /*size*/) BOOST_NOEXCEPT +backend::backend(void** /*memory*/, std::size_t /*size*/) BOOST_NOEXCEPT : hash_code_(0) , frames_count_(0) , data_(0) diff --git a/include/boost/stacktrace/detail/backend_windows.hpp b/include/boost/stacktrace/detail/backend_windows.hpp index 9409513..8bfd61a 100644 --- a/include/boost/stacktrace/detail/backend_windows.hpp +++ b/include/boost/stacktrace/detail/backend_windows.hpp @@ -96,15 +96,15 @@ inline bool try_init_com(com_holder& idebug_) BOOST_NOEXCEPT { -backend::backend(void* memory, std::size_t size) BOOST_NOEXCEPT +backend::backend(void** memory, std::size_t size) BOOST_NOEXCEPT : hash_code_(0) , frames_count_(0) - , data_(static_cast(memory)) + , data_(memory) { boost::detail::winapi::ULONG_ hc = 0; frames_count_ = CaptureStackBackTrace( 0, - static_cast(size / sizeof(void*)), + static_cast(size), data_, &hc ); diff --git a/include/boost/stacktrace/stacktrace.hpp b/include/boost/stacktrace/stacktrace.hpp index 25c6165..1cc25bc 100644 --- a/include/boost/stacktrace/stacktrace.hpp +++ b/include/boost/stacktrace/stacktrace.hpp @@ -12,7 +12,6 @@ # pragma once #endif -#include #include #include @@ -27,8 +26,8 @@ namespace boost { namespace stacktrace { /// Class that on construction copies minimal information about call stack into its internals and provides access to that information. class stacktrace { /// @cond - BOOST_STATIC_CONSTEXPR std::size_t max_implementation_size = sizeof(void*) * 110u; - boost::aligned_storage::type impl_; + BOOST_STATIC_CONSTEXPR std::size_t max_implementation_size = sizeof(void*) * 100u; + void* impl_[max_implementation_size]; boost::stacktrace::detail::backend back_; /// @endcond @@ -47,7 +46,7 @@ public: /// @b Async-Handler-Safety: Depends on backend, see "Build, Macros and Backends" section. BOOST_FORCEINLINE stacktrace() BOOST_NOEXCEPT : impl_() - , back_(&impl_, sizeof(impl_)) + , back_(impl_, max_implementation_size) {} /// @b Complexity: O(st.size()) @@ -55,7 +54,7 @@ public: /// @b Async-Handler-Safety: Safe. stacktrace(const stacktrace& st) BOOST_NOEXCEPT : impl_() - , back_(st.back_, &impl_) + , back_(st.back_, impl_) {} /// @b Complexity: O(st.size())