From de755c5d5d9040fcfae7dc0c9ade64eac237c8d1 Mon Sep 17 00:00:00 2001 From: Fedor Osetrov Date: Sat, 14 Mar 2026 11:41:25 +0000 Subject: [PATCH 01/17] make dump independent --- CMakeLists.txt | 68 +++++++++---------- include/boost/stacktrace/frame.hpp | 4 +- include/boost/stacktrace/safe_dump_to.hpp | 2 +- include/boost/stacktrace/stacktrace.hpp | 1 - src/addr2line.cpp | 2 +- src/backtrace.cpp | 2 +- src/basic.cpp | 1 - src/dump.cpp | 9 +++ src/from_exception.cpp | 5 +- src/noop.cpp | 3 +- ...ng.cpp => test_thread_safety_checking.cpp} | 0 test/{torture.cpp => test_torture.cpp} | 0 12 files changed, 51 insertions(+), 46 deletions(-) create mode 100644 src/dump.cpp rename test/{thread_safety_checking.cpp => test_thread_safety_checking.cpp} (100%) rename test/{torture.cpp => test_torture.cpp} (100%) diff --git a/CMakeLists.txt b/CMakeLists.txt index 771f6f13..376f4d42 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -12,9 +12,7 @@ function(stacktrace_add_library suffix opt libs defs) return() endif() - add_library(boost_stacktrace_${suffix} - src/${suffix}.cpp - ) + add_library(boost_stacktrace_${suffix}) add_library(Boost::stacktrace_${suffix} ALIAS boost_stacktrace_${suffix}) @@ -32,8 +30,15 @@ function(stacktrace_add_library suffix opt libs defs) ) target_compile_definitions(boost_stacktrace_${suffix} - PUBLIC BOOST_STACKTRACE_NO_LIB - PRIVATE BOOST_STACKTRACE_SOURCE ${defs} + PUBLIC + BOOST_STACKTRACE_NO_LIB + PRIVATE + ${defs} + ) + + target_sources(boost_stacktrace_${suffix} + PRIVATE + ${CMAKE_CURRENT_LIST_DIR}/src/${suffix}.cpp ) if(BUILD_SHARED_LIBS) @@ -50,26 +55,25 @@ endfunction() include(CheckCXXSourceCompiles) -function(stacktrace_check var source incs libs defs) +function(stacktrace_check var source incs libs) set(CMAKE_REQUIRED_INCLUDES "${incs}") list(APPEND CMAKE_REQUIRED_INCLUDES "${CMAKE_CURRENT_SOURCE_DIR}/build") set(CMAKE_REQUIRED_LIBRARIES "${libs}") - set(CMAKE_REQUIRED_DEFINITIONS "${defs}") check_cxx_source_compiles("#include \"${source}\"" ${var}) set(${var} ${${var}} PARENT_SCOPE) endfunction() -stacktrace_check(BOOST_STACKTRACE_HAS_BACKTRACE has_backtrace.cpp "" "backtrace" "") +stacktrace_check(BOOST_STACKTRACE_HAS_BACKTRACE has_backtrace.cpp "" "backtrace") set(_default_addr2line ON) if(WIN32 AND NOT CMAKE_CXX_PLATFORM_ID MATCHES "Cygwin") set(_default_addr2line OFF) endif() -stacktrace_check(BOOST_STACKTRACE_HAS_WINDBG has_windbg.cpp "" "dbgeng;ole32" "") -stacktrace_check(BOOST_STACKTRACE_HAS_WINDBG_CACHED has_windbg_cached.cpp "${CMAKE_CURRENT_SOURCE_DIR}/../config/include" "dbgeng;ole32" "") +stacktrace_check(BOOST_STACKTRACE_HAS_WINDBG has_windbg.cpp "" "dbgeng;ole32") +stacktrace_check(BOOST_STACKTRACE_HAS_WINDBG_CACHED has_windbg_cached.cpp "${CMAKE_CURRENT_SOURCE_DIR}/../config/include" "dbgeng;ole32") set(_default_from_exception ON) if (CMAKE_CXX_PLATFORM_ID MATCHES "Cygwin") @@ -97,50 +101,44 @@ message(STATUS "Boost.Stacktrace: " "from_exception ${BOOST_STACKTRACE_ENABLE_FROM_EXCEPTION}" ) +stacktrace_add_library(dump ON "" "") stacktrace_add_library(noop ${BOOST_STACKTRACE_ENABLE_NOOP} "" "") -stacktrace_add_library(backtrace ${BOOST_STACKTRACE_ENABLE_BACKTRACE} "backtrace;${CMAKE_DL_LIBS}" "") -stacktrace_add_library(addr2line ${BOOST_STACKTRACE_ENABLE_ADDR2LINE} "${CMAKE_DL_LIBS}" "") -stacktrace_add_library(basic ${BOOST_STACKTRACE_ENABLE_BASIC} "${CMAKE_DL_LIBS}" "") +stacktrace_add_library(backtrace ${BOOST_STACKTRACE_ENABLE_BACKTRACE} "boost_stacktrace_dump;backtrace;${CMAKE_DL_LIBS}" "") +stacktrace_add_library(addr2line ${BOOST_STACKTRACE_ENABLE_ADDR2LINE} "boost_stacktrace_dump;${CMAKE_DL_LIBS}" "") +stacktrace_add_library(basic ${BOOST_STACKTRACE_ENABLE_BASIC} "boost_stacktrace_dump;${CMAKE_DL_LIBS}" "") stacktrace_add_library(windbg ${BOOST_STACKTRACE_ENABLE_WINDBG} "dbgeng;ole32" "_GNU_SOURCE=1") stacktrace_add_library(windbg_cached ${BOOST_STACKTRACE_ENABLE_WINDBG_CACHED} "dbgeng;ole32" "_GNU_SOURCE=1") # boost_stacktrace, default library add_library(boost_stacktrace INTERFACE) -add_library(Boost::stacktrace ALIAS boost_stacktrace) target_include_directories(boost_stacktrace INTERFACE include) -if(BOOST_STACKTRACE_ENABLE_WINDBG) - - target_link_libraries(boost_stacktrace INTERFACE Boost::stacktrace_windbg) +add_library(Boost::stacktrace ALIAS boost_stacktrace) +if(BOOST_STACKTRACE_ENABLE_WINDBG) + set(__default_stacktrace_backend "windbg") elseif(BOOST_STACKTRACE_ENABLE_WINDBG_CACHED) - - target_link_libraries(boost_stacktrace INTERFACE Boost::stacktrace_windbg) - + set(__default_stacktrace_backend "windbg_cached") elseif(BOOST_STACKTRACE_ENABLE_BACKTRACE) - - target_link_libraries(boost_stacktrace INTERFACE Boost::stacktrace_backtrace) - + set(__default_stacktrace_backend "backtrace") elseif(BOOST_STACKTRACE_ENABLE_ADDR2LINE) - - target_link_libraries(boost_stacktrace INTERFACE Boost::stacktrace_addr2line) - + set(__default_stacktrace_backend "addr2line") elseif(BOOST_STACKTRACE_ENABLE_BASIC) - - target_link_libraries(boost_stacktrace INTERFACE Boost::stacktrace_basic) - + set(__default_stacktrace_backend "basic") elseif(BOOST_STACKTRACE_ENABLE_NOOP) - - target_link_libraries(boost_stacktrace INTERFACE Boost::stacktrace_noop) - + set(__default_stacktrace_backend "noop") +else() + message(FATAL "All backends are disabled") endif() -# Boost::stacktrace_from_exception is never the default -stacktrace_add_library(from_exception ${BOOST_STACKTRACE_ENABLE_FROM_EXCEPTION} "${CMAKE_DL_LIBS};boost_stacktrace" "") +message(STATUS "Boost.stacktrace default backend: ${__default_stacktrace_backend}") +target_link_libraries(boost_stacktrace INTERFACE Boost::stacktrace_${__default_stacktrace_backend}) +unset(__default_stacktrace_backend) -# +# Boost::stacktrace_from_exception is never the default +stacktrace_add_library(from_exception ${BOOST_STACKTRACE_ENABLE_FROM_EXCEPTION} "boost_stacktrace_dump;${CMAKE_DL_LIBS}" "" FALSE) if(BUILD_TESTING) add_subdirectory(test) diff --git a/include/boost/stacktrace/frame.hpp b/include/boost/stacktrace/frame.hpp index 1c126ef7..d14f8e7d 100644 --- a/include/boost/stacktrace/frame.hpp +++ b/include/boost/stacktrace/frame.hpp @@ -15,8 +15,6 @@ #include #include -#include // boost::stacktrace::detail::native_frame_ptr_t - #include #include @@ -64,7 +62,7 @@ std::basic_ostream& operator<<(std::basic_ostream -#ifndef BOOST_STACKTRACE_LINK +#if !defined(BOOST_STACKTRACE_LINK) # if defined(BOOST_STACKTRACE_USE_NOOP) # include # elif defined(BOOST_MSVC) || defined(BOOST_STACKTRACE_USE_WINDBG) || defined(BOOST_STACKTRACE_USE_WINDBG_CACHED) diff --git a/include/boost/stacktrace/safe_dump_to.hpp b/include/boost/stacktrace/safe_dump_to.hpp index 09eb010f..474d6619 100644 --- a/include/boost/stacktrace/safe_dump_to.hpp +++ b/include/boost/stacktrace/safe_dump_to.hpp @@ -205,7 +205,7 @@ BOOST_FORCEINLINE std::size_t safe_dump_to(std::size_t skip, std::size_t max_dep #include -#if !defined(BOOST_STACKTRACE_LINK) || defined(BOOST_STACKTRACE_INTERNAL_BUILD_LIBS) +#if !defined(BOOST_STACKTRACE_LINK) # if defined(BOOST_STACKTRACE_USE_NOOP) # include # include diff --git a/include/boost/stacktrace/stacktrace.hpp b/include/boost/stacktrace/stacktrace.hpp index f0000dd5..954b695d 100644 --- a/include/boost/stacktrace/stacktrace.hpp +++ b/include/boost/stacktrace/stacktrace.hpp @@ -24,7 +24,6 @@ #endif #include -#include #include #include diff --git a/src/addr2line.cpp b/src/addr2line.cpp index a5a4935a..744689aa 100644 --- a/src/addr2line.cpp +++ b/src/addr2line.cpp @@ -13,4 +13,4 @@ #endif #include -#include + diff --git a/src/backtrace.cpp b/src/backtrace.cpp index 375c8bdd..cfb82f5f 100644 --- a/src/backtrace.cpp +++ b/src/backtrace.cpp @@ -13,4 +13,4 @@ #endif #include -#include + diff --git a/src/basic.cpp b/src/basic.cpp index c1274771..7826f6a9 100644 --- a/src/basic.cpp +++ b/src/basic.cpp @@ -12,4 +12,3 @@ #endif #include -#include diff --git a/src/dump.cpp b/src/dump.cpp new file mode 100644 index 00000000..d85d70cc --- /dev/null +++ b/src/dump.cpp @@ -0,0 +1,9 @@ +#define BOOST_STACKTRACE_LINK +#define BOOST_STACKTRACE_INTERNAL_BUILD_LIBS + +#ifndef _GNU_SOURCE +# define _GNU_SOURCE +#endif + +#include +#include diff --git a/src/from_exception.cpp b/src/from_exception.cpp index bb765807..6d937636 100644 --- a/src/from_exception.cpp +++ b/src/from_exception.cpp @@ -6,7 +6,6 @@ #if defined(__MINGW32__) || defined(_MSC_VER) -#include #include extern "C" void** __cdecl __current_exception(); // exported from vcruntime.dll @@ -154,7 +153,7 @@ BOOST_SYMBOL_EXPORT void assert_no_pending_traces() noexcept { #endif #include -#include +#include #include #include @@ -170,6 +169,8 @@ BOOST_SYMBOL_EXPORT void assert_no_pending_traces() noexcept { #include #endif +#include + namespace { constexpr std::size_t kStacktraceDumpSize = 4096; diff --git a/src/noop.cpp b/src/noop.cpp index 38acc5da..7ec4f3ca 100644 --- a/src/noop.cpp +++ b/src/noop.cpp @@ -6,6 +6,7 @@ #define BOOST_STACKTRACE_INTERNAL_BUILD_LIBS #define BOOST_STACKTRACE_LINK -#define BOOST_STACKTRACE_USE_NOOP + #include #include +#include diff --git a/test/thread_safety_checking.cpp b/test/test_thread_safety_checking.cpp similarity index 100% rename from test/thread_safety_checking.cpp rename to test/test_thread_safety_checking.cpp diff --git a/test/torture.cpp b/test/test_torture.cpp similarity index 100% rename from test/torture.cpp rename to test/test_torture.cpp From 5afba8d1cf1d89f545d3f12bc5016f8849f62ee1 Mon Sep 17 00:00:00 2001 From: Fedor Osetrov Date: Sat, 14 Mar 2026 11:41:44 +0000 Subject: [PATCH 02/17] build tests without boost test --- test/CMakeLists.txt | 26 ++++++++++++----- test/Jamfile.v2 | 42 +++++++++++++-------------- test/cmake_subdir_test/CMakeLists.txt | 18 ++++++++---- test/test.cpp | 8 ++++- test/test_impl.hpp | 5 ++-- test/test_noop.cpp | 6 +--- test/test_num_conv.cpp | 2 +- test/test_thread_safety_checking.cpp | 4 +-- 8 files changed, 66 insertions(+), 45 deletions(-) diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index afe56f78..e4edf45f 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -2,13 +2,25 @@ # 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(BoostTest OPTIONAL RESULT_VARIABLE HAVE_BOOST_TEST) - -if(NOT HAVE_BOOST_TEST) - return() +if(NOT TARGET tests) + add_custom_target(tests) endif() -boost_test(TYPE run SOURCES test.cpp test_impl.cpp LINK_LIBRARIES Boost::stacktrace Boost::core) -boost_test(TYPE run SOURCES test_noop.cpp test_impl.cpp LINK_LIBRARIES Boost::stacktrace_noop Boost::core) +function(add_stacktrace_test name libs sources) + set(test_name stacktrace_test${name}) + + add_executable(${test_name} test${name}.cpp ${sources}) + target_link_libraries(${test_name} PRIVATE ${libs}) + add_test(NAME ${test_name} COMMAND ${test_name}) + add_dependencies(tests ${test_name}) +endfunction() -boost_test(TYPE run SOURCES test_trivial.cpp LINK_LIBRARIES Boost::stacktrace Boost::core) +add_stacktrace_test(_num_conv Boost::stacktrace "") +add_stacktrace_test(_void_ptr_cast Boost::stacktrace "") +add_stacktrace_test(_noop Boost::stacktrace_noop test_impl.cpp) +add_stacktrace_test(_trivial Boost::stacktrace test_impl.cpp) +add_stacktrace_test("" Boost::stacktrace test_impl.cpp) +add_stacktrace_test(_thread_safety_checking "Boost::stacktrace;Boost::optional" test_impl.cpp) +add_stacktrace_test(_from_exception "Boost::stacktrace;Boost::stacktrace_from_exception" "") +add_stacktrace_test(_from_exception_none Boost::stacktrace "") +add_stacktrace_test(_torture Boost::stacktrace test_impl.cpp) diff --git a/test/Jamfile.v2 b/test/Jamfile.v2 index 72c3aa24..65bcc5d4 100644 --- a/test/Jamfile.v2 +++ b/test/Jamfile.v2 @@ -120,23 +120,23 @@ test-suite stacktrace_tests [ run test_trivial.cpp : : : on .//test_impl_lib_basic $(LINKSHARED_BASIC) : trivial_basic_lib ] # Thread safety with debug symbols - [ run thread_safety_checking.cpp + [ run test_thread_safety_checking.cpp : : : on .//test_impl_lib_backtrace $(LINKSHARED_BT) : backtrace_lib_threaded ] - [ run thread_safety_checking.cpp + [ run test_thread_safety_checking.cpp : : : on .//test_impl_lib_backtrace $(LINKSHARED_BT) BOOST_STACKTRACE_BACKTRACE_FORCE_STATIC /boost/optional//boost_optional : backtrace_lib_threaded_static ] - [ run thread_safety_checking.cpp + [ run test_thread_safety_checking.cpp : : : on .//test_impl_lib_windbg $(LINKSHARED_WIND) /boost/optional//boost_optional : windbg_lib_threaded ] - [ run thread_safety_checking.cpp + [ run test_thread_safety_checking.cpp : : : on .//test_impl_lib_windbg_cached $(LINKSHARED_WIND_CACHED) /boost/optional//boost_optional : windbg_cached_lib_threaded ] - [ run thread_safety_checking.cpp + [ run test_thread_safety_checking.cpp : : : on .//test_impl_lib_basic $(LINKSHARED_BASIC) /boost/optional//boost_optional : basic_lib_threaded ] @@ -163,23 +163,23 @@ test-suite stacktrace_tests [ 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 + [ run test_thread_safety_checking.cpp : : : off .//test_impl_lib_backtrace_no_dbg /boost/optional//boost_optional $(LINKSHARED_BT) : backtrace_lib_no_dbg_threaded ] - [ run thread_safety_checking.cpp + [ run test_thread_safety_checking.cpp : : : off .//test_impl_lib_windbg_no_dbg $(LINKSHARED_WIND) : windbg_lib_no_dbg_threaded ] - [ run thread_safety_checking.cpp + [ run test_thread_safety_checking.cpp : : : off .//test_impl_lib_windbg_cached_no_dbg $(LINKSHARED_WIND_CACHED) : windbg_cached_lib_no_dbg_threaded ] - [ run thread_safety_checking.cpp + [ run test_thread_safety_checking.cpp : : : off .//test_impl_lib_basic_no_dbg $(LINKSHARED_BASIC) @@ -258,18 +258,18 @@ for local p in [ glob ../example/*.cpp ] # Very long tests for detecting memory leaks and corruptions test-suite stacktrace_torture : - [ run torture.cpp test_impl.cpp : : : on BOOST_STACKTRACE_USE_BACKTRACE $(BT_DEPS) : torture_backtrace_ho ] - #[ run torture.cpp test_impl.cpp : : : on BOOST_STACKTRACE_USE_ADDR2LINE $(AD2L_DEPS) : torture_addr2line_ho ] - [ run torture.cpp test_impl.cpp : : : on $(WIND_DEPS) : torture_windbg_ho ] - [ run torture.cpp test_impl.cpp : : : on BOOST_STACKTRACE_USE_WINDBG_CACHED $(WICA_DEPS) : torture_windbg_cached_ho ] - [ run torture.cpp test_impl.cpp : : : on $(FORCE_SYMBOL_EXPORT) $(BASIC_DEPS) : torture_basic_ho ] - [ run torture.cpp test_impl.cpp : : : on BOOST_STACKTRACE_TEST_NO_DEBUG_AT_ALL $(BASIC_DEPS) : torture_basic_ho_empty ] - - [ run torture.cpp test_impl.cpp : : : on .//test_impl_lib_backtrace $(LINKSHARED_BT) : torture_backtrace_lib ] - #[ run torture.cpp test_impl.cpp : : : on .//test_impl_lib_addr2line $(LINKSHARED_AD2L) : torture_addr2line_lib ] - [ run torture.cpp test_impl.cpp : : : on .//test_impl_lib_windbg $(LINKSHARED_WIND) : torture_windbg_lib ] - [ run torture.cpp test_impl.cpp : : : on .//test_impl_lib_windbg_cached $(LINKSHARED_WIND_CACHED) : torture_windbg_cached_lib ] - [ run torture.cpp test_impl.cpp : : : on .//test_impl_lib_basic $(LINKSHARED_BASIC) : torture_basic_lib ] + [ run test_torture.cpp test_impl.cpp : : : on BOOST_STACKTRACE_USE_BACKTRACE $(BT_DEPS) : torture_backtrace_ho ] + #[ run test_torture.cpp test_impl.cpp : : : on BOOST_STACKTRACE_USE_ADDR2LINE $(AD2L_DEPS) : torture_addr2line_ho ] + [ run test_torture.cpp test_impl.cpp : : : on $(WIND_DEPS) : torture_windbg_ho ] + [ run test_torture.cpp test_impl.cpp : : : on BOOST_STACKTRACE_USE_WINDBG_CACHED $(WICA_DEPS) : torture_windbg_cached_ho ] + [ run test_torture.cpp test_impl.cpp : : : on $(FORCE_SYMBOL_EXPORT) $(BASIC_DEPS) : torture_basic_ho ] + [ run test_torture.cpp test_impl.cpp : : : on BOOST_STACKTRACE_TEST_NO_DEBUG_AT_ALL $(BASIC_DEPS) : torture_basic_ho_empty ] + + [ run test_torture.cpp test_impl.cpp : : : on .//test_impl_lib_backtrace $(LINKSHARED_BT) : torture_backtrace_lib ] + #[ run test_torture.cpp test_impl.cpp : : : on .//test_impl_lib_addr2line $(LINKSHARED_AD2L) : torture_addr2line_lib ] + [ run test_torture.cpp test_impl.cpp : : : on .//test_impl_lib_windbg $(LINKSHARED_WIND) : torture_windbg_lib ] + [ run test_torture.cpp test_impl.cpp : : : on .//test_impl_lib_windbg_cached $(LINKSHARED_WIND_CACHED) : torture_windbg_cached_lib ] + [ run test_torture.cpp test_impl.cpp : : : on .//test_impl_lib_basic $(LINKSHARED_BASIC) : torture_basic_lib ] ; explicit stacktrace_torture ; diff --git a/test/cmake_subdir_test/CMakeLists.txt b/test/cmake_subdir_test/CMakeLists.txt index 3fcee082..627e5ec6 100644 --- a/test/cmake_subdir_test/CMakeLists.txt +++ b/test/cmake_subdir_test/CMakeLists.txt @@ -2,15 +2,12 @@ # 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 -cmake_minimum_required(VERSION 3.5...3.20) +cmake_minimum_required(VERSION 3.5...4.20) project(cmake_subdir_test LANGUAGES CXX) # Put boost_stacktrace_*.dll in the same directory as main.exe set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}) - -add_subdirectory(../.. boostorg/stacktrace) - # boostdep --brief stacktrace set(deps @@ -30,6 +27,8 @@ describe mp11 static_assert throw_exception +optional +type_traits ) @@ -39,8 +38,15 @@ foreach(dep IN LISTS deps) endforeach() +enable_testing() +add_subdirectory(../.. boostorg/stacktrace) + add_executable(main main.cpp) target_link_libraries(main Boost::stacktrace) -enable_testing() -add_test(main main) +add_executable(main_header_only main.cpp) +target_include_directories(main_header_only PRIVATE ../../include) +target_link_libraries(main_header_only PRIVATE Boost::core Boost::container_hash Boost::predef) + +add_test(NAME main COMMAND main) +add_test(NAME main_header_only COMMAND main_header_only) diff --git a/test/test.cpp b/test/test.cpp index 29cc9147..ff8c0a84 100644 --- a/test/test.cpp +++ b/test/test.cpp @@ -7,7 +7,6 @@ #include #include -#include #include #include #include @@ -106,8 +105,15 @@ void test_nested(bool print = true) { template void test_comparisons_base(Bt nst, Bt st) { Bt cst(st); +#if defined(__clang__) +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wself-assign-overloaded" +#endif st = st; cst = cst; +#if defined(__clang__) +#pragma GCC diagnostic pop +#endif BOOST_TEST(nst); BOOST_TEST(st); #if !defined(BOOST_MSVC) && !defined(BOOST_STACKTRACE_USE_WINDBG) diff --git a/test/test_impl.hpp b/test/test_impl.hpp index 30b0dd99..62d65a83 100644 --- a/test/test_impl.hpp +++ b/test/test_impl.hpp @@ -5,6 +5,9 @@ // http://www.boost.org/LICENSE_1_0.txt) +#include +#include + #include #if defined(BOOST_LEXICAL_CAST_TRY_LEXICAL_CONVERT_HPP) || defined(BOOST_LEXICAL_CAST_BAD_LEXICAL_CAST_HPP) @@ -15,8 +18,6 @@ #error "windows.h header leaked into the boost/stacktrace/stacktrace.hpp" #endif -#include - using namespace boost::stacktrace; #ifdef BOOST_STACKTRACE_DYN_LINK diff --git a/test/test_noop.cpp b/test/test_noop.cpp index 3071a55a..8e2fab04 100644 --- a/test/test_noop.cpp +++ b/test/test_noop.cpp @@ -6,15 +6,11 @@ #include "test_impl.hpp" -#include #include -#include - -#include +#include using boost::stacktrace::stacktrace; -using boost::stacktrace::frame; void test_deeply_nested_namespaces() { BOOST_TEST(return_from_nested_namespaces().size() == 0); diff --git a/test/test_num_conv.cpp b/test/test_num_conv.cpp index 27d34ad3..40031764 100644 --- a/test/test_num_conv.cpp +++ b/test/test_num_conv.cpp @@ -4,13 +4,13 @@ // accompanying file LICENSE_1_0.txt or copy at // http://www.boost.org/LICENSE_1_0.txt) +#include #include #include #include #include #include -#include void test_to_hex_array() { diff --git a/test/test_thread_safety_checking.cpp b/test/test_thread_safety_checking.cpp index e0c73e65..53e4e2ef 100644 --- a/test/test_thread_safety_checking.cpp +++ b/test/test_thread_safety_checking.cpp @@ -52,9 +52,9 @@ int main() { t2.join(); t3.join(); - const auto elapsed = t - std::chrono::steady_clock::now(); + const auto elapsed = std::chrono::steady_clock::now() - t; std::cout << "Elapsed: " << std::chrono::duration_cast( elapsed - ). count() << "ms"; + ). count() << "ms\n"; return boost::report_errors(); } From 7d56a555453932e3688395b0cb6beb704be205f7 Mon Sep 17 00:00:00 2001 From: Fedor Osetrov Date: Sat, 14 Mar 2026 11:51:19 +0000 Subject: [PATCH 03/17] include dump in windows --- CMakeLists.txt | 4 ++-- src/from_exception.cpp | 1 + 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 376f4d42..bdbf8db8 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -106,8 +106,8 @@ stacktrace_add_library(noop ${BOOST_STACKTRACE_ENABLE_NOOP} "" "") stacktrace_add_library(backtrace ${BOOST_STACKTRACE_ENABLE_BACKTRACE} "boost_stacktrace_dump;backtrace;${CMAKE_DL_LIBS}" "") stacktrace_add_library(addr2line ${BOOST_STACKTRACE_ENABLE_ADDR2LINE} "boost_stacktrace_dump;${CMAKE_DL_LIBS}" "") stacktrace_add_library(basic ${BOOST_STACKTRACE_ENABLE_BASIC} "boost_stacktrace_dump;${CMAKE_DL_LIBS}" "") -stacktrace_add_library(windbg ${BOOST_STACKTRACE_ENABLE_WINDBG} "dbgeng;ole32" "_GNU_SOURCE=1") -stacktrace_add_library(windbg_cached ${BOOST_STACKTRACE_ENABLE_WINDBG_CACHED} "dbgeng;ole32" "_GNU_SOURCE=1") +stacktrace_add_library(windbg ${BOOST_STACKTRACE_ENABLE_WINDBG} "boost_stacktrace_dump;dbgeng;ole32" "_GNU_SOURCE=1") +stacktrace_add_library(windbg_cached ${BOOST_STACKTRACE_ENABLE_WINDBG_CACHED} "boost_stacktrace_dump;dbgeng;ole32" "_GNU_SOURCE=1") # boost_stacktrace, default library diff --git a/src/from_exception.cpp b/src/from_exception.cpp index 6d937636..5dbb9cdc 100644 --- a/src/from_exception.cpp +++ b/src/from_exception.cpp @@ -7,6 +7,7 @@ #if defined(__MINGW32__) || defined(_MSC_VER) #include +#include extern "C" void** __cdecl __current_exception(); // exported from vcruntime.dll #define _pCurrentException static_cast(*__current_exception()) From e3dc26c574b7862caea9f686d723c1a77b8c355d Mon Sep 17 00:00:00 2001 From: Fedor Osetrov Date: Sun, 15 Mar 2026 10:08:45 +0000 Subject: [PATCH 04/17] compile dump for Windows --- CMakeLists.txt | 19 +++++++++++++++++-- src/dump.cpp | 19 +++++++++++++++++-- src/windbg.cpp | 6 +++--- src/windbg_cached.cpp | 8 ++++---- test/CMakeLists.txt | 23 ++++++++++++----------- 5 files changed, 53 insertions(+), 22 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index bdbf8db8..9819128f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,4 +1,5 @@ # Copyright 2020, 2021 Peter Dimov +# Copyright 2026 Fedor Osetrov # Distributed under the Boost Software License, Version 1.0. # https://www.boost.org/LICENSE_1_0.txt @@ -101,7 +102,18 @@ message(STATUS "Boost.Stacktrace: " "from_exception ${BOOST_STACKTRACE_ENABLE_FROM_EXCEPTION}" ) -stacktrace_add_library(dump ON "" "") +if(BOOST_STACKTRACE_ENABLE_BACKTRACE OR + BOOST_STACKTRACE_ENABLE_ADDR2LINE OR + BOOST_STACKTRACE_ENABLE_BASIC OR + BOOST_STACKTRACE_ENABLE_WINDBG OR + BOOST_STACKTRACE_ENABLE_WINDBG_CACHED + ) + set(_enable_non_noop_backend TRUE) +endif() + +if(_enable_non_noop_backend) + stacktrace_add_library(dump ON "" "") +endif() stacktrace_add_library(noop ${BOOST_STACKTRACE_ENABLE_NOOP} "" "") stacktrace_add_library(backtrace ${BOOST_STACKTRACE_ENABLE_BACKTRACE} "boost_stacktrace_dump;backtrace;${CMAKE_DL_LIBS}" "") stacktrace_add_library(addr2line ${BOOST_STACKTRACE_ENABLE_ADDR2LINE} "boost_stacktrace_dump;${CMAKE_DL_LIBS}" "") @@ -138,7 +150,10 @@ target_link_libraries(boost_stacktrace INTERFACE Boost::stacktrace_${__default_s unset(__default_stacktrace_backend) # Boost::stacktrace_from_exception is never the default -stacktrace_add_library(from_exception ${BOOST_STACKTRACE_ENABLE_FROM_EXCEPTION} "boost_stacktrace_dump;${CMAKE_DL_LIBS}" "" FALSE) +if(_enable_non_noop_backend) + stacktrace_add_library(from_exception ${BOOST_STACKTRACE_ENABLE_FROM_EXCEPTION} "boost_stacktrace_dump;${CMAKE_DL_LIBS}" "" FALSE) + unset(_enable_non_noop_backend) +endif() if(BUILD_TESTING) add_subdirectory(test) diff --git a/src/dump.cpp b/src/dump.cpp index d85d70cc..0016f31c 100644 --- a/src/dump.cpp +++ b/src/dump.cpp @@ -1,3 +1,10 @@ +// Copyright Antony Polukhin, 2025-2026 +// Copyright Fedor Osetrov, 2025-2026 +// +// 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_LINK #define BOOST_STACKTRACE_INTERNAL_BUILD_LIBS @@ -5,5 +12,13 @@ # define _GNU_SOURCE #endif -#include -#include +#if defined(BOOST_WINDOWS) +# include +#else +# include +#endif +#if defined(BOOST_WINDOWS) && !defined(BOOST_WINAPI_IS_MINGW) // MinGW does not provide RtlCaptureStackBackTrace. MinGW-w64 does. +# include +#else +# include +#endif diff --git a/src/windbg.cpp b/src/windbg.cpp index 5f92a5b2..9b028976 100644 --- a/src/windbg.cpp +++ b/src/windbg.cpp @@ -4,11 +4,11 @@ // 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 + #ifndef _GNU_SOURCE # define _GNU_SOURCE #endif -#define BOOST_STACKTRACE_INTERNAL_BUILD_LIBS -#define BOOST_STACKTRACE_LINK #include -#include diff --git a/src/windbg_cached.cpp b/src/windbg_cached.cpp index 6601020f..6b7ea07d 100644 --- a/src/windbg_cached.cpp +++ b/src/windbg_cached.cpp @@ -4,12 +4,12 @@ // 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_USE_WINDBG_CACHED +#define BOOST_STACKTRACE_LINK + #ifndef _GNU_SOURCE # define _GNU_SOURCE #endif -#define BOOST_STACKTRACE_INTERNAL_BUILD_LIBS -#define BOOST_STACKTRACE_LINK -#define BOOST_STACKTRACE_USE_WINDBG_CACHED #include -#include diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index e4edf45f..7761f91e 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -1,4 +1,5 @@ # Copyright 2018-2020 Peter Dimov +# Copyright 2026 Fedor Osetrov # 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 @@ -7,20 +8,20 @@ if(NOT TARGET tests) endif() function(add_stacktrace_test name libs sources) - set(test_name stacktrace_test${name}) + set(test_name stacktrace_${name}) - add_executable(${test_name} test${name}.cpp ${sources}) + add_executable(${test_name} ${name}.cpp ${sources}) target_link_libraries(${test_name} PRIVATE ${libs}) add_test(NAME ${test_name} COMMAND ${test_name}) add_dependencies(tests ${test_name}) endfunction() -add_stacktrace_test(_num_conv Boost::stacktrace "") -add_stacktrace_test(_void_ptr_cast Boost::stacktrace "") -add_stacktrace_test(_noop Boost::stacktrace_noop test_impl.cpp) -add_stacktrace_test(_trivial Boost::stacktrace test_impl.cpp) -add_stacktrace_test("" Boost::stacktrace test_impl.cpp) -add_stacktrace_test(_thread_safety_checking "Boost::stacktrace;Boost::optional" test_impl.cpp) -add_stacktrace_test(_from_exception "Boost::stacktrace;Boost::stacktrace_from_exception" "") -add_stacktrace_test(_from_exception_none Boost::stacktrace "") -add_stacktrace_test(_torture Boost::stacktrace test_impl.cpp) +add_stacktrace_test(test_num_conv Boost::stacktrace "") +add_stacktrace_test(test_void_ptr_cast Boost::stacktrace "") +add_stacktrace_test(test_noop Boost::stacktrace_noop test_impl.cpp) +add_stacktrace_test(test_trivial Boost::stacktrace test_impl.cpp) +add_stacktrace_test(test Boost::stacktrace test_impl.cpp) +add_stacktrace_test(test_thread_safety_checking "Boost::stacktrace;Boost::optional" test_impl.cpp) +add_stacktrace_test(test_from_exception "Boost::stacktrace;Boost::stacktrace_from_exception" "") +add_stacktrace_test(test_from_exception_none Boost::stacktrace "") +add_stacktrace_test(test_torture Boost::stacktrace test_impl.cpp) From 7b6741f1010b0d36d3f5ada1970496c1b30bc4a7 Mon Sep 17 00:00:00 2001 From: Fedor Osetrov Date: Sun, 15 Mar 2026 10:23:46 +0000 Subject: [PATCH 05/17] link public with dump --- CMakeLists.txt | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 9819128f..00e7a954 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -7,7 +7,7 @@ cmake_minimum_required(VERSION 3.8...4.20) project(boost_stacktrace VERSION "${BOOST_SUPERPROJECT_VERSION}" LANGUAGES CXX) -function(stacktrace_add_library suffix opt libs defs) +function(stacktrace_add_library suffix opt public_libs libs defs) if(NOT opt) return() @@ -26,6 +26,7 @@ function(stacktrace_add_library suffix opt libs defs) Boost::core Boost::predef Boost::winapi + ${public_libs} PRIVATE ${libs} ) @@ -112,14 +113,14 @@ if(BOOST_STACKTRACE_ENABLE_BACKTRACE OR endif() if(_enable_non_noop_backend) - stacktrace_add_library(dump ON "" "") + stacktrace_add_library(dump ON "" "" "") endif() -stacktrace_add_library(noop ${BOOST_STACKTRACE_ENABLE_NOOP} "" "") -stacktrace_add_library(backtrace ${BOOST_STACKTRACE_ENABLE_BACKTRACE} "boost_stacktrace_dump;backtrace;${CMAKE_DL_LIBS}" "") -stacktrace_add_library(addr2line ${BOOST_STACKTRACE_ENABLE_ADDR2LINE} "boost_stacktrace_dump;${CMAKE_DL_LIBS}" "") -stacktrace_add_library(basic ${BOOST_STACKTRACE_ENABLE_BASIC} "boost_stacktrace_dump;${CMAKE_DL_LIBS}" "") -stacktrace_add_library(windbg ${BOOST_STACKTRACE_ENABLE_WINDBG} "boost_stacktrace_dump;dbgeng;ole32" "_GNU_SOURCE=1") -stacktrace_add_library(windbg_cached ${BOOST_STACKTRACE_ENABLE_WINDBG_CACHED} "boost_stacktrace_dump;dbgeng;ole32" "_GNU_SOURCE=1") +stacktrace_add_library(noop ${BOOST_STACKTRACE_ENABLE_NOOP} "" "" "") +stacktrace_add_library(backtrace ${BOOST_STACKTRACE_ENABLE_BACKTRACE} boost_stacktrace_dump "backtrace;${CMAKE_DL_LIBS}" "") +stacktrace_add_library(addr2line ${BOOST_STACKTRACE_ENABLE_ADDR2LINE} boost_stacktrace_dump "${CMAKE_DL_LIBS}" "") +stacktrace_add_library(basic ${BOOST_STACKTRACE_ENABLE_BASIC} boost_stacktrace_dump "${CMAKE_DL_LIBS}" "") +stacktrace_add_library(windbg ${BOOST_STACKTRACE_ENABLE_WINDBG} boost_stacktrace_dump "dbgeng;ole32" "_GNU_SOURCE=1") +stacktrace_add_library(windbg_cached ${BOOST_STACKTRACE_ENABLE_WINDBG_CACHED} boost_stacktrace_dump "dbgeng;ole32" "_GNU_SOURCE=1") # boost_stacktrace, default library @@ -151,7 +152,7 @@ unset(__default_stacktrace_backend) # Boost::stacktrace_from_exception is never the default if(_enable_non_noop_backend) - stacktrace_add_library(from_exception ${BOOST_STACKTRACE_ENABLE_FROM_EXCEPTION} "boost_stacktrace_dump;${CMAKE_DL_LIBS}" "" FALSE) + stacktrace_add_library(from_exception ${BOOST_STACKTRACE_ENABLE_FROM_EXCEPTION} boost_stacktrace_dump "${CMAKE_DL_LIBS}" "" FALSE) unset(_enable_non_noop_backend) endif() From 3a24d582519bfab6e6e4efa0a72c047b3e02aa1e Mon Sep 17 00:00:00 2001 From: Fedor Osetrov Date: Sun, 15 Mar 2026 10:34:13 +0000 Subject: [PATCH 06/17] include config to resolve windows --- src/dump.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/dump.cpp b/src/dump.cpp index 0016f31c..03fbb805 100644 --- a/src/dump.cpp +++ b/src/dump.cpp @@ -12,6 +12,8 @@ # define _GNU_SOURCE #endif +#include + #if defined(BOOST_WINDOWS) # include #else From 9e0203bda3aa4c66fe9f73504a82569aacbd57e0 Mon Sep 17 00:00:00 2001 From: Fedor Osetrov Date: Sun, 15 Mar 2026 10:37:22 +0000 Subject: [PATCH 07/17] add link options for header_only --- test/cmake_subdir_test/CMakeLists.txt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/test/cmake_subdir_test/CMakeLists.txt b/test/cmake_subdir_test/CMakeLists.txt index 627e5ec6..58b32c49 100644 --- a/test/cmake_subdir_test/CMakeLists.txt +++ b/test/cmake_subdir_test/CMakeLists.txt @@ -46,7 +46,8 @@ target_link_libraries(main Boost::stacktrace) add_executable(main_header_only main.cpp) target_include_directories(main_header_only PRIVATE ../../include) -target_link_libraries(main_header_only PRIVATE Boost::core Boost::container_hash Boost::predef) +target_compile_definitions(main_header_only PRIVATE _GNU_SOURCE=1) +target_link_libraries(main_header_only PRIVATE Boost::core Boost::container_hash Boost::predef Boost::winapi) add_test(NAME main COMMAND main) add_test(NAME main_header_only COMMAND main_header_only) From c32114c6c3f5ec1a630b1dc77bde57aa80c1a28b Mon Sep 17 00:00:00 2001 From: Fedor Osetrov Date: Sun, 15 Mar 2026 10:42:53 +0000 Subject: [PATCH 08/17] maybe fix macro for mac --- test/cmake_subdir_test/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/cmake_subdir_test/CMakeLists.txt b/test/cmake_subdir_test/CMakeLists.txt index 58b32c49..d420cdeb 100644 --- a/test/cmake_subdir_test/CMakeLists.txt +++ b/test/cmake_subdir_test/CMakeLists.txt @@ -46,7 +46,7 @@ target_link_libraries(main Boost::stacktrace) add_executable(main_header_only main.cpp) target_include_directories(main_header_only PRIVATE ../../include) -target_compile_definitions(main_header_only PRIVATE _GNU_SOURCE=1) +target_compile_definitions(main_header_only PRIVATE "_GNU_SOURCE=1") target_link_libraries(main_header_only PRIVATE Boost::core Boost::container_hash Boost::predef Boost::winapi) add_test(NAME main COMMAND main) From fb7b00e5340f11547bf94aef5d9ddecf0f2f5586 Mon Sep 17 00:00:00 2001 From: Fedor Osetrov Date: Sun, 15 Mar 2026 11:58:39 +0000 Subject: [PATCH 09/17] fix cmake install --- CMakeLists.txt | 12 ++++++------ test/cmake_install_test/main.cpp | 2 +- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 00e7a954..ed92db43 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -26,8 +26,8 @@ function(stacktrace_add_library suffix opt public_libs libs defs) Boost::core Boost::predef Boost::winapi - ${public_libs} PRIVATE + ${public_libs} ${libs} ) @@ -116,11 +116,11 @@ if(_enable_non_noop_backend) stacktrace_add_library(dump ON "" "" "") endif() stacktrace_add_library(noop ${BOOST_STACKTRACE_ENABLE_NOOP} "" "" "") -stacktrace_add_library(backtrace ${BOOST_STACKTRACE_ENABLE_BACKTRACE} boost_stacktrace_dump "backtrace;${CMAKE_DL_LIBS}" "") -stacktrace_add_library(addr2line ${BOOST_STACKTRACE_ENABLE_ADDR2LINE} boost_stacktrace_dump "${CMAKE_DL_LIBS}" "") -stacktrace_add_library(basic ${BOOST_STACKTRACE_ENABLE_BASIC} boost_stacktrace_dump "${CMAKE_DL_LIBS}" "") -stacktrace_add_library(windbg ${BOOST_STACKTRACE_ENABLE_WINDBG} boost_stacktrace_dump "dbgeng;ole32" "_GNU_SOURCE=1") -stacktrace_add_library(windbg_cached ${BOOST_STACKTRACE_ENABLE_WINDBG_CACHED} boost_stacktrace_dump "dbgeng;ole32" "_GNU_SOURCE=1") +stacktrace_add_library(backtrace ${BOOST_STACKTRACE_ENABLE_BACKTRACE} Boost::stacktrace_dump "backtrace;${CMAKE_DL_LIBS}" "") +stacktrace_add_library(addr2line ${BOOST_STACKTRACE_ENABLE_ADDR2LINE} Boost::stacktrace_dump "${CMAKE_DL_LIBS}" "") +stacktrace_add_library(basic ${BOOST_STACKTRACE_ENABLE_BASIC} Boost::stacktrace_dump "${CMAKE_DL_LIBS}" "") +stacktrace_add_library(windbg ${BOOST_STACKTRACE_ENABLE_WINDBG} Boost::stacktrace_dump "dbgeng;ole32" "_GNU_SOURCE=1") +stacktrace_add_library(windbg_cached ${BOOST_STACKTRACE_ENABLE_WINDBG_CACHED} Boost::stacktrace_dump "dbgeng;ole32" "_GNU_SOURCE=1") # boost_stacktrace, default library diff --git a/test/cmake_install_test/main.cpp b/test/cmake_install_test/main.cpp index 24911105..a69ff3f1 100644 --- a/test/cmake_install_test/main.cpp +++ b/test/cmake_install_test/main.cpp @@ -13,6 +13,6 @@ int main() try { throw 42; } catch (...) { - std::cout << "From current excption:\n" << boost::stacktrace::stacktrace::from_current_exception() << std::endl; + std::cout << "From current exception:\n" << boost::stacktrace::stacktrace::from_current_exception() << std::endl; } } From 40e19f1bf0c5c2a3cceb447636cd1b95e8ab71e9 Mon Sep 17 00:00:00 2001 From: Fedor Osetrov Date: Sun, 15 Mar 2026 13:21:21 +0000 Subject: [PATCH 10/17] link public with dump --- CMakeLists.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index ed92db43..c70fd9f5 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -26,8 +26,8 @@ function(stacktrace_add_library suffix opt public_libs libs defs) Boost::core Boost::predef Boost::winapi - PRIVATE ${public_libs} + PRIVATE ${libs} ) @@ -152,7 +152,7 @@ unset(__default_stacktrace_backend) # Boost::stacktrace_from_exception is never the default if(_enable_non_noop_backend) - stacktrace_add_library(from_exception ${BOOST_STACKTRACE_ENABLE_FROM_EXCEPTION} boost_stacktrace_dump "${CMAKE_DL_LIBS}" "" FALSE) + stacktrace_add_library(from_exception ${BOOST_STACKTRACE_ENABLE_FROM_EXCEPTION} Boost::stacktrace_dump "${CMAKE_DL_LIBS}" "") unset(_enable_non_noop_backend) endif() From a69bb3d6446f66814ef524dca281e3c7ce71877c Mon Sep 17 00:00:00 2001 From: Fedor Osetrov Date: Sun, 15 Mar 2026 13:21:55 +0000 Subject: [PATCH 11/17] build exception internal --- src/from_exception.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/from_exception.cpp b/src/from_exception.cpp index 5dbb9cdc..bc0c2a63 100644 --- a/src/from_exception.cpp +++ b/src/from_exception.cpp @@ -4,6 +4,9 @@ // 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 + #if defined(__MINGW32__) || defined(_MSC_VER) #include From 258e663658f50f9861038694addf45d428bcd22e Mon Sep 17 00:00:00 2001 From: Fedor Osetrov Date: Sun, 15 Mar 2026 13:23:17 +0000 Subject: [PATCH 12/17] include only required --- include/boost/stacktrace/detail/frame_decl.hpp | 1 - include/boost/stacktrace/detail/frame_msvc.ipp | 2 +- include/boost/stacktrace/detail/frame_noop.ipp | 2 +- include/boost/stacktrace/detail/frame_unwind.ipp | 2 +- include/boost/stacktrace/stacktrace.hpp | 1 + 5 files changed, 4 insertions(+), 4 deletions(-) diff --git a/include/boost/stacktrace/detail/frame_decl.hpp b/include/boost/stacktrace/detail/frame_decl.hpp index ae5d91ee..8920e212 100644 --- a/include/boost/stacktrace/detail/frame_decl.hpp +++ b/include/boost/stacktrace/detail/frame_decl.hpp @@ -12,7 +12,6 @@ # pragma once #endif -#include #include #include // boost::stacktrace::detail::native_frame_ptr_t diff --git a/include/boost/stacktrace/detail/frame_msvc.ipp b/include/boost/stacktrace/detail/frame_msvc.ipp index 4d782761..e27e2f94 100644 --- a/include/boost/stacktrace/detail/frame_msvc.ipp +++ b/include/boost/stacktrace/detail/frame_msvc.ipp @@ -12,7 +12,7 @@ # pragma once #endif -#include +#include #include #include diff --git a/include/boost/stacktrace/detail/frame_noop.ipp b/include/boost/stacktrace/detail/frame_noop.ipp index d517cfb3..c7e88437 100644 --- a/include/boost/stacktrace/detail/frame_noop.ipp +++ b/include/boost/stacktrace/detail/frame_noop.ipp @@ -12,7 +12,7 @@ # pragma once #endif -#include +#include namespace boost { namespace stacktrace { namespace detail { diff --git a/include/boost/stacktrace/detail/frame_unwind.ipp b/include/boost/stacktrace/detail/frame_unwind.ipp index 5a7cbea1..2b4dd7ec 100644 --- a/include/boost/stacktrace/detail/frame_unwind.ipp +++ b/include/boost/stacktrace/detail/frame_unwind.ipp @@ -12,7 +12,7 @@ # pragma once #endif -#include +#include #include #include diff --git a/include/boost/stacktrace/stacktrace.hpp b/include/boost/stacktrace/stacktrace.hpp index 954b695d..f0000dd5 100644 --- a/include/boost/stacktrace/stacktrace.hpp +++ b/include/boost/stacktrace/stacktrace.hpp @@ -24,6 +24,7 @@ #endif #include +#include #include #include From bc00bc4691291a8e01f87a1ed23eda1552f0d1d6 Mon Sep 17 00:00:00 2001 From: Fedor Osetrov Date: Sun, 15 Mar 2026 13:31:25 +0000 Subject: [PATCH 13/17] rollback to frame.hpp --- include/boost/stacktrace/detail/frame_msvc.ipp | 2 +- include/boost/stacktrace/detail/frame_noop.ipp | 2 +- include/boost/stacktrace/detail/frame_unwind.ipp | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/include/boost/stacktrace/detail/frame_msvc.ipp b/include/boost/stacktrace/detail/frame_msvc.ipp index e27e2f94..4d782761 100644 --- a/include/boost/stacktrace/detail/frame_msvc.ipp +++ b/include/boost/stacktrace/detail/frame_msvc.ipp @@ -12,7 +12,7 @@ # pragma once #endif -#include +#include #include #include diff --git a/include/boost/stacktrace/detail/frame_noop.ipp b/include/boost/stacktrace/detail/frame_noop.ipp index c7e88437..d517cfb3 100644 --- a/include/boost/stacktrace/detail/frame_noop.ipp +++ b/include/boost/stacktrace/detail/frame_noop.ipp @@ -12,7 +12,7 @@ # pragma once #endif -#include +#include namespace boost { namespace stacktrace { namespace detail { diff --git a/include/boost/stacktrace/detail/frame_unwind.ipp b/include/boost/stacktrace/detail/frame_unwind.ipp index 2b4dd7ec..5a7cbea1 100644 --- a/include/boost/stacktrace/detail/frame_unwind.ipp +++ b/include/boost/stacktrace/detail/frame_unwind.ipp @@ -12,7 +12,7 @@ # pragma once #endif -#include +#include #include #include From 76a4f74e35c3596d1db192554bde6d0e2ce075c4 Mon Sep 17 00:00:00 2001 From: Fedor Osetrov Date: Sun, 15 Mar 2026 14:58:33 +0000 Subject: [PATCH 14/17] do not test torture with addr2line --- CMakeLists.txt | 2 +- test/CMakeLists.txt | 4 +++- test/test_from_exception.cpp | 2 +- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index c70fd9f5..d642defe 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -148,7 +148,6 @@ endif() message(STATUS "Boost.stacktrace default backend: ${__default_stacktrace_backend}") target_link_libraries(boost_stacktrace INTERFACE Boost::stacktrace_${__default_stacktrace_backend}) -unset(__default_stacktrace_backend) # Boost::stacktrace_from_exception is never the default if(_enable_non_noop_backend) @@ -159,3 +158,4 @@ endif() if(BUILD_TESTING) add_subdirectory(test) endif() +unset(__default_stacktrace_backend) diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index 7761f91e..c9512c62 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -24,4 +24,6 @@ add_stacktrace_test(test Boost::stacktrace test_impl.cpp) add_stacktrace_test(test_thread_safety_checking "Boost::stacktrace;Boost::optional" test_impl.cpp) add_stacktrace_test(test_from_exception "Boost::stacktrace;Boost::stacktrace_from_exception" "") add_stacktrace_test(test_from_exception_none Boost::stacktrace "") -add_stacktrace_test(test_torture Boost::stacktrace test_impl.cpp) +if(NOT __default_stacktrace_backend STREQUAL "addr2line") + add_stacktrace_test(test_torture Boost::stacktrace test_impl.cpp) +endif() diff --git a/test/test_from_exception.cpp b/test/test_from_exception.cpp index c09e1113..db5b36eb 100644 --- a/test/test_from_exception.cpp +++ b/test/test_from_exception.cpp @@ -146,7 +146,7 @@ BOOST_NOINLINE BOOST_SYMBOL_VISIBLE void test_rethrow_nested() { } catch (...) { auto trace = stacktrace::from_current_exception(); BOOST_TEST(trace); - std::cout << "Tarce in test_rethrow_nested(): " << trace << '\n'; + std::cout << "Trace in test_rethrow_nested(): " << trace << '\n'; BOOST_TEST(to_string(trace).find("in_test_throw_1") == std::string::npos); #if defined(BOOST_MSVC) BOOST_TEST(to_string(trace).find("in_test_throw_2") == std::string::npos); From d3706ffd5819ebbbbaa9fd7e1adfc3a4b7aed125 Mon Sep 17 00:00:00 2001 From: Fedor Osetrov Date: Sun, 15 Mar 2026 15:22:55 +0000 Subject: [PATCH 15/17] disable from_exception test on MacOS --- test/CMakeLists.txt | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index c9512c62..c8d19816 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -22,8 +22,10 @@ add_stacktrace_test(test_noop Boost::stacktrace_noop test_impl.cpp) add_stacktrace_test(test_trivial Boost::stacktrace test_impl.cpp) add_stacktrace_test(test Boost::stacktrace test_impl.cpp) add_stacktrace_test(test_thread_safety_checking "Boost::stacktrace;Boost::optional" test_impl.cpp) -add_stacktrace_test(test_from_exception "Boost::stacktrace;Boost::stacktrace_from_exception" "") add_stacktrace_test(test_from_exception_none Boost::stacktrace "") +if(NOT ${CMAKE_SYSTEM_NAME} MATCHES "Darwin") + add_stacktrace_test(test_from_exception "Boost::stacktrace;Boost::stacktrace_from_exception" "") +endif() if(NOT __default_stacktrace_backend STREQUAL "addr2line") add_stacktrace_test(test_torture Boost::stacktrace test_impl.cpp) endif() From 5556978607d5d8daf99921004b330dd0579c3ba4 Mon Sep 17 00:00:00 2001 From: Fedor Osetrov Date: Sun, 15 Mar 2026 15:29:05 +0000 Subject: [PATCH 16/17] try add dump to b2 --- build.jam | 5 ++++- build/Jamfile.v2 | 17 +++++++++++++++++ 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/build.jam b/build.jam index 8ea7a382..dd15fb25 100644 --- a/build.jam +++ b/build.jam @@ -20,8 +20,9 @@ project /boost/stacktrace ; explicit - [ alias boost_stacktrace_addr2line : build//boost_stacktrace_addr2line ] + [ alias boost_stacktrace_dump : build//boost_stacktrace_dump ] [ alias boost_stacktrace_backtrace : build//boost_stacktrace_backtrace ] + [ alias boost_stacktrace_addr2line : build//boost_stacktrace_addr2line ] [ alias boost_stacktrace_basic : build//boost_stacktrace_basic ] [ alias boost_stacktrace_from_exception : build//boost_stacktrace_from_exception ] [ alias boost_stacktrace_noop : build//boost_stacktrace_noop ] @@ -29,6 +30,7 @@ explicit [ alias boost_stacktrace_windbg_cached : build//boost_stacktrace_windbg_cached ] [ alias boost_stacktrace : boost_stacktrace_noop ] [ alias all : + boost_stacktrace_dump boost_stacktrace_addr2line boost_stacktrace_backtrace boost_stacktrace_basic @@ -42,6 +44,7 @@ explicit call-if : boost-library stacktrace : install + boost_stacktrace_dump boost_stacktrace_addr2line boost_stacktrace_backtrace boost_stacktrace_basic diff --git a/build/Jamfile.v2 b/build/Jamfile.v2 index 0af76b9c..7fc331b6 100644 --- a/build/Jamfile.v2 +++ b/build/Jamfile.v2 @@ -64,6 +64,17 @@ explicit WinDbg ; mp-run-simple has_windbg_cached.cpp : : : Dbgeng ole32 : WinDbgCached ; explicit WinDbgCached ; +lib boost_stacktrace_dump + : # sources + ../src/dump.cpp + : # requirements + all + shared:BOOST_STACKTRACE_DYN_LINK=1 + : # default build + : # usage-requirements + BOOST_STACKTRACE_NO_LIB=1 + ; + rule build-stacktrace-noop ( props * ) { local enabled = [ property.select : $(props) ] ; @@ -108,6 +119,7 @@ lib boost_stacktrace_backtrace : # requirements all linux:dl + boost_stacktrace_dump backtrace shared:BOOST_STACKTRACE_DYN_LINK=1 @build-stacktrace-backtrace @@ -145,6 +157,7 @@ lib boost_stacktrace_addr2line : # requirements all linux:dl + boost_stacktrace_dump shared:BOOST_STACKTRACE_DYN_LINK=1 @build-stacktrace-addr2line : # default build @@ -174,6 +187,7 @@ lib boost_stacktrace_basic : # requirements all linux:dl + boost_stacktrace_dump shared:BOOST_STACKTRACE_DYN_LINK=1 @build-stacktrace-basic : # default build @@ -202,6 +216,7 @@ lib boost_stacktrace_windbg ../src/windbg.cpp : # requirements all + boost_stacktrace_dump Dbgeng ole32 shared:BOOST_STACKTRACE_DYN_LINK=1 @build-stacktrace-windbg @@ -231,6 +246,7 @@ lib boost_stacktrace_windbg_cached ../src/windbg_cached.cpp : # requirements all + boost_stacktrace_dump Dbgeng ole32 shared:BOOST_STACKTRACE_DYN_LINK=1 @build-stacktrace-windbg-cached @@ -263,6 +279,7 @@ lib boost_stacktrace_from_exception : # requirements all linux:dl + boost_stacktrace_dump # Enable build when explicitly requested, or by default, when on x86 @build-stacktrace-from-exception From fb044fa142ca965f84197749931ea5d7123393de Mon Sep 17 00:00:00 2001 From: Fedor Osetrov Date: Sun, 15 Mar 2026 15:39:17 +0000 Subject: [PATCH 17/17] propagate dump to dependencies --- build/Jamfile.v2 | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/build/Jamfile.v2 b/build/Jamfile.v2 index 7fc331b6..f230335c 100644 --- a/build/Jamfile.v2 +++ b/build/Jamfile.v2 @@ -127,6 +127,7 @@ lib boost_stacktrace_backtrace : # usage-requirements #shared:BOOST_STACKTRACE_DYN_LINK=1 BOOST_STACKTRACE_NO_LIB=1 + boost_stacktrace_dump ; rule build-stacktrace-addr2line ( props * ) @@ -164,6 +165,7 @@ lib boost_stacktrace_addr2line : # usage-requirements #shared:BOOST_STACKTRACE_DYN_LINK=1 BOOST_STACKTRACE_NO_LIB=1 + boost_stacktrace_dump ; rule build-stacktrace-basic ( props * ) @@ -194,6 +196,7 @@ lib boost_stacktrace_basic : # usage-requirements #shared:BOOST_STACKTRACE_DYN_LINK=1 BOOST_STACKTRACE_NO_LIB=1 + boost_stacktrace_dump ; rule build-stacktrace-windbg ( props * ) @@ -224,6 +227,7 @@ lib boost_stacktrace_windbg : # usage-requirements #shared:BOOST_STACKTRACE_DYN_LINK=1 BOOST_STACKTRACE_NO_LIB=1 + boost_stacktrace_dump ; rule build-stacktrace-windbg-cached ( props * ) @@ -254,6 +258,7 @@ lib boost_stacktrace_windbg_cached : # usage-requirements #shared:BOOST_STACKTRACE_DYN_LINK=1 BOOST_STACKTRACE_NO_LIB=1 + boost_stacktrace_dump ; rule build-stacktrace-from-exception ( props * ) @@ -287,4 +292,5 @@ lib boost_stacktrace_from_exception : # usage-requirements #shared:BOOST_STACKTRACE_DYN_LINK=1 BOOST_STACKTRACE_NO_LIB=1 + boost_stacktrace_dump ;