when i use [rocketmq-client-cpp-2.2.0] api in my app, it's often Crashed with Error: pure virtual method called
HUHANK opened this issue · comments
程序运行系统:CentOS7
下面是GDB的调用堆栈信息:
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib64/libthread_db.so.1".
Core was generated by `./mq_consumer'.
Program terminated with signal 6, Aborted.
#0 0x00007f252e8fc387 in raise () from /lib64/libc.so.6
Missing separate debuginfos, use: debuginfo-install glibc-2.17-326.el7_9.x86_64 libaio-0.3.109-13.el7.x86_64 libgcc-4.8.5-44.el7.x86_64 libstdc++-4.8.5-44.el7.x86_64 libuuid-2.23.2-65.el7_9.1.x86_64 zlib-1.2.7-21.el7_9.x86_64
(gdb) bt
#0 0x00007f252e8fc387 in raise () from /lib64/libc.so.6
#1 0x00007f252e8fda78 in abort () from /lib64/libc.so.6
#2 0x00007f252f20ca95 in __gnu_cxx::__verbose_terminate_handler() () from /lib64/libstdc++.so.6
#3 0x00007f252f20aa06 in ?? () from /lib64/libstdc++.so.6
#4 0x00007f252f20aa33 in std::terminate() () from /lib64/libstdc++.so.6
#5 0x00007f252f20b59f in __cxa_pure_virtual () from /lib64/libstdc++.so.6
#6 0x000000000041e8bb in ConsumerMsgListener::consumeMessage (this=0x21abc20, msgs=warning: Type size unknown, assuming 1. Try casting to a known type, or void *.
warning: Type size unknown, assuming 1. Try casting to a known type, or void *.
Python Exception <class 'gdb.error'> Cannot perform pointer math on incomplete type "rocketmq::MQMessageExt", try casting to a known type, or void *.:
std::vector of length 200, capacity 200) at /home/code/share/mq/mf_rocketmq.cpp:32
#7 0x00007f253441eca4 in rocketmq::ConsumeMessageOrderlyService::ConsumeRequest(boost::weak_ptr<rocketmq::PullRequest>) () from /home/code/lib/librocketmq.so
#8 0x00007f25344207da in boost::asio::detail::completion_handler<boost::_bi::bind_t<void, boost::_mfi::mf1<void, rocketmq::ConsumeMessageOrderlyService, boost::weak_ptr<rocketmq::PullRequest> >, boost::_bi::list2<boost::_bi::value<rocketmq::ConsumeMessageOrderlyService*>, boost::_bi::value<boost::shared_ptr<rocketmq::PullRequest> > > >, boost::asio::io_context::basic_executor_type<std::allocator<void>, 0ul> >::do_complete(void*, boost::asio::detail::scheduler_operation*, boost::system::error_code const&, unsigned long) ()
from /home/code/lib/librocketmq.so
#9 0x00007f25343ecb07 in boost::asio::detail::scheduler::run(boost::system::error_code&) ()
from /home/code/lib/librocketmq.so
#10 0x00007f25344190b3 in boost::asio::io_context::run() () from /home/code/lib/librocketmq.so
#11 0x00007f25344de1df in thread_proxy () from /home/code/lib/librocketmq.so
#12 0x00007f2533fe2ea5 in start_thread () from /lib64/libpthread.so.0
#13 0x00007f252e9c4b0d in clone () from /lib64/libc.so.6
下面是我的关键代码片段:
class ConsumerMsgListener : public MessageListenerOrderly
{
public:
ConsumerMsgListener(CRocketMQMessageHandler *phandler) : m_msg_handler(phandler)
{
}
virtual ~ConsumerMsgListener() {}
ConsumeStatus consumeMessage(const vector<MQMessageExt> &msgs) override
{
for (size_t i = 0; i < msgs.size(); i++)
{
shared_ptr<BusMessage> pBusMsg = make_shared<BusMessage>();
pBusMsg->fromJson(msgs[i].getBody());
if (m_msg_handler)
{
if (!m_msg_handler->messageHandle(
pBusMsg, msgs[i].getQueueId(),
msgs[i].getQueueOffset()))
{
return RECONSUME_LATER;
}
}
else
{
return RECONSUME_LATER;
}
}
return CONSUME_SUCCESS;
}
private:
CRocketMQMessageHandler *m_msg_handler = nullptr;
};
个人觉得是官方API的BUG,如果有大神遇到过类似问题,并解决的希望不宁赐教,请官方确认一下这个问题,谢谢!
发一下没用registerMessageListener
函数的代码
掉用
registerMessageListener
函数的代码
try
{
m_consumer_handler = new DefaultMQPushConsumer(m_consumer_group_name);
m_consumer_handler->setNamesrvAddr(m_namesrv_addr);
m_consumer_handler->setGroupName(m_consumer_group_name);
m_consumer_handler->setConsumeFromWhere(CONSUME_FROM_LAST_OFFSET);
m_consumer_handler->subscribe(m_consumer_topic, "*");
m_consumer_handler->setConsumeThreadCount(1);
m_consumer_handler->setConsumeMessageBatchMaxSize(31);
m_consumer_handler->setAsyncPull(true);
m_consumer_msg_listener = new ConsumerMsgListener(this);
m_consumer_handler->registerMessageListener(m_consumer_msg_listener);
m_consumer_handler->start();
}
catch (const MQClientException &e)
{
LOG_ERROR(e.what());
return false;
}
@HUHANK /home/code/share/mq/mf_rocketmq.cpp:32 这行代码是什么?
@HUHANK /home/code/share/mq/mf_rocketmq.cpp:32 这行代码是什么?
@HUHANK CRocketMQMessageHandler
类型的定义,和运行时m_msg_handler
成员变量的值是什么呢?
看起来m_msg_handler
没有指向一个完整的类型。
没有指向一个完整的类型
嗯,我再测一下,把m_msg_handler相关代码从ConsumerMsgListener拿掉试试
@ifplusor
请问,我怎么样调整vector的大小,我测试发现默认size都是1,要通过那个设置函数设置这个的大小。
该问题是我代码的问题,与rocketmq-client-cpp-2.2.0的api无关,谢谢 @ifplusor 的指点。
@ifplusor 请问,我怎么样调整vector的大小,我测试发现默认size都是1,要通过那个设置函数设置这个的大小。
@ifplusor 请问,我怎么样调整vector的大小,我测试发现默认size都是1,要通过那个设置函数设置这个的大小。
Ths!