mirror of
https://github.com/boostorg/stacktrace.git
synced 2026-01-30 20:32:08 +00:00
CI fixes (#153)
* Update thread_safety_checking.cpp to use Standard Library types * Remove MinGW runs due to https://github.com/boostorg/system/issues/116 * Delete the shared memory example sources
This commit is contained in:
3
.github/workflows/ci.yml
vendored
3
.github/workflows/ci.yml
vendored
@@ -27,8 +27,7 @@ jobs:
|
||||
- toolset: gcc-9
|
||||
cxxstd: "03,11,14,17,2a"
|
||||
os: ubuntu-22.04
|
||||
- toolset: clang
|
||||
compiler: clang++-14
|
||||
- toolset: clang-15
|
||||
cxxstd: "03,11,14,17,2a"
|
||||
os: ubuntu-22.04
|
||||
# TODO: fix and uncomment
|
||||
|
||||
@@ -295,43 +295,6 @@ Terminate called:
|
||||
|
||||
[endsect]
|
||||
|
||||
[/
|
||||
[section Store stacktraces into shared memory]
|
||||
|
||||
There's a way to serialize stacktrace in async safe manner and share that serialized representation with another process. Here's another example with signal handlers.
|
||||
|
||||
This example is very close to the [link stacktrace.getting_started.handle_terminates_aborts_and_seg "Handle terminates, aborts and Segmentation Faults"], but this time we are dumping stacktrace into shared memory:
|
||||
|
||||
[getting_started_terminate_handlers_shmem]
|
||||
|
||||
After registering signal handlers and catching a signal, we may print stacktrace dumps on program restart:
|
||||
|
||||
[getting_started_on_program_restart_shmem]
|
||||
|
||||
The program output will be the following:
|
||||
|
||||
```
|
||||
Previous run crashed and left trace in shared memory:
|
||||
0# 0x00007FD51C7218EF
|
||||
1# my_signal_handler2(int) at ../example/terminate_handler.cpp:68
|
||||
2# 0x00007FD51B833CB0
|
||||
3# 0x00007FD51B833C37
|
||||
4# 0x00007FD51B837028
|
||||
5# 0x00007FD51BE44BBD
|
||||
6# 0x00007FD51BE42B96
|
||||
7# 0x00007FD51BE42BE1
|
||||
8# bar(int) at ../example/terminate_handler.cpp:18
|
||||
9# foo(int) at ../example/terminate_handler.cpp:22
|
||||
10# bar(int) at ../example/terminate_handler.cpp:14
|
||||
11# foo(int) at ../example/terminate_handler.cpp:22
|
||||
12# run_3(char const**) at ../example/terminate_handler.cpp:152
|
||||
13# main at ../example/terminate_handler.cpp:207
|
||||
14# 0x00007FD51B81EF45
|
||||
15# 0x0000000000402999
|
||||
```
|
||||
|
||||
[endsect]
|
||||
]
|
||||
|
||||
[endsect]
|
||||
|
||||
|
||||
@@ -63,33 +63,12 @@ void my_terminate_handler() {
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
BOOST_CONSTEXPR_OR_CONST std::size_t shared_memory_size = 4096 * 8;
|
||||
|
||||
//[getting_started_terminate_handlers_shmem
|
||||
#include <boost/stacktrace.hpp>
|
||||
#include <boost/interprocess/shared_memory_object.hpp>
|
||||
#include <boost/interprocess/mapped_region.hpp>
|
||||
|
||||
boost::interprocess::shared_memory_object g_shm; // inited at program start
|
||||
boost::interprocess::mapped_region g_region; // inited at program start
|
||||
|
||||
|
||||
void my_signal_handler2(int signum) {
|
||||
::signal(signum, SIG_DFL);
|
||||
void** f = static_cast<void**>(g_region.get_address());
|
||||
*f = reinterpret_cast<void*>(1); // Setting flag that shared memory now contains stacktrace.
|
||||
boost::stacktrace::safe_dump_to(f + 1, g_region.get_size() - sizeof(void*));
|
||||
|
||||
::raise(SIGABRT);
|
||||
}
|
||||
//]
|
||||
|
||||
#include <iostream> // std::cerr
|
||||
#include <fstream> // std::ifstream
|
||||
#include <boost/filesystem/path.hpp>
|
||||
#include <boost/filesystem/operations.hpp>
|
||||
|
||||
|
||||
#ifndef BOOST_WINDOWS
|
||||
inline void copy_and_run(const char* exec_name, char param, bool not_null) {
|
||||
std::cout << "Running with param " << param << std::endl;
|
||||
boost::filesystem::path command = exec_name;
|
||||
@@ -110,6 +89,7 @@ inline void copy_and_run(const char* exec_name, char param, bool not_null) {
|
||||
std::exit(ret);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
int run_0(const char* /*argv*/[]) {
|
||||
//[getting_started_setup_terminate_handlers
|
||||
@@ -160,67 +140,6 @@ int run_2(const char* argv[]) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
int run_3(const char* /*argv*/[]) {
|
||||
using namespace boost::interprocess;
|
||||
{
|
||||
shared_memory_object shm_obj(open_or_create, "shared_memory", read_write);
|
||||
shm_obj.swap(g_shm);
|
||||
}
|
||||
g_shm.truncate(shared_memory_size);
|
||||
|
||||
{
|
||||
mapped_region m(g_shm, read_write, 0, shared_memory_size);
|
||||
m.swap(g_region);
|
||||
}
|
||||
void** f = static_cast<void**>(g_region.get_address());
|
||||
*f = 0;
|
||||
|
||||
::signal(SIGSEGV, &my_signal_handler2);
|
||||
::signal(SIGABRT, &my_signal_handler2);
|
||||
foo(5);
|
||||
return 31;
|
||||
}
|
||||
|
||||
int run_4(const char* argv[]) {
|
||||
using namespace boost::interprocess;
|
||||
{
|
||||
shared_memory_object shm_obj(open_only, "shared_memory", read_write);
|
||||
shm_obj.swap(g_shm);
|
||||
}
|
||||
|
||||
{
|
||||
mapped_region m(g_shm, read_write, 0, shared_memory_size);
|
||||
m.swap(g_region);
|
||||
}
|
||||
|
||||
//[getting_started_on_program_restart_shmem
|
||||
void** f = static_cast<void**>(g_region.get_address());
|
||||
if (*f) { // Checking if memory contains stacktrace.
|
||||
boost::stacktrace::stacktrace st
|
||||
= boost::stacktrace::stacktrace::from_dump(f + 1, g_region.get_size() - sizeof(bool));
|
||||
|
||||
std::cout << "Previous run crashed and left trace in shared memory:\n" << st << std::endl;
|
||||
*f = 0; /*<-*/
|
||||
shared_memory_object::remove("shared_memory");
|
||||
if (std::string(argv[0]).find("noop") == std::string::npos) {
|
||||
if (!st) {
|
||||
return 43;
|
||||
}
|
||||
} else {
|
||||
if (st) {
|
||||
return 44;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
return 42; /*->*/
|
||||
}
|
||||
//]
|
||||
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
#include <sstream>
|
||||
|
||||
int test_inplace() {
|
||||
@@ -335,10 +254,6 @@ int main(int argc, const char* argv[]) {
|
||||
// We are copying files to make sure that stacktrace printing works independently from executable name
|
||||
copy_and_run(argv[0], '1', true);
|
||||
copy_and_run(argv[0], '2', false);
|
||||
|
||||
// There are some issues with async-safety of shared memory writes on Windows.
|
||||
copy_and_run(argv[0], '3', true);
|
||||
copy_and_run(argv[0], '4', false);
|
||||
#endif
|
||||
|
||||
return test_inplace();
|
||||
@@ -347,9 +262,6 @@ int main(int argc, const char* argv[]) {
|
||||
switch (argv[1][0]) {
|
||||
case '0': return run_0(argv);
|
||||
case '1': return run_1(argv);
|
||||
case '2': return run_2(argv);
|
||||
case '3': return run_3(argv);
|
||||
case '4': return run_4(argv);
|
||||
}
|
||||
|
||||
return 404;
|
||||
|
||||
@@ -117,20 +117,20 @@ test-suite stacktrace_tests
|
||||
|
||||
# Thread safety with debug symbols
|
||||
[ run thread_safety_checking.cpp
|
||||
: : : <debug-symbols>on <library>/boost/thread//boost_thread <library>/boost/timer//boost_timer <library>.//test_impl_lib_backtrace $(LINKSHARED_BT)
|
||||
: : : <debug-symbols>on <library>.//test_impl_lib_backtrace $(LINKSHARED_BT)
|
||||
: backtrace_lib_threaded ]
|
||||
[ run thread_safety_checking.cpp
|
||||
: : : <debug-symbols>on <library>/boost/thread//boost_thread <library>/boost/timer//boost_timer <library>.//test_impl_lib_backtrace $(LINKSHARED_BT)
|
||||
: : : <debug-symbols>on <library>.//test_impl_lib_backtrace $(LINKSHARED_BT)
|
||||
<define>BOOST_STACKTRACE_BACKTRACE_FORCE_STATIC
|
||||
: backtrace_lib_threaded_static ]
|
||||
[ run thread_safety_checking.cpp
|
||||
: : : <debug-symbols>on <library>/boost/thread//boost_thread <library>/boost/timer//boost_timer <library>.//test_impl_lib_windbg $(LINKSHARED_WIND)
|
||||
: : : <debug-symbols>on <library>.//test_impl_lib_windbg $(LINKSHARED_WIND)
|
||||
: windbg_lib_threaded ]
|
||||
[ run thread_safety_checking.cpp
|
||||
: : : <debug-symbols>on <library>/boost/thread//boost_thread <library>/boost/timer//boost_timer <library>.//test_impl_lib_windbg_cached $(LINKSHARED_WIND_CACHED)
|
||||
: : : <debug-symbols>on <library>.//test_impl_lib_windbg_cached $(LINKSHARED_WIND_CACHED)
|
||||
: windbg_cached_lib_threaded ]
|
||||
[ run thread_safety_checking.cpp
|
||||
: : : <debug-symbols>on <library>/boost/thread//boost_thread <library>/boost/timer//boost_timer <library>.//test_impl_lib_basic $(LINKSHARED_BASIC)
|
||||
: : : <debug-symbols>on <library>.//test_impl_lib_basic $(LINKSHARED_BASIC)
|
||||
: basic_lib_threaded ]
|
||||
|
||||
##### Tests with disabled debug symbols #####
|
||||
@@ -157,29 +157,21 @@ test-suite stacktrace_tests
|
||||
# Thread safety without debug symbols
|
||||
[ run thread_safety_checking.cpp
|
||||
: : : <debug-symbols>off
|
||||
<library>/boost/thread//boost_thread
|
||||
<library>/boost/timer//boost_timer
|
||||
<library>.//test_impl_lib_backtrace_no_dbg
|
||||
$(LINKSHARED_BT)
|
||||
: backtrace_lib_no_dbg_threaded ]
|
||||
[ run thread_safety_checking.cpp
|
||||
: : : <debug-symbols>off
|
||||
<library>/boost/thread//boost_thread
|
||||
<library>/boost/timer//boost_timer
|
||||
<library>.//test_impl_lib_windbg_no_dbg
|
||||
$(LINKSHARED_WIND)
|
||||
: windbg_lib_no_dbg_threaded ]
|
||||
[ run thread_safety_checking.cpp
|
||||
: : : <debug-symbols>off
|
||||
<library>/boost/thread//boost_thread
|
||||
<library>/boost/timer//boost_timer
|
||||
<library>.//test_impl_lib_windbg_cached_no_dbg
|
||||
$(LINKSHARED_WIND_CACHED)
|
||||
: windbg_cached_lib_no_dbg_threaded ]
|
||||
[ run thread_safety_checking.cpp
|
||||
: : : <debug-symbols>off
|
||||
<library>/boost/thread//boost_thread
|
||||
<library>/boost/timer//boost_timer
|
||||
<library>.//test_impl_lib_basic_no_dbg
|
||||
$(LINKSHARED_BASIC)
|
||||
: basic_lib_no_dbg_threaded ]
|
||||
|
||||
@@ -33,7 +33,7 @@ skip_tags: true
|
||||
environment:
|
||||
matrix:
|
||||
- APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2017
|
||||
TOOLSET: msvc-14.1 # ,clang-win
|
||||
TOOLSET: msvc-14.1 #,clang-win
|
||||
CXXSTD: 14,17
|
||||
ADDRMD: 64
|
||||
#- APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2015
|
||||
@@ -44,10 +44,11 @@ environment:
|
||||
# ADDPATH: C:\cygwin64\bin;
|
||||
# TOOLSET: gcc
|
||||
# CXXSTD: 03,11,14,1z
|
||||
- APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2015
|
||||
ADDPATH: C:\mingw\bin;
|
||||
TOOLSET: gcc
|
||||
CXXSTD: 03,11,14,1z
|
||||
# Waiting for https://github.com/boostorg/system/issues/116
|
||||
#- APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2015
|
||||
# ADDPATH: C:\mingw\bin;
|
||||
# TOOLSET: gcc
|
||||
# CXXSTD: 03,11,14,1z
|
||||
#- APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2015
|
||||
# ADDPATH: C:\mingw-w64\x86_64-7.2.0-posix-seh-rt_v5-rev1\mingw64\bin;
|
||||
# TOOLSET: gcc
|
||||
@@ -61,7 +62,10 @@ before_build:
|
||||
- set BOOST=C:/boost-local
|
||||
- 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/interprocess
|
||||
- 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%
|
||||
|
||||
@@ -7,15 +7,14 @@
|
||||
#include "test_impl.hpp"
|
||||
#include <boost/stacktrace/stacktrace_fwd.hpp>
|
||||
|
||||
#include <chrono>
|
||||
#include <sstream>
|
||||
#include <thread>
|
||||
|
||||
#include <boost/stacktrace.hpp>
|
||||
#include <boost/thread.hpp>
|
||||
#include <boost/optional.hpp>
|
||||
#include <boost/core/lightweight_test.hpp>
|
||||
|
||||
#include <boost/timer/timer.hpp>
|
||||
|
||||
using boost::stacktrace::stacktrace;
|
||||
|
||||
|
||||
@@ -42,16 +41,20 @@ void main_test_loop() {
|
||||
}
|
||||
|
||||
int main() {
|
||||
boost::timer::auto_cpu_timer t;
|
||||
const auto t = std::chrono::steady_clock::now();
|
||||
|
||||
boost::thread t1(main_test_loop);
|
||||
boost::thread t2(main_test_loop);
|
||||
boost::thread t3(main_test_loop);
|
||||
std::thread t1(main_test_loop);
|
||||
std::thread t2(main_test_loop);
|
||||
std::thread t3(main_test_loop);
|
||||
main_test_loop();
|
||||
|
||||
t1.join();
|
||||
t2.join();
|
||||
t3.join();
|
||||
|
||||
const auto elapsed = t - std::chrono::steady_clock::now();
|
||||
std::cout << "Elapsed: " << std::chrono::duration_cast<std::chrono::milliseconds>(
|
||||
elapsed
|
||||
). count() << "ms";
|
||||
return boost::report_errors();
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user