データの競合を検出するには、次の 3 つの手順を実行する必要があります。
データの競合の検出を有効にするコードを計測する
計測したコードで実験を作成する
データの競合の実験結果を検討する
アプリケーションでデータの競合の検出を可能にするには、実行時にメモリーアクセスをモニターするコードをあらかじめ計測しておくこと、つまり、実行時にメモリーアクセスをモニターし、データの競合が発生しているかどうかを判別するために、実行時サポートライブラリ libtha.so の呼び出しをコードに挿入しておく必要があります。
コードの計測方法としては、コンパイル中にアプリケーションのソースレベルで行う場合もあれば、バイナリに対し追加ツールを実行することによってアプリケーションのバイナリレベルで行う場合もあります。
ソースレベルの計測は、コンパイルに特別なオプションを指定して行います。また、使用する最適化レベルおよびその他のコンパイラオプションを指定できます。ソースレベルの計測は、コンパイラが一部の分析と計測を少ないメモリーアクセスで行うことができるため、実行時間がより短縮されます。
バイナリレベルの計測は、ソースコードが使用できない場合に役立ちます。ソースコードがある場合でもバイナリ計測を使用することがあります。ただしこの場合、アプリケーションが使用している共有ライブラリはコンパイルできません。discover ツールを使用したバイナリ計測では、バイナリだけでなく、開かれている共有ライブラリすべてを計測します。
ソースレベルで計測するには、特別なコンパイラオプションを付けてソースコードをコンパイルします。
-xinstrument=datarace
このコンパイラオプションを付けてコンパイラで生成されたコードが、データの競合の検出用に計測されます。
–g コンパイラオプションも、アプリケーションバイナリの構築時に使用する必要があります。このオプションを付けると、スレッドアナライザでデータの競合を報告するときにソースコードおよび行番号情報を表示するための追加データを生成できます。
バイナリレベルで計測するには、discover ツールを使用する必要があります。バイナリが a.out という名前の場合、次のように実行することによって、計測済みのバイナリ a.outi を作成できます。
discover -i datarace -o a.outi a.out
discover ツールでは、開かれている共有ライブラリを、それがプログラム内で静的にリンクされているか、dlopen() によって動的に開かれているかにかかわらず、すべて自動的に計測します。デフォルトで、ライブラリの計測済みコピーは、ディレクトリ $HOME/SUNW_Bit_Cache に書き込まれます。
有効な discover コマンド行オプションの一部を次に示します。詳細は、discover(1) のマニュアルページを参照してください。
計測済みバイナリを、指定したファイル名で出力する
指定したライブラリを計測しない
どのライブラリも計測しない
キャッシュディレクトリを dir に変更する
データの競合の検出実験を作成するには、–r race フラグを付けて collect コマンドを使用して、アプリケーションを実行し、プロセスの実行中に実験データを収集します。–r race オプションを使用すると、競合を起こしたデータアクセスの対を収集データから知ることができます。
データの競合を検出する実験を検討するには、tha コマンドを使用します。このコマンドにより、スレッドアナライザのグラフィカルユーザーインタフェースが起動します。er_print コマンド行インタフェースも使用できます。