【发布时间】:2017-05-24 15:51:05
【问题描述】:
我正在使用 ZeroMQ 的 PUB/SUB 套接字模式。 PUB 制作股票的财务数据并发布。主题设置为每只股票的代码。在 SUB 端,客户可以根据股票代码订阅他们想要的数据。 PUB 用 C 编写,SUB 用 Python 编写。
但是,在测试过程中出现了问题。如果只将一个股票代码设置为 SUB 套接字上的消息过滤器,则一切正常。但是当涉及到大量股票时,程序会在短时间内崩溃,并报错“Segmentation fault (core dumped)”(详情如下)。
这是PUB (C)的代码:
while (1) {
int rc = 0;
// send topic
rc = zmq_send(pub_socket, topic, rc, ZMQ_SNDMORE);
if (rc == -1) {
// error handling
}
// send stock data
rc = zmq_send(pub_socket, data, rc, 0);
if (rc == -1) {
// error handling
}
}
这里是SUB (Python)的代码:
import zmq
# initialize a SUB socket
ctx = zmq.Context.instance()
socket = ctx.socket(zmq.SUB)
# set socket options to filter message
for code in code_list:
socket.setsockopt_string(zmq.SUBSCRIBE, code)
socket.connect(PUB_ADDR)
# recv data from PUB
while True:
data = socket.recv()
print(data)
我还使用 gdb 来调试程序。 调试结果如下: debug result
有人知道程序为什么会崩溃吗?欢迎任何帮助,谢谢。
更新:
如果我将setsockopt_string 部分替换为以下代码,Python 脚本运行良好。奇怪的事情...我需要深入挖掘setsockopt_string 函数。
Python 中的新代码:
socket.setsockopt_string( zmq.SUBSCRIBE, "" )
最新更新:
我运行了@user3666197 提供的脚本,得到了调试日志。我只选择了日志的几个部分,因为它很长。
【问题讨论】:
-
您的机器上有源代码 (
malloc.c) 吗?如果在bt之后输入list,你会看到什么?机器有多少内存? -
@Attie 1. 我的机器上似乎没有 malloc.c,因为我使用
find命令搜索文件并且没有返回结果; 2. 有点不知道怎么调试问题,明天交易期间调试程序,更新list结果; 3.机器内存32GB -
由于
SEGFAULT在 malloc.c 中,我怀疑存在一些堆损坏。可能值得获得资源......你的操作系统是什么?在 Ubuntu 上,您可以运行:apt-get install libc6-dev(需要 root,并替换正确的包名称)。如果你需要更多,你可以运行apt-get source libc6(不需要root)。然后,您可以找到malloc.c:3588并获得有关问题所在的提示。 -
可能还值得研究一下 python
gdb扩展,看看你的 python 应用程序中发生崩溃的地方......我从来没有运气好,所以你可能需要找其他人筹码。wiki.python.org/moin/DebuggingWithGdb / docs.python.org/devguide/gdb.html -
@user3666197 抱歉,出现了一些其他事情,分散了我的注意力。我修改了PUB端的代码结构,手指受伤了,所以还没有运行测试脚本。我将在运行脚本后更新 DEBUG:log,可能是 2 或 3 天后。