मुझे नहीं पता कि यह समस्या कहां से आ सकती है: (जीडीबी के साथ डिबगिंग):

terminate called after throwing an instance of '[Thread 0x7ffff5e68700 (LWP 24945) exited]
boost::exception_detail::clone_impl<boost::exception_detail::error_info_injector<boost::system::system_error> >'

थ्रेड 1 "random_walkerta" को सिग्नल SIGSEGV, सेगमेंटेशन फॉल्ट प्राप्त हुआ। tcache_get (tc_idx=1) malloc.c:2943 . पर

स्टैकट्रेस:

#0  tcache_get (tc_idx=1) at malloc.c:2943
#1  __GI___libc_malloc (bytes=31) at malloc.c:3050
#2  0x00007ffff6ec154c in operator new(unsigned long) ()
   from /usr/lib/x86_64-linux-gnu/libstdc++.so.6
#3  0x00007ffff6f56dbf in std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::_M_mutate(unsigned long, unsigned long, char const*, unsigned long) () from /usr/lib/x86_64-linux-gnu/libstdc++.so.6
#4  0x00007ffff6f584bb in std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::_M_append(char const*, unsigned long) ()
   from /usr/lib/x86_64-linux-gnu/libstdc++.so.6
#5  0x00005555555bee66 in boost::system::system_error::what (
    this=0x5555558a1bf0) at /usr/include/boost/system/system_error.hpp:70
#6  0x00007ffff6eba8ba in ?? () from /usr/lib/x86_64-linux-gnu/libstdc++.so.6
#7  0x00007ffff6ec0d3a in ?? () from /usr/lib/x86_64-linux-gnu/libstdc++.so.6
#8  0x00007ffff6ebfd59 in ?? () from /usr/lib/x86_64-linux-gnu/libstdc++.so.6
#9  0x00007ffff6ec0708 in __gxx_personality_v0 ()
   from /usr/lib/x86_64-linux-gnu/libstdc++.so.6
#10 0x00007ffff6888763 in ?? () from /lib/x86_64-linux-gnu/libgcc_s.so.1
#11 0x00007ffff688907d in _Unwind_Resume ()
   from /lib/x86_64-linux-gnu/libgcc_s.so.1
#12 0x00005555555cb8d6 in boost::asio::detail::do_throw_error (err=..., 
    location=0x555555610dba "close")
    at /usr/include/boost/asio/detail/impl/throw_error.ipp:37
---Type <return> to continue, or q <return> to quit---
#13 0x00005555555cb741 in boost::asio::detail::throw_error (err=..., 
    location=0x555555610dba "close")
    at /usr/include/boost/asio/detail/throw_error.hpp:42
#14 0x00005555555de022 in boost::asio::basic_socket<boost::asio::ip::udp, boost::asio::datagram_socket_service<boost::asio::ip::udp> >::close (
    this=0x555555887ea0) at /usr/include/boost/asio/basic_socket.hpp:356
#15 0x00005555555d7ebe in Vast::net_overhearing_handler::handle_close (
    this=0x555555889490) at net_overhearing_handler.cpp:160
#16 0x00005555555d7e4c in Vast::net_overhearing_handler::close (
    this=0x555555889490) at net_overhearing_handler.cpp:141
#17 0x00005555555c9b85 in Vast::net_overhearing::stop (this=0x5555558870e0)
    at net_overhearing.cpp:88
#18 0x00005555555ba77f in Vast::VASTnet::~VASTnet (this=0x55555587f180, 
    __in_chrg=<optimized out>) at VASTnet.cpp:63
#19 0x000055555556ca7a in Vast::destroyNet (net=0x55555587f180)
    at VASTVerse.cpp:93
#20 0x000055555556d036 in Vast::VASTVerse::~VASTVerse (this=0x55555587e4c0, 
    __in_chrg=<optimized out>) at VASTVerse.cpp:196
#21 0x000055555556bce4 in main (argc=1, argv=0x7fffffffe598)
    at random_walkertalker.cpp:266

सेटअप इस प्रकार है: मेरे पास एक बूस्ट यूडीपी सॉकेट है जो अलग थ्रेड io_service पर चल रहा है, पैकेट सुन रहा है। सब कुछ अपेक्षा के अनुसार काम करता है जब तक कि मैं प्रोग्राम, यूडीपी सॉकेट और io_service को बंद करने का प्रयास नहीं करता। मैं अनुमान लगा रहा हूं कि मैं कुछ सही ढंग से बंद नहीं कर रहा हूं।

यहाँ UDP और io_services को बंद करने का कोड दिया गया है:

if (_io_service != NULL) {
   _io_service->reset();
   _udp->close();                 //This line is giving the error (160)  


   _io_service->stop();
   _iosthread->join();
}

शुरू करना, मैं निम्नलिखित करता हूं:

_udp = new ip::udp::socket(*_io_service);
_udp->open(ip::udp::v4());

_udp->async_receive_from(
  boost::asio::buffer(_buf, VAST_BUFSIZ), _remote_endpoint_,
  boost::bind(&net_overhearing_handler::handle_input, this,
  boost::asio::placeholders::error,
  boost::asio::placeholders::bytes_transferred));

_iosthread = new boost::thread(boost::bind(&boost::asio::io_service::run, io_service));
1
Daniel Schoonwinkel 10 अक्टूबर 2018, 13:48

1 उत्तर

सबसे बढ़िया उत्तर

इस लाइन को हटा दें

 _io_service->reset();

क्योंकि संदर्भ के अनुसार io_service:: रीसेट करें

कोई भी अधूरा कॉल होने पर इस फ़ंक्शन को कॉल नहीं किया जाना चाहिए रन (), रन_ऑन (), पोल () या पोल_ऑन () फ़ंक्शन के लिए।

ऐसा लगता है कि run विधि थ्रेड में काम करती है जब आप restart को कॉल करते हैं।

io_service::run विधि को रोकने के लिए आपको इस विधि को कॉल करने की आवश्यकता नहीं है। run में सभी लंबित कार्यों को _io_service->stop(); पर कॉल करके रद्द कर दिया जाएगा, फिर run रुक जाएगा और आपका थ्रेड भी समाप्त हो जाएगा।

0
rafix07 10 अक्टूबर 2018, 14:51