« システムソフトウェア2.10でkbootが起動しない | トップページ | Cellの最大演算性能 »

Cellプログラムのデバッグ

今回は、Cellプログラムのデバッグ方法についてまとめてみました。

私は通常、PC LinuxのEclipse IDEでCellプログラムを作成・コンパイルし、PCのシミュレーター上で、IDEのGUIベースでデバッグを行っています。PS3上でgdbを使ってデバッグを行っても同様のことが出きるのですが、GUIベースで変数の状態確認やステップ動作が出来た方が私的には楽ちんです。PS3ではメモリー量の制約からIDEを動かすことはできません。

ただ、Eclipse IDEでCellプログラムのデバッグを行う際には、以下の問題がありました。

  1. SDK 3.0のIDEになってから、デバッグを開始する際にに、次のエラーメッセージが出る
       Error while mapping shared library sections:
       /lib/libgcc_s.so.1: No such file or directory.
  2. SDK 3.0にしてから、SPEプログラムのトレースができない場合がある(ブレークポイントを設定しても停止しないなど)
  3. シミュレーターではレスポンスが悪い(数千回ループを回すような計算はかなり待たされる)
  4. グローバル宣言された大きな配列をwatchするとtime outエラーが発生する

個々の問題について、解決方法を試行錯誤してみました。

1. Error while mapping shared library sectionsの対策

IDEでデバッグを行う際に、PC側の/opt/cell/sysroot/lib配下のシェアードライブラリをサーチしますが、その際にlibgcc_s.so.1が見つからないというエラーのようです。PS3のppc Linuxからこのファイルをコピーしてやると今度はライブラリーのバージョンが違うというエラーが出てきます。ということで、SDK 3.0のシミュレーター環境についてきたライブラリーファイルが必要なようです。シミュレーター環境のファイルは以下の手順で取得できます。

 # mount -o loop -t ext2 /opt/ibm/systemsim-cell/images/cell/sysroot_disk  /mnt/sim

/mnt/simは適当なマウント用のディレクトリを作成します。/mnt/sim/libに移動して以下のファイルを/opt/cell/sysroot/libにコピーします。
 libgcc_s-4.1.2-20070503.so.1
 libgcc_s.so.1

3項の解決策を行うことでも本問題は解決します。

2. SPEプログラムのトレースができない問題の対策

本当の原因は不明なのですが、以下の措置で問題が解決しています。

  • SDK 2.1で作成したプログラムは、ソースファイルをバックアップした後、一旦プロジェクトごと削除し、プロジェクトを再度作成しコンパイル・リンクをやり直す
  • あるプログラムは、pthread_create()のみを呼び出して、pthread_join()呼び出しが抜けていたので、pthread_join()の追加で正常動作

3. レスポンス改善

PC上のEclipse IDEからPS3上で動作するターゲットプログラムを制御することで、シミュレーターを使用せずにデバッグができることが分かりました。

  • 図の「シミュレーターでのデバッグ」に示すように、PC上でデバッグを行う場合、シミュレーター上で動作するgdb_serverがデバッグ対象のターゲットプログラムを起動します。
  • x86 Linux上で動作するppu-gdbがgdb_serverと通信し、デバッグを制御します
  • また、Eclipse IDEとppu-gdbが通信することで、デバッグセッションの状態をIDEのGUI画面に表示します(IDEが裏でgdbのコマンドをたたいて、結果をGUI画面に表示するイメージです)

Gdb_server_4

ということは、シミュレーターの代わりに、「PS3を使用したデバッグ」に示すように、PS3上でgdb_serverとターゲットプログラムを動かしてTCP/IPで通信できるようにしてあげれば、シミュレーターと同様の動作ができるはずです。実際に以下の設定で動作が可能となりました。

  • PS3にもSDK3.0がインストールされていること
  • /opt/cell/sysrootを異なるディレクトリ名にリネーム
  • PS3のルートディレクトリ(/)を/opt/cell/sysrootにnfsを使用してマウント
    リンク時に参照される/opt/cell/sysroot/配下のライブラリーと、PS3で実行時に動的にリンクされるシェアードライブラリーが同一でないとデバッグがうまく動かない場合があるため、この操作が必要になります
  • すでに作成済みのプログラムは再度リンクをやり直します
  • IDEのCell EnvironmentからCell Boxを右クリックしてcreatを選択
  • HostにPS3のIPアドレス、user/passwordにPS3のアカウント名・パスワードを設定
  • 作成したCell Boxを選択してStart Environmentのボタンをクリック
  • Debugのダイアログボックスを開き、Targetに作成したCellBoxを設定
  • デバックを開始

これで見違えるほど高速にデバッグができるようになります。何よりもシミュレーターの起動時間がなくなる点が大きいです。

(2008/4/3追記)
PC側・PS3側にFirewallの設定が行われていると、debuggerが使用するTCPポート(デフォルトは10000)がブロックされデバッグを起動できない場合があります(デバッグ起動中に、No route to host等の表示のあと強制終了してしまう)。Fedoraの場合、system-config-securitylevelを使用してFirewallを設定した場合、「その他のポート」欄にTCPポート10000などを追加する必要があります(下記の残問題1が発生した場合を加味して、10000-10100などのレンジを指定することも可能です)。私は、ブロードバンドルーター(これ自体がfirewallになる)の内側で使用しているため、Linuxのfirewallは無効にしてあります。

4. グローバル宣言された大きな配列をwatch

この問題も、3項に示すPS3上でデバッグターゲットを動かす方法で解決します。

残問題(2008/1/21追記)

きりんさんのコメントにもあったのですが、以下の問題はまだ未解決です。

  1. "Remote TCP port already in use"のエラー
    シミュレーター・CellBox双方で遭遇しました。この記事を書く段階になって発生しなくなったため、投稿には含め なかった次第です。この問題は、デバッグセッションが異常終了した際に、gdbとgdb_serverの通信で使用しているTCPポート=10000が開 放されないために発生するようです。デバッグプロパティ→ Debugger→ Port numberを別の値に変えるとデバッグができますが、異常終了する毎に新しい値に変える必要があり、何だか気持ちがよくないです。
  2. speプログラムの"No source file named”
    当方の環境でも出ます(SPE埋め込み・分離双方で)。DebugプロパティーのSource部分をいじってみても改善しません。3項を除いてspeプログラムのトレースはできているため、現状放置です
  3. SPEプログラムのトレース(次のケースでは依然としてトレースがうまく動作しません)
    spe_context_runを実行するthreadをloopで何回も呼び出すと、SIGTRAPによりgdbが停止したり、speプログラム内をトレー スできない(ブレークポイントが無視される)問題があります。spe_context_runを実行するthreadを1回しか呼び出さない場合、SPE埋め込み(Embedded)を含めてspeプログラム内もトレースできています。
  4. C/C++ Buildだけエラーダイアログが出る
    CellBoxを使用する前、SDK2.1→3.0に更新した直後に遭遇した記憶があります

« システムソフトウェア2.10でkbootが起動しない | トップページ | Cellの最大演算性能 »

Cellプログラミング」カテゴリの記事

コメント

ppcのライブラリをコピーするまではやってみたのですが、
シミュレータ環境をマウントしてそこから持ってくるまでは頭が回りませんでした。
Errorを無視してシミュレータでデバッグしてましたが、
3,4回やると以下のメッセージを出してデバッガが立ち上がらなくなり、
*** The launch did not work correctly ***
An exception was thrown during the launch: Remote TCP port already in use
その度にEclipseの再起動をしなければならなかったので、結局Cell Boxでデバッグしてました。(大量のライブラリが見つからないErrorが出ましたが。)
でも、おかげさまでError減りだいぶすっきりしました。ありがとうございました。
まだ、speのソースファイルがみつけられないようで、以下のメッセージが出ます。
No source file named
また、2項に関してですがSPEプログラムをPPEに埋め込むとトレース出来ません。
埋め込まなければ出来るのですが、No source file named のメッセージでます。
Todotaniさんは出てませんか?
それからCell Boxのデバッグですが、何回かやってEclpiseを終了させ、
次に起動したとき、PPEプログラムのプロパティのC/C++ Buildだけエラーダイアログがでて見れなくなる現象が出ました。

きりんさん。コメントありがとうございました。

"Remote TCP port already in use"のエラーですが、私も何回かシミュレーター・CellBox双方で遭遇しました。この記事を書く段階になって発生しなくなったため、投稿には含めなかった次第です。この問題は、デバッグセッションが異常終了した際に、gdbとgdb_serverの通信で使用しているTCPポート=10000が開放されないために発生するようです。デバッグプロパティ→ Debugger→ Port numberを別の値に変えるとデバッグができますが、異常終了する毎に新しい値に変える必要があり、何だか気持ちがよくないです。

speプログラムの"No source file named”は当方の環境でも出ます(SPE埋め込み・分離双方で)。DebugプロパティーのSource部分をいじってみても改善しません。

SPE埋め込み(Embedded)のトレースは私の環境ではできております。ただ、spe_context_runを実行するthreadをloopで何回も呼び出すと、SIGTRAPでgdbが停止したり、speプログラム内をトレースできない(ブレークポイントが無視される)問題があります。spe_context_runを実行するthreadを1回しか呼び出さない場合、speプログラムは問題なくトレースできます。

"C/C++ Buildだけエラーダイアログが出る"問題は、CellBoxを使うようになる前に遭遇したことがあった記憶があります(SDK2.1→3.0に更新した後)。

SDKも早く3.1にならないとだめかもしれませんね。

レスありがとうございます。
gdbの問題は既知のようですし、
SDK3.1が出るまで我慢するしかなさそうですね。

この記事へのコメントは終了しました。

« システムソフトウェア2.10でkbootが起動しない | トップページ | Cellの最大演算性能 »

2018年10月
  1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31      
無料ブログはココログ