问题描述
我们正在使用boost日志库进行应用程序日志记录。
这是我们正在使用的记录器:
boost::log::sources::severity_logger_mt<boost::log::trivial::severity_level> logger_type;
对于日志记录,我们使用宏:
BOOST_LOG_SEV(::boost::log::sources::aux::logger_singleton< logger >::get(),static_cast<boost::log::trivial::severity_level>(sever_level));
我们面临的一个问题是,在应用程序退出时,内部boost日志的boost::shared_ptr<boost::log::v2_mt_posix::sources::aux::logger_holder
boost :: shared_ptr被破坏了。
由于这是lazy_singleton类,因此我们不确定是什么原因导致其早期破坏。
在我们的应用程序退出序列中,仍然只有很少的地方可以访问记录器进行记录,最终以SEGV结尾。
以下是AddressSanitizer库的摘要
29198==ERROR: AddressSanitizer: heap-use-after-free on address 0x60e00001c0b0 at pc 0x7f2183876711 bp 0x7fffb861d310 sp 0x7fffb861d308
READ of size 8 at 0x60e00001c0b0 thread T0 (product.exe)
#0 0x7f2183876710 in boost::shared_ptr<boost::log::v2_mt_posix::core>::operator->() const lnx86/asan/include/TPtools/boost/smart_ptr/shared_ptr.hpp:735
#1 0x7f2183875854 in boost::log::v2_mt_posix::record boost::log::v2_mt_posix::sources::basic_composite_logger<char,boost::log::v2_mt_posix::sources::severity_logger_mt<boost::log::v2_mt_posix::trivial::severity_level>,boost::log::v2_mt_posix::sources::multi_thread_model<boost::log::v2_mt_posix::aux::light_rw_mutex>,boost::log::v2_mt_posix::sources::features<boost::log::v2_mt_posix::sources::severity<boost::log::v2_mt_posix::trivial::severity_level> > >::open_record<boost::parameter::aux::tagged_argument_list_of_1<boost::parameter::aux::tagged_argument<boost::log::v2_mt_posix::keywords::tag::severity,boost::log::v2_mt_posix::trivial::severity_level const> > >(boost::parameter::aux::tagged_argument_list_of_1<boost::parameter::aux::tagged_argument<boost::log::v2_mt_posix::keywords::tag::severity,boost::log::v2_mt_posix::trivial::severity_level const> > const&) (lib/libcustomlogger.so+0xfb854)
#2 0x7f21838737a9 in logs::ostream::~ostream() ../src/logger.cpp:76
.....
#23 0x33ac635b21 in exit (/lib64/libc.so.6+0x33ac635b21)
#24 0x33ac61ed63 in __libc_start_main (/lib64/libc.so.6+0x33ac61ed63)
#25 0x5bed58 (/bin/product.exe+0x5bed58)
0x60e00001c0b0 is located 112 bytes inside of 152-byte region [0x60e00001c040,0x60e00001c0d8)
freed by thread T0 (product.exe) here:
#0 0x7f21bd610820 in operator delete(void*,unsigned long) (lib/libasan.so.3+0xc3820)
#1 0x7f218387a2ee in boost::detail::sp_counted_impl_pd<boost::log::v2_mt_posix::sources::aux::logger_holder<boost::log::v2_mt_posix::sources::severity_logger_mt<boost::log::v2_mt_posix::trivial::severity_level> >*,boost::detail::sp_ms_deleter<boost::log::v2_mt_posix::sources::aux::logger_holder<boost::log::v2_mt_posix::sources::severity_logger_mt<boost::log::v2_mt_posix::trivial::severity_level> > > >::~sp_counted_impl_pd() (lib/libcustomlogger.so+0x1002ee)
#2 0x7f21838745bd in boost::detail::sp_counted_base::destroy() lnx86/asan/include/TPtools/boost/smart_ptr/detail/sp_counted_base_std_atomic.hpp:91
#3 0x7f21838746f8 in boost::detail::sp_counted_base::weak_release() lnx86/asan/include/TPtools/boost/smart_ptr/detail/sp_counted_base_std_atomic.hpp:126
#4 0x7f2183874670 in boost::detail::sp_counted_base::release() lnx86/asan/include/TPtools/boost/smart_ptr/detail/sp_counted_base_std_atomic.hpp:113
#5 0x7f2183874785 in boost::detail::shared_count::~shared_count() lnx86/asan/include/TPtools/boost/smart_ptr/detail/shared_count.hpp:427
#6 0x7f2183876f87 in boost::shared_ptr<boost::log::v2_mt_posix::sources::aux::logger_holder<boost::log::v2_mt_posix::sources::severity_logger_mt<boost::log::v2_mt_posix::trivial::severity_level> > >::~shared_ptr() lnx86/asan/include/TPtools/boost/smart_ptr/shared_ptr.hpp:341
#7 0x33ac635b21 in exit (/lib64/libc.so.6+0x33ac635b21)
prevIoUsly allocated by thread T0 (product.exe) here:
#0 0x7f21bd60fc20 in operator new(unsigned long) (lib/libasan.so.3+0xc2c20)
#1 0x7f21838798bc in boost::detail::shared_count::shared_count<boost::log::v2_mt_posix::sources::aux::logger_holder<boost::log::v2_mt_posix::sources::severity_logger_mt<boost::log::v2_mt_posix::trivial::severity_level> >*,boost::detail::sp_ms_deleter<boost::log::v2_mt_posix::sources::aux::logger_holder<boost::log::v2_mt_posix::sources::severity_logger_mt<boost::log::v2_mt_posix::trivial::severity_level> > > >(boost::log::v2_mt_posix::sources::aux::logger_holder<boost::log::v2_mt_posix::sources::severity_logger_mt<boost::log::v2_mt_posix::trivial::severity_level> >*,boost::detail::sp_inplace_tag<boost::detail::sp_ms_deleter<boost::log::v2_mt_posix::sources::aux::logger_holder<boost::log::v2_mt_posix::sources::severity_logger_mt<boost::log::v2_mt_posix::trivial::severity_level> > > >) lnx86/asan/include/TPtools/boost/smart_ptr/detail/shared_count.hpp:214
#2 0x7f2183879138 in boost::shared_ptr<boost::log::v2_mt_posix::sources::aux::logger_holder<boost::log::v2_mt_posix::sources::severity_logger_mt<boost::log::v2_mt_posix::trivial::severity_level> > >::shared_ptr<boost::log::v2_mt_posix::sources::aux::logger_holder<boost::log::v2_mt_posix::sources::severity_logger_mt<boost::log::v2_mt_posix::trivial::severity_level> >,boost::detail::sp_inplace_tag<boost::detail::sp_ms_deleter<boost::log::v2_mt_posix::sources::aux::logger_holder<boost::log::v2_mt_posix::sources::severity_logger_mt<boost::log::v2_mt_posix::trivial::severity_level> > > > >(boost::log::v2_mt_posix::sources::aux::logger_holder<boost::log::v2_mt_posix::sources::severity_logger_mt<boost::log::v2_mt_posix::trivial::severity_level> >*,boost::detail::sp_inplace_tag<boost::detail::sp_ms_deleter<boost::log::v2_mt_posix::sources::aux::logger_holder<boost::log::v2_mt_posix::sources::severity_logger_mt<boost::log::v2_mt_posix::trivial::severity_level> > > >) lnx86/asan/include/TPtools/boost/smart_ptr/shared_ptr.hpp:388
#3 0x7f21838785ed in boost::detail::sp_if_not_array<boost::log::v2_mt_posix::sources::aux::logger_holder<boost::log::v2_mt_posix::sources::severity_logger_mt<boost::log::v2_mt_posix::trivial::severity_level> > >::type boost::make_shared<boost::log::v2_mt_posix::sources::aux::logger_holder<boost::log::v2_mt_posix::sources::severity_logger_mt<boost::log::v2_mt_posix::trivial::severity_level> >,char const*,unsigned int,boost::log::v2_mt_posix::sources::severity_logger_mt<boost::log::v2_mt_posix::trivial::severity_level> >(char const*&&,unsigned int&&,boost::log::v2_mt_posix::sources::severity_logger_mt<boost::log::v2_mt_posix::trivial::severity_level>&&) lnx86/asan/include/TPtools/boost/smart_ptr/make_shared_object.hpp:250
#4 0x7f2183877e47 in boost::log::v2_mt_posix::sources::aux::logger_singleton<logger>::construct_logger() (lib/libcustomlogger.so+0xfde47)
#5 0x7f21818c9aeb in boost::log::v2_mt_posix::sources::aux::global_storage::get_or_init(boost::typeindex::stl_type_index,boost::shared_ptr<boost::log::v2_mt_posix::sources::aux::logger_holder_base> (*)()) (tools/TPtools/boost/lib/64bit/libboost_log.so.1.71.0+0x6daeb)
我们如何知道/或控制何时破坏logger_holder的lazy_singleton类? 还是有什么办法事先知道是否释放了logger_holder,以便我们的应用程序可以跳过退出顺序的日志记录?
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)