Boost::log只在debian中崩溃

Boost::log crashs only in debian

本文关键字:崩溃 debian 只在 log Boost      更新时间:2023-10-16

下面的代码在ubuntu/suse/redhat上运行良好。。。但它在debian上崩溃了,它在一个无效的指针上免费运行

uname-a":Linux DEV20V 4.9.0-7-amd64#1 SMP Debian 4.9.110-3+deb9u2(2018-08-13(x86_64 GNU/LinuxGLIBC:Debian GLIBC 2.24-11+deb9u3

代码

boost::log::core::get()->add_thread_attribute("File", boost::log::attributes::mutable_constant<std::string>(""));
boost::log::core::get()->add_thread_attribute("Line", boost::log::attributes::mutable_constant<int>(0));
auto log_open_mode = std::ios_base::out;
if (debug)
{
log_open_mode |= std::ios_base::trunc;
}
else
{
log_open_mode |= std::ios_base::app;
}
boost::shared_ptr< boost::log::core > core = boost::log::core::get();
boost::shared_ptr< boost::log::sinks::text_file_backend > backend = boost::make_shared<boost::log::sinks::text_file_backend>();
//   boost::log::keywords::file_name = "file%N.log",
//   boost::log::keywords::open_mode = log_open_mode,
//   boost::log::keywords::rotation_size = 10 * 1024 * 1024,
//   boost::log::keywords::auto_flush = true

backend->set_file_name_pattern("/var/log/file.log");
backend->set_open_mode(log_open_mode);
backend->set_rotation_size(10 * 1024 *1024);
backend->auto_flush(true);
typedef boost::log::sinks::synchronous_sink< boost::log::sinks::text_file_backend > sink_t;
boost::shared_ptr< sink_t > sink(new sink_t(backend));
if (!debug)
{
sink->set_filter(boost::log::trivial::severity >= boost::log::trivial::info);
}
sink->set_formatter(
boost::log::expressions::format("%1%: [%2%] [%3%:%4%] [pid-%5%] [t-%6% (%7%)] - %8%")
% boost::log::expressions::format_date_time< boost::posix_time::ptime >("TimeStamp", "%Y-%m-%d %H:%M:%S")
% boost::log::trivial::severity
% boost::log::expressions::attr<std::string>("File")
% boost::log::expressions::attr<int>("Line")
% boost::log::expressions::attr<boost::log::attributes::current_process_id::value_type>("ProcessID")
% boost::log::expressions::attr<boost::log::attributes::current_thread_id::value_type>("ThreadID")
% a_thread_name
% boost::log::expressions::smessage
);
//   backend->scan_for_files(boost::log::sinks::file::scan_all);
core->add_sink(sink);
boost::log::add_common_attributes();

堆栈跟踪

*** Error in `/usr/bin/lanctrlconfig': free(): invalid pointer: 0x00007ffe8fd61848 ***
======= Backtrace: =========
/lib/x86_64-linux-gnu/libc.so.6(+0x70bfb)[0x7fcf822c6bfb]
/lib/x86_64-linux-gnu/libc.so.6(+0x76fc6)[0x7fcf822ccfc6]
/lib/x86_64-linux-gnu/libc.so.6(+0x7780e)[0x7fcf822cd80e]
/usr/lib/libboost_log.so.1.62.0(_ZN5boost3log11v2_mt_posix5sinks17text_file_backend30set_file_name_pattern_internalERKNS_10filesystem4pathE+0x179)[0x7fcf85479239]
/usr/lib/libboost_log.so.1.62.0(_ZN5boost3log11v2_mt_posix5sinks17text_file_backend9constructERKNS_10filesystem4pathESt13_Ios_OpenmodemRKNS1_3aux14light_functionIFbvEEEb+0x190)[0x7fcf8547a340]
/usr/lib/libboost_log.so.1.62.0(_ZN5boost3log11v2_mt_posix5sinks17text_file_backendC1Ev+0x53)[0x7fcf8547a463]
/usr/lib/liblanctrlcommon.so.1(_ZN5boost11make_sharedINS_3log11v2_mt_posix5sinks17text_file_backendEIEEENS_6detail15sp_if_not_arrayIT_E4typeEDpOT0_+0x6d)[0x7fcf83abd332]
/usr/lib/liblanctrlcommon.so.1(_Z8init_logRKSsb+0x28c)[0x7fcf83ab9ad5]
/usr/lib/liblanctrlcommon.so.1(_ZN3App5setupEiPPc+0x8a8)[0x7fcf83a44468]
/usr/bin/lanctrlconfig[0x490521]
/lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xf1)[0x7fcf822762e1]
/usr/bin/lanctrlconfig[0x4593ea]

有人能给点提示吗?

编辑未标记堆栈跟踪(C++过滤(:

/lib/x86_64-linux-gnu/libc.so.6(+0x70bfb)[0x7fcf822c6bfb]
/lib/x86_64-linux-gnu/libc.so.6(+0x76fc6)[0x7fcf822ccfc6]
/lib/x86_64-linux-gnu/libc.so.6(+0x7780e)[0x7fcf822cd80e]
/usr/lib/libboost_log.so.1.62.0(boost::log::v2_mt_posix::sinks::text_file_backend::set_file_name_pattern_internal(boost::filesystem::path const&)+0x179)[0x7fcf85479239]
/usr/lib/libboost_log.so.1.62.0(boost::log::v2_mt_posix::sinks::text_file_backend::construct(boost::filesystem::path const&, std::_Ios_Openmode, unsigned long, boost::log::v2_mt_posix::aux::light_function<bool ()> const&, bool)+0x190)[0x7fcf8547a340]
/usr/lib/libboost_log.so.1.62.0(boost::log::v2_mt_posix::sinks::text_file_backend::text_file_backend()+0x53)[0x7fcf8547a463]
/usr/lib/liblanctrlcommon.so.1(boost::detail::sp_if_not_array<boost::log::v2_mt_posix::sinks::text_file_backend>::type boost::make_shared<boost::log::v2_mt_posix::sinks::text_file_backend>()+0x6d)[0x7fcf83abd332]
/usr/lib/liblanctrlcommon.so.1(init_log(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, bool)+0x28c)[0x7fcf83ab9ad5]
/usr/lib/liblanctrlcommon.so.1(App::setup(int, char**)+0x8a8)[0x7fcf83a44468]
/usr/bin/lanctrlconfig[0x490521]
/lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xf1)[0x7fcf822762e1]
/usr/bin/lanctrlconfig[0x4593ea]

我也遇到了类似的问题。

我的应用程序要么用double-free((中止(当使用gperftools/tcmalloc时(,要么不使用tcmalloc的segfault,也在text_file_backend::set_file_name_pattern_internal

在我的案例中,只需使Boost::文件系统成为显式链接依赖项就足够了(否则,它是由Boost::Log或Boost:∶Log::Setup库间接加载的(。

我试过Boost 1.69和1.71.0。