スレッドアナライザを使用すると、プログラム内の潜在的デッドロックおよび実デッドロックを確認できます。スレッドアナライザは、Oracle Developer Studio パフォーマンスアナライザが使用するものと同じ収集-分析モデルに従います。
スレッドアナライザを使用するには、次の 3 つの手順を行います。
ソースコードをコンパイルする。
デッドロック検出実験を作成する。
実験結果を検する。
コードをコンパイルし、必ず –g を指定します。高度な最適化では、行番号や呼び出しスタックなどの情報が間違って報告される場合があるので、高度な最適化は指定しないでください。–g –xopenmp=noopt を付けて OpenMP プログラムをコンパイルし、–g –mt だけを付けて POSIX スレッドプログラムをコンパイルします。
これらのコンパイラオプションについては、cc(1)、CC(1)、または f95 (1) のマニュアルページを参照してください。
このチュートリアルの場合、次のコマンドを使用してコードをコンパイルします。
% cc -g -o din_philo din_philo.c
–r deadlock オプションを付けて collect コマンドを使用します。このオプションは、プログラムの実行中にデッドロック検出実験を作成します。
このチュートリアルの場合、次のコマンドを使用して、din_philo.1.er というデッドロック検出実験を作成します。
% collect -r deadlock -o din_philo.1.er din_philo
collect –r コマンドでは、デッドロック検出実験の作成時に役立つ次のオプションが受け入れられます。
回復不可能なエラーが検出された場合は、プログラムを終了します。
回復不可能なエラーが検出された場合は、プログラムを終了してコアダンプを出力します。
回復不可能なエラーが検出された場合も、プログラムの続行を許可します。
デフォルトの動作は terminate です。
必要な動作を実行するために、collect –r コマンドで前述のいずれかのオプションを使用できます。たとえば、実デッドロックが発生した場合にプログラムを終了してコアダンプを出力するには、次の collect –r コマンドを使用します。
% collect -r deadlock, abort -o din_philo.1.er din_philo
実デッドロックが発生した場合にプログラムをハングアップさせるには、次の collect –r コマンドを使用します。
% collect -r deadlock, continue -o din_philo.1.er din_philo
複数のデッドロック検出実験を作成することによって、デッドロックを検出する可能性を高められます。実験ごとに異なるスレッド数と異なる入力データを使用してください。たとえば、din_philo.c コードで、次の行の値を変更できます。
13 #define PHILOS 5 14 #define DELAY 5000 15 #define FOOD 100
続いて、前述のようにコンパイルして、別の実験結果を収集できます。
詳しくは、collect(1) および collector(1) のマニュアルページを参照してください。
スレッドアナライザ、パフォーマンスアナライザ、er_print ユーティリティーで、デッドロック検出実験を検証できます。スレッドアナライザおよびパフォーマンスアナライザはどちらも GUI インタフェースを表示します。スレッドアナライザはデフォルトビューの簡略セットを表示しますが、それ以外はパフォーマンスアナライザと同じです。
スレッドアナライザを開始して、din_philo.1.er 実験結果を開くには、次のコマンドを入力します。
% tha din_philo.1.er
スレッドアナライザには、メニューバー、ツールバー、左側にデータビューを選択できる垂直のナビゲーションバーが表示されます。
デッドロック検出用に収集された実験結果を開くと、デフォルトで、次のデータビューが表示されます。
「概要」画面には、ロードされた実験のメトリックの概要が表示されます。
「デッドロック」ビューには、スレッドアナライザがプログラム内で検出した潜在的デッドロックや実デッドロックの一覧が表示されます。er_print din_philo.1.er デッドロックごとに関連するスレッドが示されます。これらのスレッドは、各スレッドがロックを保持し、チェーン内の次のスレッドが保持している別のロックを要求するという巡回チェーンを形成しています。
デッドロックを選択すると、関係するスレッドの詳細情報を示す「デッドロックの詳細」ウィンドウが右側のパネルに表示されます。
「デュアルソース」ビューには、スレッドがロックを保持したソース位置と、同じスレッドがロックを要求したソース位置が示されます。スレッドがロックを保持し要求したソース行が強調表示されます。このビューを表示するには、「デッドロック」ビューの円形のチェーン内のスレッドを選択して、「デュアルソース」ビューをクリックします。
「実験」ビューには、実験でのロードオブジェクトが表示され、すべてのエラーおよび警告メッセージが一覧表示されます。
「詳細ビュー」オプションメニューでほかのビューを表示できます。
er_print ユーティリティーは、コマンド行インタフェースを表示します。インタラクティブセッションで er_print ユーティリティーを使用して、セッション中にサブコマンドを指定します。コマンド行オプションを使用して、インタラクティブでない方法でもサブコマンドを指定できます。
次のサブコマンドは、 er_print ユーティリティーでデッドロックを調べるときに役立ちます。
–deadlocks
このオプションは、実験で検出された潜在的デッドロックおよび実デッドロックについて報告します。(er_print) プロンプトで deadlocks を指定するか、er_print コマンド行で –deadlocks を指定します。
–ddetail deadlock-ID
このオプションは、指定した deadlock-ID を持つデッドロックの詳細な情報を返します。(er_print) プロンプトで ddetail を指定するか、er_print コマンド行で –ddetail を指定します。指定された deadlock-ID が all の場合、すべてのデッドロックの詳細情報が表示されます。それ以外では、最初のデッドロックを表す 1 などの単一のデッドロック番号を指定します。
–header
このオプションは、実験に関する記述的情報を表示し、すべてのエラーまたは警告を報告します。(er_print) プロンプトで header と指定するか、コマンド行で –header と指定します。
詳細は、collect(1)、tha(1)、analyzer(1)、および er_print(1) のマニュアルページを参照してください。