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

更新 : 2008 年 7 月

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

d21c150d.alert_note(ja-jp,VS.90).gifメモ :

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

d21c150d.alert_note(ja-jp,VS.90).gifメモ :

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

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 を有効にするには、Windows レジストリに HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\MDA サブキーを追加します。"MDAEnable.reg" というテキスト ファイルに次の例をコピーします。

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

コマンド プロンプトから MDAEnable.reg ファイルを実行して MDA をそのコンピュータ上で有効にします。MDA を無効にするには、"MDADisable.reg" というテキスト ファイルに次の例をコピーします。

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

次に、コマンド プロンプトから MDADisable.reg ファイルを実行します。

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

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

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 レジストリ キーまたは 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 に固有の設定の詳細については、該当する MDA のドキュメントを参照してください。

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.

参照

その他の技術情報

アプリケーションのデバッグとプロファイリング

履歴の変更

日付

履歴

理由

2008 年 7 月

ContextSwitchDeadlock メッセージの回避に関する説明を追加

カスタマ フィードバック