Re: [OpenSIPStack] FW: Memory Leak in Proxy and Full Mode
Brought to you by:
joegenbaclor
From: Gustavo C. <cur...@ho...> - 2008-06-19 13:41:31
|
Hi Joegen, Thanks for your help. The other header which is missing in the SIPMessage::CleanUp() is the m_SessionExpires ("session-expires"). I will continue with my tests and let you know. Gustavo > Date: Thu, 19 Jun 2008 08:38:42 +0800> From: joe...@gm...> To: cur...@gm...> CC: jo...@op...; ope...@li...; jb...@so...> Subject: Re: [OpenSIPStack] FW: Memory Leak in Proxy and Full Mode> > Right! I've found m_MinSE is not getting deleted in > SIPMessage::CleanUp(). Patched this in CVS.> > Joegen> > Gustavo Curetti wrote:> > Hi Joegen> > > > The modification doesn't solve the memory issues. I continue searching > > for the memory leak. > > > > A new case is attached and this one appear too when debugging with > > Microsot Visual.> > > > Originally, i sent the attached Invite every 250 ms and I set the > > timer B and H in 20 ms:> > > > #define SIP_TIMER_B 20> > > > #define SIP_TIMER_H 20> > > > Then I change the code > > of B2BUserAgent::Registrar::ProcessUpperRegKeepAlive() > > for making easier to replicate the leak:> > > > > > void B2BUserAgent::Registrar::ProcessUpperRegKeepAlive()> > {> > while( !m_UpperRegSync.Wait( 250 ) )> > {> > OString testRequest => > "INVITE sip:5435155555@192.168.0.5:5060 SIP/2.0\r\nContact: > > <sip:4284623@192.168.0.10:5060>\r\nCSeq: 101 INVITE\r\nFrom: > > <sip:4284623@192.168.0.10>;tag=5A3745C-2418\r\nTo: > > <sip:55555555@192.168.0.206>\r\nVia: SIP/2.0/UDP > > 192.168.0.206:5060;branch=z9hG4bK63028de3a6b7743a\r\nVia: SIP/2.0/UDP > > 192.168.0.10:5060\r\nRecord-Route: > > <sip:192.168.0.206:5060;lr>\r\nAllow: INVITE, OPTIONS, BYE, CANCEL, > > ACK, PRACK, COMET, REFER, SUBSCRIBE, NOTIFY, INFO\r\nUser-Agent: > > Cisco-SIPGateway/IOS-12.x\r\nCall-Id: > > 3738EB25-278011DD-B92F90A6-C0EF6BE3@192.168.0.10\r\nMax-Forwards > > <mailto:3738EB25-278011DD-B92F90A6-C0EF6BE3@192.168.0.10%5Cr%5CnMax-Forwards>: > > 6\r\nExpires: 180\r\nContent-Length: 235\r\ndate: Thu, 22 May 2008 > > 21:52:32 GMT\r\nsupported: timer\r\nmin-se: 1800\r\ncisco-guid: > > 926237238-662704605-3106705574-3236916195\r\nremote-party-id: > > <sip:4284623@192.168.0.10>;party=calling;screen=no;privacy=off\r\ntimestamp: > > 1211493152\r\nallow-events: telephone-event\r\ncontent-type: > > application/sdp\r\n\r\nv=0\r\no=CiscoSystemsSIP-GW-UserAgent 7402 717 > > IN IP4 192.168.0.10\r\ns=SIP Call\r\nc=IN IP4 192.168.0.10\r\nt=0 > > 0\r\nm=audio 19298 RTP/AVP 0 19\r\nc=IN IP4 192.168.0.10\r\na=rtpmap:0 > > PCMU/8000\r\na=rtpmap:19 CN/8000\r\na=ptime:20";> > testRequest = ParserTools::LineFeedSanityCheck( testRequest );> > SIPMessage * msg = new SIPMessage( testRequest );> > > > OString addrStr = "192.168.0.147";> > OString portStr = "10000";> > SIPHeader rcvAddr( "RCVADDR", addrStr );> > SIPHeader rcvPort( "RCVPORT", portStr );> > SIPHeader rcvTran( "RCVTRAN", "udp" );> > > > msg->AddInternalHeader( rcvAddr );> > msg->AddInternalHeader( rcvPort );> > msg->AddInternalHeader( rcvTran );> > msg->SetInterfaceAddress( "192.168.0.202" );> > msg->SetInterfacePort( 5070 );> > > > OStringStream traceStream;> > > > traceStream << "<<< "> > << msg->GetStartLine() << " "> > << " SRC: " << addrStr << ":" << portStr << ":UDP"> > << " enc=" << msg->IsEncrypted()> > << " bytes=1103";> > > > OStringStream strPacket;> > strPacket << *msg;> > COMPOUND_LOG_CONTEXT( LogInfo(), msg->GetCallId(), > > traceStream.str(), LogDebugHigh(), strPacket );> > > > SIPTransport::NotifyRead( traceStream.str() );> > > > if( msg->IsInvite() )> > {> > SIPMessage * trying = new SIPMessage();> > msg->CreateResponse( *trying, SIPMessage::Code100_Trying );> > Via via;> > msg->GetViaAt(0, via );> > if( via.IsBehindNAT() )> > {> > SIPURI srcURI;> > srcURI.SetHost(addrStr);> > srcURI.SetPort(portStr);> > trying->SetSendAddress(srcURI);> > }> > if( msg->IsEncrypted() )> > trying->SetEncryption( TRUE );> > GetTransportManager()->ProcessOutbound( trying );> > }> > > > GetTransportManager()->OnTransportEvent(> > new SIPTransportEvent(> > msg,> > SIPTransportEvent::UDPPacketArrival> > ) );> >> > /*///process the keep alives here> > for( PINDEX i = 0; i < GetRegistrationDB().GetSize(); i++ )> > {> > SIPMessage reg;> > if( GetRegistrationDB().GetRegistration( i, reg ) )> > {> > if( reg.HasInternalHeader( "upper-reg" ) )> > {> > /// this is an upper reg, send a keep-alive> > /// Check the last via if its from a private IP> > Via via;> > if( reg.GetViaAt( reg.GetViaSize() - 1, via ) )> > {> > if( via.IsBehindNAT() )> > {> > SIPURI target;> > target.SetHost( via.GetReceiveAddress().AsSTLString() );> > target.SetPort( via.GetRPort() );> > SIPMessage keepAlive;> > RequestLine requestLine;> > requestLine.SetMethod( "KEEP-ALIVE" );> > requestLine.SetRequestURI( target );> > keepAlive.SetStartLine( requestLine );> > GetUserAgent().TransportWrite( keepAlive );> > }> > }> > }> > }> > }*/> > }> > }> >> > > > The OpenSBC is in "Proxy Only Mode" and the configuration is in > > "OpenSBC.reg" (attached).> > > > I compile the OpenSBC in Microsoft Visual C++ 2005 obtaining the exe > > attached.> > > > Any idea?> > > > Thanks for your help.> > > > Gustavo> >> >> >> > ------------------------------------------------------------------------> >> > > Date: Thu, 5 Jun 2008 14:18:35 +0800> > > To: cur...@gm...> > > Subject: Re: [OpenSIPStack] FW: Memory Leak in Proxy and Full Mode> > > From: joe...@gm...> > >> > > Hi Gustavo,> > >> > > Yes, i'm able to replicate it. For some reason, the code I #ifdefed in> > > AppendVia() below is causing it. Let me know if it solves your issues.> > > I've tried looking at what its doing but nothing is evident as to > > why it> > > would leak. If you find something, let me know> > >> > > Joegen> > >> > > BOOL SIPMessage::AppendVia(> > > const Via & header> > > )> > > {> > > GlobalLock();> > >> > > ParseViaList();> > >> > > if( m_ViaList == NULL )> > > {> > > m_ViaList = new Via::Collection();> > > m_ViaList->Append( new Via( header ) );> > > }else> > > {> > >> > > #if 0 // For some reason, this sanity check is leaking mem> > > /// sanity check> > > if( m_ViaList->GetSize() > 0 )> > > {> > > Via & topVia = (*m_ViaList)[0];> > >> > > SIPURI topViaURI = topVia.GetURI();> > >> > > SIPURI newURI = header.GetURI();> > >> > > if( SIPTransport::IsTheSameAddress( topViaURI, newURI, TRUE ) )> > > return FALSE;> > > }> > > #endif> > >> > > ///we append it on top> > > Via::Collection oldViaList = *m_ViaList;> > > oldViaList.MakeUnique();> > > delete m_ViaList;> > >> > > m_ViaList = new Via::Collection();> > > m_ViaList->Append( new Via( header ) );> > >> > > for( PINDEX i = 0; i < oldViaList.GetSize(); i++ )> > > m_ViaList->Append( new Via( oldViaList[i] ) );> > >> > > m_ViaList->MakeUnique();> > > }> > >> > >> > > return TRUE;> > > }> > >> > >> > > Gustavo Curetti wrote:> > > >> > > > Hi Joegen> > > >> > > > The destructor is called. The problem seem to be the headers like > > Via,> > > > RecordRoute, Contact, Allow, Supported (List headers).> > > >> > > > The leak is very easy to reproduce. I change the code of> > > > B2BUserAgent::Registrar::ProcessUpperRegKeepAlive:> > > >> > > >> > > > void B2BUserAgent::Registrar::ProcessUpperRegKeepAlive()> > > > {> > > > while( !m_UpperRegSync.Wait( 10 ) )> > > > {> > > >> > > > SIPMessage * msg = new SIPMessage();> > > >> > > > msg->AppendVia(Via("SIP/2.0/UDP 192.168.0.10:5060"));> > > > msg->AppendVia(Via("SIP/2.0/UDP> > > > > > 192.168.0.206:5060;branch=z9hG4bK440fdc3e04de9d10;rport=5060;received=192.168.0.206"));> > > > msg->AppendRecordRoute(RouteURI("<sip:192.168.0.206:5060;lr>"));> > > > msg->AppendContact(ContactURI("<sip:5435155555@192.168.0.5>"));> > > > msg->AppendAllow(Allow("INVITE, ACK, CANCEL, OPTIONS, BYE, REFER,> > > > SUBSCRIBE, NOTIFY"));> > > > msg->AppendSupported(Supported("replaces"));> > > >> > > > delete msg;> > > > }> > > > }> > > >> > > >> > > > I compile the OpenSBC in Microsoft Visual C++ 2005 obtaining the exe> > > > attached.> > > > I execute "OpenSBC Debug" in Windows 2003 or Windows 2000 and the > > leak> > > > is there.> > > >> > > > I put traces and SIPMessage::~SIPMessage(), SIPMessage::Cleanup() are> > > > called.> > > >> > > > Any idea?> > > >> > > > Thanks for your help.> > > >> > > > Gustavo> > > >> > > > > > ------------------------------------------------------------------------> > > >> > > > > Date: Mon, 2 Jun 2008 10:19:08 +0800> > > > > To: cur...@gm...; > > ope...@li...> > > > > From: joe...@gm...> > > > > Subject: Re: [OpenSIPStack] FW: Memory Leak in Proxy and Full Mode> > > > >> > > > > Try putting a trace before and after the "delete" statement to > > be sure> > > > > that its getting called. From what i see, assuming that SIPMessage> > > > > destructor performs proper cleanup, that a leak here can only be > > caused> > > > > by an exception occurring in the SIPMessage constructor;> > > > >> > > > > Gustavo Curetti wrote:> > > > > > Hi Joegen:> > > > > >> > > > > > The memory leak is hard to find. I send the 200 OK repeatedly but> > > > the memory leak doesn't appear if i'm debugging with Microsot Visual> > > > 2005, but the leak appears if i'm running the OpenSBC like a service.> > > > > >> > > > > > If I comment:> > > > > >> > > > > >> > > > > > void SIPStack::EnqueueTransportWriteEvent(> > > > > > const SIPMessage & message,> > > > > > SIPTransportEvent::Type eventType> > > > > > )> > > > > > {> > > > > > if( m_IsTerminating )> > > > > > return;> > > > > >> > > > > > /*SIPMessage * msg = new SIPMessage(message);> > > > > >> > > > > > msg->SetInternalHeader( "TRN-ID", > > msg->GetTransactionId().AsString());> > > > > > m_TransportManager->EnqueueEvent( new SIPTransportEvent( msg,> > > > eventType ) );*/> > > > > > }> > > > > >> > > > > > there is not leak. But if I modify the code like this:> > > > > >> > > > > >> > > > > > void SIPStack::EnqueueTransportWriteEvent(> > >> > > > > > const SIPMessage & message,> > > > > > SIPTransportEvent::Type eventType> > > > > > )> > > > > > {> > > > > > if( m_IsTerminating )> > > > > > return;> > > > > >> > > > > > SIPMessage * msg = new SIPMessage(message);> > > > > >> > > > > > /*msg->SetInternalHeader( "TRN-ID",> > > > msg->GetTransactionId().AsString());> > > > > > m_TransportManager->EnqueueEvent( new SIPTransportEvent( msg,> > > > eventType ) );*/> > > > > > delete msg;> > > > > > }> > > > > >> > > > > > the leak shows up. I don't understand why this happens if I'm> > > > deleting the msg.> > > > > > What i said in the last mail about CSeq is not seem to be the > > reason.> > > > > > Any idea? Thanks for your help.> > > > > > Gustavo> > > > > >> > > > > >> > > > > > From: cur...@ho...Subject: RE: [OpenSIPStack]> > > > Memory Leak in Proxy and Full ModeDate: Fri, 30 May 2008 17:04:37 > > +0200> > > > > >> > > > > >> > > > > > Hi Joegen: I found that the memory leak is when you create a> > > > SIPMessage from other SIPMessage or from a OString and then you > > delete> > > > de message. In the case of the 200 Ok the message is created in:> > > > > > ProxySessionManager::OnOrphanedMessage()SIPUserAgent::TransportWrite()SIPStack::EnqueueTransportWriteEvent(){SIPMessage > >> > > > * msg = new SIPMessage(message); The memory leak is because the CSeq> > > > header. If i comment : SIPMessage::SIPMessage(const SIPMessage &> > > > msg)SIPMessage & SIPMessage::operator=(const SIPMessage & msg)void> > > > SIPMessage::AssignContents(SIPMessage & msg){ /*if( m_CSeq != NULL )> > > > msg.m_CSeq = static_cast<CSeq*>(m_CSeq->Clone());*/} There is no more> > > > memory leak. I try to replace: SIPMessage * msg = new> > > > SIPMessage(message); ----> SIPMessage * msg = new> > > > SIPMessage(message.AsString()); but the memory leak still exist > > unless> > > > i comment: void SIPMessage::Finalize(){ /*if( m_CSeq == NULL ) {> > > > m_CSeq = new CSeq( h ); }*/} That's what i found so far. Gustavo> > > > > >> > > > > >> > > > > >> Date: Fri, 30 May 2008 11:26:11 +0800> To:> > > > cur...@gm...; ope...@li...>> > > > Subject: Re: [OpenSIPStack] Memory Leak in Proxy and Full Mode> From:> > > > joe...@gm...> > Hi Gustavo,> > Take a look at void> > > > ProxySession::OnFinalResponse( SIPMessage & message > ) method. Can> > > > you verify if the object created in:> > manager.CreateTuple(> > > > m_OriginalInvite, m_RoutedInvite, 10 );> > Actually expires after 10> > > > seconds?> > Putting a breakpoint at> > > > ProxySessionTupleManager::Tuple::~Tuple() should > be enough to> > > > confirm it.> > Also by any chance, did you accidentally think that> > > > this tuple is the > mem leak because it was created after the> > > > transaction?> > Joegen> > > Gustavo Curetti wrote:> > Hi Joegen> > > > > >> > > > I found a memory leak when the OpenSBC is configured in Proxy or Full> > > > mode. When i send a 200 Ok for example in B2B mode there is no memory> > > > leak, but when i send a 200 ok in Proxy or Full mode, some memory is> > > > taken and never released. I attach the logs. The OpenSBC> > > > (192.168.0.202:5070) is running under Windows.> > > > Thanks for your> > > > help> > > > Gustavo> >> > > > _________________________________________________________________> >> > > > Ingresá ya a MSN Deportes y enterate de las últimas novedades del> > > > mundo deportivo.> > http://msn.foxsports.com/fslasc/> >> > > > > > ------------------------------------------------------------------------>> > > > >> >> > > > > > -------------------------------------------------------------------------> > >> > > > > This SF.net email is sponsored by: Microsoft> > Defy all > > challenges.> > > > Microsoft(R) Visual Studio 2008.> >> > > > http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/> >> > > > > > ------------------------------------------------------------------------>> > > > >> > _______________________________________________> >> > > > opensipstack-devel mailing list> >> > > > ope...@li...> >> > > > https://lists.sourceforge.net/lists/listinfo/opensipstack-devel> > > > > >> > > > > > ------------------------------------------------------------------------>> > > > >> > No virus found in this incoming message.> > Checked by AVG. > >> > > > Version: 7.5.524 / Virus Database: 269.24.1/1463 - Release Date:> > > > 5/23/2008 3:36 PM> > > >> > > > > >>> > > > > >> > > > > > Ingresá ya a MSN en Concierto y disfrutá los recitales en vivo de> > > > tus artistas favoritos. MSN en Concierto> > > > > > _________________________________________________________________> > > > > > Descargá ya gratis y viví la experiencia Windows Live.> > > > > > http://www.descubrewindowslive.com/latam/index.html> > > > > >> > > > > > -------------------------------------------------------------------------> > > > > > This SF.net email is sponsored by: Microsoft> > > > > > Defy all challenges. Microsoft(R) Visual Studio 2008.> > > > > > http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/> > > > > > _______________________________________________> > > > > > opensipstack-devel mailing list> > > > > > ope...@li...> > > > > > https://lists.sourceforge.net/lists/listinfo/opensipstack-devel> > > > > >> > > > > >> > > > > >> > > > > >> > > > >> > > > >> > > > >> > > > >> > > > > > -------------------------------------------------------------------------> > > > > This SF.net email is sponsored by: Microsoft> > > > > Defy all challenges. Microsoft(R) Visual Studio 2008.> > > > > http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/> > > > > _______________________________________________> > > > > opensipstack-devel mailing list> > > > > ope...@li...> > > > > https://lists.sourceforge.net/lists/listinfo/opensipstack-devel> > > >> > > >> > > > > > ------------------------------------------------------------------------> > > > Descargá ya gratis y viví la experiencia Windows Live. Descubre> > > > Windows Live <http://www.descubrewindowslive.com/latam/index.html>> > > > > > ------------------------------------------------------------------------> > > >> > > > Internal Virus Database is out-of-date.> > > > Checked by AVG.> > > > Version: 7.5.524 / Virus Database: 269.24.1/1463 - Release Date: > > 5/23/2008 3:36 PM> > > >> > >> > >> >> >> > ------------------------------------------------------------------------> > Ingresá ya a MSN Deportes y enterate de las últimas novedades del > > mundo deportivo. MSN Deportes <http://msn.foxsports.com/fslasc/>> > _________________________________________________________________ Ingresá ya a MSN Deportes y enterate de las últimas novedades del mundo deportivo. http://msn.foxsports.com/fslasc/ |