次の方法で共有


プロファイル 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::GetThreadStaticAddressICorProfilerInfo2::GetAppDomainStaticAddressICorProfilerInfo2::GetContextStaticAddress、および ICorProfilerInfo2::GetRVAStaticAddress の各メソッドを使用すると、静的フィールドの位置に関する情報を取得できます。 その位置のメモリを参照して、次のように解釈します。

  • 参照型 : ObjectID

  • 値型 : 実際の値を含むボックスの ObjectID

  • プリミティブ型 : プリミティブ値

参照

FunctionEnter2 関数

FunctionLeave2 関数

ICorProfilerInfo2::GetClassLayout メソッド

ICorProfilerInfo2::GetBoxClassLayout メソッド

ICorProfilerInfo2::GetStringLayout メソッド

ICorProfilerInfo2::GetArrayObjectInfo メソッド

ICorProfilerInfo2::GetThreadStaticAddress メソッド

ICorProfilerInfo2::GetAppDomainStaticAddress メソッド

ICorProfilerInfo2::GetContextStaticAddress メソッド

ICorProfilerInfo2::GetRVAStaticAddress メソッド

参照

概念

プロファイリングの概要