プログラムのパフォーマンス解析

tcov Enhanced − ステートメントレベルの解析

オリジナルの tcov 同様、tcov Enhanced は、プログラムの実行方法についての行単位の情報を提供します。tcov Enhanced は、どの行がどれくらいの頻度で使用されているかを示す注釈が付けられたソースファイルのコピーを作成します。また、基本ブロックに関する要約情報も提供します。tcov Enhanced は、C および C++ のソースファイルに対して動作します。

tcov Enhanced では、オリジナル tcov のいくつかの欠点が改善されています。

tcov Enhanced 用のコンパイル

tcov Enhanced を使用するには、オリジナルの tcov と同様の以下の手順に従ってください。

  1. tcov Enhanced の実験データ用にプログラムをコンパイルします。

  2. 実験を実行します。

  3. tcov を使って、結果を解析します。

オリジナルの tcov では、-xa オプションを使ってコンパイルを行いました。 tcov Enhanced によってコードカバレージ用のプログラムをコンパイルするには、すべてのコンパイラに対して、-xprofile=tcov オプションを使用してください。index.assist という名前のプログラムを例として使用する場合、tcov Enhanced を使ったコンパイルは以下のようなコマンドになります。

% cc -xprofile=tcov -o index.assist index.assist.c

tcov Enhanced は、tcov とは異なり、.d ファイルを作成しません。プログラムが実行されるまで、カバレージデータファイルは作成されません。カバレージ解析用にコンパイルされた各モジュールごとに 1 つのファイルではなくて、プログラム実行後に 1 つのカバレージデータファイルが作成されます。

index.assist.c のコンパイルの後、index.assist を実行して、プロファイルデータを生成してください。


% index.assist 
% ls -dF *.profile 
index.assist.profile/ 	
% ls *.profile 	
tcovd

デフォルトでは、tcovd ファイルが保存されるディレクトリの名前は、実行可能ファイルの名前から派生して付けられます。また、そのディレクトリは、実行可能ファイルが実行されたディレクトリに作成されます (オリジナルの tcov は、モジュールがコンパイルされたディレクトリに .d ファイルを作成します)。

tcovd ファイルが保存されるディレクトリはまた、「プロファイルバケット」 として知られます。プロファイルバケットは、環境変数 SUN_PROFDATA を使用することで、上書きできます。実行可能なファイル名が argv[0] の値と等しくない場合などに、この操作は有効です (たとえば、違う名前のシンボリックリンクから実行可能ファイルが実行された場合など)。

プロファイルバケットが生成されたディレクトリを上書きすることも可能です。実行ディレクトリとは別のディレクトリを指定するには、環境変数 SUN_PROFDATA_DIR を使ってパスを指定してください。この変数には、相対パス名、絶対パス名のどちらでも指定できます。相対パス名は、プログラムの実行完了時のカレントの作業ディレクトリに対する相対的な位置となります。

TCOVDIR は、SUN_PROFDATA_DIR の下方互換性を維持するために同類の環境変数としてサポートされています。SUN_PROFDATA_DIR が設定されている場合、TCOVDIR が無視されます。TCOVDIRSUN_PROFDATA_DIR の両者が設定されていると、プロファイルバケットが生成された時点で、警告が表示されます。SUN_PROFDATA_DIR は、TCOVDIR よりも優先されます。これらの変数は、-xprofile=tcov オプションによってコンパイルされたプログラムの実行時に使用され、さらに、tcov コマンドによって使用されます。


注 -

このスキーマはプロファイルフィードバックメカニズムによっても使用されます。


いくつかのカバレージデータが作成されたら、生データをソースファイルに関連付けるレポートを生成できます。


% tcov -x index.profile index.assist.c 
% ls *.tcov 
index.assist.c.tcov

このレポートの出力は、前の例 (オリジナルの tcov のもの) と同じです。

プロファイル化された共有ライブラリの生成

tcov Enhanced とともに使用するための共有ライブラリの生成は、以下の類似したコンパイルオプションを使って遂行できます。

% cc -G -xprofile=tcov -o foo.so.1 doo.o

ファイルのロック

tcov Enhanced は、ブロックカバレージデータファイルの更新にシンプルなファイルロッキングメカニズムを使用します。tcov Enhanced は、tcovd ファイルと同じディレクトリに生成された単独ファイルを使用します。そのファイル名は tcovd.temp.lock です。カバレージ解析用にコンパイルされたプログラムの実行が手動で終了された場合、ロックファイルは必ず手動で削除してください。

ロックの競合が存在する場合、このロッキングスキームは指数バックオフを行います。そして、5 回試みた後、tcov ランタイムがロックを獲得できないと、tcov はあきらめ、その実行用のデータは失われます。この場合、以下のメッセージが表示されます。

tcov_exit: temp file exists, is someone else running this executable?

tcov 用ディレクトリおよび環境変数

tcov 用にプログラムをコンパイルし、そのプログラムを実行すると、実行プログラムはプロファイルバケットを生成します。既にプロファイルバケットが存在している場合、プログラムはそのプロファイルバケットを使用します。プロファイルバケットが存在していない場合は、プロファイルバケットを生成します。

プロファイルバケットは、プロファイル出力が生成されるディレクトリを指定します。プロファイル出力の名前と場所は、環境変数で指定可能なデフォルトの設定によって制御されます。


注 -

tcov は、プロファイルフィードバックを集めるために使用したコンパイラオプション -xprofile=collect-xprofile=use によって使用される同じデフォルトと環境変数を使用します。これらのコンパイラオプションの詳細については、ご使用のコンパイラのマニュアルを参照してください。


プログラムが生成するデフォルトのプロファイルバケットの名前は、実行可能ファイル名 + .profile となり、実行可能ファイルが実行されるディレクトリに生成されます。そのため、カレントディレクトリが /home/joe で、/usr/bin/xyz というプログラムを実行すると、デフォルト動作としては、/home/joexyz.profile という名前のプロファイルバケットが生成されます。

デフォルトを変更するための環境変数を以下に示します。

実行時のプロファイルバケットの名前の指定に使用できます。この変数の値は、常に SUN_PROFDATA_DIR の値に追加されます (両方の変数が設定されている場合)。

プロファイルバケットを含むディレクトリの名前の指定に使用できます。これは実行時および tcov コマンドにおいて使用されます。

TCOVDIR は、下方互換性を維持するため、SUN_PROFDATA_DIR の同類の環境変数としてサポートされています。SUN_PROFDATA_DIR が設定されている場合、TCOVDIR は無視されます。TCOVDIRSUN_PROFDATA_DIR の両者が設定されていると、プロファイルバケットが生成された時点で、警告が表示されます。

TCOVDIR は、 -xprofile=tcov を使用してコンパイルされたプログラムの実行時にに使用され、さらに tcov コマンドによって使用されます。

デフォルト設定の無効化

デフォルトを上書きするには、環境変数を使用してプロファイルバケットを変更します。

  1. 環境変数 SUN_PROFDATA を使って、プロファイルバケットの名前を変更します。

  2. 環境変数 SUN_PROFDATA_DIR を使って、プロファイルバケットが置かれているディレクトリを変更します。

この 2 つの環境変数はプロファイルバケットのデフォルトの保存場所と名前を上書きします。保存場所と名前は別々に上書きすることができます。たとえば、SUN_PROFDATA_DIR の設定だけを選択すると、プロファイルバケットは SUN_PROFDATA_DIR に設定されたディレクトリに移動しますが、デフォルトの名前 (実行可能ファイル名 +.profile) が引き続きプロファイルバケット用の名前として使用されます。

絶対パス名と相対パス名

プロファイルフィードバック用のコンパイル行上では、SUN_PROFDATA_DIR によって、絶対パス名 (「/」から始まる) と相対パス名の 2 種類のディレクトリの形式を指定できます。絶対パス名を使用する場合、プロファイルバケットはそのディレクトリに収められます。一方、相対パス名を使用する場合、プロファイルバケットは実行可能ファイルが実行されるカレントの作業ディレクトリに対して相対的な位置関係になります。

たとえば、カレントディレクトリが /home/joe で、SUN_PROFDATA_DIR.. に設定された状態で /usr/bin/xyz というプログラムを実行すると、プロファイルバケットは /home/joe/../xyz.profile となります。環境変数に指定された値が相対的であるため、プロファイルバケットは /home/joe と相対的な位置関係となります。またこの例では、実行可能ファイル名を使用した、デフォルトのプロファイルバケット名が使用されます。

TCOVDIRSUN_PROFDATA_DIR

旧バージョンの tcov (-xa または -a フラグによるコンパイルによって使用可能となります) は、TCOVDIR という環境変数を使用していました。TCOVDIR は、ソースファイルと同じディレクトリではなく、tcov カウンタファイルが収められるディレクトリを指定しました。この環境変数との互換性を維持するため、新しい環境変数 SUN_PROFDATA_DIRTCOVDIR 環境変数と同様に動作します。両方の変数が設定されている場合、警告が出力され、SUN_PROFDATA_DIR が、TCOVDIR よりも優先されます。

-xprofile=tcov

デフォルトでは、プロファイルバケットは、カレントディレクトリにある <argv[0]>.profile と呼ばれます。

SUN_PROFDATA を設定している場合、プロファイルバケットは、どこに保存されていようと、$SUN_PROFDATA と呼ばれます。

SUN_PROFDATA_DIR を設定している場合、プロファイルバケットは、指定されたディレクトリに保存されます。

SUN_PROFDATASUN_PROFDATA_DIR はそれぞれ独立しています。いずれの環境変数も設定されていると、プロファイルバケット名は、SUN_PROFDATA_DIR を使ってプロファイルバケットを見つけ出すことによって生成され、SUN_PROFDATA はそのディレクトリのプロファイルバケットの命名に使用されます。

UNIX のプロセスでは、プログラム実行中、カレントの作業ディレクトリが変更されることがあります。そのため、プロファイルバケットの生成に使用されるカレントの作業ディレクトリは、プログラムの実行終了時におけるカレントの作業ディレクトリとなります。まれですがプログラムの実行中にそのカレント作業ディレクトリを変更するような場合には、環境変数を利用して、プロファイルバケットが生成される場所をコントロールしてください。

tcov プログラムについて

-xprofile=bucket オプションは、tcov プロファイル用に使用されるプロファイルバケットの名前を指定します。SUN_PROFDATA_DIR または TCOVDIR が設定されている場合、いずれか一方がこの引数に付加されます。