acl icon indicating copy to clipboard operation
acl copied to clipboard

通过smembers获取数据,在数据多过80条的时候会报错

Open timxian opened this issue 5 years ago • 9 comments

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

timxian avatar Dec 28 '18 06:12 timxian

members 只声明没有分配对象空间,你可以这样: std::vectoracl::string members; redis.smembers(key.c_str(), &members);

zhengshuxin avatar Dec 30 '18 11:12 zhengshuxin

我改成了您的方式,但是并没有用,依然是之前那个错:

    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

timxian avatar Jan 02 '19 02:01 timxian

请在你的测试环境中按:https://github.com/acl-dev/demo/blob/master/redis_set.cpp 这个例子测一下,我测试是没有问题的。

zhengshuxin avatar Jan 03 '19 12:01 zhengshuxin

我使用了这个例子去测试。写入是没有问题的,我通过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

报错截屏: screenshot from 2019-01-04 14-58-47 screenshot from 2019-01-04 14-58-28 screenshot from 2019-01-04 14-57-43 screenshot from 2019-01-04 14-58-01

timxian avatar Jan 04 '19 07:01 timxian

补充一下展开的堆栈信息: image

timxian avatar Jan 04 '19 07:01 timxian

default 我把值改成80后也是OK的,而且用 valgrind 检查了内存,都是正常的,不太容易复现您遇到的情况。另外,您所用的 acl 版本是多少?是不是把 acl 库完整地重新编译过?

zhengshuxin avatar Jan 04 '19 09:01 zhengshuxin

我是git clone整个acl项目,然后本地编译的。我clone的是master的branch

根据这一段说明,build了这3个库 image

还需要添加什么依赖吗?

timxian avatar Jan 04 '19 10:01 timxian

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

SivanLaai avatar May 26 '21 07:05 SivanLaai

没有,我已经直接用redis的c client来做了

timxian avatar May 26 '21 14:05 timxian