更新 : 2007 年 11 月
ここでは、共通言語ランタイム (CLR: Common Language Runtime) のデバッグ API による一般的なデバッグ シナリオの処理方法について説明します。一部のシナリオは CLR によって直接サポートされますが、現在のメソッドとの相互運用を通じてサポートされるシナリオもあります。
アウトプロセス デバッグ
アウトプロセス デバッグのデバッガは、デバッグ対象プロセスとは別のプロセス (デバッグ対象の外部プロセス) です。このシナリオでは、デバッガとデバッグ対象との通信が少ないため、プロセスの状態をより正確に把握することができます。
CLR デバッグ API は、アウトプロセス デバッグを直接サポートします。この API は、デバッガとデバッグ対象のマネージ部分との間のすべての通信を処理し、マネージ コードのデバッグをサポートします。
CLR デバッグ API はアウトプロセスで実行されますが、スレッド同期などの一部のデバッグ ロジックは、デバッグ対象のインプロセスで実行されます。多くの場合、この実装の詳細はデバッガに対して透過的にする必要があります。スレッド同期の詳細については、「CLR デバッグのアーキテクチャ」を参照してください。アウトプロセスの欠点は、API のデバッグ時にクラッシュ ダンプを使用できないという点です。
インプロセス デバッグ
.NET Framework Version 1.0 および 1.1 では、CLR デバッグ API は制限されたインプロセス デバッグをサポートしていました。インプロセス デバッグでは、プロファイラでデバッグ API の検査機能を使用できました。.NET Framework 2.0 では、インプロセス デバッグは、プロファイル API との整合性が強化された一連の機能に置き換えられました。これらの変更の詳細については、「プロファイリングの概要」でスタック スナップショットおよびオブジェクト検査の各機能を参照してください。
リモート プロセス デバッグ
リモート プロセス デバッグでは、デバッガのユーザー インターフェイスはデバッグ対象プロセスとは別のコンピュータ上にあります。このシナリオは、リソースの制約、場所の依存関係、またはオペレーティング システムの妨げになるバグが原因で、同一コンピュータ上で実行するとデバッガとデバッグ対象の間に干渉が生じる場合に便利です。
CLR デバッグ API は、リモート プロセス デバッグを直接サポートしていません。それでも、CLR デバッグ API を使用しているデバッガは、デバッグ対象プロセスの外部に存在する必要があります。したがって、このソリューションでは、デバッグ対象と同じコンピュータ上にプロキシ プロセスが必要となります。
アンマネージ コード デバッグ
マネージ コードはアンマネージ コードと同じプロセスに共存できるため、マネージ コードとアンマネージ コードを同時にデバッグしようとすることがよくあります。
CLR デバッグ API は、アンマネージ コード デバッグを直接サポートしていません。ただし、Win32 のデバッグ機能を共有することによって、アンマネージ コード デバッガとの共存が可能です。マネージ コードとアンマネージ コードとの境界でステップ実行する機能もサポートされています。
また、CLR デバッグ API には、プロセスをデバッグするための 2 つのオプションがあります。
ソフトアタッチ オプションでは、プロセスのマネージ部分のみをデバッグします。プロセスにソフトアタッチされたデバッガは、後でプロセスからデタッチできます。
ハードアタッチ オプションでは、プロセスのマネージ部分とアンマネージ部分の両方をデバッグします。すべての Win32 デバッグ イベントは、デバッグ API を通して公開されます。
混合言語環境
コンポーネント ソフトウェアでは、各種コンポーネントが異なる言語で作成されている可能性があります。デバッガは、異なる言語で記述されているコードを認識して、データを正しい形式で表示し、式を正しい構文で評価する必要があります。
CLR にはソース言語の概念がないため、CLR デバッグ API は混合言語環境を直接サポートしていません。デバッガの既存のソース マップ機能に、特定の関数をその関数の実装言語に対応付ける機能が必要です。
複数プロセスと分散プログラム
コンポーネント プログラムには、異なるプロセスやネットワーク上の他のコンピュータで実行される連携コンポーネントが含まれている可能性があります。実行されている処理の論理ビューを得るには、プロセスとコンピュータの間の実行ロジックをトレースする機能がデバッガに必要です。
CLR デバッグ API は、複数プロセス デバッグを直接サポートしていません。CLR デバッグ API を使用しているデバッガには複数プロセス デバッグの直接サポート機能が必要であり、この機能がある既存のメソッドは引き続き正しく動作します。