Segmentation Fault Fail?

Segmentation Fault Fail?

本文关键字:Fail Fault Segmentation      更新时间:2023-10-16
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();
    }
}

我在寻找这个问题的答案时偶然发现了这个问题,并发现了正确的解决方案。ActiveMQ-CPP库需要首先正确初始化:

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

完成后别忘了关闭它:

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

它实际上是OP链接到的网页的一部分:http://activemq.apache.org/cms/example.html

从您围绕删除的测试(这是完全不必要的,顺便说一句,NULL上的删除是完美定义的)我收集connection等可能是NULL。然而,在上面,您在使用它们之前没有检查NULL。因此,可能其中一个是NULL,因此您的访问会导致分割错误。

也:是从ConnectionFactory返回的指针::createCMSConnectionFactory分配与new ?因为否则将它们存储在auto_ptr中是不正确的事情。

此外,类型ConnectionFactory是在实例化auto_ptr的地方定义的(而不是仅仅(向前)声明的)吗?因为在不完整的类型上实例化auto_ptr(比如只声明了,还没有定义的类型)是未定义的行为,也可能导致分段错误。

这些都是我看到的可能性。仅使用您展示的代码无法说明更多内容。您真的应该用调试器一步完成它,看看分段错误发生在哪里。