次の方法で共有


マネージド デバッグ アシスタントを使用してエラーを診断する

この記事は .NET Framework に固有のものです。 .NET 6 以降のバージョンを含む、.NET の新しい実装には適用されません。

マネージド デバッグ アシスタント (MDA) は、共通言語ランタイム (CLR) と連携してランタイムの状態に関する情報を提供するデバッグ支援機能です。 アシスタントは、他の方法ではトラップできないランタイム イベントに関する情報メッセージを生成します。 MDA を使用すると、マネージド コードとアンマネージド コードの間で遷移するときに発生する、見つけにくいアプリケーションのバグを特定できます。

Windows レジストリにキーを追加するか、環境変数を設定して、すべての 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
マーシャ リング
memberInfoCacheCreation
moduloObjectHashcode
nonComVisibleBaseClass
notMarshalable
openGenericCERCall
overlappedFreeError
pInvokeLog
pInvokeStackImbalance
raceOnRCWCleanup
再 入
releaseHandleFailed
reportAvOnComRelease
streamWriterBufferedDataLost
virtualCERCall

既定では、.NET Framework では、すべてのマネージド デバッガーに対して MDA のサブセットがアクティブ化されます。 Visual Studio で既定のセットを表示するには、[デバッグ] メニューの [Windows>Exception 設定] を選択し、[マネージド デバッグ アシスタント] の一覧を展開します。

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

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

構成ファイルに複数のアシスタントを指定する場合は、アルファベット順に一覧表示する必要があります。 たとえば、virtualCERCallinvalidCERCall 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 シグネチャの呼び出し規則とパラメーターが、ターゲットのアンマネージド シグネチャと一致することを確認します。

こちらも参照ください