2

我们有一个 Foo 服务器(foo.something.org),Bar 客户端使用 HeartBeat 线程定期连接()并检查它是否活着。这工作正常。但是每隔 2 小时,Bar 会在尝试解析 Foo 的主机名时出现段错误。

2 小时 = 7200 秒 = 默认 TCP 保持活动值。但我不知道这与我的情况有什么关系。我在 Ubuntu 10.04,32 位。

有罪代码:

tcp::resolver res( io_service ); //This eventually calls gethostbyname2_()
res.resolve( tcp::resolver::query( foo_hostname, foo_port, resolve_err );

堆栈跟踪:

#0  0xb481907f in ns_samename () from /lib/tls/i686/cmov/libresolv.so.2
No symbol table info available.
#1  0xb481327c in __res_nameinquery () from /lib/tls/i686/cmov/libresolv.so.2
No symbol table info available.
#2  0xb48133cc in __res_queriesmatch () from /lib/tls/i686/cmov/libresolv.so.2
No symbol table info available.
#3  0xb4813d9f in ?? () from /lib/tls/i686/cmov/libresolv.so.2
No symbol table info available.
#4  0xb48118a3 in __libc_res_nquery () from /lib/tls/i686/cmov/libresolv.so.2
No symbol table info available.
#5  0xb4811e8b in ?? () from /lib/tls/i686/cmov/libresolv.so.2
No symbol table info available.
#6  0xb48122b5 in __libc_res_nsearch () from /lib/tls/i686/cmov/libresolv.so.2
No symbol table info available.
#7  0xb4821bd6 in _nss_dns_gethostbyname3_r () from /lib/tls/i686/cmov/libnss_dns.so.2
No symbol table info available.
#8  0xb4821f2b in _nss_dns_gethostbyname2_r () from /lib/tls/i686/cmov/libnss_dns.so.2
No symbol table info available.
#9  0xb74acb0d in gethostbyname2_r () from /lib/tls/i686/cmov/libc.so.6
No symbol table info available.
#10 0xb746e010 in ?? () from /lib/tls/i686/cmov/libc.so.6
No symbol table info available.
#11 0xb746fa65 in getaddrinfo () from /lib/tls/i686/cmov/libc.so.6
No symbol table info available.
#12 0xb649b0da in boost::asio::detail::resolver_service<boost::asio::ip::tcp>::resolve(boost::shared_ptr<void>&, boost::asio::ip::basic_resolver_query<boost::asio::ip::tcp> const&, boost::system::error_code&)
    () from /home/spiderman/lib/pyfoo.so
No symbol table info available.
#13 0xb648c3b5 in boost::asio::ip::resolver_service<boost::asio::ip::tcp>::resolve (this=0x8eb9418) at /usr/local/include/boost/asio/ip/resolver_service.hpp:105
No locals.
#14 boost::asio::ip::basic_resolver<boost::asio::ip::tcp, boost::asio::ip::resolver_service<boost::asio::ip::tcp> >::resolve (this=0x8eb9418) at /usr/local/include/boost/asio/ip/basic_resolver.hpp:122
No locals.
#15 HeartBeatThread::tryConnect (this=0x8eb9418) at foo.cc:557
        err = {m_val = 0, m_cat = 0xb6141098}
        res = {<boost::asio::basic_io_object<boost::asio::ip::resolver_service<boost::asio::ip::tcp> >> = {<boost::noncopyable_::noncopyable> = {<No data fields>}, service = @0x8eb9758, implementation = {
              px = 0x0, pn = {pi_ = 0xb4590530}}}, <No data fields>}
        endpoint_iterator = {<boost::iterator_facade<boost::asio::ip::basic_resolver_iterator<boost::asio::ip::tcp>, boost::asio::ip::basic_resolver_entry<boost::asio::ip::tcp> const, boost::forward_traversal_tag, boost::asio::ip::basic_resolver_entry<boost::asio::ip::tcp> const&, int>> = {<No data fields>}, values_ = {px = 0x6, pn = {pi_ = 0x91a}}, 
          iter_ = {<boost::optional_detail::optional_base<__gnu_cxx::__normal_iterator<boost::asio::ip::basic_resolver_entry<boost::asio::ip::tcp> const*, std::vector<boost::asio::ip::basic_resolver_entry<boost::asio::ip::tcp>, std::allocator<boost::asio::ip::basic_resolver_entry<boost::asio::ip::tcp> > > > >> = {<boost::optional_detail::optional_tag> = {<No data fields>}, m_initialized = 20, m_storage = {dummy_ = {
                  data =  <incomplete sequence \370\252\202\265>, aligner_ = {<No data fields>}}}}, <No data fields>}}
        end = {<boost::iterator_facade<boost::asio::ip::basic_resolver_iterator<boost::asio::ip::tcp>, boost::asio::ip::basic_resolver_entry<boost::asio::ip::tcp> const, boost::forward_traversal_tag, boost::asio::ip::basic_resolver_entry<boost::asio::ip::tcp> const&, int>> = {<No data fields>}, values_ = {px = 0x0, pn = {pi_ = 0xa82aaac}}, 
          iter_ = {<boost::optional_detail::optional_base<__gnu_cxx::__normal_iterator<boost::asio::ip::basic_resolver_entry<boost::asio::ip::tcp> const*, std::vector<boost::asio::ip::basic_resolver_entry<boost::asio::ip::tcp>, std::allocator<boost::asio::ip::basic_resolver_entry<boost::asio::ip::tcp> > > > >> = {<boost::optional_detail::optional_tag> = {<No data fields>}, m_initialized = false, m_storage = {
                dummy_ = {data = "\001\000\000", aligner_ = {<No data fields>}}}}, <No data fields>}}
#16 0xb648cc99 in HeartBeatThread::handleConnectCompleted (this=0x8eb9418, err=...) at foo.cc:586
No locals.
#17 0xb649015c in boost::asio::detail::handler_queue::handler_wrapper<boost::asio::detail::binder1<boost::_bi::bind_t<void, boost::_mfi::mf1<void, HeartBeatThread, boost::system::error_code const&>, boost::_bi::list2<boost::_bi::value<HeartBeatThread*>, boost::arg<1> (*)()> >, boost::system::error_code> >::do_call(boost::asio::detail::handler_queue::handler*) () from /home/sipderman/lib/pyfoo.so
No symbol table info available.
#18 0xb6499273 in boost::asio::detail::task_io_service<boost::asio::detail::epoll_reactor<false> >::run_one(boost::system::error_code&) () from /home/spiderman/lib/pyfoo.so
No symbol table info available.
4

1 回答 1

1

Boost.Asio 在尝试解析查询时可能会抛出异常。您可能希望使用备用调用来解决(至少在当前版本的 boost 中可用):

tcp::resolver res( io_service ); //This eventually calls gethostbyname2_()
boost::system::error_code ec;
res.resolve( tcp::resolver::query( foo_hostname, foo_port, resolve_err ), ec );
if ( ec )
{
   // Some kind of error took place here.
   printf( "Error resolving address: %s", ec.message().c_str() );
}

如果你做这样的事情,它可能会阻止段错误,并且通过一些日志记录,可能会让你知道为什么解析偶尔会失败。

于 2012-01-10T18:10:23.493 回答