< Previous by Date | Date Index | Next by Date > |
< Previous in Thread | Thread Index | Next in Thread > |
Hi Scott, I tried to send and receive messages using single stack. I’m able to receive messages from stack. But when I’m trying to initiate new INVITE request, I’m getting below error and my application is crashing, ERR | 20170719-141343.157 | | RESIP | 140643582072576 | DataParameter.cxx:91 | Accessing defaulted DataParameter: 'tag' B2BServer: DataParameter.cxx:93: virtual std::ostream& resip::DataParameter::encode(std::ostream&) const: Assertion `!mValue.empty()' failed. ORA-24550: signal received: [si_signo=6] [si_errno=0] [si_code=-6] [si_int=0] [si_ptr=(nil)] [si_addr=0x1f400003d46] I have separate function (fnG_encodeSipPBMsgToSIPStackMessage) to encode sip message, here is the SIP message from my application logs which is generated using makeRequest, INVITE sip:1.1.5695103.en-fe@10.10.30.111:5060 SIP/2.0 Via: SIP/2.0/UDP 192.168.2.106:2271;branch=z9hG4bK5615554850bd4935;received=192.168.2.106;rport=0 Max-Forwards: 70 Route: <sip:10.10.30.113:30029> Contact: <sip:SonetelPBX@49.57.50.46:30029> To: <sip:1.1.5695103.en-fe@10.10.30.111:5060> From: "sai_live_fname_2"<sip:sai_live_fname_2@xxxxxxxxxx:5060>;tag=8b7d7e2c Call-ID: NXp-UyYakfdU4k1ufJyZtA.. CSeq: 1 INVITE P-Charging-Vector: icid-value=1522390983 Content-Length: 0 For new INVITE request, we should not send tag as per RFC. If we are voiding that and send tag for NameAddr type headers with some dummy value, then the request is reaching to proxy. Here is the SIP message for that, INVITE sip:1.1.5695103.en-fe@10.10.30.111:5060 SIP/2.0. Via: SIP/2.0/UDP 192.168.2.152:30029;branch=z9hG4bKc041.32500907.0. Via: SIP/2.0/UDP 192.168.2.106:2271;branch=z9hG4bK-524287-1---e93b397d27f01217;rport=2271;received=10.10.30.111. Max-Forwards: 30. Route: <sip:10.10.30.113:30029>. Contact: <sip:SonetelPBX@49.57.50.46:30029>;tag=tag. To: <sip:1.1.5695103.en-fe@10.10.30.111:5060>;tag=tag. From: "sai_live_fname_2"<sip:sai_live_fname_2@xxxxxxxxxx:5060>;tag=1b45d73e. Call-ID: eY-W-3RpyV_JOvtcXaOnTw... CSeq: 1 INVITE. P-Charging-Vector: icid-value=769118466. Content-Length: 0 I’m attaching source code and output in separate files. Please suggest me if I’m doing anything wrong. Thanks & Regards, LavanyaKumar S +91 9603323366 From: slgodin@xxxxxxxxx [mailto:slgodin@xxxxxxxxx] On Behalf Of Scott Godin On Wed, Jul 12, 2017 at 9:30 AM, LavanyaKumar <lavanyakumar.s@xxxxxxxxxxx> wrote:
[Scott] You really only need one SipStack for any SIP based application. It can both send and receive messages. The testStack program creates multiple stacks for testing only.
[Scott] It is too hard to troubleshoot this without seeing your code.
[Scott] You only need 1 SipStack and at least one transport. You cannot pass the same transport to 2 SipStacks.
[Scott] Sorry I forgot testStack got reasonably complicated recently. testSipStackInvite might be an easier example to read. Some information here: and and
|
#ifndef _STACKSERVER_HPP_ #define _STACKSERVER_HPP_ #include "rutil/GeneralCongestionManager.hxx" #include "rutil/DnsUtil.hxx" #include "rutil/Inserter.hxx" #include "rutil/Logger.hxx" #include "resip/stack/DeprecatedDialog.hxx" #include "resip/stack/Helper.hxx" #include "resip/stack/SipMessage.hxx" #include "resip/stack/SipStack.hxx" #include "resip/stack/StackThread.hxx" #include "rutil/SelectInterruptor.hxx" #include "resip/stack/TransportThread.hxx" #include "resip/stack/InterruptableStackThread.hxx" #include "resip/stack/EventStackThread.hxx" #include "resip/stack/Uri.hxx" #include "resip/stack/UnknownHeaderType.hxx" #include "resip/stack/Transport.hxx" #include "rutil/DataStream.hxx" #include "rutil/Data.hxx" #include "../Protobuf/src/ProtoSIPBuff.pb.h" #define RESIPROCATE_SUBSYSTEM Subsystem::APP using namespace resip; class SharedAsyncNotify : public AsyncProcessHandler { public: SharedAsyncNotify() { }; virtual ~SharedAsyncNotify() { }; virtual void handleProcessNotification(); bool waitNotify(int ms); protected: resip::Mutex mMutex; Condition mCondition; }; typedef struct StackThreadPair; class SipStackAndThread { public: SipMessage* received; SipMessage* response; static SipStackAndThread& instance() { return myInstance; } ~SipStackAndThread(){}; SipStack* getStack(); SipStack& operator*() const { assert(mStack); return *mStack; } SipStack* operator->() const { return mStack; } void setCongestionManager(CongestionManager* cm); void run(); void shutdown(); void join(); void destroy(); void init(); void receivedMsg(StackThreadPair& pair); bool sendMsgToStack(sip_proto_buf::ProtoSIPMessage *pCL_SipMsg, SipMessage *pCL_SipReq = NULL); protected: ThreadIf *mThread; SelectInterruptor *mSelIntr; FdPollGrp *mPollGrp; EventThreadInterruptor *mEventIntr; bool mMultiThreadedStack; private: SipStack *mStack; static SipStackAndThread myInstance; SipStackAndThread() {} SipStackAndThread(const char *tType, AsyncProcessHandler *notifyDn=0, AsyncProcessHandler *notifyUp=0); }; #endif
#include "resip/stack/Helper.hxx" #include "resip/stack/SipMessage.hxx" #include "resip/stack/Uri.hxx" #include "resip/stack/SipStack.hxx" #include "rutil/Logger.hxx" #include "rutil/ThreadIf.hxx" #include "rutil/ParseBuffer.hxx" using namespace resip; using namespace std; int gPort = {0}; SipStackAndThread SipStackAndThread::myInstance; SipStack *GStack; bool bG_SendStackFdSet = false; FdSet CG_Fdset; void SharedAsyncNotify::handleProcessNotification() { Lock lock(mMutex); (void)lock; mCondition.signal(); } bool SharedAsyncNotify::waitNotify(int ms) { Lock lock(mMutex); (void)lock; if (ms<0) { mCondition.wait(mMutex); return true; } else { return mCondition.wait(mMutex, ms); } } SipStack* SipStackAndThread::getStack() { //assert(mStack); //LOG(LOGLEVEL_INFO, __FILE__, __LINE__,"This is the mStack %x", mStack); // return mStack; } void SipStackAndThread::setCongestionManager(CongestionManager* cm) { mStack->setCongestionManager(cm); } void SipStackAndThread::run() { if ( mThread ) mThread->run(); if ( mMultiThreadedStack ) mStack->run(); } void SipStackAndThread::shutdown() { if ( mThread ) mThread->shutdown(); } void SipStackAndThread::join() { if ( mThread ) mThread->join(); if ( mMultiThreadedStack ) mStack->shutdownAndJoinThreads(); } SipStackAndThread::SipStackAndThread(const char *tType, AsyncProcessHandler *notifyDn, AsyncProcessHandler *notifyUp) : mStack(0), mThread(0), mSelIntr(0), mPollGrp(0), mEventIntr(0), mMultiThreadedStack(false) { bool doStd = false; assert( tType ); if (strcmp(tType,"intr")==0) { mSelIntr = new SelectInterruptor(); } else if ( strcmp(tType,"event")==0 || strcmp(tType,"epoll")==0 || strcmp(tType,"fdset")==0 || strcmp(tType,"poll")==0 ) { mPollGrp = FdPollGrp::create(tType); mEventIntr = new EventThreadInterruptor(*mPollGrp); } else if ( strcmp(tType,"std")==0 ) { doStd = true; } else if ( strcmp(tType,"none")==0 ) { } else if ( strcmp(tType,"multithreadedstack")==0 ) { mMultiThreadedStack=true; mPollGrp = FdPollGrp::create("event"); mEventIntr = new EventThreadInterruptor(*mPollGrp); } else { //CritLog(<<"Bad thread-type: "<<tType); exit(1); } SipStackOptions options; //options.mAsyncProcessHandler = mEventIntr?mEventIntr :(mSelIntr?mSelIntr:notifyUp); options.mAsyncProcessHandler = mEventIntr; options.mPollGrp = mPollGrp; mStack = new SipStack(options); mStack->setFallbackPostNotify(notifyUp); if (mEventIntr) { mThread = new EventStackThread(*mStack, *mEventIntr, *mPollGrp); } else if (mSelIntr) { mThread = new InterruptableStackThread(*mStack, *mSelIntr); } else if (doStd) { mThread = new StackThread(*mStack); } GStack = mStack; } void SipStackAndThread::destroy() { if ( mThread ) { delete mThread; mThread = 0; } if ( mStack ) { delete mStack; mStack = 0; } if ( mSelIntr ) { delete mSelIntr; mSelIntr = 0; } if ( mEventIntr ) { delete mEventIntr; mEventIntr = 0; } if ( mPollGrp ) { delete mPollGrp; mPollGrp = 0; } } static void waitForStacks(SipStackAndThread& receiver, SelectInterruptor *commonIntr, int& thisseltime, bool& isStrange) { FdSet fdset; receiver->buildFdSet(fdset); if ( commonIntr ) { commonIntr->buildFdSet(fdset); } if ( commonIntr ) { commonIntr->process(fdset); } receiver->process(fdset); } typedef struct StackThreadPair { StackThreadPair(SipStackAndThread& receiver, SharedAsyncNotify& sharedUp) : mReceiver(receiver), mSharedUp(sharedUp), mSeltime(0), mNoStackThread(false), mCommonIntr(0) { } bool wait(int& thisseltime); SipStackAndThread& mReceiver; SharedAsyncNotify& mSharedUp; int mSeltime; bool mNoStackThread; SelectInterruptor *mCommonIntr; }; bool StackThreadPair::wait(int& thisseltime) { if(mReceiver.getStack()->hasMessage()) { return false; } thisseltime = mSeltime; bool isStrange = false; if ( mNoStackThread ) { waitForStacks( mReceiver, mCommonIntr, thisseltime, isStrange); } else { thisseltime = 4000; bool gotPost = mSharedUp.waitNotify(thisseltime); isStrange = !gotPost; } return isStrange; } void SipStackAndThread::receivedMsg(StackThreadPair& pair) { LOG(LOGLEVEL_INFO, __FILE__, __LINE__,"This is the received stack %x", getStack()); LOG(LOGLEVEL_INFO, __FILE__, __LINE__,"This is the received mStack %x", mStack); LOG(LOGLEVEL_INFO, __FILE__, __LINE__,"This is the send Stack %x", GStack); UInt64 startTime = Timer::getTimeMs(); static long runs = 0; while(1)//mStack->mAsyncProcessHandler) { GStack->process(CG_Fdset); int thisseltime = 0; runs++; bool isStrange = pair.wait(thisseltime); if (isStrange) { } UInt64 elapsed = Timer::getTimeMs() - startTime; received = GStack->receive(); //LOG(LOGLEVEL_INFO, __FILE__, __LINE__,"Received %x", received); if (received) { LOG(LOGLEVEL_INFO, __FILE__, __LINE__,"Received SIPMessage from stack"); LOG(LOGLEVEL_INFO, __FILE__, __LINE__,"GStack %x", GStack); LOG(LOGLEVEL_INFO, __FILE__, __LINE__,"mStack %x", mStack); ProtoSIPMessage *protoSipMessage = new ProtoSIPMessage(); protoSipMessage->set_reqeventtype(SPB_ET_INVALID); protoSipMessage->set_resstatuscode(SPB_RSP_INVALID); if(received->isRequest() == true) { LOG(LOGLEVEL_INFO, __FILE__, __LINE__,"SIPRequest: %s", getMethodName(received->header(h_RequestLine).getMethod()).c_str()); Contents* body = received->getContents(); SdpContents* sdp = dynamic_cast<SdpContents*>(body); MethodTypes meth = received->header(h_RequestLine).getMethod(); if(meth == OPTIONS) { NameAddr contact; contact.uri().scheme() = "sip"; contact.uri().user() = "heartbeat"; contact.uri().host() = SipStack::getHostname(); contact.uri().port() = gPort; //contact.uri().param(p_transport) = Tuple::toData(mTransport); auto_ptr<SipMessage> msg200(Helper::makeResponse(*received, 200, contact)); //getStack()->send(*msg200); GStack->send(*msg200); delete protoSipMessage; continue; } fnG_decodeSIPMessageToProtoBuff(received, protoSipMessage); if(sdp) fnG_decodeSDPBodyToProtoBuf(sdp, protoSipMessage); int packSize = protoSipMessage->ByteSize()+4; char *packBuf = new char[packSize+1]; google::protobuf::io::ArrayOutputStream arrayOut(packBuf, packSize); google::protobuf::io::CodedOutputStream codedOut(&arrayOut); codedOut.WriteVarint32(protoSipMessage->ByteSize()); protoSipMessage->SerializeToCodedStream(&codedOut); //LOG(LOGLEVEL_INFO, __FILE__, __LINE__,"Protobuf packbuf: 0x%x created for callid: %s", packBuf, \ // protoSipMessage->siprequest().headers().callid().c_str()); MsgData_t *l_Msg = new MsgData_t; l_Msg->MsgType = SIP_MESSAGE_TYPE; l_Msg->t.m_SipMsg.packBuf = packBuf; l_Msg->t.m_SipMsg.packLen = codedOut.ByteCount(); //l_Msg->t.m_SipMsg.stack = getStack(); l_Msg->t.m_SipMsg.stack = GStack; l_Msg->t.m_SipMsg.sipRequest = received; //LOG(LOGLEVEL_INFO, __FILE__, __LINE__,"Inserting in msg queue"); CB2BWorkerThread::instance().AddMsgToQueue(*l_Msg,1); if(l_Msg) delete l_Msg; //delete packBuf; } else if(received->isResponse() == true) { LOG(LOGLEVEL_INFO, __FILE__, __LINE__,"SIPResponse: %d %s", received->header(h_StatusLine).statusCode(), received->header(h_StatusLine).reason().c_str()); Contents* body = received->getContents(); SdpContents* sdp = dynamic_cast<SdpContents*>(body); fnG_decodeSIPMessageToProtoBuff(received, protoSipMessage); if(sdp) fnG_decodeSDPBodyToProtoBuf(sdp, protoSipMessage); int packSize = protoSipMessage->ByteSize()+4; char *packBuf = new char[packSize+1]; google::protobuf::io::ArrayOutputStream arrayOut(packBuf, packSize); google::protobuf::io::CodedOutputStream codedOut(&arrayOut); codedOut.WriteVarint32(protoSipMessage->ByteSize()); protoSipMessage->SerializeToCodedStream(&codedOut); //LOG(LOGLEVEL_INFO, __FILE__, __LINE__,"Protobuf packbuf: 0x%x created for callid: %s", packBuf, \ protoSipMessage->siprequest().headers().callid().c_str()); MsgData_t *l_Msg = new MsgData_t; l_Msg->MsgType = SIP_MESSAGE_TYPE; l_Msg->t.m_SipMsg.packBuf = packBuf; l_Msg->t.m_SipMsg.packLen = codedOut.ByteCount(); //l_Msg->t.m_SipMsg.stack = getStack(); l_Msg->t.m_SipMsg.stack = GStack; l_Msg->t.m_SipMsg.sipRequest = received; //LOG(LOGLEVEL_INFO, __FILE__, __LINE__,"Inserting in msg queue"); CB2BWorkerThread::instance().AddMsgToQueue(*l_Msg,1); if(l_Msg) delete l_Msg; //delete packBuf; } else { LOG(LOGLEVEL_INFO, __FILE__, __LINE__,"Received unknown sipmessage... ignore"); } delete protoSipMessage; } } } bool SipStackAndThread::sendMsgToStack(ProtoSIPMessage *pCL_PBSipMsg, SipMessage *pCL_SIPRequest) { LOG(LOGLEVEL_INFO, __FILE__, __LINE__,"sendMsgToStack >>>"); LOG(LOGLEVEL_INFO, __FILE__, __LINE__,"mStack %x", mStack); LOG(LOGLEVEL_INFO, __FILE__, __LINE__,"GStack %x", GStack); SipMessage *pCL_SipStackMsg = NULL; /* char pscL_SIPMsg[4000] = {0}; fnG_decodeSIPMessageToString(pCL_PBSipMsg, pscL_SIPMsg); LOG(LOGLEVEL_INFO,__FILE__, __LINE__, "%s", pscL_SIPMsg); */ pCL_SipStackMsg = fnG_encodeSipPBMsgToSIPStackMessage(pCL_PBSipMsg, pCL_SipStackMsg, pCL_SIPRequest); GStack->send(*pCL_SipStackMsg); GStack->buildFdSet(CG_Fdset); fnG_decodeAndPrintStackMsg(pCL_SipStackMsg); bG_SendStackFdSet = true; LOG(LOGLEVEL_INFO, __FILE__, __LINE__,"sent request out"); LOG(LOGLEVEL_INFO, __FILE__, __LINE__,"sendMsgToStack <<<"); return true; } void SipStackAndThread::init() { LOG(LOGLEVEL_INFO, __FILE__, __LINE__,"SipStackAndThread::init()"); Log::initialize(Log::Cout, Log::toLevel("STACK"), NULL,NULL,NULL); gPort = 2271; //getPort(); int tpFlags = 0; const char* threadType = "multithreadedstack"; int statisticsInterval=60; std::vector<Transport*> transports; const char *eachThreadType = threadType; SelectInterruptor *commonIntr = NULL; AsyncProcessHandler *notifyUp = NULL; bool noStackThread = false; SharedAsyncNotify sharedUp; notifyUp = &sharedUp; SipStackAndThread receiver(eachThreadType, notifyUp, &sharedUp); receiver.getStack()->setStatisticsInterval(statisticsInterval); transports.push_back(receiver->addTransport(UDP, gPort, V4, StunDisabled,/*ipInterface*/Data::Empty,/*sipDomain*/Data::Empty,/*keypass*/Data::Empty,SecurityTypes::TLSv1, tpFlags)); std::auto_ptr<CongestionManager> receiverCongestionManager; std::auto_ptr<CongestionManager> senderCongestionManager; std::vector<TransportThread*> transportThreads; if(tpFlags & RESIP_TRANSPORT_FLAG_OWNTHREAD) { while(!transports.empty()) { transportThreads.push_back(new TransportThread(*transports.back())); transportThreads.back()->run(); transports.pop_back(); } } receiver.run(); StackThreadPair pair(receiver, sharedUp); pair.mSeltime = 100;//seltime; pair.mCommonIntr = commonIntr; pair.mNoStackThread = noStackThread; receiver.receivedMsg(pair); receiver.join(); }
putq SUCESS retval:1DEBUG | 20170719-141343.156 | | RESIP | 140643840018176 | SipStack.cxx:594 | SEND: SipReq: INVITE 1.1.5695103.en-fe@10.10.30.111:5060 tid=5615554850bd4935 cseq=1 INVITE contact=SonetelPBX@49.57.50.46:30029 / 1 from(tu) STACK | 20170719-141343.157 | | RESIP:TRANSACTION | 140643582072576 | TransactionState.cxx:168 | No matching transaction for SipReq: INVITE 1.1.5695103.en-fe@10.10.30.111:5060 tid=5615554850bd4935 cseq=1 INVITE contact=SonetelPBX@49.57.50.46:30029 / 1 from(tu) STACK | 20170719-141343.157 | | RESIP:TRANSACTION | 140643582072576 | TransactionState.cxx:68 | Creating new TransactionState: tid=5615554850bd4935 [ ClientInvite/Calling reliable target=[ V4 0.0.0.0:0 UNKNOWN_TRANSPORT target domain=unspecified mFlowKey=0 ]] STACK | 20170719-141343.157 | | RESIP:TRANSACTION | 140643582072576 | TransactionState.cxx:1149 | TransactionState::processClientInvite: SipReq: INVITE 1.1.5695103.en-fe@10.10.30.111:5060 tid=5615554850bd4935 cseq=1 INVITE contact=SonetelPBX@49.57.50.46:30029 / 1 from(tu) tid=5615554850bd4935 [ ClientInvite/Calling reliable target=[ V4 0.0.0.0:0 UNKNOWN_TRANSPORT target domain=unspecified mFlowKey=0 ]] DEBUG | 20170719-141343.157 | | RESIP:TRANSACTION | 140643582072576 | TimerQueue.cxx:50 | Adding timer: Timer B tid=5615554850bd4935 ms=32000 STACK | 20170719-141343.157 | | RESIP:TRANSACTION | 140643582072576 | TransactionState.cxx:2511 | sendToWire with no dns result: tid=5615554850bd4935 [ ClientInvite/Calling reliable target=[ V4 0.0.0.0:0 UNKNOWN_TRANSPORT target domain=unspecified mFlowKey=0 ]] DEBUG | 20170719-141343.157 | | RESIP:TRANSPORT | 140643582072576 | TransportSelector.cxx:463 | Looking up dns entries (from route) for sip:10.10.30.113:30029 DEBUG | 20170719-141343.157 | | RESIP:DNS | 140643582072576 | DnsResult.cxx:249 | DnsResult::lookup sip:10.10.30.113:30029 DEBUG | 20170719-141343.157 | | RESIP:DNS | 140643582072576 | DnsResult.cxx:471 | Numeric result so return immediately: [ V4 10.10.30.113:30029 UDP target domain=10.10.30.113 mFlowKey=0 ] STACK | 20170719-141343.157 | | RESIP:TRANSACTION | 140643582072576 | TransactionState.cxx:723 | Found matching transaction for Client DnsResultMessage: tid=5615554850bd4935 -> tid=5615554850bd4935 [ ClientInvite/Calling reliable target=[ V4 0.0.0.0:0 UNKNOWN_TRANSPORT target domain=unspecified mFlowKey=0 ]] STACK | 20170719-141343.157 | | RESIP:TRANSACTION | 140643582072576 | TransactionState.cxx:1149 | TransactionState::processClientInvite: Client DnsResultMessage: tid=5615554850bd4935 tid=5615554850bd4935 [ ClientInvite/Calling reliable target=[ V4 0.0.0.0:0 UNKNOWN_TRANSPORT target domain=unspecified mFlowKey=0 ]] STACK | 20170719-141343.157 | | RESIP:TRANSACTION | 140643582072576 | TransactionState.cxx:2350 | tid=5615554850bd4935 [ ClientInvite/Calling reliable target=[ V4 0.0.0.0:0 UNKNOWN_TRANSPORT target domain=unspecified mFlowKey=0 ]] got DNS result: 10.10.30.113 --> [[ V4 10.10.30.113:30029 UDP target domain=10.10.30.113 mFlowKey=0 ]] STACK | 20170719-141343.157 | | RESIP:DNS | 140643582072576 | DnsResult.cxx:228 | Returning next dns entry: [ V4 10.10.30.113:30029 UDP target domain=10.10.30.113 mFlowKey=0 ] STACK | 20170719-141343.157 | | RESIP:TRANSACTION | 140643582072576 | TransactionState.cxx:2395 | Unreliable transport: tid=5615554850bd4935 [ ClientInvite/Calling unreliable target=[ V4 0.0.0.0:0 UNKNOWN_TRANSPORT target domain=unspecified mFlowKey=0 ]] DEBUG | 20170719-141343.157 | | RESIP:TRANSACTION | 140643582072576 | TimerQueue.cxx:50 | Adding timer: Timer A tid=5615554850bd4935 ms=500 DEBUG | 20170719-141343.157 | | RESIP:TRANSPORT | 140643582072576 | TransportSelector.cxx:1376 | findTransportBySource([ V4 192.168.2.106:2271 UDP target domain=unspecified mFlowKey=0 ]) DEBUG | 20170719-141343.157 | | RESIP:TRANSPORT | 140643582072576 | TransportSelector.cxx:1390 | should port be ignored: 0 DEBUG | 20170719-141343.157 | | RESIP:TRANSPORT | 140643582072576 | TransportSelector.cxx:1419 | findTransport (any interface) => Transport: [ V4 0.0.0.0:2271 UDP target domain=unspecified mFlowKey=33 ] ERR | 20170719-141343.157 | | RESIP | 140643582072576 | DataParameter.cxx:91 | Accessing defaulted DataParameter: 'tag' B2BServer: DataParameter.cxx:93: virtual std::ostream& resip::DataParameter::encode(std::ostream&) const: Assertion `!mValue.empty()' failed. ORA-24550: signal received: [si_signo=6] [si_errno=0] [si_code=-6] [si_int=0] [si_ptr=(nil)] [si_addr=0x1f400003d46]