2016-01-28 24 views
3

将boost syslog添加到源代码中后,段错误出现在cpp-netlib库中。 我能够准备最小工作代码片段来重现问题。使用boost syslog和cpp-netlib时出现分段错误

#include <boost/network/protocol/http/client.hpp> 
#include <boost/log/utility/setup/file.hpp> 
#include <boost/log/sinks/syslog_backend.hpp> 

#include <iostream> 

using namespace boost::network; 
using namespace boost::network::http; 

namespace sinks = boost::log::sinks; 

int main() 
{ 
    client::request request_("http://www.boost.org/"); 
    client client_; 
    client::response response_ = client_.get(request_); 
    std::string body_ = body(response_); 
    std::cout << "body: " << body_; 
    using syslog_sinkT = sinks::synchronous_sink <sinks::syslog_backend>; 
    boost::shared_ptr <sinks::syslog_backend> backend = boost::make_shared <sinks::syslog_backend>(); 
    boost::shared_ptr<syslog_sinkT> sink = boost::make_shared <syslog_sinkT> (backend); 
} 

当最后2行被注释时,分段错误消失,一切正常。

GDB栈跟踪(约,可能会发生变化):在Ubuntu 14.04存在具有CPP-NETLIB 0.11.2和两个升压版本1_58_0和1_60_0

Program received signal SIGSEGV, Segmentation fault. 
[Switching to Thread 0xf7c29b40 (LWP 19874)] 
0x00000000 in ??() 
(gdb) where 
#0 0x00000000 in ??() 
#1 0x083c376c in boost::asio::detail::task_io_service_operation::complete (bytes_transferred=260, ec=..., owner=..., 
    this=0xf6900710) 
    at /home/kostidov/prj/third_party-master/boost/boost_1_60_0/__public__/v0/Linux-libc6/include/boost/asio/detail/task_io_service_o$ 
eration.hpp:38 
#2 boost::asio::detail::task_io_service::do_run_one (ec=..., this_thread=..., lock=..., this=<optimized out>) 
    at /home/kostidov/prj/third_party-master/boost/boost_1_60_0/__public__/v0/Linux-libc6/include/boost/asio/detail/impl/task_io_serv$ 
ce.ipp:372 
#3 boost::asio::detail::task_io_service::run (ec=..., this=0x84ea280) 
    at /home/kostidov/prj/third_party-master/boost/boost_1_60_0/__public__/v0/Linux-libc6/include/boost/asio/detail/impl/task_io_serv$ 
ce.ipp:149 
#4 boost::asio::io_service::run (this=0x84e9a94) 
    at /home/kostidov/prj/third_party-master/boost/boost_1_60_0/__public__/v0/Linux-libc6/include/boost/asio/impl/io_service.ipp:59 
#5 0x083b5766 in boost::_mfi::mf0<unsigned int, boost::asio::io_service>::operator() (p=<optimized out>, this=<optimized out>) 
    at /home/kostidov/prj/third_party-master/boost/boost_1_60_0/__public__/v0/Linux-libc6/include/boost/bind/mem_fn_template.hpp:49 
#6 boost::_bi::list1<boost::_bi::value<boost::asio::io_service*> >::operator()<unsigned int, boost::_mfi::mf0<unsigned int, boost::a$ 
io::io_service>, boost::_bi::list0> (a=<synthetic pointer>, f=..., this=0x84ea94c) 
    at /home/kostidov/prj/third_party-master/boost/boost_1_60_0/__public__/v0/Linux-libc6/include/boost/bind/bind.hpp:249 
#7 boost::_bi::bind_t<unsigned int, boost::_mfi::mf0<unsigned int, boost::asio::io_service>, boost::_bi::list1<boost::_bi::value<boo$ 
t::asio::io_service*> > >::operator() (this=0x84ea944) 
    at /home/kostidov/prj/third_party-master/boost/boost_1_60_0/__public__/v0/Linux-libc6/include/boost/bind/bind.hpp:1222 
#8 boost::detail::thread_data<boost::_bi::bind_t<unsigned int, boost::_mfi::mf0<unsigned int, boost::asio::io_service>, boost::_bi::$ 
ist1<boost::_bi::value<boost::asio::io_service*> > > >::run (this=0x84ea828) 
    at /home/kostidov/prj/third_party-master/boost/boost_1_60_0/__public__/v0/Linux-libc6/include/boost/thread/detail/thread.hpp:116 
#9 0x0840a4f8 in boost::(anonymous namespace)::thread_proxy (param=0x84ea828) at libs/thread/src/pthread/thread.cpp:167 
#10 0xf7de1f70 in start_thread() from /lib/i386-linux-gnu/libpthread.so.0 
#11 0xf7d18bee in clone() from /lib/i386-linux-gnu/libc.so.6 

问题。 Boost,cpp-netlib和我的应用程序都是用-std = C++ 11编译的。

注意1.在到达syslog_backend创建之前,cpp-netlib出现分段错误。只有最后2行的存在才能保证SIGSEGV的再现。

注意2.只能用syslog_backend进行复制。其他任何日志目标(文件,控制台)都可以正常工作。 我最好的想法是在静态变量初始化期间内部可能存在boost问题,但我没有证明这个版本。 有什么建议吗?

+0

是不是Mac OS X上重现性提升1_57_0和苹果LLVM版本7.0.2(铛-700.1.81),坚韧 – cdovgal

回答

1

好像我用过多的编译选项来构建boost和cpp-netlib。 我为boost和cpp-netlib再次准备了新版本,但是这次我尽可能少地使用其他附加选项。 它工作正常。

编辑:我找到了导致错误的关键。它是BOOST_ASIO_ENABLE_HANDLER_TRACKING它是在boost编译过程中定义的,但在编译cpp-netlib和我的应用程序时没有定义。

https://svn.boost.org/trac/boost/ticket/11945