apache / rocketmq-client-cpp

Apache RocketMQ cpp client

Home Page:https://rocketmq.apache.org/

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

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

崩溃截图如下
image

下面是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 这行代码是什么?

image

@HUHANK CRocketMQMessageHandler类型的定义,和运行时m_msg_handler成员变量的值是什么呢?

看起来m_msg_handler没有指向一个完整的类型。

没有指向一个完整的类型
嗯,我再测一下,把m_msg_handler相关代码从ConsumerMsgListener拿掉试试

@ifplusor
请问,我怎么样调整vector的大小,我测试发现默认size都是1,要通过那个设置函数设置这个的大小。
image

该问题是我代码的问题,与rocketmq-client-cpp-2.2.0的api无关,谢谢 @ifplusor 的指点。

@ifplusor 请问,我怎么样调整vector的大小,我测试发现默认size都是1,要通过那个设置函数设置这个的大小。 image

目前不支持,硬编码了1
image

@ifplusor 请问,我怎么样调整vector的大小,我测试发现默认size都是1,要通过那个设置函数设置这个的大小。 image

目前不支持,硬编码了1 image

Ths!