Oracle® Solaris Studio 12.4: Discover および Uncover ユーザーズガイド

印刷ビューの終了

更新: 2015 年 12 月
 
 

準備されたバイナリの計測

ターゲットバイナリを準備したら、次の手順はその計測です。計測は戦略的な場所にコードを追加して、discover がバイナリの実行中にメモリー操作を追跡できるようにします。


注 -  SPARC V8 アーキテクチャー上の 32 ビットバイナリの場合、discover は計測中に V8plus コードを挿入します。その結果、出力バイナリはバイナリ入力に関係なく常に v8plus になります。

discover コマンドを使用して、バイナリを計測します。たとえば、次のコマンドは、バイナリ a.out を計測し、入力 a.out を計測済みの a.out で上書きします。

discover a.out

計測済みのバイナリを実行する場合、discover はプログラムのメモリーの使用をモニターします。実行時に、discover はメモリーアクセスエラーを詳述するレポートを Web ブラウザで表示可能な HTML ファイルに書き込みます。デフォルトのファイル名は a.out.html です。レポートを ASCII ファイルまたは stderr に書き込むように要求するには、バイナリの計測時に –w オプションを使用します。

discover でバイナリの書き込み専用計測を行うように指定するには、–n オプションを使用します。

discover がバイナリを計測するときに、注釈が付けられていないために計測できないコードを検出すると、次のような警告が表示されます。

discover: (warning): a.out: 80% of code instrumented (16 out of 20 functions)

注釈付きでないコードは、バイナリにリンクされているアセンブリ言語コード、またはコンパイラでコンパイルされたモジュール、またはバイナリを適切に準備するにリストされているシステムより古いオペレーティングシステム上から来ている可能性があります。

共有ライブラリのキャッシュ

discover はバイナリを計測するときに、そのバイナリにコードを追加します。このコードは実行時リンカーと連携して、実行時に依存共有ライブラリがロードされたときにそれらを計測します。計測済みライブラリは、元のライブラリが最後に計測されてから変更されていない場合には再使用可能なキャッシュに格納されます。デフォルトでは、キャッシュディレクトリは $HOME/SUNW_Bit_Cache です。このディレクトリは –D オプションを使用して変更できます。

共有ライブラリの計測

すべての共有ライブラリを含む、プログラム全体が計測される場合、discover ユーティリティーはもっとも正確な結果を生成します。デフォルトでは、discover は実行可能ファイルのメモリーエラーだけを検査して報告します。discover で実行可能ファイルのエラーの検査をスキップするように指定するには、–n オプションを使用します。

–c オプションを使用すると、依存共有ライブラリおよび dlopen() によって動的に開かれたライブラリのエラーを discover で検査するように指定できます。–c オプションを使用して特定のライブラリのエラー検査を回避することもできます。discover はそのライブラリのエラーを報告しませんが、メモリーエラーを正しく検出するためにアドレス空間全体のメモリー状態を追跡する必要があるため、すべての共有ライブラリを含むプログラム全体で割り当てとメモリーの初期化を記録します。

discover ユーティリティーのランタイムは、リンカーの監査インタフェース (rtld-audit または LD_AUDIT とも呼ばれる) を使用して、計測される共有ライブラリを discover のキャッシュディレクトリから自動的にロードします。Oracle Solaris では、監査インタフェースはデフォルトで使用されます。Linux では、計測されるバイナリの実行中に、コマンド行で LD_AUDIT を設定する必要があります。

Oracle Linux 上の 32 ビットアプリケーションの場合:

% LD_AUDIT=install-dir/lib/compilers/postopt/bitdl.so a.out

Oracle Linux 上の 64 ビットアプリケーションの場合:

% LD_AUDIT=install-dir/lib/compilers/postopt/amd64/bitdl.so a.out

Oracle Enterprise Linux 5.x を実行しているすべての環境では、このメカニズムは機能しない可能性があります。ライブラリの計測が必要なく、LD_AUDIT が設定されていない場合は、discover は Oracle Enterprise Linux 5.x 上で問題はありません。

バイナリを適切に準備するの説明に従って、プログラムで使用されるすべての共有ライブラリを準備する必要があります。デフォルトで、実行時リンカーが準備されていないライブラリを検出する場合、致命的なエラーが発生します。ただし、discover に 1 つ以上のライブラリを無視するように指示できます。

ライブラリの無視

一部のライブラリは、準備または計測できない場合があります–s–T、または –N オプション (計測オプションを参照) を使用して、あるいは bit.rc ファイル (bit.rc 初期化ファイルを参照) の指定項目を使用して、discover にこれらのライブラリを無視するように指示できます。正確さが多少失われる可能性があります。

ライブラリが計測できず、「無視可能」と指定されていない場合、discover は計測時に失敗したり、プログラムが実行時にエラーメッセージを伴って失敗したりします。

デフォルトでは、discoverbit.rc システムファイルの指定項目を使用して、特定のシステムおよびコンパイラが提供するライブラリを、準備されていないために無視するものとして設定します。discover はもっとも一般的に使用されるライブラリのメモリー特性を認識するため、正確さに対する影響は最小限です。

ライブラリまたは実行可能ファイルの部分的な検査

–c オプションを使用して、実行可能ファイルまたはライブラリを指定できます。メモリーアクセスの検査を特定のオブジェクトファイルに制限することで、ターゲット実行可能ファイルまたはターゲットライブラリをさらに限定できます。

たとえば、ターゲットライブラリが libx.so で、ターゲット実行可能ファイルが a.out の場合は、次のコマンドを使用します。

$ discover -c libx.so -o a.out.disc a.out

複数のファイルまたはディレクトリをコロンで区切って追加することで、ターゲットの検査を制限することもできます。ファイルには ELF ファイルまたはディレクトリを指定できます。ELF ファイルを指定すると、そのファイルで定義されているすべての関数が検査されます。ディレクトリを指定すると、そのディレクトリ内のすべてのファイルが再帰的に使用されます。

$ discover -o a.out.disc a.out:t1.0:dir
$ discover -c libx.so:l1.o:12.o -o a.out.disc a.out

コマンド行オプション

discover コマンドとともに次のオプションを使用して、バイナリを計測できます。

出力オプション

–a

コードアナライザで使用するためにエラーデータを binary-name.analyze/dynamic ディレクトリに書き込みます。

–bbrowser

計測済みのプログラムの実行中に、Web ブラウザ browser を自動的に起動します (デフォルトでは off)。

–e n

レポートに n メモリーエラーのみを表示します (デフォルトでは、すべてのエラーを表示します)。

–E n

レポートに n メモリーリークのみを表示します (デフォルトは 100 です)。

–f

レポートのオフセットを表示します (デフォルトは非表示です)。

–Hhtml-file

discover のバイナリに関するレポートを HTML 形式で html-file に書き込みます。このファイルは計測済みバイナリの実行時に作成されます。html-file が相対パス名である場合、計測済みバイナリを実行する作業ディレクトリを基準として相対的に配置されます。バイナリを実行するたびにファイル名を一意にするには、ファイル名に文字列 %p を追加して、discover ランタイムにプロセス ID を含めるように指示します。たとえば、オプション –H report.%p.html によって、report.process-ID.html というファイル名のレポートファイルが生成されます。ファイル名に複数個の %p を含めると、最初のインスタンスだけがプロセス ID と置き換えられます。

このオプションまたは –w オプションを指定しない場合、レポートは HTML 形式で output-file.html に書き込まれます。output-file は、計測済みバイナリのベース名です。ファイルは、計測済みバイナリを実行する作業ディレクトリに配置されます。

このオプションおよび –w オプションを指定して、テキストおよび HTML ファイル形式の両方でレポートを書き込むことができます。

–m

レポートの符号化された名前を表示します (デフォルトは符号化されていない名前の表示です)。

–ofile

計測済みのバイナリを file に書き込みます。デフォルトで、計測済みのバイナリは入力バイナリを上書きします。

–S n

レポートに n スタックフレームのみを表示します (デフォルトは 8 です)。

–wtext-file

バイナリ上の discover のレポートを text-file に書き込みます。計測済みのバイナリを実行するときに、ファイルが作成されます。text-file が相対パス名である場合、ファイルは計測済みバイナリを実行する作業ディレクトリを基準として相対的に配置されます。バイナリを実行するたびにファイル名を一意にするには、ファイル名に文字列 %p を追加して、discover ランタイムに対してプロセス ID を含めるように要求します。たとえば、オプション –w report.%p.txt によって report.process-ID.txt というファイル名のレポートファイルが生成されます。ファイル名に複数個の %p を含めると、最初のインスタンスだけがプロセス ID と置き換えられます。–w - を指定すると stderr に出力されます。

このオプションまたは –H オプションを指定しない場合、レポートは HTML 形式で output-file.html に書き込まれます。output-file は、計測済みバイナリのベース名です。ファイルは、計測済みバイナリを実行する作業ディレクトリに配置されます。

このオプションおよび –H オプションを両方指定して、テキストおよび HTML 形式の両方でレポートを書き込みます。


注 -  –w および –H オプションを使用する場合は、フルパス名を使用することをお勧めします。相対パスが使用されている場合、レポートはプロセスの実行ディレクトリに相対的なディレクトリに生成されます。そのため、アプリケーションがディレクトリを変更し、新しいプロセスを起動する場合に、レポートが誤った場所に配置される可能性があります。アプリケーションが新しいプロセスを作成すると、実行時に libdiscoverADI.so が子プロセスに対して親のエラーレポートのコピーを作成するので、子プロセスはコピーへの書き込みを続行します。子プロセスの実行ディレクトリが異なり、レポートファイルに相対パスが使用されていた場合、その子プロセスが親プロセスを見つけられない可能性があります。フルパス名を使用することで、これらの問題を回避します。

計測オプション

–A [on | off]

割り当て/解放スタックトレースをオンまたはオフにします (デフォルトはスタック深度 8 で on です)。このフラグは、–i adi オプションを使用したハードウェアアシスト検査のための計測時にのみ指定できます。実行時パフォーマンスの向上のため、このオプションで、割り当て/解放スタックトレースの収集をオフにできます。このオプションは、Oracle Solaris Studio 12.4 、4/15 Platform Specific Enhancement (PSE) がインストールされている場合にのみ使用できます。

–c [ - | library [:scope...] | file]

すべてのライブラリ内、指定された library 内、または指定された file に改行で区切って列挙されているライブラリ内のエラーを検査します。デフォルトでは、ライブラリ内のエラーを検査しません。コロンで区切られたファイルまたはディレクトリを追加することによって、ライブラリの検査のスコープを制限できます。詳細は、ライブラリまたは実行可能ファイルの部分的な検査を参照してください。

–F [parent | child | both]

discover で計測機構を組み込んだバイナリが実行中にフォークした場合に行う処理を指定します。デフォルトでは、discover は引き続き、親プロセスと子プロセスの両方からメモリーアクセスエラーのデータを収集します。discover が親プロセスにのみ従うようにする場合は、–F parent を指定します。Discover が子プロセスにのみ従うようにする場合は、–F child を指定します。

–i [datarace | memcheck | adi]

discover の計測タイプを指定します (デフォルトは memcheck)。

datarace を指定した場合、スレッドアナライザを使用して、データ競合の検出のために計測します。このオプションを使用する場合は、データ競合検出のみが実行時に行われ、他のメモリー検査は行われません。collect コマンドを使用して計測済みのバイナリを実行し、パフォーマンスアナライザで表示可能な実験を生成する必要があります。詳細は、Oracle Solaris Studio 12.4: スレッドアナライザユーザーズガイド を参照してください。 memcheck を指定した場合、メモリーエラー検査のために計測します。 adi を指定した場合、SPARC M7 プロセッサの ADI 機能を使用して、ハードウェアアシスト検査のために計測します。この機能は SPARC M7 プロセッサで実行されている Oracle Solaris 11.3 でのみ使用できます。–i adi オプションは、Oracle Solaris Studio 12.4 、4/15 Platform Specific Enhancement (PSE) をインストールしている場合にのみ使用できます。

–K

bit.rc 初期化ファイルを読み取らないでください (「bit.rc 初期化ファイル」を参照)。

–l

discover を簡易モードで実行します。このオプションによって、プログラムの実行速度が向上します。プログラムに特別な準備は必要ありませんが、検出されるエラーの数が制限されます。

–n

実行可能ファイルのエラーを検査しません。

–N library

接頭辞 library に一致する依存共有ライブラリを計測しないでください。ライブラリ名の最初の文字が library に一致する場合、ライブラリは無視されます。library がスラッシュ (/) で始まる場合、ライブラリの完全な絶対パス名でマッチングが行われます。それ以外の場合、ライブラリのベース名でマッチングが行われます。

–P [on | off]

正確な ADI モードをオンまたはオフにします。デフォルトは on です。このフラグは、–i adi オプションを使用したハードウェアアシスト検査のための計測時にのみ指定できます。実行時パフォーマンスの向上のため、このオプションで、正確な ADI モードをオフにできます。このオプションは、Oracle Solaris Studio 12.4 、4/15 Platform Specific Enhancement (PSE) がインストールされている場合にのみ使用できます。

–s

計測不可能なバイナリの計測を試みる場合は、警告を発するが、エラーのフラグは立てないでください。

–T

指定されたバイナリのみを計測します。依存共有ライブラリを実行時に計測しないでください。

キャッシュオプション

–D cache-directory

キャッシュされた計測済みバイナリを格納するためのルートディレクトリとして cache-directory を使用します。デフォルトでは、キャッシュディレクトリは $HOME/SUNW_Bit_Cache です。

–k

キャッシュで検出されたライブラリの再計測を強制します。

その他のオプション

–h または –?

ヘルプ。短いヘルプメッセージを出力して、終了します。

–v

冗長。discover が実行している内容のログを出力します。このオプションを 2 回指定すると、より詳しい情報が出力されます。

–V

discover のバージョン情報を出力して終了します。

bit.rc 初期化ファイル

discover ユーティリティーは、起動時に一連の bit.rc ファイルを読み取ることによってその状態を初期化します。システムファイル Oracle-Solaris-Studio-installation-directory/prod/lib/bit.rc は、特定の変数のデフォルト値を提供します。discover ユーティリティーは最初にこのファイルを読み取り、次に $HOME/.bit.rc (存在する場合) と current-directory/.bit.rc (存在する場合) を読み取ります。

bit.rc ファイルには、特定の変数値を設定、追加、または削除するコマンドが含まれています。discoverset コマンドを読み取る場合、変数の前の値がある場合には、それを無効にします。append コマンドを読み取る場合、変数の既存の値に (コロンセパレータのあとに) 引数を追加します。remove コマンドを読み取る場合、変数の既存の値から引数とそのコロンセパレータを削除します。

bit.rc ファイルの変数セットには、計測時に無視するライブラリのリスト、およびバイナリ内の注釈の付いていない (準備されていない) コードの割合を計算する場合に無視する関数または関数接頭語のリストが含まれます。

詳細は、bit.rc システムファイルのヘッダーのコメントを参照してください。