[ 
https://issues.apache.org/jira/browse/AMQCPP-388?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13236951#comment-13236951
 ] 

Helen Huang edited comment on AMQCPP-388 at 3/23/12 7:11 PM:
-------------------------------------------------------------

Hi Timothy, I have tested the new ActiveMQConnection.cpp, but got a "pure 
function call" exception from ActiveMQConnection::CleanUp(). From the call 
stack, I found TransportFilter::fire was called before 
ActiveMQConnection::CleanUp().

msvcr80d.dll!_NMSG_WRITE(int rterrnum=25)  Line 198     C
        msvcr80d.dll!_purecall()  Line 54 + 0x7 bytes   C
        activemq-cppud.dll!activemq::core::ActiveMQConnection::cleanup()  Line 
469 + 0x49 bytes C++
        
activemq-cppud.dll!activemq::core::ActiveMQConnection::onException(const 
decaf::lang::Exception & ex={...})  Line 793   C++
>       activemq-cppud.dll!activemq::transport::TransportFilter::fire(const 
> decaf::lang::Exception & ex={...})  Line 54 + 0x17 bytes    C++
        
activemq-cppud.dll!activemq::transport::TransportFilter::onException(const 
decaf::lang::Exception & ex={...})  Line 47  C++
        activemq-cppud.dll!activemq::transport::TransportFilter::fire(const 
decaf::lang::Exception & ex={...})  Line 54 + 0x17 bytes    C++
        
activemq-cppud.dll!activemq::transport::TransportFilter::onException(const 
decaf::lang::Exception & ex={...})  Line 47  C++
        activemq-cppud.dll!activemq::transport::TransportFilter::fire(const 
decaf::lang::Exception & ex={...})  Line 54 + 0x17 bytes    C++
        
activemq-cppud.dll!activemq::transport::TransportFilter::onException(const 
decaf::lang::Exception & ex={...})  Line 47  C++
        
activemq-cppud.dll!activemq::transport::inactivity::InactivityMonitor::onException(const
 decaf::lang::Exception & ex={...})  Line 314   C++
        activemq-cppud.dll!activemq::transport::TransportFilter::fire(const 
decaf::lang::Exception & ex={...})  Line 54 + 0x17 bytes    C++
        
activemq-cppud.dll!activemq::transport::TransportFilter::onException(const 
decaf::lang::Exception & ex={...})  Line 47  C++
        
activemq-cppud.dll!activemq::transport::IOTransport::fire(decaf::lang::Exception
 & ex={...})  Line 72 + 0x17 bytes      C++
        activemq-cppud.dll!activemq::transport::IOTransport::run()  Line 245    
C++
        
activemq-cppud.dll!decaf::lang::ThreadProperties::runCallback(decaf::lang::ThreadProperties
 * properties=0x0131b718)  Line 137 + 0x13 bytes     C++
        activemq-cppud.dll!`anonymous namespace'::threadWorker(void * 
arg=0x0131b718)  Line 210 + 0x9 bytes     C++
        msvcr80d.dll!_callthreadstartex()  Line 348 + 0xf bytes C
        msvcr80d.dll!_threadstartex(void * ptd=0x01333ba8)  Line 331    C





In function TransportFilter::fire(), the listener pointer was NULL at the 
crash. I guess some other thread might have deleted that 
listener/ActiveMQConnection while this thread is in 
ActiveMQConnection::cleanup().

void TransportFilter::fire( const decaf::lang::Exception& ex ) {

    if( listener != NULL ){
        try{
            listener->onException( ex );
        }catch( ... ){}
    }
} 




I have put a break point in the destructor of ActiveMQConnection, and found 
these threads could delete it when the broker goes down:

Call Stack 1:
        
activemq-cppud.dll!activemq::core::ActiveMQConnection::~ActiveMQConnection()  
Line 242  C++
        activemq-cppud.dll!activemq::core::ActiveMQConnection::`vbase 
destructor'()  + 0xf bytes        C++
        activemq-cppud.dll!activemq::core::ActiveMQConnection::`vector deleting 
destructor'()  + 0x4d bytes     C++
        
activemq-cppud.dll!activemq::cmsutil::ResourceLifecycleManager::destroy()  Line 
135 + 0x20 bytes        C++
        activemq-cppud.dll!activemq::cmsutil::CmsAccessor::destroy()  Line 131  
C++
        activemq-cppud.dll!activemq::cmsutil::CmsDestinationAccessor::destroy() 
 Line 58        C++
        activemq-cppud.dll!activemq::cmsutil::CmsTemplate::destroy()  Line 211 
+ 0xb bytes      C++
        
activemq-cppud.dll!activemq::cmsutil::CmsTemplate::doReceive(cms::MessageConsumer
 * consumer=0x01408d60)  Line 632 + 0x1f bytes C++
        
activemq-cppud.dll!activemq::cmsutil::CmsTemplate::ReceiveExecutor::doInCms(cms::Session
 * session=0x01405760)  Line 647 + 0xf bytes    C++
        
activemq-cppud.dll!activemq::cmsutil::CmsTemplate::execute(activemq::cmsutil::SessionCallback
 * action=0x0130fbf8)  Line 446    C++
        activemq-cppud.dll!activemq::cmsutil::CmsTemplate::receive()  Line 682  
C++
        BrokerMonitor.exe!Receiver::ReceiveMessage()  Line 95 + 0x18 bytes      
C++
        BrokerMonitor.exe!Receiver::run()  Line 129     C++



Call Stack 2:
        
activemq-cppud.dll!activemq::core::ActiveMQConnection::~ActiveMQConnection()  
Line 242  C++
        activemq-cppud.dll!activemq::core::ActiveMQConnection::`vbase 
destructor'()  + 0xf bytes        C++
        activemq-cppud.dll!activemq::core::ActiveMQConnection::`vector deleting 
destructor'()  + 0x4d bytes     C++
        
activemq-cppud.dll!activemq::cmsutil::ResourceLifecycleManager::destroy()  Line 
135 + 0x20 bytes        C++
        activemq-cppud.dll!activemq::cmsutil::CmsAccessor::destroy()  Line 131  
C++
        activemq-cppud.dll!activemq::cmsutil::CmsDestinationAccessor::destroy() 
 Line 58        C++
        activemq-cppud.dll!activemq::cmsutil::CmsTemplate::destroy()  Line 211 
+ 0xb bytes      C++
        
activemq-cppud.dll!activemq::cmsutil::CmsTemplate::doReceive(cms::MessageConsumer
 * consumer=0x01408d60)  Line 632 + 0x1f bytes C++
        
activemq-cppud.dll!activemq::cmsutil::CmsTemplate::ReceiveExecutor::doInCms(cms::Session
 * session=0x01405760)  Line 647 + 0xf bytes    C++
        
activemq-cppud.dll!activemq::cmsutil::CmsTemplate::execute(activemq::cmsutil::SessionCallback
 * action=0x0130fbf8)  Line 446    C++
        activemq-cppud.dll!activemq::cmsutil::CmsTemplate::receive()  Line 682  
C++
        BrokerMonitor.exe!Receiver::ReceiveMessage()  Line 95 + 0x18 bytes      
C++
        BrokerMonitor.exe!Receiver::run()  Line 129     C++




        
                
      was (Author: hhuang):
    Hi Timothy, I have tested the new ActiveMQConnection.cpp, but got a "pure 
function call" exception from ActiveMQConnection::CleanUp(). From the call 
stack, I found TransportFilter::fire was called before 
ActiveMQConnection::CleanUp().

msvcr80d.dll!_NMSG_WRITE(int rterrnum=25)  Line 198     C
        msvcr80d.dll!_purecall()  Line 54 + 0x7 bytes   C
        activemq-cppud.dll!activemq::core::ActiveMQConnection::cleanup()  Line 
469 + 0x49 bytes C++
        
activemq-cppud.dll!activemq::core::ActiveMQConnection::onException(const 
decaf::lang::Exception & ex={...})  Line 793   C++
>       activemq-cppud.dll!activemq::transport::TransportFilter::fire(const 
> decaf::lang::Exception & ex={...})  Line 54 + 0x17 bytes    C++
        
activemq-cppud.dll!activemq::transport::TransportFilter::onException(const 
decaf::lang::Exception & ex={...})  Line 47  C++
        activemq-cppud.dll!activemq::transport::TransportFilter::fire(const 
decaf::lang::Exception & ex={...})  Line 54 + 0x17 bytes    C++
        
activemq-cppud.dll!activemq::transport::TransportFilter::onException(const 
decaf::lang::Exception & ex={...})  Line 47  C++
        activemq-cppud.dll!activemq::transport::TransportFilter::fire(const 
decaf::lang::Exception & ex={...})  Line 54 + 0x17 bytes    C++
        
activemq-cppud.dll!activemq::transport::TransportFilter::onException(const 
decaf::lang::Exception & ex={...})  Line 47  C++
        
activemq-cppud.dll!activemq::transport::inactivity::InactivityMonitor::onException(const
 decaf::lang::Exception & ex={...})  Line 314   C++
        activemq-cppud.dll!activemq::transport::TransportFilter::fire(const 
decaf::lang::Exception & ex={...})  Line 54 + 0x17 bytes    C++
        
activemq-cppud.dll!activemq::transport::TransportFilter::onException(const 
decaf::lang::Exception & ex={...})  Line 47  C++
        
activemq-cppud.dll!activemq::transport::IOTransport::fire(decaf::lang::Exception
 & ex={...})  Line 72 + 0x17 bytes      C++
        activemq-cppud.dll!activemq::transport::IOTransport::run()  Line 245    
C++
        
activemq-cppud.dll!decaf::lang::ThreadProperties::runCallback(decaf::lang::ThreadProperties
 * properties=0x0131b718)  Line 137 + 0x13 bytes     C++
        activemq-cppud.dll!`anonymous namespace'::threadWorker(void * 
arg=0x0131b718)  Line 210 + 0x9 bytes     C++
        msvcr80d.dll!_callthreadstartex()  Line 348 + 0xf bytes C
        msvcr80d.dll!_threadstartex(void * ptd=0x01333ba8)  Line 331    C


In function TransportFilter::fire(), the listener pointer was NULL at the 
crash. I guess some other thread might have deleted that 
listener/ActiveMQConnection while this thread is in 
ActiveMQConnection::cleanup().

void TransportFilter::fire( const decaf::lang::Exception& ex ) {

    if( listener != NULL ){
        try{
            listener->onException( ex );
        }catch( ... ){}
    }
} 




        
                  
> AprPool::getAprPool() returns NULL, causing access violation and application 
> crash
> ----------------------------------------------------------------------------------
>
>                 Key: AMQCPP-388
>                 URL: https://issues.apache.org/jira/browse/AMQCPP-388
>             Project: ActiveMQ C++ Client
>          Issue Type: Bug
>          Components: Decaf
>    Affects Versions: 3.2.3
>         Environment: Windows xp service pack 3, ActiveMQ broker 5.3.1, apr 
> 1.4.2, apr-util 1.3.9, apr iconv 1.2.1
>            Reporter: Helen Huang
>            Assignee: Timothy Bish
>            Priority: Critical
>             Fix For: 3.2.3
>
>         Attachments: AMQCPP-388-Patch.txt, BrokerMonitor.zip
>
>
> Our application that uses activemq c++ client lib crashed with the following 
> dump:
> ----------------------------------------------------------------------------------------------------------------------
> Thread 87 - System ID 3780
> Function     Arg 1     Arg 2     Arg 3   Source 
> libapr_1!apr_pvsprintf+8     00000000     0642a188     180eeb94    
> activemq_cppu!decaf::lang::Exception::buildMessage+71     0642a188     
> 180eeb74     180eee2c    
> activemq_cppu!decaf::lang::exceptions::RuntimeException::RuntimeException+4d  
>    180efeec     0642a160     00000097    
> activemq_cppu!decaf::lang::ThreadProperties::runCallback+125     180eee2c     
> 180efee0     00000001    
> msvcr80!CatchIt+5c     00000000     00000000     00000000
> LIBAPR_1!APR_PVSPRINTF+8In scotapp.dmp the assembly instruction at 
> libapr_1!apr_pvsprintf+8 in C:\scot\dll\libapr-1.dll has caused an access 
> violation exception (0xC0000005) when trying to read from memory location 
> 0x0000002c on thread 87
> --------------------------------------------------------------------------------------------------------------------
> On the call stack, we saw that following function from class 
> decaf::lang::Exception was called:
> void Exception::buildMessage( const char* format, va_list& vargs ) {
>     // Allocate buffer with a guess of it's size
>     AprPool pool;
>     // Allocate a buffer of the specified size.
>     char* buffer = apr_pvsprintf( pool.getAprPool(), format, vargs );
>     // Guessed size was enough. Assign the string.
>     message.assign( buffer, strlen( buffer ) );
> }
> The first parameter passed into apr_pvsprintf was NULL, causing the crash. 
> Could you please take a look and see if there is any bug in the activemqcpp 
> code that could cause the problem. Thanks!

--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators: 
https://issues.apache.org/jira/secure/ContactAdministrators!default.jspa
For more information on JIRA, see: http://www.atlassian.com/software/jira

        

Reply via email to