Segfault at program exit when using CAOSDB_LOG_* excessively in client programs
In the Octave library, we used to use a lot of CAOSDB_LOG_*
output. When this macro was used a lot by different mex files (so they were loaded at different times by the main Octave process), the whole program tended to segfault at program termination. We could trace this back to caosdb/logging.h
and the amount of usage of Logging putput lines. The logging level set in the client configuration did not matter.
This is some valgrind output:
ans = {}(0x0)
octave:2>
==7266== Invalid read of size 8
==7266== at 0x408B252A: void boost::sp_adl_block::intrusive_ptr_release<boost::log::v2s_mt_posix::attribute::impl, boost::sp_adl_block::thread_safe_counter>(boost::sp_adl_block::intrusive_ref_counter<boost::log::v2s_mt_po
six::attribute::impl, boost::sp_adl_block::thread_safe_counter> const*) (intrusive_ref_counter.hpp:173) ==7266== by 0x408BD92B: boost::intrusive_ptr<boost::log::v2s_mt_posix::attributes::attribute_value_impl<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > >::~intrusive_ptr() (intrusive_ptr.
hpp:98) ==7266== by 0x408CF08D: boost::log::v2s_mt_posix::attributes::mutable_constant<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, void, void, void>::impl::~impl() (mutable_constant.hpp:225)
==7266== by 0x408CF0B5: boost::log::v2s_mt_posix::attributes::mutable_constant<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, void, void, void>::impl::~impl() (mutable_constant.hpp:225)
==7266== by 0x409A3831: boost::log::v2s_mt_posix::attribute_set::~attribute_set() (in /home/daniel/.conan/data/caosdb/0.0.13/_/_/package/0bb7334c3b4d237bfe65d03882002d9866ac9e74/lib/libcaosdb.so)
==7266== by 0x408B67C5: boost::log::v2s_mt_posix::sources::basic_logger<char, boost::log::v2s_mt_posix::sources::severity_channel_logger_mt<int, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char
> > >, boost::log::v2s_mt_posix::sources::multi_thread_model<boost::log::v2s_mt_posix::aux::light_rw_mutex> >::~basic_logger() (basic_logger.hpp:78) ==7266== by 0x408B6829: boost::log::v2s_mt_posix::sources::basic_channel_logger<boost::log::v2s_mt_posix::sources::basic_logger<char, boost::log::v2s_mt_posix::sources::severity_channel_logger_mt<int, std::__cxx11::basic_
string<char, std::char_traits<char>, std::allocator<char> > >, boost::log::v2s_mt_posix::sources::multi_thread_model<boost::log::v2s_mt_posix::aux::light_rw_mutex> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >::~basic_channel_logger() (channel_feature.hpp:45)
==7266== by 0x408B6871: boost::log::v2s_mt_posix::sources::basic_severity_logger<boost::log::v2s_mt_posix::sources::basic_channel_logger<boost::log::v2s_mt_posix::sources::basic_logger<char, boost::log::v2s_mt_posix::sour
ces::severity_channel_logger_mt<int, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, boost::log::v2s_mt_posix::sources::multi_thread_model<boost::log::v2s_mt_posix::aux::light_rw_mutex> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, int>::~basic_severity_logger() (severity_feature.hpp:147)
==7266== by 0x408B688D: boost::log::v2s_mt_posix::sources::basic_composite_logger<char, boost::log::v2s_mt_posix::sources::severity_channel_logger_mt<int, std::__cxx11::basic_string<char, std::char_traits<char>, std::allo
cator<char> > >, boost::log::v2s_mt_posix::sources::multi_thread_model<boost::log::v2s_mt_posix::aux::light_rw_mutex>, boost::log::v2s_mt_posix::sources::features<boost::log::v2s_mt_posix::sources::severity<int>, boost::log::v2s_mt_posix::sources::channel<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >::~basic_composite_logger() (basic_logger.hpp:314) ==7266== by 0x408B68A9: boost::log::v2s_mt_posix::sources::severity_channel_logger_mt<int, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >::~severity_channel_logger_mt() (severity_channel
_logger.hpp:64) ==7266== by 0x408BDF51: boost::log::v2s_mt_posix::sources::aux::logger_holder<boost::log::v2s_mt_posix::sources::severity_channel_logger_mt<int, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char
> > > >::~logger_holder() (global_logger_storage.hpp:59)
==7266== by 0x408BDF84: boost::detail::sp_ms_deleter<boost::log::v2s_mt_posix::sources::aux::logger_holder<boost::log::v2s_mt_posix::sources::severity_channel_logger_mt<int, std::__cxx11::basic_string<char, std::char_trai
ts<char>, std::allocator<char> > > > >::destroy() (make_shared_object.hpp:59)
==7266== Address 0x4b2146b8 is not stack'd, malloc'd or (recently) free'd
==7266==
fatal: caught signal Speicherzugriffsfehler -- stopping myself...
==7266==
==7266== Process terminating with default action of signal 11 (SIGSEGV)
==7266== at 0x71B25A9: raise (raise.c:46)
==7266== by 0x71B272F: ??? (in /usr/lib/x86_64-linux-gnu/libpthread-2.28.so)
==7266== by 0x408B2529: void boost::sp_adl_block::intrusive_ptr_release<boost::log::v2s_mt_posix::attribute::impl, boost::sp_adl_block::thread_safe_counter>(boost::sp_adl_block::intrusive_ref_counter<boost::log::v2s_mt_po
six::attribute::impl, boost::sp_adl_block::thread_safe_counter> const*) (intrusive_ref_counter.hpp:173)
==7266== by 0x408BD92B: boost::intrusive_ptr<boost::log::v2s_mt_posix::attributes::attribute_value_impl<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > >::~intrusive_ptr() (intrusive_ptr.
hpp:98)
These are possibly relevant links we (@henrik and I) found:
- https://stackoverflow.com/questions/36932948/sigsegv-on-program-exit-with-boostlog
- https://stackoverflow.com/questions/42135759/boost-log-destructor-aborted
- https://stackoverflow.com/questions/43889003/segmentation-fault-in-boost-log
- https://www.boost.org/doc/libs/1_77_0/libs/log/doc/html/log/rationale/why_crash_on_term.html