Oracle Solaris Studio 12.2: スレッドアナライザユーザーズガイド

1.4.1.1 データの競合を検出するコードを計測する

アプリケーションでデータの競合の検出を可能にするには、実行時にメモリーアクセスを監視するコードをあらかじめ計測しておく必要があります。コードの計測方法としては、コンパイル中にアプリケーションのソースレベルで行う場合もあれば、バイナリに対し追加ツールを実行することによってアプリケーションのバイナリレベルで行う場合もあります。

ソースレベルの計測は、コンパイルに特別なオプションを指定して行います。また、使用する最適化レベルおよびその他のコンパイラオプションを指定できます。ソースレベルの計測は、コンパイラが一部の分析と計測を少ないメモリーアクセスで行うことができるため、実行時間がより短縮されます。

バイナリレベルの計測は、ソースコードが使用できない場合に役立ちます。ソースコードがある場合でもバイナリ計測を使用することがあります。ただしこの場合、アプリケーションが使用している共有ライブラリはコンパイルできません。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) のマニュアルページを参照してください。

-o file

計測済みバイナリを、指定したファイル名で出力する

-N lib

指定したライブラリを計測しない

-T

どのライブラリも計測しない

-D dir

キャッシュディレクトリを dir に変更する

データの競合を検出するためにプログラムのバイナリコードを計測する場合、discover ツールでは、入力バイナリを次の条件を満たしてコンパイルする必要があります。

また、バイナリがコンパイラオプション -xbinopt=prepare を付けてコンパイルされた場合は、SPARC ベースのシステムで実行中の、以前の Solaris バージョンでも discover ツールを使用できることがあります。このコンパイラオプションについては、cc(1)、CC(1)、または f95(1) のマニュアルページを参照してください。