Libspeプログラムのデバッグ
出典: PS3 Linux Information Site / Cell/B.E.のパワーを体験しよう
目次 |
[編集]
デバッガでプログラムを追うのに必要な共通の準備
- まず、通常のプログラムをデバッグするときと同様、PPEプログラムもSPEプログラムも -g オプションをつけてコンパイルしてください。
[編集]
Cell SDK 2.X環境でCell/B.E.プログラムの実行をデバッガで追う
- Cell SDK 2.X以降に含まれるppu-gdb がインストールされている環境では、PPU用のデバッガppu-gdbがcombined debuggerとなっているため、ppu-gdbを使うことでPPEプログラムやそのプログラムから実行されるSPEプログラムをシームレスに追うことができます。
- ppu-gdb を使ってPPEプログラム側を開始したら、通常のプログラムのようにブレークポイントなどを設定して run で実行を開始してください。SPEプログラム内のシンボルなどをbreakpointに設定すると、プログラムが読み込まれるまでbreakpointの設定をペンディングするか聞かれますので、yと答えます。
$ ppu-gdb your-ppe-program GNU gdb 6.6 ... (gdb) break some_spe_function Function "some_spe_function" not defined. Make breakpoint pending on future shared library load? (y or [n]) y (gdb)
- ブレークポイントで実行が止まったら、SPEプログラムを実行中でも普通に list でSPEのソースを見たり step で実行を進めたりすることができます。
[編集]
SPEプログラム開始時に実行を止めてデバッガに戻すには
- 特定のブレークポイントではなく、SPEプログラムが開始されたときに実行をとめたい場合は set spu stop-on-load をセットしてから runしてください。
(gdb) set spu stop-on-load
(gdb) run
...
[Switching to Thread XXXXXXX (LWP XXXX)]
0x000XXXX in main (speid=xxxxxxxxxxx, argv=xxxxxxxxxxxx)
at spe-xxx.c: X
X {
(gdb)
[編集]
SPE実行中のDMA転送バグによるBus errorを調べるには
- info spu dma というコマンドを使って、SPEのDMA実行キューのそのときの様子をみることができます。
(gdb) run
Starting program: ...
...
Program received signal SIGBUS, Bus error.
[Switching to Thread XXXXXXX (LWP XXXX)]
0x0000XXXX in ?? ()
(gdb) info spu dma
Tag-Group Status 0x00000002
Tag-Group Mask 0x00000001 ('all' query pending)
Stall-and-Notify 0x00000000
Atomic Cmd Status 0x00000000
Opcode Tag TId RId EA LSA Size LstAddr LstSize E
putllc 0 0 0 0x0000000010012100 0x3fd80 0x00000
get 0 0 0 0x00000400002e2084 0x08980 0x00010 *
get 0 0 0 0x0000000010011e00 0x08980 0x00000
mfcsync 0 0 0 0x00300 0x00880
...
- ちょうどそのとき実行されていたDMAコマンドがあれば、該当するコマンドの行の右端にアスタリスク * がついて表示されます。実行中のDMA実行コマンドの EA (メインストレージのEAアドレス) や LSA (LSアドレス)、Size (転送サイズ) をチェックして、アラインメントなどがおかしくないか調べることができます。
- 例えば上の例では上から2行目の get コマンドにおけるEAの値が16バイトにアラインされていないことがわかります。したがって、Bus error の起きた原因はDMAコマンドのアラインメントエラーであると推測できます。
[編集]
Cell SDK 1.X環境でCell/B.E.プログラムの実行をデバッガで追う
- Cell SDK 1.Xに含まれるSPU GDB (spu-gdb)がインストールされている環境では、
環境変数 SPU_DEBUG_START を設定してPPE側のプログラムを実行することで、そのプログラムから実行されるSPEプログラムをデバッガ spu-gdb で追うことができます。
- SPU_DEBUG_STARTを設定してプログラムを実行すると、SPEプログラムの実行が開始されるタイミングで次のような表示が出ます。(このとき、プログラム実行時にコマンドラインの最後に & をつけてプログラムがバックグラウンドで実行されるようにしておくと、SPEのデバッガを同じターミナルで起動することができます)
$ env SPU_DEBUG_START=1 ./program & Starting PSE thread 0xXXXXXXXX, to attach debugger use: spu-gdb -p XXXXX
- 表示どおりのコマンドラインを実行することでSPEプログラムをSPU用のgdb (spu-gdb)で追うことができます。(XXXXXの部分の表示は実行毎に違います)
$ spu-gdb -p XXXXX
- 複数のSPEスレッドを実行している場合、複数行表示が出ます。アタッチしたいスレッドを選んでspu-gdbを実行してください。
