プログラムのパフォーマンス解析 |
付録 A
従来のプロファイルツール
この章では、プログラムの動作時間を測定したり、解析対象となるパフォーマンスデータを得るための標準的なユーティリティについて解説します。prof および gprof は、SPARC プラットフォームおよび Intel プラットフォームの Solaris 2.6、7 および 8 に付属のプロファイルツールです。また、tcov はコードカバレージツールです。
注意 - 実行回数 (関数の呼び出し回数、ソースコード行の実行回数) を追跡する場合は、従来のプロファイルツールを使ってください。プログラムでの時間消費を詳細に解析する場合は、標本コレクタおよび標本アナライザを使ってより正確な情報を取得することができます。これらのアプリケーションの使用については、第 3 章および第 4 章を参照してください。
従来のプロファイルツールの一部は、C 以外のプログラミング言語で記述されたモジュールでは動作しません。言語に関する詳細は、各ツールに関する節を参照してください。
- 基本概念
- prof によるプログラムプロファイルの生成
- gprof による呼び出しグラフプロファイルの生成
- tcov による文レベルの解析
- 拡張 tcov による文レベルの解析
- プロファイルに対応した共用ライブラリの生成
基本概念
prof、gprof、および tcov は Sun WorkShop の開発環境を拡張し、パフォーマンスデータの収集および利用を可能にします。
- prof は単純なファイル形式のプログラムプロファイルを生成します。
- gprof は呼び出しグラフプロファイルを作成します。
- tcov は、どの行がどのくらいの頻度で使用されたかを示す文レベルの情報をソースファイルのコピーに生成します。
表 A-1 では、これらの標準パフォーマンスプロファイルツールで生成される情報を説明しています。
prof によるプログラムプロファイルの生成
prof はプログラムによって使用される CPU 時間の統計プロファイルを生成し、プログラム中の各関数へ制御が渡される回数をカウントします。さらに詳細なデータは、呼び出しグラフプロファイルおよびコードカバレージツールによって提供されます。
prof を利用するための手順は以下の 3 段階となっています。
prof によるプロファイリング用のプログラムをコンパイルするには、コンパイラに対して -p オプションを使用してください。たとえば、index.assist.c という名前の C のソースファイルをプロファイリング用にコンパイルするには、以下のコンパイラコマンドを使用します。
% cc -p -o index.assist index.assist.c コンパイラは
index.assist
という名前のプログラムを作成します。次に、この index.assist プログラムを実行してください。プログラムを実行するたびに、プロファイルデータが mon.out と呼ばれるファイルに送られます。プログラムを実行するたびに、新しい mon.out が生成され、古いバージョンは上書きされます。
%
index.assist
%
ls mon.out
mon.out
prof index.assist
%出力例
prof 出力の例
この表示例は、プログラムで一番多く時間を消費しているのが
compare_strings()
ルーチンであることを示しています。次は、_strlen()
です。このプログラムを改良するには、compare_strings()
関数を見直します。プロファイルサンプルの実行結果は、以下に示す列のタイトルで表示されています。
%Time
-- プログラムのこのルーチンによって消費される CPU 時間の合計におけるパーセンテージ。Seconds
-- この関数によって占められる CPU 時間の合計。Cumsecs
-- この関数およびその上位にリストされている関数によって占められる CPU 時間の総合計 (秒) 。#Calls
-- このルーチンが呼び出される回数。- msecs/call -- このルーチンが呼び出されるたびに消費する平均ミリ秒数。
Name
-- ルーチンの名前このプロファイルデータからはいったいどんな結果が導き出されるのでしょうか。compare_strings 関数は、プログラムの総時間の約 20% を消費しています。そこで、この index.assist を改良するには、compare_strings() が使用しているアルゴリズムを改良するか、compare_strings() の呼び出し回数を減らすという方法が考えられます。
この単純な呼び出しグラフからは compare_strings() がかなり強い再帰性を持つかはわかりませんが、次の項で説明する呼び出しグラフプロファイルを利用することによって、こうした情報も得ることができます。ここで紹介しているケースの場合は、アルゴリズムの改良によって呼び出し回数も減少します。
注 - Solaris 2.6、7 および 8 では、複数の CPU を使用するプログラムに対して CPU 時間のプロファイルは正確ですが、呼び出し回数はロックされていないため、関数の呼び出し回数の正確さには影響があるかもしれません。
gprof による呼び出しグラフプロファイルの生成
prof の単純なプロファイルは、パフォーマンス改善のために価値のあるデータを提供しますが、呼び出しグラフプロファイルを利用すれば、さらに詳細な解析を実行できます。呼び出しグラフプロファイルは、どのモジュールがほかのモジュールから呼び出されているか、どのモジュールがほかのモジュールを呼び出しているかを識別する一覧表を表示します。ときには、呼び出しをすべて削除することで、パフォーマンスが改善される場合もあります。
注 - gprof は関数内の時間を、各弧が往復する回数に比例して、呼び出し側に割り当てます。しかし、すべての呼び出しで同じ動作をするわけではないため、こうした動作は誤った仮定に陥る可能性もあります。例は、「gprof の誤った推論」を参照してください。
prof 同様、gprof もプログラムが使用する CPU タイムの統計的プロファイルを生成し、関数に制御が渡される回数を数えます。gprof はさらに、プログラムの呼び出しグラフにおいて各弧上で制御が受け渡される回数も数えます。弧とは、呼び出す側と呼び出される側の組み合わせを指します。
注 - Solaris 2.6、7 および 8 では、複数の CPU を使用するプログラムに対してCPU 時間のプロファイルは正確ですが、呼び出し回数はロックされていなため、関数の呼び出し回数の正確さには影響があるかもしれません。
gprof を利用するための手順は以下の 3 段階となっています。
呼び出しグラフプロファイリング用のプログラムをコンパイルするには、C コンパイラに対しては -xpg オプションを、Fortran コンパイラに対しては -pg オプションを使用してください。以下に例を示します。
% cc -xpg -o index.assist index.assist.c この結果 index.assist プログラムが実行可能になります。gprof 用にコンパイルされたプログラムを実行するたびに、呼び出しグラフプロファイルデータが gmon.out という名前のファイルに送られます。そのプログラムを実行するたびに、新しい gmon.out が作成されます。
プロファイルの結果レポートを生成するには、gprof コマンドを使用します。gprof の出力はかなり大量になる可能性があります。そのため、結果をファイルにリダイレクトすると、レポートはかなり読みやすくなるでしょう。gprof の出力を g.output というファイルにリダイレクトするには、以下の一連のコマンドを使用してください。
%index.assist
%ls gmon.out
gmon.out
%gprof index.assist > g.output
gprof の出力は以下の 2 つの主要項目から構成されます。
gprof の出力には、要約の各部分がどのような意味を持っているかの説明も含まれます。gprof はさらに標本収集の細分性を示します。
granularity: each sample hit covers 4 byte(s) for 0.07% of 14.74 secondsここでは、4 byte(s) とは 1 命令の解像度を意味しています。つまり、各標本が全実行時間の 0.07 パーセントであり、CPU 時間が 10 ミリ秒であることを意味します。
この index.assist プログラムの入力ファイルのデータには 761 行が含まれていると想定すると、以下の結論が導き出されます。
- fgets() は 762 回呼び出されています。fgets() の最後の呼び出しは、end-of-file を返します。
- insert_index_entry() 関数は、main() から 760 回呼び出されています。
- insert_index_entry() 関数が main() から 760 回呼び出されていることに加えて、insert_index_entry() 関数は自分自身を 10,392 回呼び出しています。つまり、insert_index_entry() の再帰性はかなり強いということです。
- compare_entry() (insert_index_entry() から呼び出されている) は 11,152 回呼び出され、これは 760+10,392 回と等しくなります。insert_index_entry() が呼び出されるごとに、compare_entry() の呼び出しが 1 回存在するということで、これは論理的に矛盾がありません。呼び出し回数に矛盾がある場合は、プログラム論理に何らかの問題があることを疑ってみるべきでしょう。
- insert_page_entry() は、トータルで 820 回呼び出されています。プログラムがインデックスノードを構築している間に main() から 760 回呼び出され、insert_index_entry() から 59 回呼び出されています。この頻度は、59 個の重複するインデックスエントリが存在し、その結果、それらのページ番号エントリはインデックスノードによってチェーンにリンクされていることを示します。 重複するインデックスはその後解放されます。そのため、free() は 59 回呼び出されています。
tcov による文レベルの解析
tcov は、プログラムの実行方法に関する行単位の情報を提供します。tcov はソースファイルのコピーを作成し、そこにどの行がどれくらいの頻度で使用されているかを示す注釈を挿入します。また、基本的なブロックについての情報も集約します。tcov は時間ベースのデータは生成しません。
tcov を利用するための手順は以下の 3 段階となっています。
tcov 用のコンパイル
コードカバレージ用にプログラムをコンパイルするには、C コンパイラに対して -xa オプションを使用します。index.assist という名前のプログラムを例として使用する場合、以下のコマンドによって、tcov 用のコンパイルを行ってください。
%
cc -xa -o index.assist index.assist.c
C++ または f77 コンパイラに対しては、-a コンパイラオプションを使用します。
C コンパイラは index.assist.c に存在する基本ブロックについてのデータベースエントリを含む index.assist.d ファイルを生成します。プログラム index.assist が実行され、終了した時点で、コンパイラは index.assist.d ファイルを更新します。
注 - tcov は C および C++ プログラムとは動作しますが、#line または #file 指示が含まれるファイルはサポートしません。tcov は、#include ヘッダーファイルのコードのテストカバレージ解析も行うことができません。-xa (C)、-a (その他のコンパイラ)、+d (C++) オプションを指定してコンパイルされたアプリケーションは通常よりも実行速度が遅くなります。+d オプションは C++ のインライン関数の拡張を禁止するため、各実行時の .d ファイルの更新にかなりの時間がかかります。
index.assist.d ファイルは、環境変数 TCOVDIR が指示するディレクトリに作成されます。TCOVDIR が設定されていない場合、index.assist.d はカレントディレクトリに作成されます。
index.assist.c のコンパイルが済んだら、index.assist を実行してください。
%index.assist
%ls *.d
index.assist.dそれでは、tcov を実行して、プログラムの各文の実行カウントの集計結果が含まれるファイルを生成してください。tcov は index.assist.d ファイルを使って、コードの注釈リストを含む index.assist.tcov ファイルを生成します。この出力には、各ソース文が実行された回数が示されます。ファイルの末尾には、短い要約が付いています。
%tcov index.assist.c
%ls *.tcov
index.assist.tcov次に、index.assist のモジュールの 1 つから、C コードの一部分 を示します。問題となっているモジュールは、呼び出し頻度の高い insert_index_entry 関数です。
C コードの左の数値は、各文が実行された回数を表しています。insert_index_entry 関数は11,152回呼び出されます。
tcov は、index.assist.tcov のファイルの末尾に以下のような集計情報を追加します。
コードカバレージ解析用にコンパイルされたプログラムは、(異なる入力を基にして
の) 繰り返し実行が可能です。つまり、プログラムに対して tcov を繰り返し使用し、各実行時の動作を比較できるということです。tcov によるプロファイルに対応した共用ライブラリの生成
tcov によるプロファイルに対応した共用ライブラリを生成し、バイナリファイルにすでにリンクされたライブラリの代わりに使用することが可能です。共有可能なライブラリを生成する場合は、-xa オプション (C 用) または -a オプション (その他のコンパイラ) を使用してください。以下に例を示します。
%cc -G -xa -o foo.so.1 foo.o
このコマンドは、共用ライブラリに tcov プロファイリングサブルーチンを組み込み、ライブラリのクライアントが再リンクしなくても済むようにします。ライブラリを使用するプログラムもまたプロファイリング用にリンクされる場合、そのプログラムにリンクされた
tcov
プロファイリングサブルーチンが、プログラムと共用ライブラリの両方で使用されます。ファイルのロック
tcov は、.d ファイルのブロックカバレージデータベースの更新に、単純なファイルロックメカニズムを使用します。tcov はこの目的のために単独ファイル/tmp/tcov.lock を使用します。そのため、-xa (C コンパイラ) または -a (その他のコンパイラ) を使ってコンパイルされた実行可能ファイルは、1 つのシステムで一度に 1 つしか実行すべきではありません。-xa または -a オプションを使ってコンパイルされたプログラムの実行を手動で終了した場合は、/tmp/tcov.lock ファイルを手動で削除する必要があります。
プログラムが tcovによるプロファイリング用にリンクされると、-xa または -a オプションを使ってコンパイルされたファイルは自動的にプロファイルツールのサブルーチンを呼び出します。プログラムの終了時点で、これらのサブルーチンは、ファイル xyz.f の実行時に収集された情報と、ファイル xyz.d に保存された既存のプロファイリング情報とを組み合わせます。プロファイル化されたバイナリファイルを同時に実行している人々にこの情報を変更されないようするため、更新期間中は xyz.d 用にロックファイル xyz.d.lock が作成されます。xyz.d またはそのロックファイルのオープンまたは読み取り時にエラーが存在する場合、あるいは、実行時の情報と保存されている情報との間に不整合が存在する場合、xyz.d に保存されているデータは更新されません。
xyz.d の編集または再コンパイルは、xyz.d のカウンタの数を変える可能性があります。古いプロファイル化されたバイナリの実行の際に、こうした変化が検出されます。
プロファイル化されたバイナリを実行する人が多すぎると、ロックが得られない可能性もあります。その場合は、数秒の遅れの後に、次のようなエラーメッセージが表示されます。
そして、保存されている情報の更新は行われません。このロックはネットワークを通じて安全に機能します。ロックはファイル単位で行われるため、ほかのファイルは正しく更新されます。
プロファイリングサブルーチンは、アクセス不可能となっている自動マウントファイルシステムを処理しようと試みます。それでも、異なるマシン上で、カバレージデータファイルを含むファイルシステムに異なる名前がマウントされていたり、プロファイル化されたバイナリを実行するユーザーがカバレージデータファイルまたはそれを含むディレクトリに対する書き込み権を持っていない場合、この試みは失敗します。すべてのディレクトリには、統一化された名前を付け、バイナリを実行する可能性のあるユーザー誰もが書き込み可能な状態にしておいてください。
tcov
の実行時ルーチンで発生するエラー以下のエラーメッセージが、tcov ランタイムルーチンによって報告されることがあります。
- このバイナリを実行するユーザーには、カバレージデータファイルに対する読み取り権および書き込み権がありません。カバレージデータファイルを含むディレクトリが削除されている場合も、こうした問題が起こります。
tcov_exit: Could not open coverage data file
coverage data file name
'' because '
system error message string'.
- このバイナリを実行するユーザーには、カバレージデータファイルを含むディレクトリに書き込み権がありません。カバレージデータファイルを含むディレクトリがバイナリを実行するマシンにマウントされていない場合も、こうした問題が起こります。
tcov_exit: Could not write coverage data file
coverage data file name
'' because
system error message string
''.
- 多くのユーザーが同時にカバレージデータファイルを更新しようとしています。カバレージデータファイルが更新されている間に、マシンがクラッシュしたときも、ロックファイルが放置され、こうした問題は起こります。万一、クラッシュが起こった場合には、2 つのファイルのうちサイズの大きい方をクラッシュ後のカバレージデータファイルとして使用してください。ロックファイルは手動で削除してください。
tcov_exit: Failed to create lock file '
lock file name' for coverage data file '
coverage data file name' after 5 tries. Is someone else running this executable?
- 利用可能なメモリがなく、標準 I/O パッケージが動作できません。この時点では、カバレージデータファイルの更新はできません。
tcov_exit: Stdio failure, probably no memory left.
- ロックファイル名は、カバレージデータファイル名にさらに 6 文字追加されます。そのため、派生ロックファイル名が規則違反となる可能性があります。
tcov_exit: Coverage data file path name too long (
lengthcharacters) '
coverage data file name'.
- tcov プロファイル用のライブラリまたはバイナリが、同時に実行、編集、再コンパイルされようとしています。古いバイナリは一定サイズのカバレージデータファイルを予期しますが、編集によってそのサイズはしばしば変更されます。古いバイナリが古いカバレージデータファイルを更新しようとしているときに、コンパイラが新しいカバレージデータファイルを作成すると、カバレージファイルは空白、あるいは壊れた状態で表示されます。
tcov_exit: Coverage data file '
coverage data file name' is too short. Is it out of date?
拡張
tcov
による文レベルの解析オリジナルの tcov 同様、拡張 tcov は、プログラムの実行方法についての行単位の情報を提供します。拡張 tcov は、どの行がどれくらいの頻度で使用されているかを示す注釈が付けられたソースファイルのコピーを作成します。また、基本ブロックに関する要約情報も提供します。拡張 tcov は、C および C++ のソースファイルに対して動作します。
拡張
tcov
の利点拡張 tcov では、オリジナル tcov のいくつかの欠点が改善されています。
- C++ に対するサポートがより強化されています。
- 拡張 tcov は、#include ヘッダーファイルに含まれるコードをサポートし、テンプレートクラスおよび関数のカバレージ番号があいまいになっている問題をを修正しています。
- 拡張 tcov のランタイムは、オリジナルの tcov のランタイムよりも効率的です。
- 拡張 tcov は、コンパイラがサポートしているすべてのプラットフォーム向けにサポートされています。
拡張
tcov
用のコンパイル拡張 tcov を使用するには、オリジナルの tcov と同様の以下の操作を行います。
オリジナルの tcov では、-xa オプションを使ってコンパイルを行いました。拡張 tcov によってコードカバレージ用のプログラムをコンパイルするには、すべてのコンパイラに対して、-xprofile=tcov オプションを使用してください。index.assist という名前のプログラムを例として使用する場合、拡張 tcov を使ったコンパイルは以下のようなコマンドになります。
%
cc -xprofile=tcov -o index.assist index.assist.c
拡張 tcov は、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 が無視されます。TCOVDIR と SUN_PROFDATA_DIR の両者が設定されていると、プロファイルのバケツが生成されるときに、警告が表示されます。SUN_PROFDATA_DIR は、TCOVDIR よりも優先されます。これらの変数は、-xprofile=tcov オプションによってコンパイルされたプログラムの実行時に使用されます。さらに、tcov コマンドによっても使用されます。
注 - このスキーマはプロファイルフィードバックメカニズムによっても使用されます。
カバレージデータが作成されたら、生データをソースファイルに関連付けるレポートを生成できます。
%
tcov -x index.profile index.assist.c
%
ls *.tcov
index.assist.c.tcov
このレポートの出力は、前の例 (オリジナルの tcov のもの) と同じです。
プロファイルに対応した共用ライブラリの生成
拡張 tcov とともに使用するための共用ライブラリの生成は、以下の類似したコンパイルオプションを使って実行できます。
%
cc -G -xprofile=tcov -o foo.so.1 doo.o
ファイルのロック
拡張 tcov は、単純なファイルロックメカニズムを用いてブロックカバレージデータファイルを更新します。拡張 tcov は、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/joe に xyz.profile という名前のプロファイルバケツが生成されます。
- SUN_PROFDATA
- 実行時のプロファイルバケツの名前の指定に使用できます。SUN_PROFDATA_DIR も設定されている場合は、SUN_PROFDATA の値は SUN_PROFDATA_DIR の値に追加されます。
- SUN_PROFDATA_DIR
TCOVDIR
デフォルト設定の変更
デフォルトの設定を変更するには、環境変数を使用してプロファイルバケツを変更します。
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 と相対的な位置関係となります。またこの例では、実行可能ファイル名を使用した、デフォルトのプロファイルバケツ名が使用されます。
TCOVDIR と SUN_PROFDATA_DIR
旧バージョンの tcov (-xa または -a フラグによるコンパイルによって使用可能となります) は、TCOVDIR という環境変数を使用していました。TCOVDIR は、ソースファイルと同じディレクトリではなく、tcov カウンタファイルが収められるディレクトリを指定しました。この環境変数との互換性を維持するため、新しい環境変数 SUN_PROFDATA_DIR は TCOVDIR 環境変数と同様に動作します。両方の変数が設定されている場合、警告が出力され、SUN_PROFDATA_DIR が、TCOVDIR よりも優先されます。
-xprofile=tcov
デフォルトでは、プロファイルバケツは、カレントディレクトリにある <argv[0]>.profile になります。
SUN_PROFDATA を設定している場合、プロファイルバケツは、どこに保存されていようと、 $SUN_PROFDATA になります。
SUN_PROFDATA_DIR を設定している場合、プロファイルバケツは、指定されたディレクトリに保存されます。
SUN_PROFDATA と SUN_PROFDATA_DIR はそれぞれ独立しています。いずれの環境変数も設定されていると、プロファイルバケツ名は、SUN_PROFDATA_DIR を使ってプロファイルバケツを見つけ出すことによって生成され、SUN_PROFDATA はそのディレクトリのプロファイルバケツの命名に使用されます。
UNIX のプロセスでは、プログラム実行中、カレントの作業ディレクトリが変更されることがあります。そのため、プロファイルバケツの生成に使用されるカレントの作業ディレクトリは、プログラムの実行終了時におけるカレントの作業ディレクトリとなります。まれですがプログラムの実行中にそのカレント作業ディレクトリを変更するような場合には、環境変数を利用して、プロファイルバケツが生成される場所を制御してください。
tcov プログラムについて
-xprofile=bucket オプションは、tcov プロファイル用に使用されるプロファイルバケツの名前を指定します。SUN_PROFDATA_DIR またはTCOVDIR が設定されている場合、その設定値がこの引数に付加されます。
サン・マイクロシステムズ株式会社 Copyright information. All rights reserved. |
ホーム | 目次 | 前ページへ | 次ページへ | 索引 |