プロファイル API でのオブジェクト検査
このトピックでは、プロファイル メソッドを使用してオブジェクトを検査する方法について説明します。
FunctionEnter2 および FunctionLeave2 コールバック
FunctionEnter2 コールバックおよび FunctionLeave2 コールバックは、関数の引数と戻り値に関する情報を、メモリの領域として提供します。 引数は、決められたメモリ領域に左から右に格納されます。 次の表に示すように、プロファイラーは、関数のメタデータ シグネチャを使用して引数を解釈できます。
ELEMENT_TYPE |
表現 |
---|---|
プリミティブ (ELEMENT_TYPE <= R8、I、U) |
プリミティブ値 |
値型 (VALUETYPE) |
型に依存 |
参照型 (CLASS、STRING、OBJECT、ARRAY、GENERICINST、SZARRAY) |
ObjectID (ガベージ コレクション ヒープへのポインター) |
BYREF |
マネージ ポインター (ObjectID 以外、ただし、スタックまたはガベージ コレクション ヒープを指している場合があります) |
PTR |
アンマネージ ポインター (ガベージ コレクションによる移動は不可) |
FNPTR |
ポインター サイズの非透過値 |
TYPEDBYREF |
マネージ ポインター、その後にポインター サイズの非透過値 |
ObjectID とマネージ ポインターの違いは次のとおりです。
ObjectID は、ガベージ コレクション ヒープまたは固定したオブジェクト ヒープのみを指します。 マネージ ポインターは、スタックを指す場合もあります。
ObjectID は、常にオブジェクトの先頭を指します。 マネージ ポインターは、オブジェクトのフィールドのいずれかを指す場合があります。
マネージ ポインターは、ObjectID を予期する関数に渡すことはできません。
使用できる CLR 型の一覧については、CorElementType 列挙型を参照してください。
複合型の検査
参照型や非プリミティブ値型の検査には、高度なテクニックが必要となります。
文字列または配列以外の値型および参照型については、ICorProfilerInfo2::GetClassLayout メソッドが各フィールドのオフセットを提供します。 その後、プロファイラーは、メタデータを使用してフィールドの型を判断し、再帰的に評価できます。
メモ |
---|
GetClassLayout は、そのクラス自体で定義されているフィールドのみを返します。親クラスで定義されているフィールドは含まれません。ICorProfilerInfo2::GetClassIDInfo2 メソッドを使用して親クラスの ClassID を検索し、GetClassLayout を使用して、親クラスで定義されているフィールドに関する情報を取得できます。 |
ボックス化された値型の場合は、ICorProfilerInfo2::GetBoxClassLayout メソッドを使用して、ボックス内の値型のオフセットを取得できます。 値型自体のレイアウトは変化しません。 したがって、プロファイラーは、ボックス内の値型が見つかったらすぐに、GetClassLayout を使用してレイアウトを取得できます。
文字列の場合は、ICorProfilerInfo2::GetStringLayout メソッドを使用して、文字列オブジェクト内にある目的のデータのオフセットを取得できます。
配列の場合は若干特殊で、各配列型ではなく各配列オブジェクトに対してメソッドを呼び出す必要があります。 これは、配列には多くの形式があり、オフセットを使用して記述することができないためです。 解釈を行うための手段として、ICorProfilerInfo2::GetArrayObjectInfo メソッドが用意されています。
静的フィールドの検査
静的フィールドには 4 つの型があります。 次の表では、それぞれの内容と識別方法について説明します。
静的型 |
定義 |
メタデータでの表現 |
---|---|---|
AppDomain |
基本的な静的フィールド。 アプリケーション ドメインごとに値が異なります。 |
アタッチされたカスタム属性のない静的フィールド。 |
スレッド |
マネージ スレッド ローカル ストレージ (TLS: Thread-Local Storage)。 スレッドおよびアプリケーション ドメインごとに固有の値を持つ静的フィールドです。 |
ThreadStaticAttribute でマークされた静的フィールド。 |
RVA |
モジュールのデータ セクションにホームを持つプロセス スコープの静的フィールド。 |
hasRVA フラグが設定された静的フィールド。 |
コンテキスト |
COM+ コンテキストごとに値が異なる静的フィールド。 |
ContextStaticAttribute でマークされた静的フィールド。 |
ICorProfilerInfo2::GetThreadStaticAddress、ICorProfilerInfo2::GetAppDomainStaticAddress、ICorProfilerInfo2::GetContextStaticAddress、および ICorProfilerInfo2::GetRVAStaticAddress の各メソッドを使用すると、静的フィールドの位置に関する情報を取得できます。 その位置のメモリを参照して、次のように解釈します。
参照型 : ObjectID
値型 : 実際の値を含むボックスの ObjectID
プリミティブ型 : プリミティブ値
参照
ICorProfilerInfo2::GetClassLayout メソッド
ICorProfilerInfo2::GetBoxClassLayout メソッド
ICorProfilerInfo2::GetStringLayout メソッド
ICorProfilerInfo2::GetArrayObjectInfo メソッド
ICorProfilerInfo2::GetThreadStaticAddress メソッド
ICorProfilerInfo2::GetAppDomainStaticAddress メソッド
ICorProfilerInfo2::GetContextStaticAddress メソッド
ICorProfilerInfo2::GetRVAStaticAddress メソッド