Compare commits

...

41 Commits

Author SHA1 Message Date
Antony Polukhin
d6499f26d4 Fix stacktrace_from_exception builds with MinGW (#206)
Fixes https://github.com/boostorg/stacktrace/issues/196
2025-02-18 13:41:40 +03:00
Antony Polukhin
d408cf4468 Document build options and use windbg_cached in Boost::stacktrace in CMake (#205) 2025-01-28 21:34:31 +03:00
Antony Polukhin
9d314b2b47 Force features to override library detections and make separate rules for each feature check with diagnostic messages (#203) 2025-01-23 21:56:26 +03:00
Uilian Ries
54934a386a Expose stacktrace libraries as build features (#202)
As I commented in the issue #195, this PR exposes all stacktrace libraries as boost features, mirroring what's available in the CMakeLists.txt in this project. So users will be able to build or not specific libraries present in this project. Here are some keypoints to evaluate these new changes:

- Added `build-stacktrace-feature` as generic rule validate on/off entry from users for each feature
- For `addr2line` I added a rule to disable in case using Windows and not Cygwin. It reflects the rule present in CMakeLists.txt: https://github.com/boostorg/stacktrace/blob/develop/CMakeLists.txt#L67

close #195

Signed-off-by: Uilian Ries <uilianries@gmail.com>
2025-01-18 13:26:21 +03:00
Antony Polukhin
ea282324b8 Fix some warnings on MSVC (#201) 2025-01-11 12:36:57 +03:00
Antony Polukhin
9e7a98a61a Update copyright years 2025-01-08 19:54:11 +03:00
Maciej Czarnecki
b170b28479 Use Relative Virtual Addresses to allow their decoding without knowing the base address (#200)
Instead of printing absolute addresses use relative ones so they can be used later to decode the stack trace.

## Motivation

It’s quite common to release apps without debug symbols while keeping them internally. Currently the lib prints absolute addresses which require the base address to decode them using symbols. With this change, the base address won’t be needed as values are relative to the beginning of the loaded module/binary.

The implementation for unix is **straightforward** as the existing code is used. For Windows, I’ve implemented similar logic using Windows API.

## Manual testing of Windows implementation

Here are 2 runs of `trivial_windbg_lib.exe` with .pdb and without .pdb file:

```jsx
>./trivial_windbg_lib.exe
 0# boost::stacktrace::basic_stacktrace<std::allocator<boost::stacktrace::frame> >::init at C:\Users\czarneckim\repositories\boost\boost\stacktrace\stacktrace.hpp:110
 1# main at C:\Users\czarneckim\repositories\boost\libs\stacktrace\test\test_trivial.cpp:14
 2# __scrt_common_main_seh at D:\a\_work\1\s\src\vctools\crt\vcstartup\src\startup\exe_common.inl:288
 3# BaseThreadInitThunk in C:\WINDOWS\System32\KERNEL32.DLL
 4# RtlUserThreadStart in C:\WINDOWS\SYSTEM32\ntdll.dll

> mv ./trivial_windbg_lib.pdb{,_} 
> ./trivial_windbg_lib.exe
 0# 0x0000000000001DE3 in C:\Users\czarneckim\repositories\boost\bin.v2\libs\stacktrace\test\trivial_windbg_lib.test\msvc-14.3\release\x86_64\asynch-exceptions-on\cxxstd-latest-iso\debug-symbols-on\threading-multi\trivial_windbg_lib.exe
 1# 0x0000000000001FEE in C:\Users\czarneckim\repositories\boost\bin.v2\libs\stacktrace\test\trivial_windbg_lib.test\msvc-14.3\release\x86_64\asynch-exceptions-on\cxxstd-latest-iso\debug-symbols-on\threading-multi\trivial_windbg_lib.exe
 2# 0x000000000000246C in C:\Users\czarneckim\repositories\boost\bin.v2\libs\stacktrace\test\trivial_windbg_lib.test\msvc-14.3\release\x86_64\asynch-exceptions-on\cxxstd-latest-iso\debug-symbols-on\threading-multi\trivial_windbg_lib.exe
 3# BaseThreadInitThunk in C:\WINDOWS\System32\KERNEL32.DLL
 4# RtlUserThreadStart in C:\WINDOWS\SYSTEM32\ntdll.dll

> mv ./trivial_windbg_lib.pdb{_,}
> winaddr2line.exe -f -e trivial_windbg_lib.pdb 0x0000000000001DE3
boost::stacktrace::basic_stacktrace<std::allocator<boost::stacktrace::frame> >::init
C:\Users\czarneckim\repositories\boost\boost\stacktrace\stacktrace.hpp:110
```

I’ve also decoded the returned address using x64dbg running `trivial_windbg_lib.exe+0x0000000000001DE3`:

![image](https://github.com/user-attachments/assets/a36d3306-488d-4610-9f04-7888b98c2b75)

## Control

As it was suggested in #180, the new logic is enabled by default, but can be disabled with `BOOST_STACKTRACE_DISABLE_OFFSET_ADDR_BASE` (With non header-only mode, it requires rebuilding the lib)
2025-01-07 23:59:16 +03:00
Antony Polukhin
5ec45912da Autodetect stacktrace dependencies in Appveyor CI runs (#199) 2024-12-22 18:47:19 +03:00
Antony Polukhin
679bd845aa Add libs/function_types dependency for Appveyor tests 2024-12-22 16:40:11 +03:00
Antony Polukhin
0bcc382ab5 Add libs/concept_check dependency for Appveyor tests 2024-12-22 16:25:09 +03:00
Antony Polukhin
a64b8b7985 Do not test on macos-12 as the images are not available any more (take 2) 2024-12-22 16:22:14 +03:00
Antony Polukhin
92b1c794b3 Do not test on macos-12 as the images are not available any more 2024-12-22 14:06:12 +03:00
Daniel Krügler
8c4e50324c Use GetModuleNames to determine the full module path for msvc implementation 2024-12-22 01:24:02 +03:00
Dmitry Arkhipov
22982db3f6 fix setting custom b2 feature from CLI (#194) 2024-11-19 11:00:46 +03:00
Antony Polukhin
088bf8ed7f Fix stacktrace_from_exception CMake builds (#191) 2024-10-17 11:57:19 +03:00
Antony Polukhin
344f6bae19 Always link boost_stacktrace/Boost::stacktrace with Boost::stacktrace_from_exception if it is awailable in CMake 2024-10-16 15:13:44 +03:00
int mian
6504ed9ea4 Add CMake target boost_stacktrace_from_exception (#189)
Fixes #188
2024-10-16 15:11:09 +03:00
Antony Polukhin
a778e3d223 cleanup 2024-09-15 19:03:09 +03:00
huangqinjin
464e224c2f Don't export boost_stacktrace_impl_return_nullptr for static build (#186)
Now `boost_stacktrace.lib` provides the symbol `boost_stacktrace_impl_return_nullptr` for static and shared build.

For header only library, to make the symbol available **automatically**, the only way AFAIK is to export it. We may also consider provide a configuration macro to opt-out the exported symbol, and user need to manually define the non-exported symbol somewhere in their binaries.

Closes #177 .
2024-09-13 20:42:31 +03:00
Antony Polukhin
3f79aee92f Revert fix attempt for #177 2024-09-12 22:27:45 +03:00
Antony Polukhin
da94896d2d Fix attempt for #177 2024-09-12 22:00:21 +03:00
Antony Polukhin
0a1f8ac9a0 Fix Appveyor CI runs (#183) 2024-09-12 18:26:16 +03:00
Antony Polukhin
7c79d84614 fix attempt for Appveyor 2024-09-12 11:31:04 +03:00
Antony Polukhin
e95c2723d8 Add auto linking when using clang compiler under Visual Studio (fixes #100) 2024-09-12 11:15:03 +03:00
Antony Polukhin
9028c8a413 Attempt to fix weird build issues with CYGWIN and MacOS (fixes #88) 2024-09-12 11:14:26 +03:00
Antony Polukhin
b37fc77b5d Attempt to fix weird build issues with CYGWIN and MacOS (fixes #88) 2024-09-12 11:04:52 +03:00
Mats Taraldsvik
aa97b1a34c Fix missing namespace in stacktrace.qbk (#181) 2024-09-12 10:36:53 +03:00
Julien Schueller
23e1213f54 Fix missing include for std::exception (#178)
Fixes build on mingw: 
from_exception.cpp:333:23: error: 'current_exception' is not a member of 'std'
2024-09-03 10:27:59 +03:00
René Ferdinand Rivera Morell
ad121dbed0 Add support for modular build structure. (#172)
This is part of the effort to make the Boost libraries "modular" for build and consumption. See https://lists.boost.org/Archives/boost/2024/01/255704.php and https://github.com/grafikrobot/boost-b2-modular/blob/b2-modular/README.adoc for more information.
2024-09-01 17:23:26 +03:00
Jaroslaw Pelczar
981e37c218 Fix type conversions errors reported by GCC (#175)
This commit fixes errors when compiling with:
 -Wall -Werror -Wextra -Wconversion -Wsign-conversion

Signed-off-by: Jarosław Pelczar <jarek@jpelczar.com>
2024-09-01 17:22:07 +03:00
Antony Polukhin
cbf0df774d Fix addr2line work when the process is looked up via PATH.
Fixes #72
2024-07-07 20:30:51 +03:00
Peter Dimov
34e56c4e90 Do not define BOOST_STACKTRACE_DYN_LINK when BOOST_STACKTRACE_STATIC_LINK is defined 2024-06-23 20:36:49 +03:00
Peter Dimov
f32bd5a543 Define BOOST_STACKTRACE_LINK when BOOST_STACKTRACE_STATIC_LINK is defined. Refs #169. 2024-06-21 23:01:57 +03:00
Peter Dimov
79fc075655 Revert "Disable static linking in GHA because of https://github.com/boostorg/stacktrace/issues/169"
This reverts commit 274aeaa351.
2024-06-21 22:58:47 +03:00
Peter Dimov
6624a0aaeb Remove RelWithDebInfo from posix-cmake-test, because it fails under macos-14 2024-06-21 21:59:41 +03:00
Peter Dimov
ca76415503 Set CMAKE_BUILD_TYPE in posix-cmake-test 2024-06-21 21:53:32 +03:00
Peter Dimov
4352901d19 Move tests to their own function to ensure two stack frames 2024-06-21 21:42:05 +03:00
Peter Dimov
2820ed36b5 Change Windows jobs from Release to RelWithDebInfo 2024-06-21 20:09:21 +03:00
Peter Dimov
1a389747a3 Change test/CMakeLists.txt to use Boost::stacktrace 2024-06-21 20:01:34 +03:00
Peter Dimov
1db160d566 Change cmake_subdir_test and cmake_install_test to use Boost::stacktrace 2024-06-21 19:59:27 +03:00
Peter Dimov
1b16c5d6ae Add the boost_stacktrace library to CMakeLists.txt (an alias to the default backend) 2024-06-21 19:58:30 +03:00
63 changed files with 639 additions and 150 deletions

View File

@@ -170,8 +170,8 @@ jobs:
strategy:
fail-fast: false
matrix:
os: [ ubuntu-20.04, ubuntu-22.04, macos-12, macos-13, macos-14 ]
shared: [ ON ] # https://github.com/boostorg/stacktrace/issues/169
os: [ ubuntu-20.04, ubuntu-22.04, macos-13, macos-14 ]
shared: [ OFF, ON ]
runs-on: ${{matrix.os}}
@@ -214,8 +214,8 @@ jobs:
strategy:
fail-fast: false
matrix:
os: [ ubuntu-20.04, ubuntu-22.04, macos-12, macos-13, macos-14 ]
shared: [ ON ] # https://github.com/boostorg/stacktrace/issues/169
os: [ ubuntu-20.04, ubuntu-22.04, macos-13, macos-14 ]
shared: [ OFF, ON ]
runs-on: ${{matrix.os}}
@@ -274,8 +274,8 @@ jobs:
strategy:
fail-fast: false
matrix:
os: [ ubuntu-20.04, ubuntu-22.04, macos-12, macos-13, macos-14 ]
shared: [ ON ] # https://github.com/boostorg/stacktrace/issues/169
os: [ ubuntu-20.04, ubuntu-22.04, macos-13, macos-14 ]
shared: [ OFF, ON ]
runs-on: ${{matrix.os}}
@@ -306,20 +306,20 @@ jobs:
git submodule update --init tools/boostdep
python tools/boostdep/depinst/depinst.py --git_args "--jobs 3" $LIBRARY
- name: Configure
- name: Configure (Debug)
run: |
cd ../boost-root
mkdir __build__ && cd __build__
cmake -DBOOST_INCLUDE_LIBRARIES=$LIBRARY -DBUILD_TESTING=ON -DBUILD_SHARED_LIBS=${{matrix.shared}} ..
mkdir __build_debug__ && cd __build_debug__
cmake -DBOOST_INCLUDE_LIBRARIES=$LIBRARY -DBUILD_TESTING=ON -DBUILD_SHARED_LIBS=${{matrix.shared}} -DCMAKE_BUILD_TYPE=Debug ..
- name: Build tests
- name: Build tests (Debug)
run: |
cd ../boost-root/__build__
cd ../boost-root/__build_debug__
cmake --build . --target tests
- name: Run tests
- name: Run tests (Debug)
run: |
cd ../boost-root/__build__
cd ../boost-root/__build_debug__
ctest --output-on-failure --no-tests=error
windows-cmake-subdir:
@@ -363,12 +363,12 @@ jobs:
cmake --build . --config Debug
ctest --output-on-failure --no-tests=error -C Debug
- name: Use library with add_subdirectory (Release)
- name: Use library with add_subdirectory (RelWithDebInfo)
shell: cmd
run: |
cd ../boost-root/libs/%LIBRARY%/test/cmake_subdir_test/__build__
cmake --build . --config Release
ctest --output-on-failure --no-tests=error -C Release
cmake --build . --config RelWithDebInfo
ctest --output-on-failure --no-tests=error -C RelWithDebInfo
windows-cmake-install:
strategy:
@@ -415,11 +415,11 @@ jobs:
cd ../boost-root/__build__
cmake --build . --target install --config Debug
- name: Install (Release)
- name: Install (RelWithDebInfo)
shell: cmd
run: |
cd ../boost-root/__build__
cmake --build . --target install --config Release
cmake --build . --target install --config RelWithDebInfo
- name: Use the installed library (Debug)
shell: cmd
@@ -430,20 +430,20 @@ jobs:
PATH C:\cmake-prefix\bin;%PATH%
ctest --output-on-failure --no-tests=error -C Debug
- name: Use the installed library (Release)
- name: Use the installed library (RelWithDebInfo)
shell: cmd
run: |
cd ../boost-root/libs/%LIBRARY%/test/cmake_install_test/__build__
cmake --build . --config Release
cmake --build . --config RelWithDebInfo
PATH C:\cmake-prefix\bin;%PATH%
ctest --output-on-failure --no-tests=error -C Release
ctest --output-on-failure --no-tests=error -C RelWithDebInfo
windows-cmake-test:
strategy:
fail-fast: false
matrix:
os: [ windows-2019, windows-2022 ]
shared: [ ON ] # https://github.com/boostorg/stacktrace/issues/169
shared: [ OFF, ON ]
runs-on: ${{matrix.os}}
@@ -489,14 +489,14 @@ jobs:
cd ../boost-root/__build__
ctest --output-on-failure --no-tests=error -C Debug
- name: Build tests (Release)
- name: Build tests (RelWithDebInfo)
shell: cmd
run: |
cd ../boost-root/__build__
cmake --build . --target tests --config Release
cmake --build . --target tests --config RelWithDebInfo
- name: Run tests (Release)
- name: Run tests (RelWithDebInfo)
shell: cmd
run: |
cd ../boost-root/__build__
ctest --output-on-failure --no-tests=error -C Release
ctest --output-on-failure --no-tests=error -C RelWithDebInfo

View File

@@ -71,14 +71,21 @@ 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" "")
set(_default_from_exception ON)
if (NOT CMAKE_SYSTEM_PROCESSOR MATCHES "x86_64|AMD64|amd64|i386|i686|x86")
set(_default_from_exception OFF)
endif()
option(BOOST_STACKTRACE_ENABLE_NOOP "Boost.Stacktrace: build boost_stacktrace_noop" ON)
option(BOOST_STACKTRACE_ENABLE_BACKTRACE "Boost.Stacktrace: build boost_stacktrace_backtrace" ${BOOST_STACKTRACE_HAS_BACKTRACE})
option(BOOST_STACKTRACE_ENABLE_ADDR2LINE "Boost.Stacktrace: build boost_stacktrace_addr2line" ${_default_addr2line})
option(BOOST_STACKTRACE_ENABLE_BASIC "Boost.Stacktrace: build boost_stacktrace_basic" ON)
option(BOOST_STACKTRACE_ENABLE_WINDBG "Boost.Stacktrace: build boost_stacktrace_windbg" ${BOOST_STACKTRACE_HAS_WINDBG})
option(BOOST_STACKTRACE_ENABLE_WINDBG_CACHED "Boost.Stacktrace: build boost_stacktrace_windbg_cached" ${BOOST_STACKTRACE_HAS_WINDBG_CACHED})
option(BOOST_STACKTRACE_ENABLE_FROM_EXCEPTION "Boost.Stacktrace: build boost_stacktrace_from_exception" ${_default_from_exception})
unset(_default_addr2line)
unset(_default_from_exception)
message(STATUS "Boost.Stacktrace: "
"noop ${BOOST_STACKTRACE_ENABLE_NOOP}, "
@@ -86,7 +93,8 @@ message(STATUS "Boost.Stacktrace: "
"addr2line ${BOOST_STACKTRACE_ENABLE_ADDR2LINE}, "
"basic ${BOOST_STACKTRACE_ENABLE_BASIC}, "
"windbg ${BOOST_STACKTRACE_ENABLE_WINDBG}, "
"windbg_cached ${BOOST_STACKTRACE_ENABLE_WINDBG_CACHED}"
"windbg_cached ${BOOST_STACKTRACE_ENABLE_WINDBG_CACHED}, "
"from_exception ${BOOST_STACKTRACE_ENABLE_FROM_EXCEPTION}"
)
stacktrace_add_library(noop ${BOOST_STACKTRACE_ENABLE_NOOP} "" "")
@@ -96,20 +104,44 @@ stacktrace_add_library(basic ${BOOST_STACKTRACE_ENABLE_BASIC} "${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)
elseif(BOOST_STACKTRACE_ENABLE_WINDBG_CACHED)
target_link_libraries(boost_stacktrace INTERFACE Boost::stacktrace_windbg)
elseif(BOOST_STACKTRACE_ENABLE_BACKTRACE)
target_link_libraries(boost_stacktrace INTERFACE Boost::stacktrace_backtrace)
elseif(BOOST_STACKTRACE_ENABLE_ADDR2LINE)
target_link_libraries(boost_stacktrace INTERFACE Boost::stacktrace_addr2line)
elseif(BOOST_STACKTRACE_ENABLE_BASIC)
target_link_libraries(boost_stacktrace INTERFACE Boost::stacktrace_basic)
elseif(BOOST_STACKTRACE_ENABLE_NOOP)
target_link_libraries(boost_stacktrace INTERFACE Boost::stacktrace_noop)
# Alias target for platform defaults (only if they enabled).
if(WIN32)
if(BOOST_STACKTRACE_ENABLE_WINDBG)
add_library(Boost::stacktrace ALIAS boost_stacktrace_windbg)
endif()
else()
if(BOOST_STACKTRACE_ENABLE_BACKTRACE)
add_library(Boost::stacktrace ALIAS boost_stacktrace_backtrace)
elseif(BOOST_STACKTRACE_ENABLE_BASIC)
add_library(Boost::stacktrace ALIAS boost_stacktrace_basic)
endif()
endif()
# Boost::stacktrace_from_exception is never the default
stacktrace_add_library(from_exception ${BOOST_STACKTRACE_ENABLE_FROM_EXCEPTION} "${CMAKE_DL_LIBS};boost_stacktrace" "")
#
if(BUILD_TESTING AND EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/test/CMakeLists.txt")
add_subdirectory(test)

View File

@@ -0,0 +1,15 @@
# Copyright (C) 2016-2024, Antony Polukhin.
#
# Use, modification and distribution is subject to 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)
#
import feature ;
feature.feature boost.stacktrace.noop : on off : optional propagated ;
feature.feature boost.stacktrace.backtrace : on off : optional propagated ;
feature.feature boost.stacktrace.addr2line : on off : optional propagated ;
feature.feature boost.stacktrace.basic : on off : optional propagated ;
feature.feature boost.stacktrace.windbg : on off : optional propagated ;
feature.feature boost.stacktrace.windbg_cached : on off : optional propagated ;
feature.feature boost.stacktrace.from_exception : on off : optional propagated ;

52
build.jam Normal file
View File

@@ -0,0 +1,52 @@
# Copyright René Ferdinand Rivera Morell 2023-2024
# 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)
require-b2 5.2 ;
import boost-stacktrace-features ;
constant boost_dependencies :
<library>/boost/config//boost_config
<library>/boost/container_hash//boost_container_hash
<library>/boost/core//boost_core
<library>/boost/predef//boost_predef
<target-os>windows:<library>/boost/winapi//boost_winapi ;
project /boost/stacktrace
: common-requirements
<include>include
;
explicit
[ alias boost_stacktrace_addr2line : build//boost_stacktrace_addr2line ]
[ alias boost_stacktrace_backtrace : build//boost_stacktrace_backtrace ]
[ 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 ]
[ alias boost_stacktrace_windbg : build//boost_stacktrace_windbg ]
[ alias boost_stacktrace_windbg_cached : build//boost_stacktrace_windbg_cached ]
[ alias boost_stacktrace : boost_stacktrace_noop ]
[ alias all :
boost_stacktrace_addr2line
boost_stacktrace_backtrace
boost_stacktrace_basic
boost_stacktrace_from_exception
boost_stacktrace_noop
boost_stacktrace_windbg
boost_stacktrace_windbg_cached
test
]
;
call-if : boost-library stacktrace
: install
boost_stacktrace_addr2line
boost_stacktrace_backtrace
boost_stacktrace_basic
boost_stacktrace_from_exception
boost_stacktrace_noop
boost_stacktrace_windbg
boost_stacktrace_windbg_cached
;

View File

@@ -5,14 +5,22 @@
# http://www.boost.org/LICENSE_1_0.txt)
#
import feature ;
require-b2 5.0.1 ;
import-search /boost/config/checks ;
import boost-stacktrace-features ;
import config : requires ;
import configure ;
import property ;
import ../../config/checks/config : requires ;
constant boost_dependencies_private :
<library>/boost/assert//boost_assert
;
project
: source-location .
: common-requirements $(boost_dependencies)
: requirements
[ requires cxx11_rvalue_references ]
$(boost_dependencies_private)
: default-build
<visibility>hidden
;
@@ -22,14 +30,12 @@ lib gcc_s ;
lib Dbgeng ;
lib ole32 ;
feature.feature boost.stacktrace.from_exception : on off : optional propagated ;
local LIBBACKTRACE_PATH = [ modules.peek : LIBBACKTRACE_PATH ] ;
lib backtrace
:
:
: <search>$(LIBBACKTRACE_PATH)/lib <link>static
:
: <include>$(LIBBACKTRACE_PATH)/include
: <include>$(LIBBACKTRACE_PATH)/include
;
actions mp_simple_run_action
@@ -58,17 +64,44 @@ explicit WinDbg ;
mp-run-simple has_windbg_cached.cpp : : : <library>Dbgeng <library>ole32 : WinDbgCached ;
explicit WinDbgCached ;
rule build-stacktrace-noop ( props * )
{
local enabled = [ property.select <boost.stacktrace.noop> : $(props) ] ;
switch $(enabled:G=)
{
case "on" : return ;
case "off" : return <build>no ;
}
}
lib boost_stacktrace_noop
: # sources
../src/noop.cpp
: # requirements
<warnings>all
<link>shared:<define>BOOST_STACKTRACE_DYN_LINK=1
<conditional>@build-stacktrace-noop
: # default build
: # usage-requirements
#<link>shared:<define>BOOST_STACKTRACE_DYN_LINK=1
<define>BOOST_STACKTRACE_NO_LIB=1
;
rule build-stacktrace-backtrace ( props * )
{
local enabled = [ property.select <boost.stacktrace.backtrace> : $(props) ] ;
switch $(enabled:G=)
{
case "on" : return ;
case "off" : return <build>no ;
}
if ! [ configure.builds libbacktrace : $(props) : "boost.stacktrace.backtrace" ]
{
return <build>no ;
}
}
lib boost_stacktrace_backtrace
: # sources
../src/backtrace.cpp
@@ -77,12 +110,35 @@ lib boost_stacktrace_backtrace
<target-os>linux:<library>dl
<library>backtrace
<link>shared:<define>BOOST_STACKTRACE_DYN_LINK=1
[ check-target-builds ../build//libbacktrace : : <build>no ]
<conditional>@build-stacktrace-backtrace
: # default build
: # usage-requirements
#<link>shared:<define>BOOST_STACKTRACE_DYN_LINK=1
<define>BOOST_STACKTRACE_NO_LIB=1
;
rule build-stacktrace-addr2line ( props * )
{
local enabled = [ property.select <boost.stacktrace.addr2line> : $(props) ] ;
switch $(enabled:G=)
{
case "on" : return ;
case "off" : return <build>no ;
}
# Disable by default on Windows when not using Cygwin
if <target-os>windows in $(props) && ! ( <target-os>cygwin in $(props) )
{
configure.log-library-search-result "boost.stacktrace.addr2line" : "no" ;
return <build>no ;
}
if ! [ configure.builds addr2line : $(props) : "boost.stacktrace.addr2line" ]
{
return <build>no ;
}
}
lib boost_stacktrace_addr2line
: # sources
../src/addr2line.cpp
@@ -90,12 +146,28 @@ lib boost_stacktrace_addr2line
<warnings>all
<target-os>linux:<library>dl
<link>shared:<define>BOOST_STACKTRACE_DYN_LINK=1
[ check-target-builds ../build//addr2line : : <build>no ]
<conditional>@build-stacktrace-addr2line
: # default build
: # usage-requirements
#<link>shared:<define>BOOST_STACKTRACE_DYN_LINK=1
<define>BOOST_STACKTRACE_NO_LIB=1
;
rule build-stacktrace-basic ( props * )
{
local enabled = [ property.select <boost.stacktrace.basic> : $(props) ] ;
switch $(enabled:G=)
{
case "on" : return ;
case "off" : return <build>no ;
}
if [ configure.builds WinDbg : $(props) : "boost.stacktrace.basic" ]
{
return <build>no ;
}
}
lib boost_stacktrace_basic
: # sources
../src/basic.cpp
@@ -103,12 +175,28 @@ lib boost_stacktrace_basic
<warnings>all
<target-os>linux:<library>dl
<link>shared:<define>BOOST_STACKTRACE_DYN_LINK=1
[ check-target-builds ../build//WinDbg : <build>no ]
<conditional>@build-stacktrace-basic
: # default build
: # usage-requirements
#<link>shared:<define>BOOST_STACKTRACE_DYN_LINK=1
<define>BOOST_STACKTRACE_NO_LIB=1
;
rule build-stacktrace-windbg ( props * )
{
local enabled = [ property.select <boost.stacktrace.windbg> : $(props) ] ;
switch $(enabled:G=)
{
case "on" : return ;
case "off" : return <build>no ;
}
if ! [ configure.builds WinDbg : $(props) : "boost.stacktrace.windbg" ]
{
return <build>no ;
}
}
lib boost_stacktrace_windbg
: # sources
../src/windbg.cpp
@@ -116,12 +204,28 @@ lib boost_stacktrace_windbg
<warnings>all
<library>Dbgeng <library>ole32
<link>shared:<define>BOOST_STACKTRACE_DYN_LINK=1
[ check-target-builds ../build//WinDbg : : <build>no ]
<conditional>@build-stacktrace-windbg
: # default build
: # usage-requirements
#<link>shared:<define>BOOST_STACKTRACE_DYN_LINK=1
<define>BOOST_STACKTRACE_NO_LIB=1
;
rule build-stacktrace-windbg-cached ( props * )
{
local enabled = [ property.select <boost.stacktrace.windbg_cached> : $(props) ] ;
switch $(enabled:G=)
{
case "on" : return ;
case "off" : return <build>no ;
}
if ! [ configure.builds WinDbgCached : $(props) : "boost.stacktrace.windbg_cached" ]
{
return <build>no ;
}
}
lib boost_stacktrace_windbg_cached
: # sources
../src/windbg_cached.cpp
@@ -129,10 +233,11 @@ lib boost_stacktrace_windbg_cached
<warnings>all
<library>Dbgeng <library>ole32
<link>shared:<define>BOOST_STACKTRACE_DYN_LINK=1
[ check-target-builds ../build//WinDbgCached : : <build>no ]
<conditional>@build-stacktrace-windbg-cached
: # default build
: # usage-requirements
#<link>shared:<define>BOOST_STACKTRACE_DYN_LINK=1
<define>BOOST_STACKTRACE_NO_LIB=1
;
rule build-stacktrace-from-exception ( props * )
@@ -147,8 +252,10 @@ rule build-stacktrace-from-exception ( props * )
local arch = [ property.select <architecture> : $(props) ] ;
if $(arch) && ( $(arch:G=) != x86 )
{
configure.log-library-search-result "boost.stacktrace.from_exception" : "no" ;
return <build>no ;
}
configure.log-library-search-result "boost.stacktrace.from_exception" : "yes" ;
}
lib boost_stacktrace_from_exception
@@ -160,12 +267,8 @@ lib boost_stacktrace_from_exception
# Enable build when explicitly requested, or by default, when on x86
<conditional>@build-stacktrace-from-exception
# Require usable libbacktrace on other platforms
#[ check-target-builds ../build//libbacktrace : : <build>no ]
: # default build
: # usage-requirements
#<link>shared:<define>BOOST_STACKTRACE_DYN_LINK=1
<define>BOOST_STACKTRACE_NO_LIB=1
;
boost-install boost_stacktrace_noop boost_stacktrace_backtrace boost_stacktrace_addr2line boost_stacktrace_basic boost_stacktrace_windbg boost_stacktrace_windbg_cached boost_stacktrace_from_exception ;

View File

@@ -1,4 +1,4 @@
// Copyright Antony Polukhin, 2016-2024.
// Copyright Antony Polukhin, 2016-2025.
//
// Distributed under the Boost Software License, Version 1.0. (See
// accompanying file LICENSE_1_0.txt or copy at

View File

@@ -1,4 +1,4 @@
# Copyright Antony Polukhin, 2016-2024.
# Copyright Antony Polukhin, 2016-2025.
# Use, modification, and distribution are
# subject to 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)
@@ -9,9 +9,9 @@ import doxygen ;
doxygen autodoc
:
[ glob ../../../boost/stacktrace.hpp ]
[ glob ../../../boost/stacktrace/*.hpp ]
[ glob ../../../boost/stacktrace/detail/frame_decl.hpp ]
[ glob ../include/boost/stacktrace.hpp ]
[ glob ../include/boost/stacktrace/*.hpp ]
[ glob ../include/boost/stacktrace/detail/frame_decl.hpp ]
:
<doxygen:param>EXTRACT_ALL=NO
<doxygen:param>HIDE_UNDOC_MEMBERS=YES

View File

@@ -2,7 +2,7 @@
[quickbook 1.6]
[version 1.0]
[id stacktrace]
[copyright 2016-2024 Antony Polukhin]
[copyright 2016-2025 Antony Polukhin]
[category Language Features Emulation]
[license
Distributed under the Boost Software License, Version 1.0.
@@ -68,7 +68,7 @@ Pretty often assertions provide not enough information to locate the problem. Fo
Aborted (core dumped)
```
That's not enough to locate the problem without debugger. There may be thousand code lines in real world examples and hundred places where that assertion could happen. Let's try to improve the assertions, and make them more informative:
That's not enough to locate the problem without debugger. There may be thousand code lines in real world examples and hundred places where that assertion can happen. Let's try to improve the assertions, and make them more informative:
[getting_started_assert_handlers]
@@ -163,7 +163,7 @@ int main() {
foo("test1");
bar("test2");
} catch (const std::exception& exc) {
boost::stacktrace::stacktrace trace = boost::stacktrace::from_current_exception(); // <---
boost::stacktrace::stacktrace trace = boost::stacktrace::stacktrace::from_current_exception(); // <---
std::cerr << "Caught exception: " << exc.what() << ", trace:\n" << trace;
}
}
@@ -236,7 +236,7 @@ Code from above will output:
[section Enabling and disabling stacktraces]
At some point arises a requirement to easily enable/disable stacktraces for a whole project. That could be easily achieved.
At some point arises a requirement to easily enable/disable stacktraces for a whole project. That can be easily achieved.
Just define *BOOST_STACKTRACE_LINK* for a whole project. Now you can enable/disable stacktraces by just linking with different libraries:
@@ -251,7 +251,7 @@ See [link stacktrace.configuration_and_build section "Configuration and Build"]
[section Saving stacktraces by specified format]
[classref boost::stacktrace::stacktrace] provides access to individual [classref boost::stacktrace::frame frames] of the stacktrace,
so that you could save stacktrace information in your own format. Consider the example, that saves only function addresses of each frame:
so that you can save stacktrace information in your own format. Consider the example, that saves only function addresses of each frame:
[getting_started_trace_addresses]
@@ -304,7 +304,63 @@ Terminate called:
[section Configuration and Build]
By default Boost.Stacktrace is a header-only library, but you may change that and use the following macros to improve build times or to be able to tune library without recompiling your project:
[section Usage from CMake]
CMake library `Boost::stacktrace` provides the best available implementation:
```
target_link_libraries(${PROJECT}
PUBLIC
Boost::stacktrace
)
```
There are also CMake libraries for fine grained selection of implementation:
* `Boost::stacktrace_windbg`
* `Boost::stacktrace_windbg_cached`
* `Boost::stacktrace_backtrace`
* `Boost::stacktrace_addr2line`
* `Boost::stacktrace_basic`
* `Boost::stacktrace_noop`
Note that `Boost::stacktrace_from_exception` is not used by default, so add it explicitly if its functionality is required:
```
target_link_libraries(${PROJECT} # your project
PUBLIC
Boost::stacktrace
Boost::stacktrace_from_exception
)
```
[endsect]
[section CMake build notes]
When building the Boost.Stacktrace libraries using `CMake` the `BOOST_STACKTRACE_ENABLE_*` options control the build. For example:
* `cmake -DBOOST_STACKTRACE_ENABLE_NOOP=0 -DBOOST_STACKTRACE_ENABLE_BACKTRACE=1 -DBOOST_STACKTRACE_ENABLE_FROM_EXCEPTION=1` - do not build the `noop` implementation and force the builds of `backtrace` and `from_exception`.
* `cmake -DBOOST_STACKTRACE_ENABLE_NOOP=1 -DBOOST_STACKTRACE_ENABLE_WINDBG=1 -DBOOST_STACKTRACE_ENABLE_WINDBG_CACHED=0` - build the `noop` and `windbg` implementations and disable the build of `windbg_cached`.
If options are not provided they are auto-detected and the result of detection is printed and implicitly used during build.
[endsect]
[section B2 build notes]
When building the Boost.Stacktrace libraries using `b2` the `boost.stacktrace.*` options can be used to control the build. For example:
* `b2 boost.stacktrace.noop=off boost.stacktrace.backtrace=on boost.stacktrace.from_exception=on` - do not build the `noop` implementation and force the builds of `backtrace` and `from_exception`.
* `b2 boost.stacktrace.noop=on boost.stacktrace.windbg=on boost.stacktrace.windbg_cached=off` - build the `noop` and `windbg` implementations and disable the build of `windbg_cached`.
If options are not provided they are auto-detected and the result of detection is printed and implicitly used during build.
[endsect]
[section Header only options]
If CMake is not used then the Boost.Stacktrace is a header-only library by default. To change that (to improve build times or to be able to tune library without recompiling your project) use the following macros:
[table:linkmacro Link macros
[[Macro name] [Effect]]
[[*BOOST_STACKTRACE_LINK*] [Disable header-only build and require linking with shared or static library that contains the tracing implementation. If *BOOST_ALL_DYN_LINK* is defined, then link with shared library.]]
@@ -312,13 +368,13 @@ By default Boost.Stacktrace is a header-only library, but you may change that an
]
In header only mode library could be tuned by macro. If one of the link macro from above is defined, you have to manually link with one of the libraries:
In header only mode library can be tuned by macro. If one of the link macro from above is defined, you have to manually link with one of the libraries:
[table:libconfig Config
[[Macro name or default] [Library] [Effect] [Platforms] [Uses debug information [footnote This will provide more readable backtraces with *source code locations* if the binary is built with debug information.]] [Uses dynamic exports information [footnote This will provide readable function names in backtrace for functions that are exported by the binary. Compiling with `-rdynamic` flag, without `-fvisibility=hidden` or marking functions as exported produce a better stacktraces.]] ]
[[['default for MSVC, Intel on Windows, MinGW-w64] / *BOOST_STACKTRACE_USE_WINDBG*] [*boost_stacktrace_windbg*] [ Uses `dbgeng.h` to show debug info, stores the implementation internals in a static varaible protected with mutex. May require linking with *ole32* and *dbgeng*. ] [MSVC, MinGW-w64, Intel on Windows] [yes] [no]]
[[['default for MSVC, Intel on Windows, MinGW-w64] / *BOOST_STACKTRACE_USE_WINDBG*] [*boost_stacktrace_windbg*] [ Uses `dbgeng.h` to show debug info, stores the implementation internals in a static variable protected with mutex. May require linking with *ole32* and *dbgeng*. ] [MSVC, MinGW-w64, Intel on Windows] [yes] [no]]
[[['default for other platforms]] [*boost_stacktrace_basic*] [Uses compiler intrinsics to collect stacktrace and if possible `::dladdr` to show information about the symbol. Requires linking with *libdl* library on POSIX platforms.] [Any compiler on POSIX or MinGW] [no] [yes]]
[[*BOOST_STACKTRACE_USE_WINDBG_CACHED*] [*boost_stacktrace_windbg_cached*] [ Uses `dbgeng.h` to show debug info and caches implementation internals in TLS for better performance. Useful only for cases when traces are gathered very often. May require linking with *ole32* and *dbgeng*. ] [MSVC, Intel on Windows] [yes] [no]]
[[*BOOST_STACKTRACE_USE_BACKTRACE*] [*boost_stacktrace_backtrace*] [Requires linking with *libdl* on POSIX and *libbacktrace* libraries[footnote Some *libbacktrace* packages SEGFAULT if there's a concurrent work with the same `backtrace_state` instance. To avoid that issue the Boost.Stacktrace library uses `thread_local` states, unfortunately this may consume a lot of memory if you often create and destroy execution threads in your application. Define *BOOST_STACKTRACE_BACKTRACE_FORCE_STATIC* to force single instance, but make sure that [@https://github.com/boostorg/stacktrace/blob/develop/test/thread_safety_checking.cpp thread_safety_checking.cpp] works well in your setup. ]. *libbacktrace* is probably already installed in your system[footnote If you are using Clang with libstdc++ you could get into troubles of including `<backtrace.h>`, because on some platforms Clang does not search for headers in the GCC's include paths and any attempt to add GCC's include path leads to linker errors. To explicitly specify a path to the `<backtrace.h>` header you could define the *BOOST_STACKTRACE_BACKTRACE_INCLUDE_FILE* to a full path to the header. For example on Ubuntu Xenial use the command line option *-DBOOST_STACKTRACE_BACKTRACE_INCLUDE_FILE=</usr/lib/gcc/x86_64-linux-gnu/5/include/backtrace.h>* while building with Clang. ], or built into your compiler.
[[*BOOST_STACKTRACE_USE_BACKTRACE*] [*boost_stacktrace_backtrace*] [Requires linking with *libdl* on POSIX and *libbacktrace* libraries[footnote Some *libbacktrace* packages SEGFAULT if there's a concurrent work with the same `backtrace_state` instance. To avoid that issue the Boost.Stacktrace library uses `thread_local` states, unfortunately this may consume a lot of memory if you often create and destroy execution threads in your application. Define *BOOST_STACKTRACE_BACKTRACE_FORCE_STATIC* to force single instance, but make sure that [@https://github.com/boostorg/stacktrace/blob/develop/test/thread_safety_checking.cpp thread_safety_checking.cpp] works well in your setup. ]. *libbacktrace* is probably already installed in your system[footnote If you are using Clang with libstdc++ you can get into troubles of including `<backtrace.h>`, because on some platforms Clang does not search for headers in the GCC's include paths and any attempt to add GCC's include path leads to linker errors. To explicitly specify a path to the `<backtrace.h>` header you can define the *BOOST_STACKTRACE_BACKTRACE_INCLUDE_FILE* to a full path to the header. For example on Ubuntu Xenial use the command line option *-DBOOST_STACKTRACE_BACKTRACE_INCLUDE_FILE=</usr/lib/gcc/x86_64-linux-gnu/5/include/backtrace.h>* while building with Clang. ], or built into your compiler.
Otherwise (if you are a *MinGW*/*MinGW-w64* user for example) it can be downloaded [@https://github.com/ianlancetaylor/libbacktrace from here] or [@https://github.com/gcc-mirror/gcc/tree/master/libbacktrace from here]. ] [Any compiler on POSIX, or MinGW, or MinGW-w64] [yes] [yes]]
[[*BOOST_STACKTRACE_USE_ADDR2LINE*] [*boost_stacktrace_addr2line*] [Use *addr2line* program to retrieve stacktrace. Requires linking with *libdl* library and `::fork` system call. Macro *BOOST_STACKTRACE_ADDR2LINE_LOCATION* must be defined to the absolute path to the addr2line executable if it is not located in /usr/bin/addr2line. ] [Any compiler on POSIX] [yes] [yes]]
@@ -331,6 +387,8 @@ In header only mode library could be tuned by macro. If one of the link macro fr
* if you wish to disable backtracing and *BOOST_STACKTRACE_LINK* is defined, you just need link with *-lboost_stacktrace_noop*
* if you wish to disable backtracing and you use the library in header only mode, you just need to define *BOOST_STACKTRACE_USE_NOOP* for the whole project and recompile it
[endsect]
[section MinGW and MinGW-w64 specific notes]
MinGW-w64 and MinGW (without -w64) users have to install libbacktrace for getting better stacktraces. Follow the instruction:
@@ -370,11 +428,11 @@ In theory, walking the stack without decoding and demangling should be async sig
In practice, it is not:
* Looks like a page fault while dumping the trace on a containerized/virtualized
Windows system has a chance to deadlock. Page fault could happen easily
Windows system has a chance to deadlock. Page fault can happen easily
as we have to write the dump either to memory or to a file.
* On POSIX systems a deadlock could happen if a signal is received when throwing
* On POSIX systems a deadlock can happen if a signal is received when throwing
an exception [@https://github.com/boostorg/stacktrace/issues/131 #131].
Theoretically this could be worked around by bypassing the mutex locking
Theoretically this can be worked around by bypassing the mutex locking
in C++-runtime at exception throw
([@https://github.com/userver-framework/userver/blob/4246909c99506d3ab34bd130a5154b4acc8e87de/core/src/engine/task/exception_hacks.cpp#L241-L244 sample implementation]
in the 🐙 userver framework), or by using a very modern runtime

View File

@@ -1,4 +1,4 @@
// Copyright Antony Polukhin, 2016-2024.
// Copyright Antony Polukhin, 2016-2025.
//
// Distributed under the Boost Software License, Version 1.0. (See
// accompanying file LICENSE_1_0.txt or copy at

View File

@@ -1,4 +1,4 @@
// Copyright Antony Polukhin, 2016-2024.
// Copyright Antony Polukhin, 2016-2025.
//
// Distributed under the Boost Software License, Version 1.0. (See
// accompanying file LICENSE_1_0.txt or copy at

View File

@@ -1,4 +1,4 @@
// Copyright Antony Polukhin, 2016-2024.
// Copyright Antony Polukhin, 2016-2025.
//
// Distributed under the Boost Software License, Version 1.0. (See
// accompanying file LICENSE_1_0.txt or copy at

View File

@@ -1,4 +1,4 @@
// Copyright Antony Polukhin, 2016-2024.
// Copyright Antony Polukhin, 2016-2025.
//
// Distributed under the Boost Software License, Version 1.0. (See
// accompanying file LICENSE_1_0.txt or copy at

View File

@@ -1,4 +1,4 @@
// Copyright Antony Polukhin, 2016-2024.
// Copyright Antony Polukhin, 2016-2025.
//
// Distributed under the Boost Software License, Version 1.0. (See
// accompanying file LICENSE_1_0.txt or copy at

View File

@@ -1,10 +1,10 @@
// Copyright Antony Polukhin, 2016-2024.
// Copyright Antony Polukhin, 2016-2025.
//
// 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_USER_CONFIG <libs/stacktrace/example/user_config.hpp>
#define BOOST_USER_CONFIG <example/user_config.hpp>
#include <boost/array.hpp>
#include <exception> // std::set_terminate, std::abort

View File

@@ -1,4 +1,4 @@
// Copyright Antony Polukhin, 2016-2024.
// Copyright Antony Polukhin, 2016-2025.
//
// Distributed under the Boost Software License, Version 1.0. (See
// accompanying file LICENSE_1_0.txt or copy at

View File

@@ -1,4 +1,4 @@
// Copyright Antony Polukhin, 2016-2024.
// Copyright Antony Polukhin, 2016-2025.
//
// Distributed under the Boost Software License, Version 1.0. (See
// accompanying file LICENSE_1_0.txt or copy at

View File

@@ -1,4 +1,4 @@
// Copyright Antony Polukhin, 2016-2024.
// Copyright Antony Polukhin, 2016-2025.
//
// Distributed under the Boost Software License, Version 1.0. (See
// accompanying file LICENSE_1_0.txt or copy at
@@ -18,6 +18,7 @@
#include <boost/stacktrace/detail/try_dec_convert.hpp>
#include <boost/core/demangle.hpp>
#include <cstdio>
#include <cstring>
#include <sys/types.h>
#include <sys/wait.h>
@@ -116,12 +117,14 @@ inline std::string addr2line(const char* flag, const void* addr) {
std::string res;
boost::stacktrace::detail::location_from_symbol loc(addr);
if (!loc.empty()) {
// For programs started through $PATH loc.name() is not absolute and
// addr2line will fail.
if (!loc.empty() && std::strchr(loc.name(), '/') != nullptr) {
res = loc.name();
} else {
res.resize(16);
int rlin_size = ::readlink("/proc/self/exe", &res[0], res.size() - 1);
while (rlin_size == static_cast<int>(res.size() - 1)) {
ssize_t rlin_size = ::readlink("/proc/self/exe", &res[0], res.size() - 1);
while (rlin_size == static_cast<ssize_t>(res.size() - 1)) {
res.resize(res.size() * 4);
rlin_size = ::readlink("/proc/self/exe", &res[0], res.size() - 1);
}
@@ -129,7 +132,7 @@ inline std::string addr2line(const char* flag, const void* addr) {
res.clear();
return res;
}
res.resize(rlin_size);
res.resize(static_cast<std::size_t>(rlin_size));
}
addr2line_pipe p(flag, res.c_str(), to_hex_array(addr).data());

View File

@@ -1,4 +1,4 @@
// Copyright Antony Polukhin, 2016-2024.
// Copyright Antony Polukhin, 2016-2025.
//
// Distributed under the Boost Software License, Version 1.0. (See
// accompanying file LICENSE_1_0.txt or copy at

View File

@@ -0,0 +1,72 @@
// Copyright Antony Polukhin, 2016-2025.
//
// 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_ADDR_BASE_MSVC_HPP
#define BOOST_STACKTRACE_DETAIL_ADDR_BASE_MSVC_HPP
#include <boost/config.hpp>
#ifdef BOOST_HAS_PRAGMA_ONCE
# pragma once
#endif
#include <cstdio>
#include <memory>
#ifdef WIN32_LEAN_AND_MEAN
#include <windows.h>
#include <psapi.h>
#else
// Prevent inclusion of extra Windows SDK headers which can cause conflict
// with other code using Windows SDK
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#include <psapi.h>
#undef WIN32_LEAN_AND_MEAN
#endif
namespace boost { namespace stacktrace { namespace detail {
inline std::uintptr_t get_own_proc_addr_base(const void* addr) {
// Try to avoid allocating memory for the modules array if possible.
// The stack buffer should be large enough for most processes.
HMODULE modules_stack[1024];
std::unique_ptr<HMODULE[]> modules_allocated;
HMODULE* modules = modules_stack;
DWORD needed_bytes = 0;
std::uintptr_t addr_base = 0;
HANDLE process_handle = GetCurrentProcess();
auto enum_process_is_ok = EnumProcessModules(process_handle, modules, sizeof(modules), &needed_bytes);
// Check if the error is because the buffer is too small.
if (!enum_process_is_ok && GetLastError() == ERROR_INSUFFICIENT_BUFFER) {
modules_allocated.reset(new HMODULE[needed_bytes / sizeof(HMODULE)]);
modules = modules_allocated.get();
enum_process_is_ok = EnumProcessModules(process_handle, modules, needed_bytes, &needed_bytes);
}
if (enum_process_is_ok) {
for (std::size_t i = 0; i < (needed_bytes / sizeof(HMODULE)); ++i) {
MODULEINFO module_info;
// Get the module name
if (GetModuleInformation(process_handle, modules[i], &module_info, sizeof(module_info))
&& module_info.lpBaseOfDll <= addr && addr < LPBYTE(module_info.lpBaseOfDll) + module_info.SizeOfImage) {
// Module contains the address
addr_base = reinterpret_cast<std::uintptr_t>(module_info.lpBaseOfDll);
break;
}
}
}
CloseHandle(process_handle);
return addr_base;
}
}}} // namespace boost::stacktrace::detail
#endif // BOOST_STACKTRACE_DETAIL_ADDR_BASE_MSVC_HPP

View File

@@ -1,4 +1,4 @@
// Copyright Antony Polukhin, 2016-2024.
// Copyright Antony Polukhin, 2016-2025.
//
// Distributed under the Boost Software License, Version 1.0. (See
// accompanying file LICENSE_1_0.txt or copy at

View File

@@ -1,4 +1,4 @@
// Copyright Antony Polukhin, 2016-2024.
// Copyright Antony Polukhin, 2016-2025.
//
// Distributed under the Boost Software License, Version 1.0. (See
// accompanying file LICENSE_1_0.txt or copy at

View File

@@ -1,4 +1,4 @@
// Copyright Antony Polukhin, 2016-2024.
// Copyright Antony Polukhin, 2016-2025.
//
// Distributed under the Boost Software License, Version 1.0. (See
// accompanying file LICENSE_1_0.txt or copy at
@@ -88,7 +88,7 @@ std::size_t this_thread_frames::collect(native_frame_ptr_t* out_frames, std::siz
#else
boost::stacktrace::detail::unwind_state state = { skip, out_frames, out_frames + max_frames_count };
::_Unwind_Backtrace(&boost::stacktrace::detail::unwind_callback, &state);
frames_count = state.current - out_frames;
frames_count = static_cast<std::size_t>(state.current - out_frames);
#endif //defined(BOOST_STACKTRACE_USE_LIBC_BACKTRACE_FUNCTION)
if (frames_count && out_frames[frames_count - 1] == 0) {

View File

@@ -1,4 +1,4 @@
// Copyright Antony Polukhin, 2016-2024.
// Copyright Antony Polukhin, 2016-2025.
//
// Distributed under the Boost Software License, Version 1.0. (See
// accompanying file LICENSE_1_0.txt or copy at

View File

@@ -1,4 +1,4 @@
// Copyright Antony Polukhin, 2016-2024.
// Copyright Antony Polukhin, 2016-2025.
//
// Distributed under the Boost Software License, Version 1.0. (See
// accompanying file LICENSE_1_0.txt or copy at
@@ -19,6 +19,10 @@
#include <boost/stacktrace/detail/to_dec_array.hpp>
#include <boost/stacktrace/detail/to_hex_array.hpp>
#ifndef BOOST_STACKTRACE_DISABLE_OFFSET_ADDR_BASE
#include <boost/stacktrace/detail/addr_base_msvc.hpp>
#endif
#ifdef WIN32_LEAN_AND_MEAN
#include <windows.h>
#else
@@ -33,7 +37,7 @@
#include <mutex>
#ifdef BOOST_MSVC
#if defined(__clang__) || defined(BOOST_MSVC)
# pragma comment(lib, "ole32.lib")
# pragma comment(lib, "Dbgeng.lib")
#endif
@@ -247,6 +251,57 @@ public:
const std::size_t delimiter = result.find_first_of('!');
if (module_name) {
*module_name = result.substr(0, delimiter);
if (!module_name->empty()) {
ULONG64 base = 0;
res = (S_OK == idebug_->GetModuleByOffset(
offset,
0,
nullptr,
&base
));
if (res) {
name[0] = '\0';
size = 0;
res = (S_OK == idebug_->GetModuleNames(
DEBUG_ANY_ID,
base,
name,
sizeof(name),
&size,
nullptr,
0,
nullptr,
nullptr,
0,
nullptr
));
}
if (!res && size != 0)
{
std::string module_path(size, char());
res = (S_OK == idebug_->GetModuleNames(
DEBUG_ANY_ID,
base,
&module_path[0],
static_cast<ULONG>(module_path.size()),
&size,
nullptr,
0,
nullptr,
nullptr,
0,
nullptr
));
if (res && size > 1) {
module_name->assign(module_path, size - 1);
}
}
else if (res && size > 1) {
module_name->assign(name, size - 1);
}
}
}
if (delimiter == std::string::npos) {
@@ -340,7 +395,13 @@ public:
if (!name.empty()) {
res += name;
} else {
#ifdef BOOST_STACKTRACE_DISABLE_OFFSET_ADDR_BASE
res += to_hex_array(addr).data();
#else
// Get own base address
const uintptr_t base_addr = get_own_proc_addr_base(addr);
res += to_hex_array(reinterpret_cast<uintptr_t>(addr) - base_addr).data();
#endif
}
std::pair<std::string, std::size_t> source_line = this->get_source_file_line_impl(addr);

View File

@@ -1,4 +1,4 @@
// Copyright Antony Polukhin, 2016-2024.
// Copyright Antony Polukhin, 2016-2025.
//
// Distributed under the Boost Software License, Version 1.0. (See
// accompanying file LICENSE_1_0.txt or copy at

View File

@@ -1,4 +1,4 @@
// Copyright Antony Polukhin, 2016-2024.
// Copyright Antony Polukhin, 2016-2025.
//
// Distributed under the Boost Software License, Version 1.0. (See
// accompanying file LICENSE_1_0.txt or copy at
@@ -17,6 +17,7 @@
#include <boost/stacktrace/detail/to_hex_array.hpp>
#include <boost/stacktrace/detail/location_from_symbol.hpp>
#include <boost/stacktrace/detail/to_dec_array.hpp>
#include <boost/stacktrace/detail/addr_base.hpp>
#include <boost/core/demangle.hpp>
#include <cstdio>
@@ -40,7 +41,12 @@ public:
if (!Base::res.empty()) {
Base::res = boost::core::demangle(Base::res.c_str());
} else {
#ifdef BOOST_STACKTRACE_DISABLE_OFFSET_ADDR_BASE
Base::res = to_hex_array(addr).data();
#else
const auto addr_base = boost::stacktrace::detail::get_own_proc_addr_base(addr);
Base::res = to_hex_array(reinterpret_cast<uintptr_t>(addr) - addr_base).data();
#endif
}
if (Base::prepare_source_location(addr)) {

View File

@@ -1,4 +1,4 @@
// Copyright Antony Polukhin, 2016-2024.
// Copyright Antony Polukhin, 2016-2025.
//
// Distributed under the Boost Software License, Version 1.0. (See
// accompanying file LICENSE_1_0.txt or copy at
@@ -52,7 +52,7 @@ inline int libbacktrace_full_callback(void *data, uintptr_t /*pc*/, const char *
if (d.function && function) {
*d.function = function;
}
d.line = lineno;
d.line = static_cast<std::size_t>(lineno);
return 0;
}

View File

@@ -1,4 +1,4 @@
// Copyright Antony Polukhin, 2016-2024.
// Copyright Antony Polukhin, 2016-2025.
//
// Distributed under the Boost Software License, Version 1.0. (See
// accompanying file LICENSE_1_0.txt or copy at

View File

@@ -1,4 +1,4 @@
// Copyright Antony Polukhin, 2016-2024.
// Copyright Antony Polukhin, 2016-2025.
//
// Distributed under the Boost Software License, Version 1.0. (See
// accompanying file LICENSE_1_0.txt or copy at

View File

@@ -1,4 +1,4 @@
// Copyright Antony Polukhin, 2016-2024.
// Copyright Antony Polukhin, 2016-2025.
//
// Distributed under the Boost Software License, Version 1.0. (See
// accompanying file LICENSE_1_0.txt or copy at
@@ -11,7 +11,11 @@
# define BOOST_STACKTRACE_LINK
#endif
#if defined(BOOST_STACKTRACE_LINK) && !defined(BOOST_STACKTRACE_DYN_LINK) && defined(BOOST_ALL_DYN_LINK)
#if !defined(BOOST_STACKTRACE_LINK) && defined(BOOST_STACKTRACE_STATIC_LINK)
# define BOOST_STACKTRACE_LINK
#endif
#if defined(BOOST_STACKTRACE_LINK) && !defined(BOOST_STACKTRACE_DYN_LINK) && !defined(BOOST_STACKTRACE_STATIC_LINK) && defined(BOOST_ALL_DYN_LINK)
# define BOOST_STACKTRACE_DYN_LINK
#endif

View File

@@ -1,4 +1,4 @@
// Copyright Antony Polukhin, 2016-2024.
// Copyright Antony Polukhin, 2016-2025.
//
// Distributed under the Boost Software License, Version 1.0. (See
// accompanying file LICENSE_1_0.txt or copy at

View File

@@ -1,4 +1,4 @@
// Copyright Antony Polukhin, 2016-2024.
// Copyright Antony Polukhin, 2016-2025.
//
// Distributed under the Boost Software License, Version 1.0. (See
// accompanying file LICENSE_1_0.txt or copy at

View File

@@ -1,4 +1,4 @@
// Copyright Antony Polukhin, 2016-2024.
// Copyright Antony Polukhin, 2016-2025.
//
// Distributed under the Boost Software License, Version 1.0. (See
// accompanying file LICENSE_1_0.txt or copy at

View File

@@ -1,4 +1,4 @@
// Copyright Antony Polukhin, 2016-2024.
// Copyright Antony Polukhin, 2016-2025.
//
// Distributed under the Boost Software License, Version 1.0. (See
// accompanying file LICENSE_1_0.txt or copy at

View File

@@ -1,4 +1,4 @@
// Copyright Antony Polukhin, 2016-2024.
// Copyright Antony Polukhin, 2016-2025.
//
// Distributed under the Boost Software License, Version 1.0. (See
// accompanying file LICENSE_1_0.txt or copy at

View File

@@ -1,4 +1,4 @@
// Copyright Antony Polukhin, 2016-2024.
// Copyright Antony Polukhin, 2016-2025.
//
// Distributed under the Boost Software License, Version 1.0. (See
// accompanying file LICENSE_1_0.txt or copy at

View File

@@ -1,4 +1,4 @@
// Copyright Antony Polukhin, 2016-2024.
// Copyright Antony Polukhin, 2016-2025.
//
// Distributed under the Boost Software License, Version 1.0. (See
// accompanying file LICENSE_1_0.txt or copy at

View File

@@ -1,5 +1,5 @@
// Copyright 2014 Renato Tegon Forti, Antony Polukhin.
// Copyright Antony Polukhin, 2015-2024.
// Copyright Antony Polukhin, 2015-2025.
//
// Distributed under the Boost Software License, Version 1.0.
// (See accompanying file LICENSE_1_0.txt

View File

@@ -1,4 +1,4 @@
// Copyright Antony Polukhin, 2016-2024.
// Copyright Antony Polukhin, 2016-2025.
//
// Distributed under the Boost Software License, Version 1.0. (See
// accompanying file LICENSE_1_0.txt or copy at
@@ -20,6 +20,20 @@
#include <boost/stacktrace/detail/frame_decl.hpp>
#include <boost/stacktrace/detail/push_options.h>
#if defined(BOOST_MSVC) && (defined(BOOST_STACKTRACE_INTERNAL_BUILD_LIBS) || !defined(BOOST_STACKTRACE_LINK))
extern "C" {
#if defined(BOOST_STACKTRACE_DYN_LINK)
BOOST_SYMBOL_EXPORT
#elif defined(BOOST_STACKTRACE_LINK)
#else
BOOST_SYMBOL_EXPORT inline
#endif
void* boost_stacktrace_impl_return_nullptr() { return nullptr; }
}
#endif
namespace boost { namespace stacktrace {
/// Comparison operators that provide platform dependant ordering and have O(1) complexity; are Async-Handler-Safe.

View File

@@ -1,4 +1,4 @@
// Copyright Antony Polukhin, 2016-2024.
// Copyright Antony Polukhin, 2016-2025.
//
// Distributed under the Boost Software License, Version 1.0. (See
// accompanying file LICENSE_1_0.txt or copy at

View File

@@ -1,4 +1,4 @@
// Copyright Antony Polukhin, 2016-2024.
// Copyright Antony Polukhin, 2016-2025.
//
// Distributed under the Boost Software License, Version 1.0. (See
// accompanying file LICENSE_1_0.txt or copy at
@@ -37,7 +37,6 @@
extern "C" {
BOOST_SYMBOL_EXPORT inline void* boost_stacktrace_impl_return_nullptr() { return nullptr; }
const char* boost_stacktrace_impl_current_exception_stacktrace();
bool* boost_stacktrace_impl_ref_capture_stacktraces_at_throw();

View File

@@ -1,4 +1,4 @@
// Copyright Antony Polukhin, 2016-2024.
// Copyright Antony Polukhin, 2016-2025.
//
// Distributed under the Boost Software License, Version 1.0. (See
// accompanying file LICENSE_1_0.txt or copy at

View File

@@ -1,4 +1,4 @@
// Copyright Antony Polukhin, 2023-2024.
// Copyright Antony Polukhin, 2023-2025.
//
// Distributed under the Boost Software License, Version 1.0. (See
// accompanying file LICENSE_1_0.txt or copy at

View File

@@ -1,4 +1,4 @@
// Copyright Antony Polukhin, 2023-2024.
// Copyright Antony Polukhin, 2023-2025.
//
// Distributed under the Boost Software License, Version 1.0. (See
// accompanying file LICENSE_1_0.txt or copy at

View File

@@ -1,10 +1,10 @@
// Copyright Antony Polukhin, 2023-2024.
// Copyright Antony Polukhin, 2023-2025.
//
// 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)
#if defined(_MSC_VER)
#if defined(__MINGW32__) || defined(_MSC_VER)
#include <boost/stacktrace/safe_dump_to.hpp>
#include <windows.h>
@@ -157,6 +157,7 @@ BOOST_SYMBOL_EXPORT void assert_no_pending_traces() noexcept {
#include <boost/stacktrace/safe_dump_to.hpp>
#include <cstddef>
#include <exception>
#include <dlfcn.h>
#if !BOOST_STACKTRACE_ALWAYS_STORE_IN_PADDING

View File

@@ -4,6 +4,10 @@
// accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
#ifndef _GNU_SOURCE
# define _GNU_SOURCE
#endif
#define BOOST_STACKTRACE_INTERNAL_BUILD_LIBS
#define BOOST_STACKTRACE_LINK
#include <boost/stacktrace/detail/frame_msvc.ipp>

View File

@@ -4,6 +4,10 @@
// accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
#ifndef _GNU_SOURCE
# define _GNU_SOURCE
#endif
#define BOOST_STACKTRACE_INTERNAL_BUILD_LIBS
#define BOOST_STACKTRACE_LINK
#define BOOST_STACKTRACE_USE_WINDBG_CACHED

View File

@@ -8,8 +8,7 @@ if(NOT HAVE_BOOST_TEST)
return()
endif()
# This test doesn't work with stacktrace_basic
# boost_test(TYPE run SOURCES test.cpp test_impl.cpp Boost::stacktrace_basic Boost::core)
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)
boost_test(TYPE run SOURCES test_trivial.cpp LINK_LIBRARIES Boost::stacktrace_basic Boost::core)
boost_test(TYPE run SOURCES test_trivial.cpp LINK_LIBRARIES Boost::stacktrace Boost::core)

View File

@@ -5,7 +5,9 @@
# http://www.boost.org/LICENSE_1_0.txt)
#
import ../../config/checks/config : requires ;
import-search /boost/config/checks ;
import config : requires ;
import testing ;
lib dl : : <link>shared ;
lib gcc_s ;
@@ -31,6 +33,8 @@ project
<warnings>all
<test-info>always_show_run_output
<visibility>hidden
<include>..
<library>/boost/optional//boost_optional
;
local FORCE_SYMBOL_EXPORT = <target-os>freebsd:<linkflags>"-rdynamic" <target-os>solaris:<linkflags>"-Bdynamic" <target-os>aix:<linkflags>"-rdynamic"
@@ -122,15 +126,19 @@ test-suite stacktrace_tests
[ run thread_safety_checking.cpp
: : : <debug-symbols>on <library>.//test_impl_lib_backtrace $(LINKSHARED_BT)
<define>BOOST_STACKTRACE_BACKTRACE_FORCE_STATIC
<library>/boost/optional//boost_optional
: backtrace_lib_threaded_static ]
[ run thread_safety_checking.cpp
: : : <debug-symbols>on <library>.//test_impl_lib_windbg $(LINKSHARED_WIND)
<library>/boost/optional//boost_optional
: windbg_lib_threaded ]
[ run thread_safety_checking.cpp
: : : <debug-symbols>on <library>.//test_impl_lib_windbg_cached $(LINKSHARED_WIND_CACHED)
<library>/boost/optional//boost_optional
: windbg_cached_lib_threaded ]
[ run thread_safety_checking.cpp
: : : <debug-symbols>on <library>.//test_impl_lib_basic $(LINKSHARED_BASIC)
<library>/boost/optional//boost_optional
: basic_lib_threaded ]
##### Tests with disabled debug symbols #####
@@ -158,6 +166,7 @@ test-suite stacktrace_tests
[ run thread_safety_checking.cpp
: : : <debug-symbols>off
<library>.//test_impl_lib_backtrace_no_dbg
<library>/boost/optional//boost_optional
$(LINKSHARED_BT)
: backtrace_lib_no_dbg_threaded ]
[ run thread_safety_checking.cpp
@@ -179,6 +188,8 @@ test-suite stacktrace_tests
[ run test_void_ptr_cast.cpp ]
[ run test_num_conv.cpp ]
[ run test_from_exception_none.cpp : : : $(LINKSHARED_NOOP) <debug-symbols>on : from_exception_none_noop ]
[ run test_from_exception_none.cpp : : : <define>BOOST_STACKTRACE_USE_NOOP $(NOOP_DEPS) <debug-symbols>on : from_exception_none_noop_ho ]
[ run test_from_exception_none.cpp : : : $(LINKSHARED_BASIC) <debug-symbols>on : from_exception_none_basic ]
[ run test_from_exception_none.cpp : : : $(FORCE_SYMBOL_EXPORT) $(BASIC_DEPS) <debug-symbols>on : from_exception_none_basic_ho ]
[ run test_from_exception_none.cpp : : : $(LINKSHARED_BT) <debug-symbols>on : from_exception_none_bt ]
@@ -188,6 +199,8 @@ test-suite stacktrace_tests
[ run test_from_exception_none.cpp : : : $(LINKSHARED_WIND_CACHED) <debug-symbols>on : from_exception_none_windbg_cached ]
[ run test_from_exception_none.cpp : : : <define>BOOST_STACKTRACE_USE_WINDBG_CACHED $(WICA_DEPS) <debug-symbols>on : from_exception_none_windbg_cached_ho ]
[ run test_from_exception_none.cpp : : : <library>/boost/stacktrace//boost_stacktrace_from_exception $(LINKSHARED_NOOP) <debug-symbols>on : from_exception_disabled_none ]
[ run test_from_exception_none.cpp : : : <library>/boost/stacktrace//boost_stacktrace_from_exception <define>BOOST_STACKTRACE_USE_NOOP $(NOOP_DEPS) : from_exception_disabled_none_ho ]
[ run test_from_exception_none.cpp : : : <library>/boost/stacktrace//boost_stacktrace_from_exception $(LINKSHARED_BASIC) <debug-symbols>on : from_exception_disabled_basic ]
[ run test_from_exception_none.cpp : : : <library>/boost/stacktrace//boost_stacktrace_from_exception $(FORCE_SYMBOL_EXPORT) $(BASIC_DEPS) <debug-symbols>on : from_exception_disabled_basic_ho ]
[ run test_from_exception_none.cpp : : : <library>/boost/stacktrace//boost_stacktrace_from_exception $(LINKSHARED_BT) <debug-symbols>on : from_exception_disabled_bt ]
@@ -212,15 +225,15 @@ test-suite stacktrace_tests
for local p in [ glob ../example/*.cpp ]
{
local target_name = $(p[1]:B) ;
local additional_dependency = ;
local additional_dependency = <library>/boost/array//boost_array ;
if $(target_name) = "terminate_handler"
{
additional_dependency = <library>/boost/filesystem//boost_filesystem <library>/boost/system//boost_system <target-os>linux:<library>rt ;
additional_dependency += <library>/boost/filesystem//boost_filesystem <library>/boost/system//boost_system <target-os>linux:<library>rt ;
}
if $(target_name) = "throwing_st"
{
additional_dependency = [ requires rtti ] ;
additional_dependency += [ requires rtti ] <library>/boost/exception//boost_exception ;
}
stacktrace_tests += [ run $(p) : : : <debug-symbols>on $(LINKSHARED_BT) $(additional_dependency) : backtrace_$(p2[1]:B) ] ;

View File

@@ -2,7 +2,7 @@
# subject to 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)
#
# Copyright Antony Polukhin, 2016-2024.
# Copyright Antony Polukhin, 2016-2025.
#
# See https://svn.boost.org/trac/boost/wiki/TravisCoverals for description of this file
@@ -21,7 +21,7 @@ init:
# From this point and below code is same for all the Boost libs
###############################################################################################################
version: 1.84.{build}-{branch}
version: 1.88.{build}-{branch}
# branches to build
branches:
@@ -63,13 +63,10 @@ before_build:
- git clone -b %BOOST_BRANCH% --depth 10 https://github.com/boostorg/boost.git %BOOST%
- cd %BOOST%
- git submodule update --init --depth 10 tools/build tools/boostdep
libs/filesystem libs/atomic libs/system libs/interprocess libs/array
libs/iterator libs/detail libs/exception libs/smart_ptr libs/mpl
libs/align libs/container libs/tuple libs/intrusive libs/scope
- rm -rf %BOOST%/libs/%BOOST_LIBS_FOLDER%
- mv -f %APPVEYOR_BUILD_FOLDER% %BOOST%/libs/%BOOST_LIBS_FOLDER%
- python tools/boostdep/depinst/depinst.py --git_args "--depth 10 --jobs 2" %BOOST_LIBS_FOLDER%
- python tools/boostdep/depinst/depinst.py --include example --git_args "--depth 10 --jobs 2" %BOOST_LIBS_FOLDER%
build_script:
- cmd /c bootstrap

View File

@@ -6,10 +6,10 @@ cmake_minimum_required(VERSION 3.5...3.20)
project(cmake_install_test LANGUAGES CXX)
find_package(boost_stacktrace_basic REQUIRED)
find_package(boost_stacktrace REQUIRED)
add_executable(main main.cpp)
target_link_libraries(main Boost::stacktrace_basic)
target_link_libraries(main Boost::stacktrace)
enable_testing()
add_test(main main)

View File

@@ -1,5 +1,5 @@
// Copyright 2019 Peter Dimov
// Copyright 2022-2024 Antony Polukhin
// Copyright 2022-2025 Antony Polukhin
// Distributed under the Boost Software License, Version 1.0.
// https://www.boost.org/LICENSE_1_0.txt

View File

@@ -40,7 +40,7 @@ foreach(dep IN LISTS deps)
endforeach()
add_executable(main main.cpp)
target_link_libraries(main Boost::stacktrace_basic)
target_link_libraries(main Boost::stacktrace)
enable_testing()
add_test(main main)

View File

@@ -1,5 +1,5 @@
// Copyright 2019 Peter Dimov
// Copyright 2022-2024 Antony Polukhin
// Copyright 2022-2025 Antony Polukhin
// Distributed under the Boost Software License, Version 1.0.
// https://www.boost.org/LICENSE_1_0.txt

View File

@@ -1,4 +1,4 @@
// Copyright Antony Polukhin, 2016-2024.
// Copyright Antony Polukhin, 2016-2025.
//
// Distributed under the Boost Software License, Version 1.0. (See
// accompanying file LICENSE_1_0.txt or copy at
@@ -8,6 +8,7 @@
#include <boost/stacktrace.hpp>
#include <stdexcept>
#include <fstream>
#include <iostream>
#include <sstream>
#include <cctype>
@@ -257,7 +258,57 @@ void test_empty_basic_stacktrace() {
BOOST_TEST(!(st > st_t(0, 0)));
}
int main() {
void test_stacktrace_limits()
{
BOOST_TEST_EQ(boost::stacktrace::stacktrace(0, 1).size(), 1);
BOOST_TEST_EQ(boost::stacktrace::stacktrace(1, 1).size(), 1);
}
std::size_t get_file_size(const char* file_name) {
std::ifstream file(file_name, std::ios::binary | std::ios::ate);
const auto file_size = file.tellg();
BOOST_TEST(file_size > 0);
return static_cast<std::size_t>(file_size);
}
uintptr_t get_address_from_frame(const std::string& frame) {
std::size_t address = 0;
std::string hex_address;
std::size_t pos = frame.find("0x");
if (pos != std::string::npos) {
// Extract the hex address substring
hex_address = frame.substr(pos + 2); // Skip "0x"
// Convert hex string to std::size_t
std::stringstream ss;
ss << std::hex << hex_address;
ss >> address;
}
return address;
}
void test_relative_virtual_address(const char* file_path)
{
const auto frame = to_string(boost::stacktrace::stacktrace(0, 1).as_vector().front());
// Skip the test if the frame does not contain an address
if (frame.find("0x") == std::string::npos) {
return;
}
const auto file_size = get_file_size(file_path);
BOOST_TEST(file_size > 0);
const auto address = get_address_from_frame(frame);
BOOST_TEST(address > 0);
// Verify that the address is within the binary
BOOST_TEST(address <= file_size);
}
int main(const int, const char* argv[]) {
test_deeply_nested_namespaces();
test_frames_string_data_validity();
test_nested<15>();
@@ -275,8 +326,9 @@ int main() {
test_comparisons_base(make_some_stacktrace1(), make_some_stacktrace2());
test_nested<260>(false);
BOOST_TEST(boost::stacktrace::stacktrace(0, 1).size() == 1);
BOOST_TEST(boost::stacktrace::stacktrace(1, 1).size() == 1);
test_stacktrace_limits();
test_relative_virtual_address(argv[0]);
return boost::report_errors();
}

View File

@@ -1,4 +1,4 @@
// Copyright Antony Polukhin, 2023-2024.
// Copyright Antony Polukhin, 2023-2025.
//
// Distributed under the Boost Software License, Version 1.0. (See
// accompanying file LICENSE_1_0.txt or copy at

View File

@@ -1,4 +1,4 @@
// Copyright Antony Polukhin, 2023-2024.
// Copyright Antony Polukhin, 2023-2025.
//
// Distributed under the Boost Software License, Version 1.0. (See
// accompanying file LICENSE_1_0.txt or copy at

View File

@@ -1,4 +1,4 @@
// Copyright Antony Polukhin, 2016-2024.
// Copyright Antony Polukhin, 2016-2025.
//
// Distributed under the Boost Software License, Version 1.0. (See
// accompanying file LICENSE_1_0.txt or copy at

View File

@@ -1,4 +1,4 @@
// Copyright Antony Polukhin, 2016-2024.
// Copyright Antony Polukhin, 2016-2025.
//
// Distributed under the Boost Software License, Version 1.0. (See
// accompanying file LICENSE_1_0.txt or copy at

View File

@@ -1,4 +1,4 @@
// Copyright Antony Polukhin, 2016-2024.
// Copyright Antony Polukhin, 2016-2025.
//
// Distributed under the Boost Software License, Version 1.0. (See
// accompanying file LICENSE_1_0.txt or copy at

View File

@@ -1,4 +1,4 @@
// Copyright Antony Polukhin, 2016-2024.
// Copyright Antony Polukhin, 2016-2025.
//
// Distributed under the Boost Software License, Version 1.0. (See
// accompanying file LICENSE_1_0.txt or copy at

View File

@@ -1,4 +1,4 @@
// Copyright Antony Polukhin, 2022-2024.
// Copyright Antony Polukhin, 2022-2025.
//
// Distributed under the Boost Software License, Version 1.0. (See
// accompanying file LICENSE_1_0.txt or copy at

View File

@@ -1,4 +1,4 @@
// Copyright Antony Polukhin, 2016-2024.
// Copyright Antony Polukhin, 2016-2025.
//
// Distributed under the Boost Software License, Version 1.0. (See
// accompanying file LICENSE_1_0.txt or copy at