標本コレクタがプロファイルデータの収集に使用するメカニズムでは、SIGPROF と SIGEMT の 2 つのシグナルを使用します。 プロファイルシグナルを失ったり取り扱いを誤ったりしないようにするため、標本コレクタは自分自身のシグナルハンドラをプライマリシグナルハンドラとしてインストールします。 データ収集対象であるプログラムがそのシグナルハンドラをインストールすると、標本コレクタは自分のシグナルハンドラをプライマリシグナルハンドラとして再インストールします。 コレクタのシグナルハンドラは、自身が処理しないシグナルをすべてそのプログラムのシグナルハンドラに渡します。
コレクタのシグナルハンドラは、シグナル配信がシステムコールへ割り込まないようにフラグを立てます。 しかし、プログラムのシグナルハンドラがシステムコールの割り込みを許可するフラグを設定するようになっている場合、この制御によってプログラムの動作が変わることがあります。 このような場合の重要な例として、非同期入出力ライブラリ libaio.so の動作変化があります。このライブラリは、非同期キャンセル操作に SIGPROF を使用し、かつ、システムコールには割り込みません。 しかし、コレクタライブラリ libcollector.so がインストールされていると、このキャンセルシグナルの到着が遅延します。
コレクタがシグナルハンドラを再インストールしないことがあります。 コレクタライブラリを事前にインストールせずに、プロセスに dbx を接続し、データ収集を有効にした場合、プログラムは自身のシグナルハンドラをインストールすることになり、コレクタはツールのシグナルハンドラを再インストールしません。 この場合、プログラムのシグナルハンドラが SIGPROF と SIGEMT シグナルを確実に渡すようにして、パフォーマンスデータが失われないようにする必要があります。 プログラムのシグナルハンドラがシステムコールに割り込むと、プログラムの動作とプロファイリングの動作の両方が、コレクタライブラリを事前にインストールした場合とは異なる動作をとることになります。
関連項目 | |
---|---|
動作中プロセスのパフォーマンスデータの収集 |