gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 12:44:11 24 4
gpt4 key购买 nike

当我们将错误数据发送到 zmq 套接字时,I/O 线程引发异常并且进程被终止。crash调用栈如下

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(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

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

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

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

无论如何,祝你好运,你需要发布更多信息才能获得更好的回复 - 接收者是什么样的,你发送什么以及你实际期望发生什么......

关于c++ - zeromq 在 I/O 线程中引发异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52560982/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com