2013-11-28 127 views
1

我寫了一些多線程的應用程序與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)); 
      } 

剛剛編輯和加入的客戶端的一部分。

+0

你必須記住'std :: string'的'c_str'函數返回一個*臨時*指針。如果保存這些指針並稍後使用它們,則會出現未定義的行爲。 –

+0

謝謝,我的壞,很明顯 –

+0

它沒有幫助同樣的問題 –

回答

1

看着堆棧跟蹤,問題出現在Client::handle_resolve,第012行。

我最好的猜測是你在不檢查它是否有效的情況下解引用迭代器。也許你可以發佈這個功能,如果你看它時錯誤不明顯。

UPDATE:我的猜測是正確的:你在檢查操作是否成功之前解引用迭代器。如果沒有,那麼迭代器將不會被取消引用。

移動if (!err)塊內的前兩行。

+0

剛編輯的主帖 –

+0

我是盲目的......謝謝,完美的作品 –

0

因爲我不知道詳細的io_service,所以我必須猜測一點。你在使用哪個平臺?在boost 1.41上,我們遇到了在QNX中沒有正確檢測到自動多線程功能的問題,因此BOOST_ASIO_HAS_THREADS可能不會被設置。這導致使用null_mutex而不是POSIX或Windows互斥體。由於std :: vector本身不是線程安全的,這可能會導致segfault的競爭條件。

+0

我使用的是debian jessie和boost 1.54 –