contextSwitchDeadlock MDA

메모

이 문서는 .NET Framework와 관련이 있습니다. .NET 6 이상 버전을 포함하여 .NET의 최신 구현에는 적용되지 않습니다.

contextSwitchDeadlock MDA(관리 디버깅 도우미)는 COM 컨텍스트 전환을 시도하는 동안 교착 상태가 감지되면 활성화됩니다.

Symptoms

가장 일반적인 증상은 관리 코드에서 관리되지 않는 COM 구성 요소에 대한 호출이 반환되지 않는다는 것입니다. 또 다른 증상은 시간이 지남에 따라 증가하는 메모리 사용량입니다.

원인

가장 가능성이 큰 원인은 STA(단일 스레드 아파트) 스레드가 메시지를 펌핑하지 않는다는 것입니다. STA 스레드는 메시지를 펌핑하지 않고 대기 중이거나 긴 작업을 수행하고 있으며 메시지 큐를 펌핑할 수 없습니다.

시간이 지남에 따라 메모리 사용량이 증가하는 것은 종료자 스레드가 관리되지 않는 COM 구성 요소에 대한 호출 Release 을 시도하고 해당 구성 요소가 반환되지 않기 때문입니다. 이렇게 하면 종료자가 다른 개체를 회수할 수 없습니다.

기본적으로 Visual Basic 콘솔 애플리케이션의 주 스레드에 대한 스레딩 모델은 STA입니다. 이 MDA는 STA 스레드가 공용 언어 런타임 또는 타사 컨트롤을 통해 직접 또는 간접적으로 COM 상호 운용성을 사용하는 경우 활성화됩니다. Visual Basic 콘솔 애플리케이션에서 이 MDA를 활성화하지 않도록 하려면 주 메서드에 특성을 적용 MTAThreadAttribute 하거나 메시지를 펌핑하도록 애플리케이션을 수정합니다.

다음 조건이 모두 충족되면 이 MDA가 잘못 활성화될 수 있습니다.

  • 애플리케이션은 라이브러리를 통해 직간접적으로 STA 스레드에서 COM 구성 요소를 만듭니다.

  • 애플리케이션이 디버거에서 중지되었고 사용자가 애플리케이션을 계속하거나 단계 작업을 수행했습니다.

  • 관리되지 않는 디버깅을 사용할 수 없습니다.

MDA가 잘못 활성화되는지 확인하려면 모든 중단점을 사용하지 않도록 설정하고, 애플리케이션을 다시 시작하고, 중지하지 않고 실행하도록 허용합니다. MDA가 활성화되지 않은 경우 초기 활성화가 false일 수 있습니다. 이 경우 디버깅 세션의 간섭을 방지하기 위해 MDA를 사용하지 않도록 설정합니다.

메모

이 MDA는 Visual Studio 대한 기본 집합에 있습니다. MDA를 사용하지 않도록 설정하는 방법에 대한 자세한 내용은 관리되는 디버깅 도우미를 사용하여 오류 진단을 참조하세요.

해결 방법

STA 메시지 펌핑과 관련된 COM 규칙을 따릅니다.

런타임에 미치는 영향

이 MDA는 CLR에 영향을 주지 않습니다. COM 컨텍스트에 대한 데이터만 보고합니다.

출력

현재 컨텍스트 및 대상 컨텍스트를 설명하는 메시지입니다.

구성 / 설정

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

참고하십시오