2011-11-15 6 views
0
Program received signal SIGSEGV, Segmentation fault. 
[Switching to Thread -177935456 (LWP 5483)] 
0xf79ff2ca in activemq::core::ActiveMQSessionExecutor::dispatch (this=0xf4b04bc0, 
    [email protected]) 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(); 
    } 
} 
+0

コードが必要です。 – orlp

+1

はい、コードがさらに必要になります。優れたIDEとデバッガでスタックトレースを表示できます。目を逸らさなければならないことのいくつかは、オフ・バイ・ワンのエラーであり、単純に未割り当てメモリにアクセスしようとしています。 – Maxpm

+0

がコードで更新されました。 – DarthVader

答えて

-1

削除の周りにあなたのテストから(ちなみに、完全に不必要なあり、NULLに削除が完全に定義されている)私はconnectionなどがNULLであることができることを集めます。しかし、上記を使用する前に、NULLをチェックしないでください。したがって、それらのうちの1つがNULLの場合、アクセスによってセグメント違反が発生します。

また、newで割り当てられたConnectionFactory :: createCMSConnectionFactoryから返されるポインタはありますか?それ以外の場合はauto_ptrに格納するのは適切ではありません。

また、auto_ptrをインスタンス化した時点で、タイプConnectionFactoryが定義されています(宣言されただけではなく)。不完全な型(宣言されているだけで、まだ定義されていないものなど)にインスタンス化するauto_ptrは未定義の振る舞いであり、またセグメンテーション違反につながる可能性があります。

これは私が見る可能性のあるものです。あなたが示したコードだけでもっと言えることはありません。あなたは本当にデバッガを使ってそれをシングルステップ実行し、セグメンテーションフォルトがどこで発生するのかを確認する必要があります。

+0

あなたは何も削除すべきではないと言っていますか?彼らはポインタです... – DarthVader

+0

私はライブラリのインターフェイスを知らないので、あなたが削除されるべきかどうかを確かめることはできません。 'connection'、' destination'、 'session'、' user'のために私はかなりあなたがすべきだと確信しています。しかし、完全に確実にするためには、ドキュメントで確認する必要があります(ポインタは 'new'で割り当てられたメモリを指すために*必要ではありません)。しかし、完全に不要なのは、削除する前にNULLをチェックすることです(つまり、 'it(foo!= NULL)を削除するfoo; '単に' 'foo;'を削除する '' NULLをテストしないでください)。しかし、あなたは*これらのポインタを使う前にNULLをテストすべきです。 – celtschk

+0

もOKです。 http://activemq.apache.org/cms/example.htmlからコードを入手しました – DarthVader

1

私はこの問題を解決するためにこれを見つけ出し、正しい解決策を発見しました。 ActiveMQの-CPPライブラリーは、最初に適切に初期化する必要があります

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

、完成したときにそれをシャットダウンすることを忘れないでください:

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

それが実際にそのWebページの一部です。次のリンク先のOP: http://activemq.apache.org/cms/example.html

関連する問題