並列領域で実行が停止されると、where コマンドによってアウトラインサブルーチンを含むスタックトレースと複数の実行時ライブラリ呼び出しが表示されます。「コンパイラによる OpenMP コードの変換」の Fortran の例を使用して実行を行 15 で停止すると、where コマンドによって次のスタックトレースが生成されます。
[t@4 l@4]: where current thread: t@4 =>[1] _$d1A12.MAIN_(), line 15 in "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) stopped in _$d1A12.MAIN_ at line 15 in file "example.f90" 15 sum = sum + a(i) [t@1 l@1]: where current thread: t@1 =>[1] _$d1A12.MAIN_(), line 15 in "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(), line 12 in "example.f90" |
いくつかのスレッドが大きくない場合、threads コマンド (「threads コマンド」参照) を使用してすべてのスレッドをリスト表示し、スレーブスレッド内で実行がどのようにブレークポイントに到達したかを判別し、各スレッドに切り替えてマスタースレッドを判別することができます。