Oracle® Solaris Studio 12.4: パフォーマンスアナライザ

印刷ビューの終了

更新: 2015 年 1 月
 
 

データ収集とシグナル

シグナルは、クロックプロファイリングとハードウェアカウンタプロファイリングの両方に使用されます。SIGPROF は、すべての実験のデータ収集で使用されます。シグナルを生成する期間は、収集されるデータによって異なります。Solaris での SIGEMT または Linux での SIGIO はハードウェアカウンタプロファイリングに使用されます。オーバーフローの間隔は、プロファイリングのユーザーパラメータによって異なります。プロファイリングシグナルを使用または操作する何らかのユーザーコードが、データ収集の妨げになる可能性があります。コレクタは、そのシグナルハンドラをプロファイルシグナル用にインストールする場合、シグナルを配信するシステムコールの処理が中断されないようにするためのフラグを設定します。この設定により、プロファイリングシグナルをほかの目的に使用しているターゲットプログラムの動作が変更される可能性があります。

コレクタは、そのシグナルハンドラをプロファイルシグナル用にインストールするときに、ターゲットが独自のシグナルハンドラをインストールしたかどうかを記憶しています。コレクタはまた、一部のシグナル処理ルーチンに割り込み、ユーザーがこれらのシグナル用にシグナルハンドラをインストールできないようにします。コレクタは、実験の開始時にユーザーハンドラを置き換える場合と同様に、そのユーザーのハンドラを保存します。

プロファイリングシグナルは、カーネル内のプロファイリングタイマーまたはハードウェアカウンタオーバーフロー処理コードから、または kill(2)、sigsend(2)、tkill(2)、tgkill(2)、または _lwp_kill(2) のシステムコール、raise(3C) および sigqueue(3C) のライブラリコール、あるいは kill コマンドへの応答として送信されます。コレクタが起点を区別できるように、シグナルコードがシグナルとともに配信されます。シグナルコードは、プロファイリングのために配信される場合はコレクタによって処理されます。プロファイリングのために配信されない場合は、ターゲットのシグナルハンドラに配信されます。

コレクタが dbx の下で実行されているときに、配信されたプロファイリングシグナルのシグナルコードが破壊されたり、プロファイルシグナルがシステムまたはライブラリコールあるいはコマンドから生成されたかのように扱われたりする場合があります。その場合は、ユーザーのハンドラに誤って配信されます。ユーザーハンドラが SIG_DFL に設定されていた場合は、プロセスが失敗してコアダンプが生成されます。

コレクタがターゲットプロセスへの接続のあとに呼び出された場合、コレクタはそのシグナルハンドラをインストールしますが、シグナル処理ルーチンに割り込むことはできません。これらのユーザーコードが接続のあとにシグナルハンドラをインストールした場合は、コレクタのシグナルハンドラがオーバーライドされ、データは失われます。

どちらかのプロファイリングシグナルを含むシグナルによって、システムコールが途中で終了することがあります。この動作を処理するようにプログラムを準備する必要があります。libcollector は、データ収集のシグナルハンドラをインストールするときに、可能であればシステムコールを再開するように指定します。ただし、sleep(3C) などの一部のシステムコールはエラーを報告することなく早期に復帰します。

標本シグナルと一時停止/再開シグナル

シグナルは、ユーザーが標本シグナル (-l) または一時停止/再開シグナル (-y) として指定できます。この使用には SIGUSR1 または SIGUSR2 が推奨されますが、ターゲットによって使用されない任意のシグナルを使用できます。

プロファイリングシグナルは、プロセスがそれ以外ではそのシグナルを使用しない場合に使用できますが、ほかのシグナルが使用できない場合にのみ使用するようにしてください。コレクタは、一部のシグナル処理ルーチンに割り込み、ユーザーがこれらのシグナル用にシグナルハンドラをインストールできないようにします。コレクタは、実験の開始時にユーザーハンドラを置き換える場合と同様に、そのユーザーのハンドラを保存します。

コレクタがターゲットプロセスへの接続のあとに呼び出され、ユーザーコードが標本または一時停止/再開シグナル用にシグナルハンドラをインストールした場合、それらのシグナルは指定されたとおりに動作しなくなります。