【问题标题】:How to resolve a failed assert - zmqpp::frame::~frame(): assertion `0 == result' failed?如何解决失败的断言 - zmqpp::frame::~frame(): 断言 `0 == result' 失败?
【发布时间】:2016-06-03 02:20:15
【问题描述】:

我正在使用 zeromqpp 将数据发送到另一个进程。我已经成功地将zeromqpp 与其他信号一起使用,但是将我的最后一条消息添加到生产者后,我经常得到运行时断言:

zmqpp::frame::~frame()68: assertion "0 == result" failed

消费者程序永远不会收到错误,只有生产者会导致生产者的程序崩溃。如果我删除发布消息的代码,则看不到断言。

zeromq 服务器不报告任何错误。 GDB 没有给我堆栈跟踪,并且断言不会在多个程序执行期间同时发生,所以我很难找出问题所在。我已经开始注释掉大部分代码以试图缩小范围,但我仍然不知道问题的原因。

谁能告诉我这个断言错误是什么意思,以便我可以缩小要查找的范围?

编辑

这是第 0 步。

    signalProducer_->publish(SIGNAL_NAME, producerData, 1, VALID_SIGNAL_DATA);

【问题讨论】:

  • 您能否发布您的 assert SLOC + 一些“围绕”它的源代码上下文? assert 至少包括:a)断言失败的表达式(result == 0 ),b)源文件的名称和c)它发生的行号。所以实际上 -- 您曾经“缩小要查找的范围”还有什么其他疑问? 如果您阅读了 ZeroMQ API 文档,关于此的更多详细信息如下: ZeroMQ 团队通常使用result == 0 断言来检测各种可能的异常。 errno 中报告了更多详细信息。
  • @user3666197 在我的原始帖子中,我已经包含了发生断言的源文件名、类名和函数名。它在 ~frame() 中的名声.cpp 中。但是我确实忘记了行号。我现在已经添加了。
  • 那么,您打算什么时候搬到 [Step 0]
  • @user3666197 我不明白你的问题“你还有什么疑问......”
  • @user3666197 添加步骤 0

标签: c++ zeromq assertion


【解决方案1】:

步骤 0:

还发布实际上开始产生问题的代码
查看您自己的文本

cit.:" 如果我​​删除发布消息的代码,那么我看不到断言。"


第 1 步:

Review the ZeroMQ low-level API documentation,不是实际使用的c++封装/绑定实现,预先设计的细节在最底层识别和区分错误原因,以便实现和理解,哪些根本原因可能出现在特定的 API 服务调用中:

示例: ...ØMQ 团队自早期版本以来在这方面特别聪明和迂腐- 赞

如果成功,zmq_send() 函数将返回消息中的字节数。否则它将返回 -1 并将 errno 设置为下面定义的值之一。

错误

EAGAIN 请求了非阻塞模式,目前无法发送消息。

ENOTSUP 此套接字类型不支持zmq_send() 操作。

EFSM 由于该套接字不是当前套接字,因此无法在此套接字上执行zmq_send() 操作处于适当的状态。在多个状态之间切换的套接字类型可能会出现此错误,例如ZMQ_REP。有关详细信息,请参阅 zmq_socket(3) 的消息传递模式部分。

ETERM 与指定套接字关联的 ØMQ 上下文已终止。

@ 987654334@ 提供的套接字无效。

EINTR 在发送消息之前,操作因传递信号而中断。

EHOSTUNREACH
消息无法路由。

/*                                                     Send a multi-part
                                                       message consisting
                                                       of three parts to socket */
rc = zmq_send ( socket, "ABC",   3, ZMQ_SNDMORE );     assert (rc == 3);
rc = zmq_send ( socket, "DEFGH", 5, ZMQ_SNDMORE );     assert (rc == 5);

/*                                                     Final part;
                                                       no more parts to follow */
rc = zmq_send ( socket, "JK",    2, 0 );               assert (rc == 2);

【讨论】:

  • 您的回复,我会进一步调查。不幸的是,我不能发布周围的代码,因为它是专有的。
  • @Fred -- 恕我直言,一个 SLOC + 一个失败的 assert 绝不是专有的。
  • 是的,你是对的,一行代码很少是专有的。我从您的请求中了解到您想要“外围代码”,这对我来说意味着不止一行。
猜你喜欢
  • 2014-01-16
  • 1970-01-01
  • 2011-05-27
  • 2021-12-03
  • 2019-07-11
  • 2018-06-02
  • 2011-04-02
  • 2014-12-18
相关资源
最近更新 更多