简体   繁体   English

C ++ Boost导致崩溃

[英]c++ boost causing crashes

I wrote some multithreaded application with c++11 features and boost, but I got annoying problem. 我写了一些具有c ++ 11功能和boost的多线程应用程序,但遇到了烦人的问题。

code: 码:

boost::asio::io_service io_service;
Client c(io_service, server->hostname.c_str(), server->port.c_str());
io_service.run(); //here is problem , it causes crashes

bt: BT:

#0 0x414910 std::vector<boost::asio::ip::basic_resolver_entry<boost::asio::ip::tcp>, std::allocator<boost::asio::ip::basic_resolver_entry<boost::asio::ip::tcp> > >::operator[](this=0x0, __n=0) (/usr/include/c++/4.8/bits/stl_vector.h:771)
#1 0x4131d4 boost::asio::ip::basic_resolver_iterator<boost::asio::ip::tcp>::dereference(this=0x7fffdb7fd250) (/usr/include/boost/asio/ip/basic_resolver_iterator.hpp:183)
#2 0x411f24 boost::asio::ip::basic_resolver_iterator<boost::asio::ip::tcp>::operator*(this=0x7fffdb7fd250) (/usr/include/boost/asio/ip/basic_resolver_iterator.hpp:123)
#3 0x40f8c6 Client::handle_resolve(this=0x7fffdb7fd800, err=..., endpoint_iterator=...) (*******Client.h:48)
#4 0x41c21f boost::_mfi::mf2<void, Client, boost::system::error_code const&, boost::asio::ip::basic_resolver_iterator<boost::asio::ip::tcp> >::operator() (this=0x7fffdb7fd450, p=0x7fffdb7fd800, a1=..., a2=...) (/usr/include/boost/bind/mem_fn_template.hpp:280)
#5 0x41bd3b boost::_bi::list3<boost::_bi::value<Client*>, boost::arg<1> (*)() (/usr/include/boost/bind/bind.hpp:392)
#6 0x41b74e boost::_bi::bind_t<void, boost::_mfi::mf2<void, Client, boost::system::error_code const&, boost::asio::ip::basic_resolver_iterator<boost::asio::ip::tcp> >, boost::_bi::list3<boost::_bi::value<Client*>, boost::arg<1> (*)() (/usr/include/boost/bind/bind_template.hpp:102)
#7 0x41adaf boost::asio::detail::binder2<boost::_bi::bind_t<void, boost::_mfi::mf2<void, Client, boost::system::error_code const&, boost::asio::ip::basic_resolver_iterator<boost::asio::ip::tcp> >, boost::_bi::list3<boost::_bi::value<Client*>, boost::arg<1> (*)() (/usr/include/boost/asio/detail/bind_handler.hpp:127)
#8 0x419fe1 boost::asio::asio_handler_invoke<boost::asio::detail::binder2<boost::_bi::bind_t<void, boost::_mfi::mf2<void, Client, boost::system::error_code const&, boost::asio::ip::basic_resolver_iterator<boost::asio::ip::tcp> >, boost::_bi::list3<boost::_bi::value<Client*>, boost::arg<1> (*)() (/usr/include/boost/asio/handler_invoke_hook.hpp:64)
#9 0x4191d8 boost_asio_handler_invoke_helpers::invoke<boost::asio::detail::binder2<boost::_bi::bind_t<void, boost::_mfi::mf2<void, Client, boost::system::error_code const&, boost::asio::ip::basic_resolver_iterator<boost::asio::ip::tcp> >, boost::_bi::list3<boost::_bi::value<Client*>, boost::arg<1> (*)() (/usr/include/boost/asio/detail/handler_invoke_helpers.hpp:37)
#10 0x41776c    boost::asio::detail::resolve_op<boost::asio::ip::tcp, boost::_bi::bind_t<void, boost::_mfi::mf2<void, Client, boost::system::error_code const&, boost::asio::ip::basic_resolver_iterator<boost::asio::ip::tcp> >, boost::_bi::list3<boost::_bi::value<Client*>, boost::arg<1> (*)() (/usr/include/boost/asio/detail/resolve_op.hpp:112)
#11 0x409df4    boost::asio::detail::task_io_service_operation::complete(this=0x7fffc8000db0, owner=..., ec=..., bytes_transferred=0) (/usr/include/boost/asio/detail/task_io_service_operation.hpp:37)
#12 0x40c4f7    boost::asio::detail::task_io_service::do_run_one(this=0x7fffc8000910, lock=..., this_thread=..., ec=...) (/usr/include/boost/asio/detail/impl/task_io_service.ipp:384)
#13 0x40bf27    boost::asio::detail::task_io_service::run(this=0x7fffc8000910, ec=...) (/usr/include/boost/asio/detail/impl/task_io_service.ipp:153)
#14 0x40c8a7    boost::asio::io_service::run(this=0x7fffdb7fdbc0) (/usr/include/boost/asio/impl/io_service.ipp:59)
#15 0x41d9a3    some_function(server=0x67e0b0) (*********Server.cpp:17)

Client.h Client.h

 void handle_resolve(const boost::system::error_code& err,
                            tcp::resolver::iterator endpoint_iterator)
        {
            tcp::endpoint endpoint = *endpoint_iterator; //48 line
            ip_ = endpoint.address().to_string();
            if (!err)
            {
                boost::asio::async_connect(socket_, endpoint_iterator,
                                           boost::bind(&Client::handle_connect, this,
                                                       boost::asio::placeholders::error));
            }

Just edited and added client part. 刚刚编辑并添加了客户端部分。

Looking at the stack trace, the problem is in Client::handle_resolve , line 48 of Client.h . 查看堆栈跟踪,问题出在Client::handle_resolve第48 Client.h

My best guess is that you're dereferencing an iterator without checking whether it's valid first. 我的最佳猜测是,您在不检查迭代器是否首先有效的情况下取消引用了迭代器。 Perhaps you could post that function, if the error isn't obvious when you look at it. 如果在查看错误时不明显,则可以发布该函数。

UPDATE : My guess was correct: you're dereferencing the iterator before checking whether the operation succeeded. 更新 :我的猜测是正确的:在检查操作是否成功之前,您要取消引用迭代器。 If it didn't, then the iterator won't be dereferencable. 如果没有,则迭代器将不可取消。

Move the first two lines inside the if (!err) block. if (!err)块内移动前两行。

Since I don't know io_service in detail, I have to guess a little bit. 由于我不了解io_service的详细信息,因此我不得不猜测一下。 Which platform are you using? 您正在使用哪个平台? On boost 1.41 we had the problem that in QNX the automatic multithread capability was not detected correctly and therefore BOOST_ASIO_HAS_THREADS may not be set. 在Boost 1.41上,我们遇到的问题是,在QNX中没有正确检测到自动多线程功能,因此可能未设置BOOST_ASIO_HAS_THREADS。 This leads to a null_mutex being used instead of POSIX or Windows mutexes. 这导致使用null_mutex代替POSIX或Windows互斥锁。 Since std::vector itself is not thread safe, this could lead to the race condition with the segfault. 由于std :: vector本身不是线程安全的,因此可能导致segfault出现争用条件。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM