contextSwitchDeadlock MDA

更新 : 2007 年 11 月

contextSwitchDeadlock マネージ デバッグ アシスタント (MDA: Managed Debugging Assistant) は、COM コンテキストの遷移の試行中にデッドロックが検出されるとアクティブ化されます。

症状

最も一般的な症状は、マネージ コードから実行されたアンマネージ COM コンポーネントの呼び出しが戻らないことです。別の症状として、メモリの使用量が時間と共に増加する場合もあります。

原因

最も考えられる原因として、シングルスレッド アパートメント (STA) スレッドがメッセージ ポンプを行っていない可能性があります。STA スレッドが、メッセージ ポンプを行わずに待機しているか、または時間のかかる操作を実行していて、メッセージ キューのポンプを許可していません。

時間をかけたメモリ使用量が時間と共に増加する症状は、ファイナライザ スレッドがアンマネージ COM コンポーネント上の Release を呼び出そうとして、そのコンポーネントから制御が戻らない場合に発生します。このため、ファイナライザは他のオブジェクトを再利用できなくなります。

既定では、Visual Basic コンソール アプリケーションのメイン スレッドのスレッド処理モデルは STA です。STA スレッドが共通言語ランタイムまたはサードパーティ コントロールを通じて COM 相互運用性を直接または間接的に使用する場合、この MDA がアクティブ化されます。Visual Basic コンソール アプリケーションでこの MDA がアクティブ化されるのを防ぐには、メイン メソッドに MTAThreadAttribute 属性を適用するか、またはメッセージをポンプするようにアプリケーションを変更します。

次のすべての条件が満たされる場合、この MDA が誤ってアクティブ化される可能性があります。

  • アプリケーションがライブラリを通じて直接または間接的に STA スレッドから COM コンポーネントを作成する。

  • デバッガでアプリケーションが中断され、ユーザーがアプリケーションを続行したか、またはステップ操作を実行した。

  • アンマネージ デバッグが有効になっていない。

MDA が誤ってアクティブ化されたかどうかを判断するには、すべてのブレークポイントを無効にし、アプリケーションを再開して、中断なしで実行させます。MDA がアクティブ化されない場合は、最初のアクティブ化は誤りだった可能性があります。その場合は、MDA を無効にして、デバッグ セッションとの干渉を防ぎます。

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

この MDA は、Visual Studio 2005 以降のバージョンの既定のセットに含まれています。Visual Studio でホスティング プロセスが有効にされている場合、既定のセットに含まれる MDA を無効にすることはできません。ホスティング プロセスは既定で有効になるため、明示的に無効にする必要があります。MDA を無効にする方法については、「マネージ デバッグ アシスタントによるエラーの診断」の「MAD の有効化と無効化」を参照してください。

解決策

STA メッセージ ポンプに関する COM 規則に従います。

ランタイムへの影響

この MDA は、CLR への影響はありません。COM コンテキストに関するデータを報告するだけです。

出力

現在のコンテキストおよび対象のコンテキストを説明するメッセージです。

構成

<mdaConfig>
  <assistants>
    <contextSwitchDeadlock enable="false" />
  </assistants>
</mdaConfig>

参照

概念

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

相互運用マーシャリングの概要

参照

MarshalAsAttribute

その他の技術情報

相互運用性