c++ - ZMQ::send()引发异常并杀死QNX进程。为什么以及如何从中恢复?

标签 c++ exception zeromq qnx-neutrino

ZMQ::send() 引发异常并终止进程。

为什么以及如何从中恢复。

我在QNX版本6.5.0上使用ZeroMQ REQ/REP 模式。预期的catch{}块未收到此异常。

这是gdb跟踪:

(gdb) bt
#0  0xb033e4a1 in SignalKill () from /opt/qnx650/target/qnx6/x86/lib/libc.so.3
#1  0xb032d0ee in raise () from /opt/qnx650/target/qnx6/x86/lib/libc.so.3
#2  0xb032b3a8 in abort () from /opt/qnx650/target/qnx6/x86/lib/libc.so.3
#3  0xb835c077 in std::do_abort () from /opt/qnx650/target/qnx6/x86/lib/libcpp.so.4
#4  0xb835c01e in std::terminate () from /opt/qnx650/target/qnx6/x86/lib/libcpp.so.4
#5  0xb8354ff3 in __cxa_throw () from /opt/qnx650/target/qnx6/x86/lib/libcpp.so.4
#6  0x080596bc in zmq::detail::socket_base::send (this=0x8071070, msg_=@0x7b22d38)
    at /home/bindhu/rtcs/libzmq/include/zmq.hpp:1299
#7  0x0805b0a4 in dblog::SendPacketToDBLogger (this=0x8071068, ipc_can_msg=
      {type = 0, timestamp = 1590330536976, can_id = 352260142, data = 2511882692165894191})
    at /home/user/rtcs/canvehicle/dblog.cpp:203
#8  0x080530e3 in send_version_request (type=0 '\0', module=47 '/')
    at /home/user/rtcs/canvehicle/CanVehicle.cc:4736
#9  0x08053f50 in p_thread_kalmar_version (arg=0x0)
    at /home/user/rtcs/canvehicle/CanVehicle.cc:4749
#10 0xb0320390 in ?? () from /opt/qnx650/target/qnx6/x86/lib/libc.so.3

这是我的代码的片段。
dblog::dblog() :
    context(1), socket(context, ZMQ_REQ) {
    zmq_setsockopt (socket, ZMQ_LINGER, "", 0);
}
void dblog::Init() {
    socket.connect("tcp://127.0.0.1:5555");
}
zmq::message_t create_values(protoTable.ByteSizeLong() + sizeof(uint16_t));
*((uint16_t*)create_values.data()) = TABLEMSG_ID;  // ID
protoTable.SerializeToArray(create_values.data() + sizeof(uint16_t), protoTable.ByteSizeLong());

zmq::message_t reply;
try {
int returnv = socket.send(create_values,ZMQ_NOBLOCK);
socket.recv(&reply);
}
 catch (int e)
{
std::cout << "SPD exception e : " << e << std::endl;
}

最佳答案

如果遵循dbg()输出,则在ZMQ_CPP11 template<int Opt, class T, bool BoolUnit = false> struct integral_option{}块中为#ifdef报告行(如果使用最新版本)relates to模板定义:

// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ zmq.hpp:1290
#ifdef ZMQ_CPP11

namespace sockopt
{
// There are two types of options,
// integral type with known compiler time size (int, bool, int64_t, uint64_t)
// and arrays with dynamic size (strings, binary data).

// BoolUnit: if true accepts values of type bool (but passed as T into libzmq)
template<int Opt, class T, bool BoolUnit = false> struct integral_option
{
};

...

} // namespace sockopt
#endif // ZMQ_CPP11
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ zmq.hpp:1577

如果源代码和C++版本11都适合并且可以正常工作,则在调用实际 create_values -方法之前,添加更多调试启用代码,以检查 .send() 变量的事前内容。

一些 assert() -s也将是公平的,例如
assert(   socket.connect() == 0
      && "INF:: a call to .connect()-method failed, better inspect the <errno>"
          );

要么
assert(   0 == zmq_setsockopt( socket, ZMQ_LINGER, "", 0 )
      && "INF:: a call to zmq_setsockopt() API failed, better inspect the <errno>"
          );

在这里,我不敢满足API定义,所以宁愿调用zmq_setsockopt( socket, ZMQ_LINGER, &linger, sizeof (linger) )

关于c++ - ZMQ::send()引发异常并杀死QNX进程。为什么以及如何从中恢复?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61986901/

相关文章:

c++ - 在 QtQuick 中自定义样式

Java,父类,方法抛出异常

iOS 10 Xcode 8 - 迁移到 Swift 3 和 Date

java - 斯坦福解析器(类型化依赖)异常

c++ - 终止在 Linux 上以提升的权限运行的进程时套接字锁定

python - PAIR/PAIR 通信原型(prototype)中的 PyZMQ 用户输入()

c++ - 我无法在数字后扫描字符

c++ - 如何在 OpenGL 中显示图像

python - UDP 连接没有收到来自服务器的任何回复 - Python(也可能使用 boost 的 C++)

zeromq - 无法设置 Ratchet