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

zeromq raise exception in I/O thread

本文关键字:异常 线程 zeromq      更新时间:2023-10-16

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

00 内核基础!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(class 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 (Inline Function @ 00007ff7'50b99cf9( [d:\th\minkernel\crts\ucrt\src\appcrt\startup\thread.cpp @ 91]

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

为了帮助您,尽管细节太少而无法正确回答:

从 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

显然,堆栈跟踪显示中止,所以我希望这是来自断言,然后在窗口中调用中止或引发异常:

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

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

无论如何,祝你好运,你需要发布更多的东西才能获得更好的回应 - 收件人是什么样的,你发送什么以及你实际期望会发生什么......