zeromq 在 I/O 线程中引发异常
zeromq raise exception in I/O thread
当我们将错误数据发送到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_ = 0x0000006f
e3f9fb90, 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_ = 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]
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 的无效消息?
无论如何,祝你好运,你需要发布更多的东西才能获得更好的回应 - 收件人是什么样的,你发送什么以及你实际期望会发生什么......
- 异常属于C++中的线程还是进程
- 是什么导致了Unity 3D中的"错误线程异常"?
- C++线程库异常
- zeromq 在 I/O 线程中引发异常
- 如果不包含 pthread,为什么 GCC 的线程标准库实现会抛出异常?
- SIGABRT 和线程相关的异常,但在调试期间工作正常
- C++子线程抛出异常
- 防止线程在处理异常后在分离时调用 std::terminate()
- 多线程异常和锁定
- 线程中的异常 "main" java.lang.UnsatisfiedLinkError: no JNTIest in java.library.path
- STD ::线程和异常处理
- 终止无效异常(多线程合并排序)
- 当不调用thread.join()时,C 多线程异常
- 联接线程时出现异常
- 如何使用QThreads使无锁生产者-消费者线程交换更加异常安全
- 异常不会使用boost :: future/boost :: Promise跨线程正确传播
- JNI : 线程"AWT-EventQueue-0" java.lang.UnsatisfiedLinkError 中的异常
- 关于多线程应用程序中的 STL 字符串异常
- 如何在不同的上下文(例如线程)中保留原始异常类型信息
- 在没有活动异常线程的情况下终止调用