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

マネージド デバッグ アシスタント (MDA) は、共通言語ランタイム (CLR: Common Language Runtime) と連携してランタイム状態に関する情報を提供するデバッグ支援ツールです。 MDA は、これ以外の方法ではトラップできないランタイム イベントに関する情報メッセージを生成します。 MDA を使用すると、マネージド コードからアンマネージド コードへの遷移時に発生する、検出が難しいアプリケーション バグを分離できます。

Windows レジストリにキーを追加するか、環境変数を設定することによって、すべての MDA を有効または無効にすることができます。 特定の MDA を有効にするには、アプリケーション構成設定を使用します。 一部の MDA については、アプリケーションの構成ファイルで追加の構成設定を個別に設定できます。 この構成ファイルはランタイムの読み込み時に解析されるため、MDA は、マネージド アプリケーションが起動する前に有効にする必要があります。 MDA は、既に起動しているアプリケーションに対して有効にできません。

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

MDA
asynchronousThreadAbort
bindingFailure
callbackOnCollectedDelegate
contextSwitchDeadlock
dangerousThreadingAPI
dateTimeInvalidLocalFormat
dirtyCastAndCallOnInterface
disconnectedContext
dllMainReturnsFalse
exceptionSwallowedOnCallFromCom
failedQI
fatalExecutionEngineError
gcManagedToUnmanaged
gcUnmanagedToManaged
illegalPrepareConstrainedRegion
invalidApartmentStateChange
invalidCERCall
invalidFunctionPointerInDelegate
invalidGCHandleCookie
invalidIUnknown
invalidMemberDeclaration
invalidOverlappedToPinvoke
invalidVariant
jitCompilationStart
loaderLock
loadFromContext
marshalCleanupError
marshaling
memberInfoCacheCreation
moduloObjectHashcode
nonComVisibleBaseClass
notMarshalable
openGenericCERCall
overlappedFreeError
pInvokeLog
pInvokeStackImbalance
raceOnRCWCleanup
reentrancy
releaseHandleFailed
reportAvOnComRelease
streamWriterBufferedDataLost
virtualCERCall

既定では、.NET Framework はすべてのマネージド デバッガーに対して MDA のサブセットをアクティブにします。 Visual Studio で既定のセットを表示するには、[デバッグ] メニューの [ウィンドウ][例外設定] を選択してから、[Managed Debugging Assistants] の一覧を展開します。

Visual Studio の [例外設定] ウィンドウ

MDA を有効または無効にする

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

ヒント

MDA を無効にするのではなく、MDA の通知を受信するたびに Visual Studio の MDA ダイアログ ボックスが表示されないようにすることができます。 そのためには、[デバッグ] メニューの [ウィンドウ][例外設定] を選択し、[Managed Debugging Assistants] の一覧を展開して、個々の MDA の [スローされたときに中断] チェック ボックスをオンまたはオフにします。

レジストリ キー

MDA を有効にするには、Windows レジストリに HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\MDA サブキー (種類 REG_SZ、値 1) を追加します。 MDAEnable.reg という名前のテキスト ファイルに次の例をコピーします。Windows レジストリ エディター (RegEdit.exe) を開き、 [ファイル] メニューで [インポート] を選択します。 MDAEnable.reg ファイルを選択します。そのコンピューターで MDA が有効になります。 サブキーを (DWORD 値 1 ではなく) 文字列値 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"

詳細については、「アプリケーション固有の構成設定」を参照してください。 レジストリ設定は、COMPLUS_MDA 環境変数でオーバーライドできます。 詳細については、「環境変数」を参照してください。

MDA を無効にするには、Windows レジストリ エディターを使用して MDA サブキーを 0 (ゼロ) に設定します。

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

環境変数

MDA のアクティブ化は、COMPLUS_MDA 環境変数によって制御することもできます。この環境変数によってレジストリ キーがオーバーライドされます。 COMPLUS_MDA の文字列は、MDA 名やその他の特殊制御文字列の、セミコロンで区切られたリストで、大文字小文字の区別はありません。 マネージド デバッガーやアンマネージド デバッガーの下で起動すると、MDA のセットが既定で有効になります。 そのためには、デバッガーの下で既定で有効にする MDA のリスト (セミコロン区切り) を、環境変数またはレジストリ キーの値の前に暗黙的に付加します。 特殊制御文字列は次のとおりです。

  • 0 - すべての MDA を非アクティブにします。

  • 1 - 1.mda.config から MDA の設定を読み取ります。

  • managedDebugger - デバッガーの下でマネージド実行可能ファイルを起動すると、暗黙的にアクティブ化されているすべての MDA が明示的にアクティブ化されます。

  • unmanagedDebugger - デバッガーの下でアンマネージ実行可能ファイルを起動すると、暗黙的にアクティブ化されているすべての MDA が明示的にアクティブ化されます。

競合する設定がある場合は、最新の設定が以前の設定を次のようにオーバーライドします。

  • COMPLUS_MDA=0 は、デバッガーの下で暗黙的に有効化されている MDA を含め、すべての MDA を無効にします。

  • COMPLUS_MDA=gcUnmanagedToManaged は、デバッガーの下で暗黙的に有効化される MDA に加えて gcUnmanagedToManaged も有効にします。

  • COMPLUS_MDA=0;gcUnmanagedToManagedgcUnmanagedToManaged を有効にしますが、デバッガーの下で別途暗黙的に有効化されている MDA を無効にします。

アプリケーション固有の構成設定

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

marshaling を有効化して構成する方法を次の例に示します。

<mdaConfig>
  <assistants>
    <marshaling>
      <methodFilter>
        <match name="*"/>
      </methodFilter>
      <fieldFilter>
        <match name="*"/>
      </fieldFilter>
    </marshaling>
  </assistants>
</mdaConfig>

Marshaling MDA では、アプリケーションでのマネージドからアンマネージドへの遷移ごとに、アンマネージド型にマーシャリングされるマネージド型についての情報が出力されます。 また、Marshaling MDA を使用すると、Marshaling および fieldFilter 子要素でそれぞれ指定されたメソッドと構造体フィールドの名前をフィルター処理できます。

既定の設定を使用して複数の MDA を有効にする方法を次の例に示します。

<mdaConfig>
  <assistants>
    <illegalPrepareConstrainedRegion />
    <invalidCERCall />
    <openGenericCERCall />
    <virtualCERCall />
  </assistants>
</mdaConfig>

重要

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

MDA の例外

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

Visual Studio 統合開発環境 (IDE) でコードを実行するとき、特定の MDA イベントを示す例外のダイアログ ボックスが表示されないようにすることができます。 それを行うには、[デバッグ] メニューの [ウィンドウ][例外設定] を選択します。 [例外設定] ウィンドウで、 [Managed Debugging Assistants] の一覧を展開し、個々の MDA に対して [スローされたときに中断] チェック ボックスをオフにします。 このダイアログ ボックスを使用して、MDA 例外ダイアログ ボックスの表示を "有効にする" こともできます。

MDA の出力

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

PInvoke 関数 'MDATest!MDATest.Program::StdCall' がスタックを不安定にしています。 PInvoke シグネチャがアンマネージ ターゲット シグネチャに一致していないことが原因として考えられます。 呼び出し規約、および PInvoke シグネチャのパラメーターがターゲットのアンマネージ シグネチャに一致していることを確認してください。

関連項目