contextSwitchDeadlock MDA

contextSwitchDeadlock Asystent zarządzanego debugowania (MDA) jest aktywowany po wykryciu zakleszczenia podczas próby przejścia kontekstu COM.

Objawy

Najczęstszym objawem jest to, że wywołanie niezarządzanego składnika COM z kodu zarządzanego nie zwraca. Innym objawem jest wzrost użycia pamięci w czasie.

Przyczyna

Najbardziej prawdopodobną przyczyną jest to, że jednowątkowy wątek mieszkania (STA) nie pompuje wiadomości. Wątek STA czeka bez pompowania komunikatów lub wykonuje długotrwałe operacje i nie zezwala na pompowanie kolejki komunikatów.

Zwiększenie użycia pamięci w czasie jest spowodowane przez wątek finalizatora próbujący wywołać Release niezarządzany składnik COM i ten składnik nie jest zwracany. Zapobiega to odzyskiwaniu innych obiektów przez finalizator.

Domyślnie model wątkowy dla głównego wątku aplikacji konsolowych Visual Basic to STA. To rozwiązanie MDA jest aktywowane, jeśli wątek STA korzysta z współdziałania modelu COM bezpośrednio lub pośrednio za pośrednictwem środowiska uruchomieniowego języka wspólnego lub kontroli innej firmy. Aby uniknąć aktywowania tego rozwiązania MDA w aplikacji konsolowej Visual Basic, zastosuj MTAThreadAttribute atrybut do metody main lub zmodyfikuj aplikację w celu pompowania komunikatów.

Istnieje możliwość, że ta usługa MDA zostanie aktywowana fałszywie po spełnieniu wszystkich następujących warunków:

  • Aplikacja tworzy składniki COM z wątków STA bezpośrednio lub pośrednio za pośrednictwem bibliotek.

  • Aplikacja została zatrzymana w debugerze, a użytkownik kontynuował aplikację lub wykonał operację kroku.

  • Debugowanie niezarządzane nie jest włączone.

Aby określić, czy rozwiązanie MDA jest aktywowane fałszywie, wyłącz wszystkie punkty przerwania, uruchom ponownie aplikację i zezwól na jej uruchamianie bez zatrzymywania. Jeśli usługa MDA nie jest aktywowana, prawdopodobnie początkowa aktywacja była fałszywa. W takim przypadku wyłącz usługę MDA, aby uniknąć ingerencji w sesję debugowania.

Uwaga

Ta usługa MDA jest w domyślnym zestawie dla programu Visual Studio. Aby uzyskać informacje na temat wyłączania funkcji MDA, zobacz Diagnozowanie błędów za pomocą asystentów zarządzanego debugowania.

Rozwiązanie

Postępuj zgodnie z regułami COM dotyczącymi pompowania komunikatów STA.

Wpływ na środowisko uruchomieniowe

To MDA nie ma wpływu na CLR. Raportuje tylko dane dotyczące kontekstów COM.

Dane wyjściowe

Komunikat opisujący bieżący kontekst i kontekst docelowy.

Konfigurowanie

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

Zobacz też