acl
acl copied to clipboard
通过smembers获取数据,在数据多过80条的时候会报错
OS Version: Ubuntu 18.04 Lib: lib_acl_cpp
acl::acl_cpp_init();
acl::string addr("xxx:6379");
acl::redis_client client(addr.c_str(), 10, 10);
acl::redis_set redis;
redis.set_client(&client);
acl::string key = "active_tickers:xxx:20181228";
std::vector<acl::string>* members;
redis.clear();
int ret = redis.smembers(key.c_str(), members);
if (ret < 0)
{
printf("smembers error, key: %s\r\n", key.c_str());
}
printf("smembers ok, key: %s, count: %d\r\n",
key.c_str(), ret);
报错函数:
redis.smembers(key.c_str(), members);
报错堆栈:
acl::redis_result::put redis_result.cpp:251
acl::redis_client::get_redis_array redis_client.cpp:311
acl::redis_client::get_redis_object redis_client.cpp:338
acl::redis_client::run redis_client.cpp:406
acl::redis_command::run redis_command.cpp:674
acl::redis_command::get_strings redis_command.cpp:879
acl::redis_set::smembers redis_set.cpp:121
main main.cpp:140
__libc_start_main 0x00007f54ad7dcb97
_start 0x0000560fbcafb16a
members 只声明没有分配对象空间,你可以这样: std::vectoracl::string members; redis.smembers(key.c_str(), &members);
我改成了您的方式,但是并没有用,依然是之前那个错:
acl::acl_cpp_init();
acl::string addr("192.168.1.249:6379");
acl::redis_client client(addr.c_str(), 10, 10);
acl::redis_set redis;
redis.set_client(&client);
acl::string key = "active_tickers:CME:20181228";
std::vector<acl::string> members;
redis.clear();
int ret = redis.smembers(key.c_str(), &members);
if (ret < 0)
{
printf("smembers error, key: %s\r\n", key.c_str());
}
printf("smembers ok, key: %s, count: %d\r\n",
key.c_str(), ret);
报错内容: redis_result.cpp, line: 251; children[i] = children_[i];
如下面文件所示:
redis_result& redis_result::put(const redis_result* rr, size_t idx)
{
if (children_ == NULL)
children_ = (const redis_result**) dbuf_->dbuf_alloc(
sizeof(redis_result*) * children_size_);
else if (idx == 0)
children_idx_ = 0;
if (children_idx_ + 1 < children_size_)
{
children_[children_idx_++] = rr;
return *this;
}
children_size_ *= 2;
const redis_result** children =(const redis_result**)
dbuf_->dbuf_calloc(sizeof(redchildren[i] = children_[i];is_result*) * children_size_);
for (size_t i = 0; i < children_idx_; i++)
这个位置===> children[i] = children_[i];
children_ = children;
children_[children_idx_++] = rr;
return *this;
}
报错堆栈:
acl::redis_result::put redis_result.cpp:251
acl::redis_client::get_redis_array redis_client.cpp:311
acl::redis_client::get_redis_object redis_client.cpp:338
acl::redis_client::run redis_client.cpp:406
acl::redis_command::run redis_command.cpp:674
acl::redis_command::get_strings redis_command.cpp:879
acl::redis_set::smembers redis_set.cpp:121
main main.cpp:140
__libc_start_main 0x00007fdd151d5b97
_start 0x000055e36d07f16a
请在你的测试环境中按:https://github.com/acl-dev/demo/blob/master/redis_set.cpp 这个例子测一下,我测试是没有问题的。
我使用了这个例子去测试。写入是没有问题的,我通过RedisMananger已经看到写入了,但是到了cmd.smembers(key, &members);
这一句,就报我之前一模一样的问题。
补充说明:
然而,当我将写入条数改成size_t max = 70;,代码就成功了,但是改成80之后就报上面的错
Redis版本:
Redis server v=4.0.9 sha=00000000:0 malloc=jemalloc-3.6.0 bits=64 build=76095d16786fbcba
报错截屏:
补充一下展开的堆栈信息:
我把值改成80后也是OK的,而且用 valgrind 检查了内存,都是正常的,不太容易复现您遇到的情况。另外,您所用的 acl 版本是多少?是不是把 acl 库完整地重新编译过?
我是git clone整个acl项目,然后本地编译的。我clone的是master的branch
根据这一段说明,build了这3个库
还需要添加什么依赖吗?
ubuntu 18,redis list,lrange也遇到这个问题了,只要数据超过80,就会报Segmentation fault (core dumped),错误的代码也是同一行children[i] = children_[i];,你这个问题解决了吗? 错误如下:
Program terminated with signal SIGSEGV, Segmentation fault.
#0 acl::redis_result::put (this=this@entry=0x7fe3f8024ba4, rr=0x7fe3f8029a78, idx=idx@entry=79) at src/redis/redis_result.cpp:245
245 children[i] = children_[i];
[Current thread is 1 (Thread 0x7fe41bbda700 (LWP 7359))]
(gdb) bt
#0 acl::redis_result::put (this=this@entry=0x7fe3f8024ba4, rr=0x7fe3f8029a78, idx=idx@entry=79) at src/redis/redis_result.cpp:245
#1 0x00007fe41e63dd75 in acl::redis_client::get_array (this=this@entry=0x7fe41bbd9300, conn=..., dbuf=dbuf@entry=0x7fe3f8024b28) at src/redis/redis_client.cpp:327
#2 0x00007fe41e63dbee in acl::redis_client::get_object (this=this@entry=0x7fe41bbd9300, conn=..., dbuf=dbuf@entry=0x7fe3f8024b28) at src/redis/redis_client.cpp:353
#3 0x00007fe41e63e030 in acl::redis_client::run (this=0x7fe41bbd9300, dbuf=0x7fe3f8024b28, req=..., nchildren=nchildren@entry=0, rw_timeout=rw_timeout@entry=0x0) at src/redis/redis_client.cpp:416
#4 0x00007fe41e63f7b7 in acl::redis_command::run (this=0x7fe41bbd93c8, nchild=0, timeout=0x0) at src/redis/redis_command.cpp:383
#5 0x00007fe41e641d43 in acl::redis_command::get_strings (this=0x7fe41bbd93c8, out=out@entry=0x7fe41bbd92c0) at src/redis/redis_command.cpp:584
#6 0x00007fe41e62bc5e in acl::redis_list::lrange (this=0x7fe41bbd93c0, key=0x5579c19d06c8 "mylist", start=<optimized out>, end=-1, result=0x7fe41bbd92c0) at src/redis/redis_list.cpp:520
#7 0x00005579c19c70b7 in StockAnalyze::RedisManager::getListByName (this=0x5579c2ffd888, listName=0x5579c19d06c8 "mylist", marketDataElementVec=std::vector of length 0, capacity 0)
at /home/username/fundAnalyze/src/redis_manager.hpp:139
#8 0x00005579c19c737f in StockAnalyze::RedisManager::test (this=0x5579c2ffd888) at /home/username/fundAnalyze/src/redis_manager.hpp:157
#9 0x00005579c19c6cc2 in Recevier::storeMarketData (this=0x5579c2ffd878, pDepthMarketData=0x7fe41bbd97b0) at /home/username/fundAnalyze/src/recevier.cpp:28
#10 0x00005579c19c6c9b in Recevier::receiveMarketData (this=0x5579c2ffd878, pDepthMarketData=0x7fe41bbd97b0) at /home/username/fundAnalyze/src/recevier.cpp:19
#11 0x00005579c195f757 in StockAnalyze::CTPMarketSpi::OnRtnDepthMarketData (this=0x5579c2ffd870, pDepthMarketData=0x7fe41bbd97b0) at /home/username/fundAnalyze/src/ctp_market_spi.cpp:167
#12 0x00007fe41d8a5ed2 in CThostFtdcUserApiImpl::OnRtnDepthMarketData(CFTDCPackage*, unsigned short) () from /home/username/fundAnalyze/deps/lib/libthostmduserapi_se.so
---Type <return> to continue, or q <return> to quit---
#13 0x00007fe41d8de8ad in CThostFtdcUserApiImplBase::HandlePackage(CFTDCPackage*, CFTDCSession*) () from /home/username/fundAnalyze/deps/lib/libthostmduserapi_se.so
#14 0x00007fe41d82018d in CProtocol::HandlePackage(CPackage*, CProtocol*) () from /home/username/fundAnalyze/deps/lib/libthostmduserapi_se.so
#15 0x00007fe41d8308f2 in CCompressProtocol::Pop(CPackage*) () from /home/username/fundAnalyze/deps/lib/libthostmduserapi_se.so
#16 0x00007fe41d82018d in CProtocol::HandlePackage(CPackage*, CProtocol*) () from /home/username/fundAnalyze/deps/lib/libthostmduserapi_se.so
#17 0x00007fe41d82018d in CProtocol::HandlePackage(CPackage*, CProtocol*) () from /home/username/fundAnalyze/deps/lib/libthostmduserapi_se.so
#18 0x00007fe41d820aa5 in CChannelProtocol::HandleInput() () from /home/username/fundAnalyze/deps/lib/libthostmduserapi_se.so
#19 0x00007fe41d81c5c4 in CSelectReactor::DispatchIO(fd_set&, fd_set&, int&) () from /home/username/fundAnalyze/deps/lib/libthostmduserapi_se.so
#20 0x00007fe41d81c705 in CSelectReactor::DispatchIOs() () from /home/username/fundAnalyze/deps/lib/libthostmduserapi_se.so
#21 0x00007fe41d81b2b9 in CEventDispatcher::Run() () from /home/username/fundAnalyze/deps/lib/libthostmduserapi_se.so
#22 0x00007fe41d81c135 in CThread::_ThreadEntry(void*) () from /home/username/fundAnalyze/deps/lib/libthostmduserapi_se.so
#23 0x00007fe41cf5a6db in start_thread (arg=0x7fe41bbda700) at pthread_create.c:463
#24 0x00007fe41cc8371f in clone () at ../sysdeps/unix/sysv/linux/x86_64/clone.S:95
没有,我已经直接用redis的c client来做了