contextSwitchDeadlock MDAcontextSwitchDeadlock MDA

contextSwitchDeadlock マネージド デバッグ アシスタント (MDA) は、COM コンテキストの遷移の試行中にデッドロックが検出されるとアクティブ化されます。The contextSwitchDeadlock managed debugging assistant (MDA) is activated when a deadlock is detected during an attempted COM context transition.

症状Symptoms

最も一般的な症状は、マネージ コードから実行されたアンマネージ COM コンポーネントの呼び出しから戻らないことです。The most common symptom is that a call on an unmanaged COM component from managed code does not return. 別の症状として、メモリの使用量が時間と共に増加する場合もあります。Another symptom is memory usage increasing over time.

原因Cause

最も考えられる原因として、シングルスレッド アパートメント (STA) スレッドがメッセージ ポンプを行っていないことがあります。The most probable cause is that a single-threaded apartment (STA) thread is not pumping messages. STA スレッドが、メッセージ ポンプを行わずに待機しているか、または時間のかかる操作を実行していて、メッセージ キューのポンプを許可していません。The STA thread is either waiting without pumping messages or is performing lengthy operations and is not allowing the message queue to pump.

メモリ使用量が時間の経過と共に増加する症状は、ファイナライザー スレッドがアンマネージ COM コンポーネント上の Release を呼び出そうとして、そのコンポーネントが戻らない場合に発生します。Memory usage increasing over time is caused by the finalizer thread attempting to call Release on an unmanaged COM component and that component is not returning. このため、ファイナライザーは他のオブジェクトを再利用できなくなります。This prevents the finalizer from reclaiming other objects.

既定では、Visual Basic コンソール アプリケーションのメイン スレッドのスレッド処理モデルは STA です。By default, the threading model for the main thread of Visual Basic console applications is STA. STA スレッドが共通言語ランタイムまたはサードパーティ コントロールを通じて COM 相互運用性を直接または間接的に使用する場合、この MDA がアクティブ化されます。This MDA is activated if an STA thread uses COM interoperability either directly or indirectly through the common language runtime or a third-party control. Visual Basic コンソール アプリケーションでこの MDA がアクティブ化されるのを防ぐには、メイン メソッドに MTAThreadAttribute 属性を適用するか、またはメッセージをポンプするようにアプリケーションを変更します。To avoid activating this MDA in a Visual Basic console application, apply the MTAThreadAttribute attribute to the main method or modify the application to pump messages.

次のすべての条件が満たされる場合、この MDA が誤ってアクティブ化される可能性があります。It is possible for this MDA to be falsely activated when all of the following conditions are met:

  • アプリケーションがライブラリを通じて直接または間接的に STA スレッドから COM コンポーネントを作成する。An application creates COM components from STA threads either directly or indirectly through libraries.

  • デバッガーでアプリケーションが中断され、ユーザーがアプリケーションを続行したか、またはステップ操作を実行した。The application was stopped in the debugger and the user either continued the application or performed a step operation.

  • アンマネージ デバッグが有効になっていない。Unmanaged debugging is not enabled.

MDA が誤ってアクティブ化されたかどうかを判断するには、すべてのブレークポイントを無効にし、アプリケーションを再び実行して、中断なしで実行させます。To determine if the MDA is being falsely activated, disable all breakpoints, restart the application, and allow it to run without stopping. MDA がアクティブ化されない場合は、最初のアクティブ化は誤りだった可能性があります。If the MDA is not activated, it is likely the initial activation was false. その場合は、MDA を無効にして、デバッグ セッションとの干渉を防ぎます。In this case, disable the MDA to avoid interference with the debugging session.

注意

この MDA は、既定の Visual Studio のセットです。This MDA is in the default set for Visual Studio. Mda を無効にする方法については、次を参照してください。マネージ デバッグ アシスタントによるエラーの診断します。For information about how to disable MDAs, see Diagnosing Errors with Managed Debugging Assistants.

解像度Resolution

STA メッセージ ポンプに関する COM 規則に従います。Follow COM rules regarding STA message pumping.

ランタイムへの影響Effect on the Runtime

この MDA は CLR に影響しません。This MDA has no effect on the CLR. COM コンテキストに関するデータを報告するだけです。It only reports data about COM contexts.

出力Output

現在のコンテキストおよびターゲット コンテキストを説明するメッセージです。A message describing the current context and the target context.

構成Configuration

<mdaConfig>
  <assistants>
    <contextSwitchDeadlock />
  </assistants>
</mdaConfig>

関連項目See also