Oracle Solaris Studio 12.2 Discover および Uncover ユーザーズガイド

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

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

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


discover a.out

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

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


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

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

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

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

共有ライブラリの計測

すべての共有ライブラリを含む、プログラム全体が計測される場合、Discover は最も正確な結果を生成します。デフォルトでは、主要な実行可能ファイルを計測する際に、Discover はプログラムの実行時のようなコードを挿入し、Discover は共有ファイルが開かれるとすべて自動的に計測します。それらのファイルがプログラムに静的にリンクされているか、dlopen() によって動的に開かれているかは関係ありません。

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

ライブラリの無視

一部のライブラリは、準備できないか、または何らかの理由で計測できない場合があります。このような場合に、多少、正確さを低下させるために、-s-T、または -N オプション (「「計測オプション」」を参照)、bit.rc ファイル (「bit.rc 初期化ファイル」」を参照) の仕様を使用して、Discover にこれらのライブラリを無視するように指示できます。

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

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

コマンド行オプション

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

出力オプション

-o file

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

-w text_file

バイナリ上の Discover のレポートを text_file に書き込みます。計測済みのバイナリを実行するときに、ファイルが作成されます。text_file が相対パス名である場合、ファイルは計測済みバイナリを実行する作業ディレクトリを基準として相対的に配置されます。バイナリを実行するたびにファイル名を一意にするには、文字列 %p をファイル名に追加して、Discover ランタイムにプロセス ID を含めるように求めます。たとえば、オプション -w report.%p.txtreport.process_id.txt を持つレポートファイルを生成します。2 回以上、ファイル名に %p を含む場合、最初のインスタンスだけがプロセス ID と置き換えられます。

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

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

-H html_file

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

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

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

-e n

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

-E n

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

-f

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

-m

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

-S n

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

計測オプション

-l

Discover を簡易モードで実行します。このオプションは、プログラムのより高速な実行を提供し、「バイナリは正しく準備される必要がある」で説明されるように、プログラムが特別に準備される必要はないが検出されるエラー数は制限されます。

-i

スレッドアナライザを使用してデータ競合を検出するために計測します。このオプションを使用する場合は、データ競合検出のみが実行時に行われ、他のメモリー検査は行われません。計測済みのバイナリは、collect コマンドを使用して実行し、パフォーマンスアナライザで表示可能な実験を生成する必要があります (『Oracle Solaris Studio 12.2: スレッドアナライザユーザーズガイド』を参照)。

-s

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

-T

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

-N library

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

-K

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

キャッシュオプション

-D cache_directory

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

-k

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

その他のオプション

-h または -?

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

-v

冗長。Discover が実行している内容のログを出力します。詳細については、オプションを繰り返してください。

-V

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

bit.rc 初期化ファイル

Discoverは、起動時に一連の bit.rc ファイルを読み取ることによってその状態を初期化します。システムファイル、Oracle_Solaris_Studio_installation_directory /prod/lib/postopt/bit.rc は、特定の変数のデフォルトの値を提供します。Discover は最初にこのファイルを読み取り、次に、存在する場合は $HOME/.bit.rc 、および存在する場合は current_directory/.bit.rc を読み取ります。

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

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

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

SUNW_DISCOVER_OPTIONS 環境変数

SUNW_DISCOVER_OPTIONS 環境変数をコマンド行オプション -b-e-E-f-H-l-L-m, -S および -w のリストに設定することによって、計測済みバイナリの実行時動作を変更できます。たとえば、レポートされるエラー数を 50 に変更し、レポート内のスタックの深さを 3 に制限する場合、環境変数を -e 50-s 3 に設定します。