派生プロセスのデータを記録するかどうかを制御します。option には次のいずれかの値を指定できます。
on– 関数 fork、exec、およびそのバリアントが作成する派生プロセスについてのみ実験を記録します。
all– すべての派生プロセスについて実験を記録します。
off– 派生プロセスに関する実験を記録しません。
= regexp– 名前または系統が指定する正規表現と一致する派生プロセスの実験をすべて記録します。
-F on オプションを指定すると、コレクタは、fork(2)、 fork1(2)、fork(3F)、vfork(2)、および exec(2) の関数とそのバリアントの呼び出しによって作成されたプロセスをたどります。vfork の呼び出しは、内部で fork1 の呼び出しに置換されます。
-F all オプションを指定すると、コレクタは、system(3C)、system(3F)、sh(3F)、および popen(3C)、および同様の関数の呼び出しによって作成されたものを含むすべての派生プロセス、そして関係する派生プロセスをたどります。
-F '= regexp ' オプションを指定すると、コレクタは、名前または系統が指定する正規表現と一致するすべての派生プロセスをたどります。正規表現については、regexp(5) のマニュアルページを参照してください。
派生プロセスのデータを収集するとき、コレクタは、派生プロセスごとに新しい実験を親の実験内に 1 つ開きます。これらの新しい実験は、次のように、下線、文字、および数字を実験接尾辞に追加することで命名されます。
英字「f」は fork、英字「x」は exec、英字「c」はほかの派生プロセスをそれぞれ表します。
数字は、fork または exec (成功したかどうかに関係なく)、あるいはその他の呼び出しのインデックスです。
たとえば初期プロセスの実験名が test.1.er の場合、3 回目の fork の呼び出しで作成された子プロセスの実験は test.1.er/_f3.er となります。この子プロセスが新しいイメージを実行した場合、対応する実験名は test.1.er/_f3_x1.er となります。この子プロセスが popen 呼び出しを使用して別のプロセスを作成した場合、実験名は test.1.er/_f3_x1_c1.er となります。
アナライザおよび er_print は、親の実験が読み取られたときに自動的に派生プロセスの実験を読み取りますが、派生プロセスの実験は、データ表示の対象として選択されません。
表示するデータをコマンド行から選択するには、er_print か analyzer にパス名を明示的に指定します。指定するパスには、親の実験名と、親ディレクトリ内の派生実験名を含める必要があります。
たとえば、test.1.er 実験の 3 回目の fork のデータを表示する場合は、次のように指定します。
er_print test.1.er/_f3.er
analyzer test.1.er/_f3.er
もう一つの方法として、関心のある派生の実験の明示的な名前を入れた実験グループファイルを用意する方法もあります。
アナライザで派生プロセスを調べるには、親の実験を読み込んで、「表示」メニューから「データをフィルタ」を選択します。実験のリストは、親の実験のみが選択されて表示されます。これを選択解除し、対象とする派生実験を選択します。
派生プロセスが追跡されている間に親プロセスが終了した場合、派生のデータ収集が継続する可能性があります。それに従って親の実験ディレクトリは拡大を続けます。
ターゲットプログラムが JVM の場合に Java プロファイルを有効にします。option には次のいずれかの値を指定できます。
on – Java HotSpot 仮想マシンによってコンパイルされたメソッドを認識し、Java 呼び出しスタックを記録しようとします。
off – Java HotSpot 仮想マシンによってコンパイルされたメソッドを認識しようとしません。
path – 指定された path にインストールされた JVM についてのプロファイルデータを記録します。
-j オプションは、.class ファイルまたは .jar ファイルについてのデータを収集する場合は必要ありません。ただし、java 実行可能ファイルへのパスが JDK_HOME 環境変数または JAVA_PATH 環境変数に入っている必要があります。それから collect コマンド行でターゲットの program を .class ファイルまたは .jar ファイルとして指定します。拡張子は付けても付けなくてもかまいません。
JDK_HOME または JAVA_PATH 環境変数で java のパスを定義できない場合や、Java HotSpot 仮想マシンによってコンパイルされたメソッドの認識を無効にしたい場合に、-j オプションを使用できます。このオプションを使用する場合、collect コマンド行で指定する program は 1.5_03 以降のバージョンの Java 仮想マシンであることが必要です。collect コマンドは program が JVM であるかどうかと ELF 実行可能ファイルであるかどうかを確認し、そうでない場合、collect はエラーメッセージを出力します。
64 ビット JVM を使用してデータを収集する場合、32 ビット JVM 用の java に -d64 オプションを使用しないでください。これを使用すると、データは収集されません。collect コマンドの program 引数、またはこの項で説明している環境変数の 1 つに 64 ビット JVM のパスを指定してください。
プロファイリングに使用する JVM に渡す引数を 1 つ指定します。-J オプションを指定し、Java プロファイリングを指定しなかった場合は、エラーが生成され、実験は実行されません。引数は、単一の引数として JVM に渡されます。複数の引数が必要な場合は、-J オプションを使用しないでください。この場合、collect コマンド行で、JVM のパスを明示的に指定し、-j on を使用して JVM のパスのあとに JVM の引数を追加します。
signal というシグナルがプロセスへ送信されたときに標本パケットを記録します。
シグナルは、完全なシグナル名、先頭文字 SIG を省いたシグナル名、またはシグナル番号のいずれの形式でも指定できます。ただし、プログラムが使用するシグナル、または実行を終了するシグナルは指定しないでください。推奨するシグナルは SIGUSR1 および SIGUSR2 です。シグナルは、kill コマンドを使用してプロセスに送信できます。
-l および -y の両方のオプションを使用する場合は、それぞれのオプションに異なるシグナルを使用する必要があります。
プログラムに独自のシグナルハンドラがあるときにこのオプションを使用する場合には、-l で指定するシグナルが、阻止されたり、無視されたりすることなく、確実にコレクタのシグナルハンドラに渡されるようにする必要があります。
シグナルについては、signal(3HEAD) のマニュアルページを参照してください。
データ収集の時間範囲を指定します。
<所要時間> は単数で指定でき、オプションで m または s 接尾辞を付けることができます。これらは、実験を終了する時間が分か秒かを示しています。デフォルトでは、所要時間は秒です。<所要時間> はハイフンで区切られた 2 つの数で指定することもできます。これは、1 つ目の時間が経過するまでデータ収集を停止し、そして、データ収集を始める時間を示しています。2 つ目の時間が経過すると、データ収集が終了されます。2 番目の数値がゼロの場合、最初の一時停止から、プログラムの実行が終了するまでデータが収集されます。実験が終了しても、ターゲットのプロセスは完了するまで実行を続けます。
デバッガがそのプロセスに接続できるように、exec システムコールの終了時にターゲットプロセスを停止したままにします。dbx をプロセスに接続した場合には、dbx コマンドの ignore PROF と ignore EMT を使用して、収集シグナルが確実に collect コマンドに渡されるようにします。
signal というシグナルで、データの記録を制御します。このシグナルがプロセスに送信されると、一時停止状態 (データは記録されない) と記録状態 (データは記録される) が切り替わります。ただし、このスイッチの状態に関係なく、標本ポイントは常に記録されます。
シグナルは、完全なシグナル名、先頭文字 SIG を省いたシグナル名、またはシグナル番号のいずれの形式でも指定できます。ただし、プログラムが使用するシグナル、または実行を終了するシグナルは指定しないでください。推奨するシグナルは SIGUSR1 および SIGUSR2 です。シグナルは、kill(1) コマンドを使用してプロセスに送信できます。
-l および -y の両方のオプションを使用する場合は、それぞれのオプションに異なるシグナルを使用する必要があります。
-y オプションに r 引数 (省略可能) を指定した場合、コレクタは記録状態で起動します。 それ以外の場合は、一時停止状態でコレクタが起動します。-y オプションを指定しなかった場合は、記録状態で起動します。
プログラムに独自のシグナルハンドラがあるときにこのオプションを使用する場合には、-y で指定するシグナルが、阻止されたり、無視されたりすることなく、確実にコレクタのシグナルハンドラに渡されるようにする必要があります。
シグナルについては、signal(3HEAD) のマニュアルページを参照してください。