Ошибка сегментации? - PullRequest
       35

Ошибка сегментации?

0 голосов
/ 16 ноября 2011
Program received signal SIGSEGV, Segmentation fault.
[Switching to Thread -177935456 (LWP 5483)]
0xf79ff2ca in activemq::core::ActiveMQSessionExecutor::dispatch (this=0xf4b04bc0, 
    dispatch=@0xf564e240) at activemq/core/ActiveMQSessionExecutor.cpp:129
129 activemq/core/ActiveMQSessionExecutor.cpp: No such file or directory.
    in activemq/core/ActiveMQSessionExecutor.cpp
Current language:  auto; currently c++

Как я могу это исправить?тебе нужно больше кода?Я не знаю, где это терпит неудачу?Как я могу найти, где он терпит неудачу?

куда он дамп?

РЕДАКТИРОВАТЬ:
вот код:

std::string ActiveMQWrapper::get(){
    Connection* connection;
    Session* session;
    Destination* destination;
    MessageConsumer* consumer;

    try {
        std:string brokerURI = "tcp://localhost:61613?wireFormat=stomp";
        auto_ptr<ConnectionFactory> connectionFactory(ConnectionFactory::createCMSConnectionFactory( brokerURI ) );
        connection = connectionFactory->createConnection();
        connection->start();

        session = connection->createSession( Session::AUTO_ACKNOWLEDGE );
        destination = session->createQueue( "TEST.Prototype" );
        consumer = session->createConsumer( destination );
        TextMessage* textMessage =
            dynamic_cast< TextMessage* >( consumer->receive() );

        string text = "";

        if( textMessage != NULL ) {
            text = textMessage->getText();
        } else {
            text = "NOT A TEXTMESSAGE!";
        }

        try{
            if( destination != NULL ) delete destination;
        }catch (CMSException& e) { e.printStackTrace(); }
        destination = NULL;

        try{
            if( consumer != NULL ) delete consumer;
        }catch (CMSException& e) { e.printStackTrace(); }
        consumer = NULL;

        // Close open resources.
        try{
            if( session != NULL ) session->close();
            if( connection != NULL ) connection->close();
        }catch (CMSException& e) { e.printStackTrace(); }

        // Now Destroy them
        try{
            if( session != NULL ) delete session;
        }catch (CMSException& e) { e.printStackTrace(); }
        session = NULL;

        try{
            if( connection != NULL ) delete connection;
        }catch (CMSException& e) { e.printStackTrace(); }
        connection = NULL;

         return text.c_str();

    } catch( CMSException& e ) {
        e.printStackTrace();
    }
}

Ответы [ 2 ]

1 голос
/ 02 июля 2015

Я наткнулся на это при поиске ответа на эту проблему и нашел правильное решение. Сначала необходимо правильно инициализировать библиотеку ActiveMQ-CPP:

activemq::library::ActiveMQCPP::initializeLibrary();

И не забудьте закрыть его, когда закончите:

activemq::library::ActiveMQCPP::shutdownLibrary();

На самом деле это часть веб-страницы, на которую ссылается ФП: http://activemq.apache.org/cms/example.html

0 голосов
/ 16 ноября 2011

Из ваших тестов по удалению (которые совершенно ненужны, кстати, удаление по NULL совершенно определено) я понимаю, что connection и т. Д. Может быть NULL. Однако выше вы не проверяете NULL перед их использованием. Поэтому, возможно, один из них имеет значение NULL, и ваш доступ, таким образом, вызывает ошибку сегментации.

Также: указатели, возвращенные из ConnectionFactory :: createCMSConnectionFactory, выделены с new? Потому что в противном случае хранить их в auto_ptr не правильно.

Кроме того, определен ли тип ConnectionFactory (в отличие от объявленного просто (forward)) в точке, в которой вы создали экземпляр auto_ptr? Поскольку создание экземпляра auto_ptr для неполного типа (например, типа, который был только объявлен, еще не определен) является неопределенным поведением и может также привести к ошибке сегментации.

Это те возможности, которые я вижу. Там нет никакого способа сказать больше только с кодом, который вы показали. Вы действительно должны пройти через него с помощью отладчика и посмотреть, где происходит ошибка сегментации.

...