haraisao / RtORB

Light-weight CORBA implementation with C-Language.
Other
2 stars 1 forks source link

[OpenRTM-aist-C(RtORB)のインストール時エラー] #2

Open moritaritsuko opened 9 years ago

moritaritsuko commented 9 years ago
OpenRTM-aist-C(RtORB)の環境構築について、ご教示ください(長文で失礼します)
環境

 Windows7(64bit)上のVMware(Ubuntu12.04)

手順
  1. 取得したパッケージ「OpenRTM-aist-C_1.0.0.tar.gz」を展開後、「make」によるコンパイル
     ⇒エラー
  2. エラーとなったため、ライブラリをインストール
     $ apt-get install g++ libidl-dev uuid-dev autoconf libtool cmake
     (http://www.openrtp.jp/wiki/_default/ja/Software/CompileingRtORB.html
  3. 再度、「make」によるコンパイル
     ⇒glibconfig.hが存在しない のエラー
      (findコマンドで、glibconfig.hを検索したが存在しなかったはず)
  4. ネットで検索すると、「libglib2.0-dev」パッケージに存在するらしいが、apt-getコマンドでは最新とのこと
     aptitudeコマンドからインストール(はっきりと選択したパッケージを覚えていないのですが)すると、
     「/usr/lib/x86_64-linux-gnu/glib-2.0/include/glibconfig.h」が存在するようになる
  5. 「idl_compiler\Makefile」に下記の記述を追加し、「make」によるコンパイル
     INCS_Linux += -I/usr/lib/x86_64-linux-gnu/glib-2.0/include
     ⇒エラーとならず、コンパイル完了(ワーニングは発生している)
  6. 環境設定 (.bashrcへの記述追加)後、sourceコマンドで反映
  7. サンプル「SimpleIO」を作成
  8. ネームサーバを起動($cd CosName、$sh NameService.sh)
     ⇒「buffer overflow detected.」のエラーが発生
  9. coreファイルから解析しようと、最適化オプション「-O2」を「-O0」に変更し、再度、「make」によるコンパイル後、ネームサーバを起動
     ⇒エラーが発生せず(RT System Editorで、ネームサーバの登録すると表示される)
  10. サンプル「ConsoleOutInComp」を起動($cd excample/SimpleIO、$sh ConsoleOutCom.sh)
     ⇒ダンプ表示の後、下記のエラーが発生
      ERROR: Can't set ExecutionContext rate.
      ERROR: Fail to initialize a component.

Linuxへの環境構築に関しては、初心者のため、全く原因がわかりません。 解決方法をご教示いただけるよう、お願いします。 ・インストールしているライブラリがあっているのか ・設定がもれているのか 等

haraisao commented 9 years ago

環境構築の件ですが、参照されたURL( http://www.openrtp.jp/wiki/_default/ja/Software/CompileingRtORB.html )ですが、ここで説明しているのは、RtORB+OpenRTM-aist(C++版)の時のものです。

OpenRTM-aist-Cは、C++版とは独立に開発しましたので、上記の説明通りにはならないと思います。

こちらでも、12.04で動作確認をしようとは思いますが、OpenRTM-aist-Cのドキュメント( http://openrtp.jp/OpenRTM-C/index.html )をまずはご一読をお願い致します。

原@産総研

moritaritsuko commented 9 years ago

OpenRTM-aist-C(http://openrtp.jp/OpenRTM-C/rst/user/install.html)のサイトに記載されているインストール手順で作業を行っていましたが、ライブラリのインストールで、RtORBのサイト(http://www.openrtp.jp/wiki/_default/ja/Software/CompileingRtORB.html)が詳細参照先となっていたので、記載通りのライブラリのインストールを行ってしまいました。 こちらは、C++版だということは、C版では異なるライブラリのインストールが必要だということなのでしょうか。

もう一度、OpenRTM-aist-Cのドキュメントを読んでみます。

moritaritsuko commented 9 years ago

ライブラリをインストール前の状態のVMware(Ubuntu12.04-64bit)イメージを利用し、再度、 OpenRTM-aist-Cのインストールにトライしてみました。 (http://openrtp.jp/OpenRTM-C/rst/user/install.htmlに記載されている手順

  1. 「OpenRTM-aist-C-master.zip」ソースを展開後、makeを実行すると、下記のエラーとなりました。
     from orbit_idl_main.c:24
     orbit_idl_backend.h:29:24 致命的エラー
     libIDL/IDL.h:そのようなファイルやディレクトリはありません
  2. libidl-devをインストールしました。
     $sudo apt-get install libidl-dev
  3. 再度、makeを実行すると、下記のエラーとなりました。
     from orbit_idl_main.c:24
     /usr/include/glib-2.0/glib/gtypes.h:34 致命的エラー
     glibconfig.h:そのようなファイルやディレクトリはありません
  4. glibconfig.hをファイル検索($sudo find / -name glibconfig.h)すると、下記フォルダに存在したため、   /usr/lib/x86_64-linux-gnu/glib-2.0/include/glibconfig.h
     idl_compilerフォルダのMakefileに下記を追記しました。
      INCS_Linux += -I/usr/lib/x86_64-linux-gnu/glib-2.0/include
  5. 再度、makeを実行すると、エラーとならず、コンパイルが完了しました。
  6. 環境設定 (.bashrcへの記述追加)後、sourceコマンドで反映しました。
  7. ネームサーバを起動($cd CosName、$sh NameService.sh)すると、IORが表示された後、
     下記エラーとなりました。
     * buffer overflow detected * :./NameService terminated
     ★coreファイルを出力させて確認したところ、「copy_fds_set()」(socket.c)(133行目)で
      if(FD_ISSET(k, src)){が実行されたタイミングでエラーとなっていました。
  8. エラーとなった時の値を参照するため、下記フォルダのMakefileの最適化オプション「-O2」を「-O0」に
     変更後、再度、「make」によるコンパイル後、ネームサーバを起動すると、エラーは発生せず。
     ・lib/rtm/Makefile
     ・lib/orb/Makefile
     ★最適化オプションを変更すると、エラーが発生しなくなりましたが、正しい動きでしょうか。
haraisao commented 9 years ago

ご報告ありがとうございます。12.04での症状ですが、私の方でも確認できました。 10.04では、問題なく動作していましたので、最適化が変わったのかもしれません。 ちなみに私の12.04では、Gccのバージョンが 4.6.3-2ubuntu5でしたが、同じでしょうか?

10.04では、4.4.2でしたので、最適化による不具合なのかもしれません。 取り敢えずドキュメントのテストが動作すれば、正しい動きだと思います。

しかし、このままでは何かと都合が悪いと思いますので、デバッグしたいと思います。

取り急ぎ報告まで。

moritaritsuko commented 9 years ago

早速の回答ありがとうございます。 こちらの環境では、gccのバージョンは、4.6.3 (Ubuntu/Linaro 4.6.3-1ubuntu5)となっています。 デバッグして頂けるとのこと、よろしくお願いします。

moritaritsuko commented 9 years ago

ネームサーバとは別に、サンプルコンポーネントの起動でもエラーが発生しています。

  1. example\SimpleIOフォルダで、makeを実行すると、エラーとならず、コンパイルが完了しました。
  2. ConsoleOutコンポーネントを起動($sh ConsoleOutComp.sh)すると、下記のエラーとなりました。
      ERROR: Can't set ExecutionContext rate.
      ERROR: Fail to initialize a component.
      Segmentation fault (core dumped)
     ★gdbデバッガを利用して確認したところ、「RTC_RTObject_initialize()」(Manager.c)の戻り値が   RTC_RTC_OKではないため、「RTC_LightweightRTObject_exit()」が実行されており、
      「impl_RTC_LightweightRTObject_exit()」で、「ecs_servant->m_states」がNULLのために
      セグメンテーション違反となっていました。

     ★さらに、上記エラーから、「RTObject_getExecutionContextRate()」(RTObject.c)で、
      実行周期がうまく取得できていないことがわかりました。
      「Properties_getProperty()」(Properties.c)では、"1000"(デフォルト)という値を戻り値と
      しているのですが、atof()関数実行により、値が0となってしまうようです。
      そのため、「impl_RTC_ExecutionContext_set_rate()」(Impl_RTC_ExecutionContext.c)で、
      0.0以下の場合にRTC_BAD_PARAMETERが返され、エラーとなるようです。
  3. 上記のことから、gdbデバッガを利用し、無理矢理、rateに「1000」(≠0)を設定するように再実行すると、
      下記のエラーが表示されますが、起動されました。
       [ERROR] Can't Bind Object. [repo_id=(null)]
       [NameServer] Binding RTC to NameServer is done.
      Creating a component: "ConsoleOut"....succeed.
      と思ったら、起動していたはずのネームサーバが下記のエラーとなりました。
      Segmentation fault (core dumped)
      ★申し訳ありませんが、こちらの方もデバッグして頂けないでしょうか。
      (こちらでも、他の要因を考えたり、処理を追っかけてみたりしようとは思いますが。)
moritaritsuko commented 9 years ago

glibcに脆弱性がある(CVE_2015_0235 通称:GHOST)ということで、glibcをアップデート (Ubuntu EGLIBC 2.15-0ubuntu10.7⇒Ubuntu EGLIBC 2.15-0ubuntu10.11)してみましたが、 上記と状況は変わりませんでした。 ($sudo apt-get update、$sudo apt-get dist-upgrade)

haraisao commented 9 years ago

少しコードを見てみました。 lib/orb/socket.c の copy_fds_set関数の実装がおかしいのは、わかりました。 ループ処理が、 k=FD_SETSIZE になっていますが、正しくは、 k=FD_SETSIZE-1 にしないとOverFlowしてしまいます。 この修正で、NameSeriveとConsoleIn, ConsoleOutは動いたのですが、EclipseとNameSeriveの間でSystem Errorがでてしまって、現在は、それをデバッグ中です。 取り急ぎ上記の修正を行っていただけないでしょうか? リポジトリは、動作確認後に更新する予定です。

よろしくお願いいたします。

haraisao commented 9 years ago

NameServiceの方のバグは、OpenRTM-aistの場合に、NameServerとして、”OpenRTMNamingNotifier"も同時に指定する必要があったのですが、RtORBのNameServiceが(これに限らず、RtORBでは別名のつけ方が怪しいようです)この名前でPOAが検索できなかったためのようです。とりあえず、giop.cの中で強制的にOpenRTMNamingNotifier = NameServiceとしています。 ソースコードはコミットしましたので、アップデートしていただければよいと思います。

ただし、私が試したのは、32ビットのUbuntuですので、まだ不具合があるようでしたらお知らせください。

よろしくお願いいたします。

moritaritsuko commented 9 years ago

回答ありがとうございます。 早速、指示頂いた処理(ループ処理のループ変数)を修正したところ、NameServiceの起動、 RT System Editorで、ネームサーバの登録ができました。 (最適化オプションを-O2としてコンパイル)

サンプルコンポーネント(ConsoleIn、ConsoleOut)の起動に関しては、状況は変わらずでした。 1. 実行周期がうまく取得できていない。  下記のエラーが出力された箇所から、状況を確認しました。  ERROR: Can't set ExecutionContext rate.  「RTObject_getExecutionContextRate()」(RTObject.c)で、   「Properties_getProperty()」から返される値(rate)は、"1000"(デフォルト値)   その時点で、atof()の実行結果をprintf()出力させると、1000.000000   その時点で、double型変数に代入させる(ret=atof(rate))と、1000   その時点で、double型変数の値をCORBA_double型変数に代入させる(corbaRet=ret)と、1000   しかし、呼び出し元「impl_RTC_LightweightRTObject_initialize()」((Impl_RTC_ExecutionContext.c)に   戻った時点で、rate(CORBA_double型)は、0   ★何が原因でこういうことになっているのでしょうか。

2.その後、gdbデバッガで、強制的に、rateに1000を設定すると、ネームサーバが落ちてしまう。  ・ConsoleOutCompコンポーネント    [ERROR] <NameServer> Can't Bind Object. [repo_id=(null)]    [NameServer] Binding RTC to NameServer is done.    succeed.  ・NameService    Segmentation fault (core dumped)   ★何が原因でこういうことになっているのでしょうか。

★確認ですが、「malign-double」というコンパイルオプションは、64ビット環境では必要でしょうか。   サンプルコンポーネントのMakefileには記述されていますが、   lib/rtmのMakefileではコメントアウトされているようです。

haraisao commented 9 years ago

malign-doubleのコンパイルオプションですが、現時点は、どういう波及があるかわかりませんので、コンパイルオプションはなしの方がよいと思います。 CORBA自体は、32ビットOSを前提して仕様が決められているという実情がありますので、64ビットのOSでは、もう少し工夫する必要があるかもしれません。 RtORBでは、アライメントをCORBAの仕様にしたがってすべて自前で行っていますので、malign-doubleのようにコンパイラで最適化されると不具合が発生する可能性は、ゼロではありません。

実行周期の件は、64ビットのVMを使って動作確認をしてみます。

moritaritsuko commented 9 years ago

回答ありがとうございます。 malign-doubleのコンパイルオプションは、コメントアウトしておきます。

先ほど、更新されたソースのうち、「CosName/CosNaming-skelimpl.h」が文字化けしているようなのですが、 こちらも変更しておく必要があるでしょうか。

haraisao commented 9 years ago

文字化けの方は意図していませんので、そのファイルは変更なしで大丈夫です。ご指摘ありがとうございます。 後ほど再修正しておきます。

haraisao commented 9 years ago

まだ完全にデバッグできたわけではありませんが、1のご質問に関しては、RTObject_getExecutionContextRate() という関数が、呼出側できちんと宣言されおらず(本来は、すべての関数をヘッダーに記載して、宣言をしなければいけませんが)、戻り値がデフォルトの幅になってしまっているためです。 32ビットOS時代は、問題ないことが多い(droubleもint もlongも同じ幅ですので)のですが、64ビットのOSでは、そのあたりが異なる場合があります。そのためUbuntu12.04で32ビットOSでは正しく動くものが、64ビットOSで動かなる原因の一つになります。 本来ですと、自分で定義した関数は、すべてヘッダで宣言して、includeすることと、intの宣言は使わずにint8, int16, int32などの宣言にする(MISRA-Cではそうなっています)ということでしょうか。 NameServerがコアダンプして終了してしまう現象もこちらで確認できました。(32ビットOSでは問題ありませんが) こちらも主にメモリ領域の管理の問題かと思われます。前にも書きましたが、CORBA自体が32ビットOSを前提に仕様fがつくられており、OpenRTM-aist-CとRtORBも32ビットOSで開発を進めていたために、64ビットOSおよびそのコンパイラに対応できていない箇所があるのだと思います。 NameServerの方は、現在デバッグ中です。

moritaritsuko commented 9 years ago

回答ありがとうございます。 早速、「RTObject_getExecutionContextRate()」(RTObject.c)の呼び出し元関数が存在するファイル Impl_RTC_LightweightRTObject.cに下記のinclude宣言を追加してみたところ、サンプルコンポーネントを 起動時、実行周期の設定が行われ、エラーとならず、起動できるようになりました。  #include <rtm/OpenRTM.h>

haraisao commented 9 years ago

NameServerがコアダンプする件ですが、原因がわかりました。 CORBAの中でGIOPのデータをunmarshal するときにString のアライメントが8 sizeof(void *)になっていました。本来は、4になるべきだと思うのですが、なぜこうしたのか失念してしまいました。

現在のリポジトリでは、修正を反映しているのですが、もしかすると他のアプリで不具合が出る可能性も否定できません。取り合えず、ソースコードをアップデートして、試してみたください。

私のUbuntu 12.04 (64bit)での動作確認はできています。

以上、よろしくお願いいたします。

moritaritsuko commented 9 years ago

回答ありがとうございます。 修正されたファイルを展開したところ、サンプルコンポーネント「ConsoleIn」、「ConsoleOut」をエラーと ならず、起動することができました。 また、ネームサーバも落ちることなく、RT System Editorにて、「ConsoleIn」、「ConsoleOut」を接続し、 activate後、データ送受信することができました。 ありがとうございました。

今後、インストール以外でお聞きしたいことは、新たなIssueを設けたいと思います。