.NET Framework 2.0 でのプロファイル

.NET Framework Version 2.0 ではプロファイル API が強化され、機能が追加されています。 新機能は、2 つの新しいインターフェイス ICorProfilerCallback2 および ICorProfilerInfo2 によって公開されます。

.NET Framework Version 1.0 または 1.1 用に作成されたプロファイラー DLL は、.NET Framework 2.0 の共通言語ランタイム (CLR: Common Language Runtime) 環境では正常に動作しません。 Version 2.0 以降で動作するようにプロファイラー DLL を更新するには、ICorProfilerCallback2 インターフェイスを実装する必要があります。 ICorProfilerInfo2 インターフェイスは ICorProfilerInfo インターフェイスを継承し、CLR との強化された対話をサポートする新しいメソッドが導入されています。

これらの変更について、次の各セクションで説明します。

  • ジェネリック

  • コードの分割

  • インプロセス デバッグの削除

  • ネイティブ イメージ ジェネレーターを使用したコールバック

  • ガベージ コレクションのコールバックの拡張

  • 固定オブジェクト

  • その他の API の変更

API の変更以外に、新しい HRESULT である CORPROF_E_UNSUPPORTED_CALL_SEQUENCE が追加されました。 この HRESULT を返す可能性があるシナリオについては、「CORPROF_E_UNSUPPORTED_CALL_SEQUENCE HRESULT」を参照してください。

ジェネリック

ランタイムへのジェネリックの導入により、次の 3 つの変更がプロファイル API に加えられました。

  • typedef トークンと ClassID 値との間、または MethodDef トークンと FunctionID 値との間に 1 対 1 の対応関係がなくなりました。 これは、各クラスまたは関数を複数の異なる型でインスタンス化できるようになったためです。 プロファイラーの作成者は、「プロファイリングとランタイム通知 ID」を読んで、コード内での ICorProfilerInfo::GetClassFromToken メソッドおよび ICorProfilerInfo::GetFunctionFromToken メソッドの使い方や、コードをジェネリック対応に変更する方法を確認してください。 プロファイル API には、ジェネリックをサポートする 2 つの新しいメソッド、ICorProfilerInfo2::GetClassFromTokenAndTypeArgsICorProfilerInfo2::GetFunctionFromTokenAndTypeArgs が用意されています。

  • FunctionID と、これに含まれる ClassID との間に直接の対応関係がなくなりました。 コード共有の最適化により、ジェネリック型の異なる種類のインスタンスでコードを共有することができます。 FunctionID の ClassID は、関数の特定のアクティブ化のコンテキストでのみ確認できます。

  • クラスや関数の情報を取得する ICorProfilerInfo インターフェイスの既存のメソッドでは、ジェネリック型およびジェネリック関数の型引数に関する情報は取得できません。 この情報を取得するには、ICorProfilerInfo2::GetClassIDInfo2 メソッドおよび ICorProfilerInfo2::GetFunctionInfo2 メソッドを使用します。 ただし、これらのメソッドで必ずしも情報が取得できるとは限りません。詳細については、「プロファイリングとランタイム通知 ID」を参照してください。

ページのトップへ

コードの分割

.NET Framework のアセンブリは、パフォーマンスが最適化されています。 プリコンパイル済みネイティブ コードは、関数ごとに複数の領域に分割されています。 そのため、既存の ICorProfilerInfo::GetCodeInfo メソッドでは、関数のネイティブ コードの正しいエクステントを取得することができません。 プロファイラーは、より汎用的な ICorProfilerInfo2::GetCodeInfo2 メソッドを代わりに使用するように切り替える必要があります。

ページのトップへ

インプロセス デバッグの削除

.NET Framework 2.0 では、インプロセス デバッグは、プロファイル API との整合性のある一連の機能に置き換えられました。 その結果、スタック スナップショット (「プロファイリングの概要」を参照) とオブジェクト検査機能が導入されました。

ページのトップへ

ネイティブ イメージ ジェネレーターを使用したコールバック

ネイティブ イメージ ジェネレーター (NGen.exe) の大幅な最適化に伴って、より多くの処理が、実行時ではなくネイティブ イメージの生成時に行われるようになりました。 これにより、プロファイル API の動作に次の変更が加えられました。

  • 多くの関数の JITCachedFunctionSearch コールバックでネイティブ イメージが取得されなくなりました。 プロファイラーでは、コールバックの使用方法に応じて次の 2 つのオプションを選択できます。

    • 関数についての情報を収集するためにコールバックを使用する場合は、プログラムの実行中、その関数が最初に呼び出されたときにのみ、関数の情報を収集するスキームに切り替えることができます。

    • インストルメンテーションのために、コールバックを使用して関数の Just-In-Time (JIT) コンパイルを強制的に実行する場合は、プロファイラーが拡張したネイティブ イメージを代わりに使用できます。 詳細については、「プロファイル API でのコード生成」を参照してください。

  • 多くの型の ClassLoad コールバックでネイティブ イメージが取得されなくなりました。 このようなクラスでは、実行時に評価する手法 (遅延評価) を使用する必要があります。 プロファイラーが拡張したネイティブ イメージを既に使用している場合は、あえて動作を変更する必要はありません。 ただし、プロファイラーが拡張したネイティブ イメージは通常のイメージとは大幅に異なるため、特に理由がない限り、プロファイラーが拡張したネイティブ イメージには切り替えないでください。

ページのトップへ

ガベージ コレクションのコールバックの拡張

ガベージ コレクションのコールバックは、いくつかの点で拡張されています。 コールバックは、ガベージ コレクション ハンドルが作成または破棄されたことをプロファイラーに通知し、終了されるオブジェクトのキューに関する情報を提供するようになりました。また、Collect メソッドを使用してガベージ コレクションを強制するようになりました。 ICorProfilerCallback::RootReferences の拡張である ICorProfilerCallback2::RootReferences2 メソッドでは、各ルートの種類に関する情報が提供されます。 また、ICorProfilerCallback2::SurvivingReferences メソッドでは、非圧縮ガベージ コレクションで生じたヒープ内のオブジェクトのレイアウトが報告されます。

ページのトップへ

固定オブジェクト

.NET Framework 2.0 の新機能である固定オブジェクトは、ネイティブ イメージの生成時に初期化され、ネイティブ イメージに書き込まれる定数オブジェクトです。 固定オブジェクトは、ガベージ コレクションによって再配置されることはありませんが、ガベージ コレクション オブジェクトによって参照される場合があります。 新しい ICorProfilerInfo2::EnumModuleFrozenObjects メソッドを使用すると、プロファイラーで固定オブジェクトを列挙できます。

ページのトップへ

その他の API の変更

.NET Framework 2.0 では、次の API が変更されています。

ページのトップへ

参照

概念

プロファイリングの概要