注
この記事は .NET Framework に固有のものです。 .NET 6 以降のバージョンを含む、.NET の新しい実装には適用されません。
マネージド デバッグ アシスタント (MDA) は、共通言語ランタイム (CLR) と連携してランタイムの状態に関する情報を提供するデバッグ支援機能です。 アシスタントは、他の方法ではトラップできないランタイム イベントに関する情報メッセージを生成します。 MDA を使用すると、マネージド コードとアンマネージド コードの間で遷移するときに発生する、見つけにくいアプリケーションのバグを特定できます。
Windows レジストリにキーを追加するか、環境変数を設定して、すべての MDA を 有効または無効にすることができます 。 アプリケーション構成設定を使用して、特定の MDA を有効にすることができます。 アプリケーションの構成ファイルでは、一部の個別の MDA に対して追加の構成設定を設定できます。 これらの構成ファイルはランタイムの読み込み時に解析されるため、マネージド アプリケーションを開始する前に MDA を有効にする必要があります。 既に開始されているアプリケーションでは有効にできません。
次の表に、.NET Framework に付属する MDA の一覧を示します。
既定では、.NET Framework では、すべてのマネージド デバッガーに対して MDA のサブセットがアクティブ化されます。 Visual Studio で既定のセットを表示するには、[デバッグ] メニューの [Windows>Exception 設定] を選択し、[マネージド デバッグ アシスタント] の一覧を展開します。
MDA の有効化と無効化
レジストリ キー、環境変数、およびアプリケーション構成設定を使用して、MDA を有効または無効にすることができます。 アプリケーション構成設定を使用するには、レジストリ キーまたは環境変数を有効にする必要があります。
ヒント
MDA を無効にする代わりに、MDA 通知を受信するたびに Visual Studio で MDA ダイアログ ボックスが表示されないようにすることができます。 そのためには、[デバッグ] メニューの [Windows>Exception 設定] を選択し、[マネージド デバッグ アシスタント] の一覧を展開し、個々の MDA の [スローされたときに中断] チェック ボックスをオンまたはオフにします。
レジストリ キー
MDA を有効にするには、Windows レジストリに HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\MDA サブキー (REG_SZ 型、値 1) を追加します。 次の例を 、MDAEnable.regという名前のテキスト ファイルにコピーします。Windows レジストリ エディター (RegEdit.exe) を開き、[ ファイル ] メニューから [ インポート] を選択します。 MDAEnable.reg ファイルを選択して、そのコンピューターで MDA を有効にします。 サブキーを文字列値 1 (DWORD 値 1 ではなく) に設定すると、 ApplicationName.suffix.mda.config ファイルから MDA 設定を読み取ります。 たとえば、メモ帳の MDA 構成ファイルには、notepad.exe.mda.configという名前が付けられます。
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework]
"MDA"="1"
コンピューターが 64 ビット オペレーティング システムで 32 ビット アプリケーションを実行している場合は、MDA キーを次のように設定する必要があります。
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\.NETFramework]
"MDA"="1"
詳細については、「 Application-Specific 構成設定 」を参照してください。 レジストリ設定は、 COMPLUS_MDA
環境変数によってオーバーライドできます。 詳細については、「 環境変数」 を参照してください。
MDA を無効にするには、Windows レジストリ エディターを使用して MDA サブキーを 0 (ゼロ) に設定します。
既定では、レジストリ キーを追加しなくても、デバッガーにアタッチされているアプリケーションを実行すると、一部の MDA が有効になります。 このセクションで前述したように 、MDADisable.reg ファイルを実行することで、これらのアシスタントを無効にすることができます。
環境変数
MDA のアクティブ化は、レジストリ キーをオーバーライドする環境変数 COMPLUS_MDA
によって制御することもできます。
COMPLUS_MDA
文字列は、MDA 名またはその他の特殊な制御文字列の大文字と小文字を区別しないセミコロン区切りのリストです。 マネージド デバッガーまたはアンマネージド デバッガーで開始すると、一連の MDA が既定で有効になります。 これは、デバッガーの下で既定で有効になっている MDA のセミコロン区切りの一覧を環境変数またはレジストリ キーの値に暗黙的に前置することによって行われます。 特殊な制御文字列は次のとおりです。
0
- すべての MDA を非アクティブ化します。1
- ApplicationName.mda.configから MDA 設定を読み取ります。managedDebugger
- マネージド実行可能ファイルがデバッガーで起動されたときに暗黙的にアクティブ化されるすべての MDA を明示的にアクティブ化します。unmanagedDebugger
- デバッガーでアンマネージド実行可能ファイルが起動されたときに暗黙的にアクティブ化されるすべての MDA を明示的にアクティブ化します。
競合する設定がある場合、最新の設定は以前の設定よりも優先されます。
COMPLUS_MDA=0
では、デバッガーで暗黙的に有効になっている MDA も含め、すべての MDA が無効になります。COMPLUS_MDA=gcUnmanagedToManaged
では、デバッガーで暗黙的に有効になっている MDA に加えて、gcUnmanagedToManaged
が有効になります。COMPLUS_MDA=0;gcUnmanagedToManaged
では、gcUnmanagedToManaged
が有効になりますが、それ以外の場合はデバッガーで暗黙的に有効になる MDA を無効にします。
Application-Specific 構成設定
アプリケーションの MDA 構成ファイルで、一部のアシスタントを個別に有効、無効、および構成できます。 MDA を構成するためのアプリケーション構成ファイルの使用を有効にするには、MDA レジストリ キーまたは COMPLUS_MDA
環境変数を設定する必要があります。 通常、アプリケーション構成ファイルは、アプリケーションの実行可能ファイル (.exe) ファイルと同じディレクトリにあります。 ファイル名は ApplicationName.mda.config; という形式になります。たとえば、notepad.exe.mda.configします。アプリケーション構成ファイルで有効になっているアシスタントには、そのアシスタントの動作を制御するように設計された属性または要素が含まれている場合があります。
次の例は、 マーシャリングを有効にして構成する方法を示しています。
<mdaConfig>
<assistants>
<marshaling>
<methodFilter>
<match name="*"/>
</methodFilter>
<fieldFilter>
<match name="*"/>
</fieldFilter>
</marshaling>
</assistants>
</mdaConfig>
Marshaling
MDA は、アプリケーション内のマネージド型からアンマネージド型への遷移ごとに、アンマネージド型にマーシャリングされるマネージド型に関する情報を出力します。
Marshaling
MDA では、methodFilter 子要素と fieldFilter 子要素で指定されたメソッドフィールドと構造体フィールドの名前をそれぞれフィルター処理することもできます。
次の例は、既定の設定を使用して複数の MDA を有効にする方法を示しています。
<mdaConfig>
<assistants>
<illegalPrepareConstrainedRegion />
<invalidCERCall />
<openGenericCERCall />
<virtualCERCall />
</assistants>
</mdaConfig>
Von Bedeutung
構成ファイルに複数のアシスタントを指定する場合は、アルファベット順に一覧表示する必要があります。 たとえば、virtualCERCall
と invalidCERCall
MDA の両方を有効にする場合は、<virtualCERCall />
エントリの前に<invalidCERCall />
エントリを追加する必要があります。 エントリがアルファベット順でない場合は、ハンドルされない無効な構成ファイルの例外メッセージが表示されます。
MDA 例外
MDA が有効になっている場合、デバッガーでコードが実行されていない場合でもアクティブになります。 デバッガーが存在しないときに MDA イベントが発生した場合、ハンドルされない例外ではないが、ハンドルされない例外ダイアログ ボックスにイベント メッセージが表示されます。 このダイアログ ボックスを回避するには、コードがデバッグ環境で実行されていない場合に、MDA を有効にする設定を削除します。
Visual Studio 統合開発環境 (IDE) でコードを実行すると、特定の MDA イベントに対して表示される例外ダイアログ ボックスを回避できます。 これを行うには、[ デバッグ ] メニューの [Windows>Exception の設定] を選択します。 [ 例外設定] ウィンドウで、[ マネージド デバッグ アシスタント ] の一覧を展開し、個々の MDA の [ スローされたときに中断 ] チェック ボックスをオフにします。 このダイアログ ボックスを使用して、MDA 例外ダイアログ ボックスの表示を 有効 にすることもできます。
MDA 出力
MDA 出力は、 PInvokeStackImbalance
MDA からの出力を示す次の例のようになります。
PInvoke 関数 'MDATest!MDATest.Program::StdCall' によってスタックが不均衡になっています。 これは、マネージド PInvoke シグネチャがアンマネージド ターゲット シグネチャと一致しないことが原因である可能性があります。 PInvoke シグネチャの呼び出し規則とパラメーターが、ターゲットのアンマネージド シグネチャと一致することを確認します。
こちらも参照ください
.NET