Open moritaritsuko opened 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 )をまずはご一読をお願い致します。
原@産総研
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のドキュメントを読んでみます。
ライブラリをインストール前の状態のVMware(Ubuntu12.04-64bit)イメージを利用し、再度、 OpenRTM-aist-Cのインストールにトライしてみました。 (http://openrtp.jp/OpenRTM-C/rst/user/install.htmlに記載されている手順)
ご報告ありがとうございます。12.04での症状ですが、私の方でも確認できました。 10.04では、問題なく動作していましたので、最適化が変わったのかもしれません。 ちなみに私の12.04では、Gccのバージョンが 4.6.3-2ubuntu5でしたが、同じでしょうか?
10.04では、4.4.2でしたので、最適化による不具合なのかもしれません。 取り敢えずドキュメントのテストが動作すれば、正しい動きだと思います。
しかし、このままでは何かと都合が悪いと思いますので、デバッグしたいと思います。
取り急ぎ報告まで。
早速の回答ありがとうございます。 こちらの環境では、gccのバージョンは、4.6.3 (Ubuntu/Linaro 4.6.3-1ubuntu5)となっています。 デバッグして頂けるとのこと、よろしくお願いします。
ネームサーバとは別に、サンプルコンポーネントの起動でもエラーが発生しています。
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)
少しコードを見てみました。 lib/orb/socket.c の copy_fds_set関数の実装がおかしいのは、わかりました。 ループ処理が、 k=FD_SETSIZE になっていますが、正しくは、 k=FD_SETSIZE-1 にしないとOverFlowしてしまいます。 この修正で、NameSeriveとConsoleIn, ConsoleOutは動いたのですが、EclipseとNameSeriveの間でSystem Errorがでてしまって、現在は、それをデバッグ中です。 取り急ぎ上記の修正を行っていただけないでしょうか? リポジトリは、動作確認後に更新する予定です。
よろしくお願いいたします。
NameServiceの方のバグは、OpenRTM-aistの場合に、NameServerとして、”OpenRTMNamingNotifier"も同時に指定する必要があったのですが、RtORBのNameServiceが(これに限らず、RtORBでは別名のつけ方が怪しいようです)この名前でPOAが検索できなかったためのようです。とりあえず、giop.cの中で強制的にOpenRTMNamingNotifier = NameServiceとしています。 ソースコードはコミットしましたので、アップデートしていただければよいと思います。
ただし、私が試したのは、32ビットのUbuntuですので、まだ不具合があるようでしたらお知らせください。
よろしくお願いいたします。
回答ありがとうございます。 早速、指示頂いた処理(ループ処理のループ変数)を修正したところ、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ではコメントアウトされているようです。
malign-doubleのコンパイルオプションですが、現時点は、どういう波及があるかわかりませんので、コンパイルオプションはなしの方がよいと思います。 CORBA自体は、32ビットOSを前提して仕様が決められているという実情がありますので、64ビットのOSでは、もう少し工夫する必要があるかもしれません。 RtORBでは、アライメントをCORBAの仕様にしたがってすべて自前で行っていますので、malign-doubleのようにコンパイラで最適化されると不具合が発生する可能性は、ゼロではありません。
実行周期の件は、64ビットのVMを使って動作確認をしてみます。
回答ありがとうございます。 malign-doubleのコンパイルオプションは、コメントアウトしておきます。
先ほど、更新されたソースのうち、「CosName/CosNaming-skelimpl.h」が文字化けしているようなのですが、 こちらも変更しておく必要があるでしょうか。
文字化けの方は意図していませんので、そのファイルは変更なしで大丈夫です。ご指摘ありがとうございます。 後ほど再修正しておきます。
まだ完全にデバッグできたわけではありませんが、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の方は、現在デバッグ中です。
回答ありがとうございます。 早速、「RTObject_getExecutionContextRate()」(RTObject.c)の呼び出し元関数が存在するファイル Impl_RTC_LightweightRTObject.cに下記のinclude宣言を追加してみたところ、サンプルコンポーネントを 起動時、実行周期の設定が行われ、エラーとならず、起動できるようになりました。 #include <rtm/OpenRTM.h>
NameServerがコアダンプする件ですが、原因がわかりました。 CORBAの中でGIOPのデータをunmarshal するときにString のアライメントが8 sizeof(void *)になっていました。本来は、4になるべきだと思うのですが、なぜこうしたのか失念してしまいました。
現在のリポジトリでは、修正を反映しているのですが、もしかすると他のアプリで不具合が出る可能性も否定できません。取り合えず、ソースコードをアップデートして、試してみたください。
私のUbuntu 12.04 (64bit)での動作確認はできています。
以上、よろしくお願いいたします。
回答ありがとうございます。 修正されたファイルを展開したところ、サンプルコンポーネント「ConsoleIn」、「ConsoleOut」をエラーと ならず、起動することができました。 また、ネームサーバも落ちることなく、RT System Editorにて、「ConsoleIn」、「ConsoleOut」を接続し、 activate後、データ送受信することができました。 ありがとうございました。
今後、インストール以外でお聞きしたいことは、新たなIssueを設けたいと思います。
OpenRTM-aist-C(RtORB)の環境構築について、ご教示ください(長文で失礼します)
環境
Windows7(64bit)上のVMware(Ubuntu12.04)
手順
⇒エラー
$ apt-get install g++ libidl-dev uuid-dev autoconf libtool cmake
(http://www.openrtp.jp/wiki/_default/ja/Software/CompileingRtORB.html)
⇒glibconfig.hが存在しない のエラー
(findコマンドで、glibconfig.hを検索したが存在しなかったはず)
aptitudeコマンドからインストール(はっきりと選択したパッケージを覚えていないのですが)すると、
「/usr/lib/x86_64-linux-gnu/glib-2.0/include/glibconfig.h」が存在するようになる
INCS_Linux += -I/usr/lib/x86_64-linux-gnu/glib-2.0/include
⇒エラーとならず、コンパイル完了(ワーニングは発生している)
⇒「buffer overflow detected.」のエラーが発生
⇒エラーが発生せず(RT System Editorで、ネームサーバの登録すると表示される)
⇒ダンプ表示の後、下記のエラーが発生
ERROR: Can't set ExecutionContext rate.
ERROR: Fail to initialize a component.
Linuxへの環境構築に関しては、初心者のため、全く原因がわかりません。 解決方法をご教示いただけるよう、お願いします。 ・インストールしているライブラリがあっているのか ・設定がもれているのか 等