注
.NET Framework 4 でプロファイリングに大幅な変更が加えられた。
マネージド プロセス (アプリケーションまたはサービス) が開始されると、共通言語ランタイム (CLR) が読み込まれます。 CLR が初期化されると、次の 2 つの環境変数が評価され、プロセスがプロファイラーに接続する必要があるかどうかを判断します。
COR_ENABLE_PROFILING: CLR は、この環境変数が存在し、1 に設定されている場合にのみプロファイラーに接続します。
COR_PROFILER: COR_ENABLE_PROFILINGチェックに合格した場合、CLR はこの CLSID または ProgID を持つプロファイラーに接続します。このプロファイラーは、以前にレジストリに格納されている必要があります。 次の 2 つの例に示すように、COR_PROFILER環境変数は文字列として定義されます。
set COR_PROFILER={32E2F4DA-1BEA-47ea-88F9-C5DAF691C94A} set COR_PROFILER="MyProfiler"
CLR アプリケーションをプロファイリングするには、アプリケーションを実行する前に、COR_ENABLE_PROFILINGとCOR_PROFILER環境変数を設定する必要があります。 プロファイラー DLL が登録されていることを確認する必要もあります。
注
.NET Framework 4 以降では、プロファイラーを登録する必要はありません。
注
.NET Framework 4 以降のバージョンで .NET Framework バージョン 2.0、3.0、および 3.5 プロファイラーを使用するには、COMPLUS_ProfAPI_ProfilerCompatibilitySetting環境変数を設定する必要があります。
環境変数のスコープ
COR_ENABLE_PROFILINGとCOR_PROFILER環境変数を設定する方法によって、影響の範囲が決まります。 これらの変数は、次のいずれかの方法で設定できます。
ICorDebug::CreateProcess 呼び出しで変数を設定すると、その時点で実行しているアプリケーションにのみ適用されます。 (環境を継承するそのアプリケーションによって開始された他のアプリケーションにも適用されます)。
コマンド プロンプト ウィンドウで変数を設定すると、そのウィンドウから起動されるすべてのアプリケーションに適用されます。
ユーザー レベルで変数を設定すると、エクスプローラーで開始するすべてのアプリケーションに適用されます。 変数を設定した後に開くコマンド プロンプト ウィンドウには、これらの環境設定があり、そのウィンドウから起動するすべてのアプリケーションも表示されます。 ユーザー レベルで環境変数を設定するには、[ マイ コンピューター] を右クリックし、[ プロパティ] をクリックし、[ 詳細設定 ] タブをクリックし、[ 環境変数] をクリックして、 変数を [ユーザー変数 ] の一覧に追加します。
コンピューター レベルで変数を設定すると、そのコンピューターで起動されているすべてのアプリケーションに適用されます。 そのコンピューターで開くコマンド プロンプト ウィンドウには、これらの環境設定があり、そのウィンドウから起動するすべてのアプリケーションも表示されます。 これは、そのコンピューター上のすべてのマネージド プロセスがプロファイラーで開始されることを意味します。 コンピューター レベルで環境変数を設定するには、[ マイ コンピューター] を右クリックし、[ プロパティ] をクリックし、[ 詳細設定 ] タブをクリックし、[ 環境変数] をクリックし、[ システム変数 ] の一覧に変数を追加して、コンピューターを再起動します。 再起動後、変数はシステム全体で使用できるようになります。
Windows サービスをプロファイリングする場合は、環境変数を設定してプロファイラー DLL を登録した後、コンピューターを再起動する必要があります。 これらの考慮事項の詳細については、「 Windows サービスのプロファイリング」セクションを参照してください。
その他の考慮事項
プロファイラー クラスは 、ICorProfilerCallback インターフェイスと ICorProfilerCallback2 インターフェイスを 実装します。 .NET Framework バージョン 2.0 では、プロファイラーは
ICorProfilerCallback2を実装する必要があります。 そうでない場合、ICorProfilerCallback2は読み込まれません。特定の環境でプロセスを一度にプロファイリングできるプロファイラーは 1 つだけです。 異なる環境に 2 つの異なるプロファイラーを登録できますが、それぞれで個別のプロセスをプロファイリングする必要があります。 プロファイラーは、プロファイリング対象のプロセスと同じアドレス空間にマップされるインプロセス COM サーバー DLL として実装する必要があります。 これは、プロファイラーがインプロセスで実行されることを意味します。 .NET Framework は、他の種類の COM サーバーをサポートしていません。 たとえば、プロファイラーがリモート コンピューターからアプリケーションを監視する場合は、各コンピューターにコレクター エージェントを実装する必要があります。 これらのエージェントは、結果をバッチ処理し、中央のデータ収集コンピューターに通信します。
プロファイラーはインプロセスでインスタンス化される COM オブジェクトであるため、プロファイルされた各アプリケーションにはプロファイラーの独自のコピーがあります。 そのため、1 つのプロファイラー インスタンスで複数のアプリケーションのデータを処理する必要はありません。 ただし、プロファイルされた他のアプリケーションからのログ ファイルの上書きを防ぐために、プロファイラーのログ コードにロジックを追加する必要があります。
プロファイラーの初期化
両方の環境変数チェックに合格すると、CLR は COM CoCreateInstance 関数と同様の方法でプロファイラーのインスタンスを作成します。 プロファイラーは、 CoCreateInstanceへの直接呼び出しによって読み込まれません。 そのため、スレッド モデルの設定が必要な CoInitializeの呼び出しは回避されます。 CLR は、プロファイラーで ICorProfilerCallback::Initialize メソッドを呼び出します。 このメソッドのシグネチャは次のとおりです。
HRESULT Initialize(IUnknown *pICorProfilerInfoUnk)
プロファイラーは、ICorProfilerInfo または ICorProfilerInfo2 インターフェイス ポインターのpICorProfilerInfoUnkに対してクエリを実行し、後でプロファイリング中に詳細情報を要求できるように保存する必要があります。
イベント通知の設定
その後、プロファイラーは ICorProfilerInfo::SetEventMask メソッドを呼び出して、関心のある通知のカテゴリを指定します。 たとえば、プロファイラーが関数の入退出通知とガベージ コレクション通知のみに関心がある場合は、次のように指定します。
ICorProfilerInfo* pInfo;
pICorProfilerInfoUnk->QueryInterface(IID_ICorProfilerInfo, (void**)&pInfo);
pInfo->SetEventMask(COR_PRF_MONITOR_ENTERLEAVE | COR_PRF_MONITOR_GC)
この方法で通知マスクを設定することで、プロファイラーは受信する通知を制限できます。 この方法は、ユーザーが単純または特殊な目的のプロファイラーを構築するのに役立ちます。 また、プロファイラーが無視するだけの通知の送信に無駄になる CPU 時間も短縮されます。
特定のプロファイラー イベントは不変です。 つまり、これらのイベントが ICorProfilerCallback::Initialize コールバックで設定されるとすぐにオフにできず、新しいイベントを有効にすることはできません。 変更できないイベントを変更しようとすると、失敗した HRESULT ICorProfilerInfo::SetEventMask 返されます。
Windows サービスのプロファイリング
Windows サービスのプロファイリングは、共通言語ランタイム アプリケーションのプロファイリングに似ています。 どちらのプロファイリング操作も環境変数を使用して有効になります。 Windows サービスはオペレーティング システムの起動時に開始されるため、このトピックで既に説明した環境変数が既に存在し、システムが起動する前に必要な値に設定されている必要があります。 さらに、プロファイリング DLL はシステムに既に登録されている必要があります。
COR_ENABLE_PROFILINGとCOR_PROFILER環境変数を設定し、プロファイラー DLL を登録したら、Windows サービスがそれらの変更を検出できるように、ターゲット コンピューターを再起動する必要があります。
これらの変更により、システム全体でプロファイリングが有効になります。 その後実行されるすべてのマネージド アプリケーションがプロファイリングされないようにするには、ターゲット コンピューターを再起動した後にシステム環境変数を削除する必要があります。
また、この手法により、すべての CLR プロセスがプロファイリングされます。 プロファイラーは、現在のプロセスが関心があるかどうかを検出するために、 その ICorProfilerCallback::Initialize コールバックにロジックを追加する必要があります。 そうでない場合、プロファイラーは初期化を実行せずにコールバックを失敗させることができます。
こちらも参照ください
.NET