マネージ デバッグ アシスタントによるエラーの診断

マネージ デバッグ アシスタント (MDA) は、共通言語ランタイム (CLR: Common Language Runtime) と連携してランタイム状態に関する情報を提供するデバッグ支援ツールです。 MDA は、これ以外の方法ではトラップできないランタイム イベントに関する情報メッセージを生成します。 MDA を使用すると、マネージ コードからアンマネージ コードへの遷移時に発生する、検出が難しいアプリケーション バグを分離できます。 すべての MDA を有効または無効にするには、Windows レジストリにキーを追加するか、環境変数を設定します。 特定の MDA を有効にするには、アプリケーション構成設定を使用します。 一部の MDA については、アプリケーションの構成ファイルで追加の構成設定を個別に設定できます。 この構成ファイルはランタイムの読み込み時に解析されるため、MDA は、マネージ アプリケーションが起動する前に有効にする必要があります。 MDA は、既に起動しているアプリケーションに対して有効にできません。

メモメモ

MDA を有効にすると、コードをデバッガーで実行していないときでも MDA がアクティブになります。デバッガーが存在しない場合に MDA イベントが発生した場合、そのイベントはハンドルされない例外とは異なりますが、イベント メッセージはハンドルされない例外のダイアログ ボックスに表示されます。このダイアログ ボックスが表示されないようにするには、デバッグ環境でコードを実行しているのではないときに、MDA を有効にする設定を削除します。

メモメモ

Visual Studio の統合開発環境 (IDE: Integrated Development Environment) でコードを実行している場合は、特定の MDA イベントを示す例外のダイアログ ボックスを表示しないようにできます。これを行うには、[デバッグ] メニューの [例外] をクリックします ([デバッグ] メニューに [例外] が表示されない場合は、[ツール] メニューの [カスタマイズ] をクリックし、メニュー項目を追加します)。 [例外] ダイアログ ボックスで、[マネージ デバッグ アシスタント] の一覧を展開し、個々の MDA に対して [スローされるとき] チェック ボックスをオフにします。たとえば、contextSwitchDeadlock MDA の例外のダイアログ ボックスを表示しないようにするには、[マネージ デバッグ アシスタント] で、この名前の横にある [スローされるとき] チェック ボックスをオフにします。このダイアログ ボックスは、MDA を有効にする場合にも使用できます。

.NET Framework に付属する MDA の一覧を次の表に示します。

asynchronousThreadAbort MDA

bindingFailure MDA

callbackOnCollectedDelegate MDA

contextSwitchDeadlock MDA

dangerousThreadingAPI MDA

dateTimeInvalidLocalFormat MDA

dirtyCastAndCallOnInterface MDA

disconnectedContext MDA

dllMainReturnsFalse MDA

exceptionSwallowedOnCallFromCom MDA

failedQI MDA

fatalExecutionEngineError MDA

gcManagedToUnmanaged MDA

gcUnmanagedToManaged MDA

illegalPrepareConstrainedRegion MDA

invalidApartmentStateChange MDA

invalidCERCall MDA

invalidFunctionPointerInDelegate MDA

invalidGCHandleCookie MDA

invalidIUnknown MDA

invalidMemberDeclaration MDA

invalidOverlappedToPinvoke MDA

invalidVariant MDA

jitCompilationStart MDA

loaderLock MDA

loadFromContext MDA

marshalCleanupError MDA

marshaling MDA

memberInfoCacheCreation MDA

moduloObjectHashcode MDA

nonComVisibleBaseClass MDA

notMarshalable MDA

openGenericCERCall MDA

overlappedFreeError MDA

pInvokeLog MDA

pInvokeStackImbalance MDA

raceOnRCWCleanup MDA

reentrancy MDA

releaseHandleFailed MDA

reportAvOnComRelease MDA

streamWriterBufferedDataLost MDA

virtualCERCall MDA

既定では、.NET Framework はすべてのマネージ デバッガーに対して MDA のサブセットをアクティブにします。 Visual Studio で既定のセットを表示するには、[デバッグ] メニューの [例外] をクリックし、[マネージ デバッグ アシスタント] の一覧を展開します。

MDA の有効化と無効化

MDA は、レジストリ キー、環境変数、およびアプリケーション構成設定を使用して有効または無効にできます。 アプリケーション構成設定を使用するには、レジストリ キーまたは環境変数を有効にする必要があります。

Visual Studio 2005 以降のバージョンでは、ホスティング プロセスが有効な場合、既定のセットに含まれている MDA を無効にしたり、既定のセットに含まれていない MDA を有効にしたりはできません。 ホスティング プロセスは既定で有効になるため、明示的に無効にする必要があります。

Visual Studio でホスティング プロセスを無効にするには、次の操作を行います。

  1. ソリューション エクスプローラーでプロジェクトを選択します。

  2. [プロジェクト] メニューの [プロパティ] をクリックします。

    [プロジェクト デザイナー] ウィンドウが表示されます。

  3. [デバッグ] タブをクリックします。

  4. [デバッガーを有効にする] セクションで、[Visual Studio ホスティング プロセスを有効にする] チェック ボックスをオフにします。

ただし、ホスティング プロセスを無効にすると、パフォーマンスに影響する場合があります。 Visual Studio で、MDA 通知を受け取ったときに MDA ダイアログ ボックスが表示されないようにすると、MDA を無効にする必要がありません。 そのためには、[デバッグ] メニューの [例外] をクリックし、[マネージ デバッグ アシスタント] の一覧を展開し、個々の MDA に対して [スローされるとき] チェック ボックスをオフにします。

レジストリ キーを使用した MDA の有効化と無効化

MDA を有効にするには、Windows レジストリに HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\MDA サブキー (REG_SZ 型、値 1) を追加します。 MDAEnable.reg という名前のテキスト ファイルに次の例をコピーし、Windows エクスプローラーでそのファイル名をダブルクリックすると、対象のコンピューターで MDA が有効になります。

Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework]
"MDA"="1"

MDA を無効にするには、Windows レジストリ エディターを使用して MDA サブキーを 0 (ゼロ) に設定します。 または、MDADisable.reg という名前のテキスト ファイルに次の例をコピーし、Windows エクスプローラーでそのファイル名をダブルクリックしても無効にできます。

Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework]
"MDA"="0"

MDA には、レジストリ キーを追加しなくても、デバッガーにアタッチされているアプリケーションを実行すると既定で有効になるものがあります。 このようなアシスタントには、pInvokeStackImbalance MDAinvalidApartmentStateChange MDA などがあります。 これらのアシスタントを無効にするには、このセクションの前述の説明に従って MDADisable.reg ファイルを実行します。

環境変数を使用した MDA の有効化と無効化

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 を無効にします。

アプリケーション固有の構成設定を使用した MDA の有効化と無効化

アプリケーションの MDA 構成ファイルでは、一部のアシスタントを個別に有効化、無効化、および構成できます。 MDA を構成する目的でアプリケーション構成ファイルの使用を有効にするには、MDA レジストリ キーまたは COMPLUS_MDA 環境変数を設定する必要があります。 アプリケーション構成ファイルは、通常、アプリケーションの実行可能ファイル (.exe) と同じディレクトリに置かれます。 このファイル名の形式は、ApplicationName.mda.config です (notepad.exe.mda.config など)。 アプリケーション構成ファイルで有効にされたアシスタントには、そのアシスタントの動作を制御するために特別にデザインされた属性や要素が存在する場合があります。 marshaling MDA を有効化して設定する方法を次の例に示します。

<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>
重要 :重要

構成ファイルに複数のアシスタントを指定する場合は、アルファベット順に記述する必要があります。たとえば、virtualCERCall MDA と invalidCERCall MDA の両方を有効にする場合は、<invalidCERCall /> エントリ、<virtualCERCall /> エントリの順に追加する必要があります。エントリがアルファベット順になっていない場合、ハンドルされない無効な構成ファイルであることを示す例外メッセージが表示されます。

MDA の出力

MDA の出力例を次に示します。この例は、pInvokeStackImbalance MDA の出力を示しています。

A call to PInvoke function 'MDATest!MDATest.Program::StdCall' has unbalanced the stack. This is likely because the managed PInvoke signature does not match the unmanaged target signature. Check that the calling convention and parameters of the PInvoke signature match the target unmanaged signature.

参照

その他の技術情報

デバッグ、トレース、およびプロファイリング