【问题标题】:Segmentation fault on using boost syslog and cpp-netlib使用 boost syslog 和 cpp-netlib 的分段错误
【发布时间】:2016-01-28 00:28:56
【问题描述】:

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

#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);
}

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

gdb 堆栈跟踪(大约,可能会有所不同):

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

使用 cpp-netlib 0.11.2 和 boost 版本 1_58_0 和 1_60_0 的 Ubuntu 14.04 上存在问题。 Boost、cpp-netlib 和我的应用程序是使用 -std=c++11 编译的。

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

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

【问题讨论】:

  • 在带有 boost 1_57_0 和 Apple LLVM 版本 7.0.2 (clang-700.1.81) 的 Mac OS X 上无法重现,很难

标签: boost segmentation-fault syslog boost-log cpp-netlib


【解决方案1】:

似乎我在构建 boost 和 cpp-netlib 时使用了太多编译选项。 我再次为 boost 和 cpp-netlib 准备了新版本,但这次我使用的附加选项尽可能少。 而且效果很好。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-07-19
    • 1970-01-01
    • 1970-01-01
    • 2013-08-19
    • 2013-12-30
    • 1970-01-01
    • 1970-01-01
    • 2013-12-03
    相关资源
    最近更新 更多