プロファイル API について
更新 : 2007 年 11 月
プロファイラは、別のアプリケーションの実行を監視するツールです。共通言語ランタイム (CLR: Common Language Runtime) プロファイラは、プロファイル API を使用して CLR とのメッセージの送受信を行う関数で構成されるダイナミック リンク ライブラリ (DLL: Dynamic Link Library) です。プロファイラ DLL は、実行時に CLR によって読み込まれます。
従来のプロファイリング ツールは、アプリケーションの実行を測定することに重点を置いていました。その主な役割は、各関数の実行にかかる時間やアプリケーションのメモリ使用状況を一定期間にわたって測定することでした。プロファイル API は、コード カバレッジ ユーティリティや高度なデバッグ支援ツールなど、より幅広い診断ツールを対象にしています。これらの用途には、いずれも診断的な性質があります。プロファイル API は、アプリケーションの実行を測定するだけでなく、監視も行います。そのため、プロファイル API をアプリケーション自体が使用することは避ける必要があります。また、アプリケーションの実行がプロファイラに依存したり、プロファイラの影響を受けたりしないようにする必要もあります。
CLR アプリケーションのプロファイリングには、通常のコンパイル済みマシン語コードのプロファイリングよりも多くのサポートが必要です。その理由は、CLR には、アプリケーション ドメイン、ガベージ コレクション、マネージ例外処理、コードの Just-In-Time (JIT) コンパイル (Microsoft Intermediate Language (MSIL) コードからネイティブ マシン語コードへの変換) などの概念や同様の機能が採り入れられているためです。通常のプロファイリング機構では、これらの機能に関する有益な情報を見つけたり、提供したりすることはできません。プロファイル API は、CLR およびプロファイリングされたアプリケーションのパフォーマンスに大きな影響を与えることなく、この欠落した情報を効率的に提供します。
実行時に行われる JIT コンパイルは、プロファイリングを行ううえで絶好のタイミングとなります。プロファイル API を使用すると、プロファイラは、ルーチンの JIT コンパイルが行われる前に、ルーチンのメモリ内 MSIL コード ストリームを変更することができます。この方法により、プロファイラは、さらに詳細な調査が必要な特定のルーチンに動的にインストルメンテーション コードを追加できます。この方法は従来のシナリオでも可能ですが、プロファイル API を使用する CLR の方が、実装はずっと簡単です。
プロファイル API
通常、プロファイル API は、コード プロファイラを作成するために使用します。コード プロファイラとは、マネージ アプリケーションの実行を監視するプログラムです。
プロファイル API は、プロファイラ DLL によって使用されます。プロファイラ DLL は、プロファイリング対象アプリケーションと同じプロセスに読み込まれます。プロファイラ DLL は、コールバック インターフェイス (.NET Framework Version 1.0 および 1.1 の場合は ICorProfilerCallback、Version 2.0 の場合は ICorProfilerCallback2) を実装します。CLR は、このインターフェイスのメソッドを呼び出して、プロファイリングされたプロセスのイベントをプロファイラに通知します。プロファイラをランタイムにコールバックするには、ICorProfilerInfo インターフェイスおよび ICorProfilerInfo2 インターフェイスのメソッドを使用して、プロファイリングされたアプリケーションの状態に関する情報を取得します。
メモ : |
---|
プロファイリングされたアプリケーションと同じプロセスで実行するのは、プロファイラ ソリューションのデータ収集の部分だけにしてください。ユーザー インターフェイスとデータ分析は、すべて別のプロセスで実行する必要があります。 |
次の図は、プロファイラ DLL がプロファイリング対象アプリケーションおよび CLR とやり取りする方法を示しています。
プロファイリング アーキテクチャ
通知インターフェイス
ICorProfilerCallback および ICorProfilerCallback2 は、通知インターフェイスと見なすことができます。これらのインターフェイスは、ClassLoadStarted、ClassLoadFinished、JITCompilationStarted などのメソッドで構成されます。クラスのロードまたはアンロード、関数のコンパイルなどを行うたびに、プロファイラの ICorProfilerCallback インターフェイスまたは ICorProfilerCallback2 インターフェイスの対応するメソッドが呼び出されます。
たとえば、プロファイラは、FunctionEnter2 および FunctionLeave2 という 2 つの通知関数を使用して、コードのパフォーマンスを測定することができます。この場合は、各通知のタイムスタンプを記録し、結果を累積して、アプリケーションの実行時に CPU またはウォール クロック時間を最も多く使用した関数を示す一覧を出力します。
情報取得インターフェイス
プロファイリングにおけるその他の主要インターフェイスには、ICorProfilerInfo や ICorProfilerInfo2 があります。プロファイラは、分析に役立つ追加情報を取得する必要がある場合に、これらのインターフェイスを呼び出します。たとえば、CLR から FunctionEnter2 関数が呼び出されるときは、必ず関数識別子が渡されます。プロファイラは、ICorProfilerInfo2::GetFunctionInfo2 メソッドを呼び出すことで、関数の親クラスや名前など、その関数についての詳細情報を取得できます。