対象のバイナリを計測することで、戦略的な場所にコードを追加して、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 で実行可能ファイルのエラーの検査をスキップするように指定するには、–n オプションを使用します。
–c <lib> オプションを使用すると、依存共有ライブラリおよび dlopen() によって動的に開かれたライブラリのエラーを discover で検査するように指定できます。–c オプションを使用して特定のライブラリのエラー検査を回避することもできます。discover はそのライブラリのエラーを報告しませんが、メモリーエラーを正しく検出するためにアドレス空間全体のメモリー状態を追跡する必要があるため、すべての共有ライブラリを含むプログラム全体で割り当てとメモリーの初期化を記録します。
discover ユーティリティーのランタイムは、リンカーの監査インタフェース (rtld-audit または LD_AUDIT とも呼ばれる) を使用して、計測される共有ライブラリを discover のキャッシュディレクトリから自動的にロードします。Oracle Solaris では、監査インタフェースはデフォルトで使用されます。Linux では、計測されるバイナリの実行中に、コマンド行で LD_AUDIT を設定する必要があります。
Oracle Linux 上の 32 ビットアプリケーションの場合:
% LD_AUDIT=install-dir/lib/compilers/bitdl.so a.out
Oracle Linux 上の 64 ビットアプリケーションの場合:
% LD_AUDIT=install-dir/lib/compilers/amd64/bitdl.so a.out
Oracle Enterprise Linux 5.x を実行しているすべての環境では、このメカニズムは機能しない可能性があります。ライブラリの計測が必要なく、LD_AUDIT が設定されていない場合は、discover は Oracle Enterprise Linux 5.x 上で問題はありません。
バイナリの計測の説明に従って、プログラムで使用されるすべての共有ライブラリを計測するべきです。デフォルトで、実行時リンカーが計測されていないライブラリを検出する場合、致命的なエラーが発生します。ただし、discover に 1 つ以上のライブラリを無視するように指示できます。
一部のライブラリは、計測できない場合があります 。 –T または –N オプション (計測オプションを参照) を使用して、または bit.rc ファイル (bit.rc 初期化ファイルを参照) の仕様を使用して、これらのライブラリを無視するように discover に指示できます。正確さが多少失われる可能性があります。
デフォルトでは、discover はシステムの bit.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 コマンドとともに次のオプションを使用して、バイナリを計測できます。
コードアナライザで使用するためにエラーデータを binary-name.analyze/dynamic ディレクトリに書き込みます。
計測済みのプログラムの実行中に、Web ブラウザ browser を自動的に起動します (デフォルトでは off)。
レポートに n メモリーエラーのみを表示します (デフォルトでは、すべてのエラーを表示します)。
レポートに n メモリーリークのみを表示します (デフォルトは 100 です)。
レポートのオフセットを表示します (デフォルトは非表示です)。
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 ファイル形式の両方でレポートを書き込むことができます。
レポートの符号化された名前を表示します (デフォルトは符号化されていない名前の表示です)。
計測済みのバイナリを file に書き込みます。デフォルトで、計測済みのバイナリは入力バイナリを上書きします。
レポートに n スタックフレームのみを表示します (デフォルトは 8 です)。
バイナリ上の 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 形式の両方でレポートを書き込みます。
割り当て/解放スタックトレースをオンまたはオフにします (デフォルトはスタック深度 8 で on です)。このフラグは、–i adi オプションを使用したハードウェアアシスト検査のための計測時にのみ指定できます。実行時パフォーマンスの向上のため、このオプションで、割り当て/解放スタックトレースの収集をオフにできます。このオプションは、Oracle Developer Studio 12.5 、3/15 Platform Specific Enhancement (PSE) がインストールされている場合にのみ使用できます。
すべてのライブラリ内、指定された library 内、または指定された file に改行で区切って列挙されているライブラリ内のエラーを検査します。デフォルトでは、ライブラリ内のエラーを検査しません。コロンで区切られたファイルまたはディレクトリを追加することによって、ライブラリの検査のスコープを制限できます。不正なメモリー書き込みエラーなどの一部のクリティカルなエラーは、アプリケーション内のほかのバイナリに属するメモリーを破損させる可能性があるため、–-c フラグが使用されている場合でも、これらのエラーは引き続き報告されることがあります。詳細は、ライブラリまたは実行可能ファイルの部分的な検査を参照してください。
discover で計測機構を組み込んだバイナリが実行中にフォークした場合に行う処理を指定します。デフォルトでは、discover は引き続き、親プロセスと子プロセスの両方からメモリーアクセスエラーのデータを収集します。discover が親プロセスにのみ従うようにする場合は、–F parent を指定します。Discover が子プロセスにのみ従うようにする場合は、–F child を指定します。
discover の計測タイプを指定します (デフォルトは memcheck)。
datarace を指定した場合、スレッドアナライザを使用して、データ競合の検出のために計測します。このオプションを使用する場合は、データ競合検出のみが実行時に行われ、他のメモリー検査は行われません。collect コマンドを使用して計測済みのバイナリを実行し、パフォーマンスアナライザで表示可能な実験を生成する必要があります。詳細は、Oracle Developer Studio 12.5: スレッドアナライザユーザーズガイドを参照してください。 memcheck を指定した場合、メモリーエラー検査のために計測します。 adi を指定した場合、SPARC M7 プロセッサの ADI 機能を使用して、ハードウェアアシスト検査のために計測します。この機能は SPARC M7 プロセッサで実行されている Oracle Solaris 11.3 でのみ使用できます。
bit.rc 初期化ファイルを読み取らないでください (「bit.rc 初期化ファイル」を参照)。
discover を簡易モードで実行します。プログラム内のメモリーリークの検出のみを行う場合は、–l オプションを使用します。このモードでは、プログラム速度をそれほど低下させずに一部のメモリーアクセスエラーを識別することもできます。このようなエラーの例には、memcpy() 関数呼び出しへの引数として渡された double free of a memory area や out of bounds access of an allocated area があります。プログラムはフルモードで実行する前に、discover で簡易モードで実行することをお勧めします。
実行可能ファイルのエラーを検査しません。メモリー書き込みエラーなどの一部のクリティカルなエラーは、アプリケーション内のほかのバイナリに属するメモリーを破損させる可能性があるため、–-n フラグが使用されている場合でも、これらのエラーは引き続き報告されることがあります。
接頭辞 library に一致する依存共有ライブラリを計測しないでください。ライブラリ名の最初の文字が library に一致する場合、ライブラリは無視されます。library がスラッシュ (/) で始まる場合、ライブラリの完全な絶対パス名でマッチングが行われます。それ以外の場合、ライブラリのベース名でマッチングが行われます。
正確な ADI モードをオンまたはオフにします。デフォルトは on です。このフラグは、–i adi オプションを使用したハードウェアアシスト検査のための計測時にのみ指定できます。実行時パフォーマンスの向上のため、このオプションで、正確な ADI モードをオフにできます。
指定されたバイナリのみを計測します。依存共有ライブラリを実行時に計測しないでください。
キャッシュされた計測済みバイナリを格納するためのルートディレクトリとして cache-directory を使用します。デフォルトでは、キャッシュディレクトリは $HOME/SUNW_Bit_Cache です。
キャッシュで検出されたライブラリの再計測を強制します。
ヘルプ。短いヘルプメッセージを出力して、終了します。
冗長。discover が実行している内容のログを出力します。このオプションを 2 回指定すると、より詳しい情報が出力されます。
discover のバージョン情報を出力して終了します。
discover ユーティリティーは、起動時に一連の bit.rc ファイルを読み取ることによってその状態を初期化します。システムファイル Oracle-Developer-Studio-installation-directory/lib/compilers/bit.rc は、特定の変数のデフォルト値を提供します。discover ユーティリティーは最初にこのファイルを読み取り、次に $HOME/.bit.rc (存在する場合) と current-directory/.bit.rc (存在する場合) を読み取ります。
bit.rc ファイルには、特定の変数値を設定、追加、または削除するコマンドが含まれています。discover が set コマンドを読み取る場合、変数の前の値がある場合には、それを無効にします。append コマンドを読み取る場合、変数の既存の値に (コロンセパレータのあとに) 引数を追加します。remove コマンドを読み取る場合、変数の既存の値から引数とそのコロンセパレータを削除します。
bit.rc ファイルの変数セットには、計測時に無視するライブラリのリスト、およびバイナリ内の注釈付きでないコードの割合を計算する場合に無視する関数または関数接頭語のリストが含まれます。
詳細は、bit.rc システムファイルのヘッダーのコメントを参照してください。