Sun Studio 12: dbx コマンドによるデバッグ

OpenMP コードにおけるスタックトレースの使用

並列領域で実行が停止されると、 where コマンドによってアウトラインサブルーチンを含むスタックトレースと複数の実行時ライブラリ呼び出しが表示されます。 「コンパイラによる OpenMP コードの変換」の Fortran の例を使用して実行を行 15 で停止すると、where コマンドによって次のスタックトレースが生成されます。


[t@4 l@4]: where
現スレッド: t@4
=>[1] _$d1A12.MAIN_(), 行番号 15  "example.f90"
[2] __mt_run_my_job_(0x45720, 0xff82ee48, 0x0, 0xff82ee58, 0x0, 0x0), at 0x16860
[3] __mt_SlaveFunction_(0x45720, 0x0, 0xff82ee48, 0x0, 0x455e0, 0x1), at 0x1aaf0

スタックの上位フレームはアウトライン関数のフレームです。コードがアウトラインされていても、ソース行番号は 15 にマップされたままです。ほかの 2 つのフレームは実行時ライブラリルーチン用です。

並列領域で実行が停止されると、前述の例のようにスレーブスレッドの where コマンドはスタックトレースを親スレッドに戻しません。ただし、マスタースレッドの where コマンドは完全トレースバックを行います。


[t@4 l@4]: thread t@1
t@1 (l@1) で停止しました _$d1A12.MAIN_ 行番号 15 ファイル "example.f90"
15           sum = sum + a(i)
[t@1 l@1]: where
現スレッド: t@1
=>[1] _$d1A12.MAIN_(), 行番号 15  "example.f90"
[2] __mt_run_my_job_(0x41568, 0xff82ee48, 0x0, 0xff82ee58, 0x0, 0x0), at 0x16860
[3] __mt_MasterFunction_(0x1, 0x0, 0x6, 0x0, 0x0, 0x40d78), at 0x16150
[4] MAIN(), 行番号 12 "example.f90"

いくつかのスレッドが大きくない場合、threads コマンド (threads コマンド」参照) を使用してすべてのスレッドをリスト表示し、スレーブスレッド内で実行がどのようにブレークポイントに到達したかを判別し、各スレッドに切り替えてマスタースレッドを判別することができます。