Cellプログラムのデバッグ
今回は、Cellプログラムのデバッグ方法についてまとめてみました。
私は通常、PC LinuxのEclipse IDEでCellプログラムを作成・コンパイルし、PCのシミュレーター上で、IDEのGUIベースでデバッグを行っています。PS3上でgdbを使ってデバッグを行っても同様のことが出きるのですが、GUIベースで変数の状態確認やステップ動作が出来た方が私的には楽ちんです。PS3ではメモリー量の制約からIDEを動かすことはできません。
ただ、Eclipse IDEでCellプログラムのデバッグを行う際には、以下の問題がありました。
- SDK 3.0のIDEになってから、デバッグを開始する際にに、次のエラーメッセージが出る
Error while mapping shared library sections:
/lib/libgcc_s.so.1: No such file or directory. - SDK 3.0にしてから、SPEプログラムのトレースができない場合がある(ブレークポイントを設定しても停止しないなど)
- シミュレーターではレスポンスが悪い(数千回ループを回すような計算はかなり待たされる)
- グローバル宣言された大きな配列を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画面に表示するイメージです)
ということは、シミュレーターの代わりに、「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追記)
きりんさんのコメントにもあったのですが、以下の問題はまだ未解決です。
- "Remote TCP port already in
use"のエラー
シミュレーター・CellBox双方で遭遇しました。この記事を書く段階になって発生しなくなったため、投稿には含め なかった次第です。この問題は、デバッグセッションが異常終了した際に、gdbとgdb_serverの通信で使用しているTCPポート=10000が開 放されないために発生するようです。デバッグプロパティ→ Debugger→ Port numberを別の値に変えるとデバッグができますが、異常終了する毎に新しい値に変える必要があり、何だか気持ちがよくないです。 - speプログラムの"No source file named”
当方の環境でも出ます(SPE埋め込み・分離双方で)。DebugプロパティーのSource部分をいじってみても改善しません。3項を除いてspeプログラムのトレースはできているため、現状放置です - SPEプログラムのトレース(次のケースでは依然としてトレースがうまく動作しません)
spe_context_runを実行するthreadをloopで何回も呼び出すと、SIGTRAPによりgdbが停止したり、speプログラム内をトレー スできない(ブレークポイントが無視される)問題があります。spe_context_runを実行するthreadを1回しか呼び出さない場合、SPE埋め込み(Embedded)を含めてspeプログラム内もトレースできています。 - C/C++ Buildだけエラーダイアログが出る
CellBoxを使用する前、SDK2.1→3.0に更新した直後に遭遇した記憶があります


最近のコメント