简体   繁体   English

zeromq在I / O线程中引发异常

[英]zeromq raise exception in I/O thread

when we send bad data into zmq socket, I/O thread raises exception and process gets killed. 当我们将不良数据发送到zmq套接字时,I / O线程引发异常,并且进程被杀死。 Call stack of crash is as below 崩溃的调用堆栈如下

00 KERNELBASE!RaiseException+0x68 00 KERNELBASE!RaiseException + 0x68
01 zmq::zmq_abort(char * errmsg_ = )+0x21 [objdir-windows-msvc-14.0.x86_64\\build\\libzmq\\src\\err.cpp @ 89] 01 zmq :: zmq_abort(char * errmsg_ =)+ 0x21 [objdir-windows-msvc-14.0.x86_64 \\ build \\ libzmq \\ src \\ err.cpp @ 89]
02 zmq::tcp_read(unsigned int64 s_ = , void * data_ = , unsigned int64 size_ = )+0xa9 [objdir-windows-msvc-14.0.x86_64\\build\\libzmq\\src\\tcp.cpp @ 276] 02 zmq :: tcp_read(unsigned int64 s_ =,void * data_ =,unsigned int64 size_ =)+ 0xa9 [objdir-windows-msvc-14.0.x86_64 \\ build \\ libzmq \\ src \\ tcp.cpp @ 276]
03 zmq::stream_engine_t::in_event(void)+0x132 [objdir-windows-msvc-14.0.x86_64\\build\\libzmq\\src\\stream_engine.cpp @ 318] 03 zmq :: stream_engine_t :: in_event(void)+ 0x132 [objdir-windows-msvc-14.0.x86_64 \\ build \\ libzmq \\ src \\ stream_engine.cpp @ 318]
04 zmq::select_t::trigger_events(class std::vector > * fd_entries_ = 0x0000019d 323400c8, struct zmq::select_t::fds_set_t * local_fds_set_ = 0x0000006f e3f9fb90, int event_count_ = 0n2)+0x74 [objdir-windows-msvc-14.0.x86_64\\build\\libzmq\\src\\select.cpp @ 122] 04 zmq :: select_t :: trigger_events(class std :: vector> * fd_entries_ = 0x0000019d 323400c8, struct zmq::select_t::fds_set_t * local_fds_set_ = 0x0000006f e3f9fb90,int event_count_ = 0n2-++ 4.0 .x86_64 \\ build \\ libzmq \\ src \\ select.cpp @ 122]
05 zmq::select_t::select_family_entry(struct zmq::select_t::family_entry_t * family_entry_ = 0x0000019d 323400c8, int max_fd_ = 0n0, bool use_timeout_ = <Value unavailable error>, struct timeval * tv_ = 0x0000006f e3fffc98)+0xe9 [objdir-windows-msvc-14.0.x86_64\\build\\libzmq\\src\\select.cpp @ 404] 06 zmq::select_t::loop(void)+0x352 [objdir-windows-msvc-14.0.x86_64\\build\\libzmq\\src\\select.cpp @ 360] 05 zmq :: select_t :: select_family_entry(结构zmq :: select_t :: family_entry_t * family_entry_ = 0x0000019d 323400c8, int max_fd_ = 0n0, bool use_timeout_ = <Value unavailable error>, struct timeval * tv_ = 0x0000006f -c [ff 323400c8, int max_fd_ = 0n0, bool use_timeout_ = <Value unavailable error>, struct timeval * tv_ = 0x0000006f ff [e- 323400c8, int max_fd_ = 0n0, bool use_timeout_ = <Value unavailable error>, struct timeval * tv_ = 0x0000006f ff [c_ff] Windows-msvc-14.0.x86_64 \\ build \\ libzmq \\ src \\ select.cpp @ 404] 06 zmq :: select_t :: loop(void)+ 0x352 [objdir-windows-msvc-14.0.x86_64 \\ build \\ libzmq \\ src \\ select.cpp @ 360]
07 thread_routine(void * arg_ = )+0xd [objdir-windows-msvc-14.0.x86_64\\build\\libzmq\\src\\thread.cpp @ 47] 07 thread_routine(void * arg_ =)+ 0xd [objdir-windows-msvc-14.0.x86_64 \\ build \\ libzmq \\ src \\ thread.cpp @ 47]
08 invoke_thread_procedure+0xe (Inline Function @ 00007ff7`50b99cf9) [d:\\th\\minkernel\\crts\\ucrt\\src\\appcrt\\startup\\thread.cpp @ 91] 08 invoke_thread_procedure + 0xe(内联函数@ 00007ff7`50b99cf9)[d:\\ th \\ minkernel \\ crts \\ ucrt \\ src \\ appcrt \\ startup \\ thread.cpp @ 91]

Can anyone please help how to catch this exception ? 任何人都可以帮助如何捕获此异常吗?

In an effort to help you, although there are too few details to actually answer properly: 为了帮助您,尽管很少有细节可以正确回答:

From https://github.com/zeromq/libzmq/blob/master/src/tcp.cpp 来自https://github.com/zeromq/libzmq/blob/master/src/tcp.cpp

int zmq::tcp_read (fd_t s_, void *data_, size_t size_)
{
#ifdef ZMQ_HAVE_WINDOWS

const int rc =
  recv (s_, static_cast<char *> (data_), static_cast<int> (size_), 0);

//  If not a single byte can be read from the socket in non-blocking mode
//  we'll get an error (this may happen during the speculative read).
if (rc == SOCKET_ERROR) {
    const int last_error = WSAGetLastError ();
    if (last_error == WSAEWOULDBLOCK) {
        errno = EAGAIN;
    } else {
        wsa_assert (
          last_error == WSAENETDOWN || last_error == WSAENETRESET
          || last_error == WSAECONNABORTED || last_error == WSAETIMEDOUT
          || last_error == WSAECONNRESET || last_error == WSAECONNREFUSED
          || last_error == WSAENOTCONN);
        errno = wsa_error_to_errno (last_error);
    }
}
return rc == SOCKET_ERROR ? -1 : rc;
#else

Clearly the stack trace shows an abort so I expect this is from the assert which then calls abort or raiseexception in windows : 显然,堆栈跟踪显示了异常中止,因此我希望这是来自于在Windows中调用异常中止或raiseexception的断言:

https://github.com/zeromq/libzmq/blob/master/src/err.cpp https://github.com/zeromq/libzmq/blob/master/src/err.cpp

So your best bet is to look into whether the connections was made and open , whether it had been closed, or any of the basic issues the assert checks for. 因此,最好的选择是检查是否已建立并打开连接,是否已关闭连接或assert检查的任何基本问题。 If it is bad data then probably the connection was dropped by the receiver because it was an invalid message to ZMQ? 如果数据不好,则接收方可能会断开连接,因为这是发给ZMQ的无效消息?

Anyway good luck and you need to post more than this to get better responses - what is the receiver like, what are you sending and what are you actually expecting to happen.... 无论如何,祝您好运,您需要发布更多信息才能获得更好的响应-接收方是什么样的,您发送的是什么,以及您实际期望发生的事情...。

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

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