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

问题描述 投票:1回答:1

当我们将错误数据发送到zmq套接字时,I / O线程引发异常并且进程被杀死。调用堆栈的崩溃如下

00 KERNELBASE!RaiseException + 0x68 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] 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(类std :: vector> * fd_entries_ = 0x0000019d323400c8, struct zmq::select_t::fds_set_t * local_fds_set_ = 0x0000006fe3f9fb90,int event_count_ = 0n2)+ 0x74 [objdir-windows-msvc-14.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_ = 0x0000019d323400c8, int max_fd_ = 0n0, bool use_timeout_ = <Value unavailable error>, struct timeval * tv_ = 0x0000006fe3fffc98)+ 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] 07 thread_routine(void * arg_ =)+ 0xd [objdir-windows-msvc-14.0.x86_64 \ build \ libzmq \ src \ thread.cpp @ 47] 08 invoke_thread_procedure + 0xe(内联函数@ 00007ff7`50b99cf9)[d:\ th \ minkernel \ crts \ ucrt \ src \ appcrt \ startup \ thread.cpp @ 91]

任何人都可以帮助如何捕获此异常?

c++ zeromq
1个回答
0
投票

为了帮助您,尽管实际回答的细节太少:

来自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

很明显,堆栈跟踪显示中止,所以我希望这是来自断言,然后在windows中调用abort或raiseexception:

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

因此,最好的办法是查看连接是否已打开,是否已关闭,或断言检查的任何基本问题。如果它是坏数据,那么接收器可能已断开连接,因为它是ZMQ的无效消息?

无论如何好运,你需要发布更多以获得更好的回应 - 接收器是什么样的,你发送什么,你实际期望发生什么....

© www.soinside.com 2019 - 2024. All rights reserved.