C++ boost导致崩溃
我写了一些多线程的应用程序与c + + 11功能和提升,但我有恼人的问题。C++ boost导致崩溃
代码:
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:
#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
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));
}
刚刚编辑和加入的客户端的一部分。
看着堆栈跟踪,问题出现在Client::handle_resolve
,第012行。
我最好的猜测是你在不检查它是否有效的情况下解引用迭代器。也许你可以发布这个功能,如果你看它时错误不明显。
UPDATE:我的猜测是正确的:你在检查操作是否成功之前解引用迭代器。如果没有,那么迭代器将不会被取消引用。
移动if (!err)
块内的前两行。
刚编辑的主帖 –
我是盲目的......谢谢,完美的作品 –
因为我不知道详细的io_service,所以我必须猜测一点。你在使用哪个平台?在boost 1.41上,我们遇到了在QNX中没有正确检测到自动多线程功能的问题,因此BOOST_ASIO_HAS_THREADS可能不会被设置。这导致使用null_mutex而不是POSIX或Windows互斥体。由于std :: vector本身不是线程安全的,这可能会导致segfault的竞争条件。
我使用的是debian jessie和boost 1.54 –
你必须记住'std :: string'的'c_str'函数返回一个*临时*指针。如果保存这些指针并稍后使用它们,则会出现未定义的行为。 –
谢谢,我的坏,很明显 –
它没有帮助同样的问题 –