Share via


contextSwitchDeadlock-MDA

Aktualisiert: November 2007

Der contextSwitchDeadlock-MDA (Managed Debugging Assistant, Assistent für verwaltetes Debuggen) wird aktiviert, wenn während eines versuchten COM-Kontextübergangs ein Deadlock erkannt wurde.

Symptome

Das häufigste Symptom ist, dass der Aufruf einer nicht verwalteten COM-Komponente aus verwaltetem Programmcode nicht beendet wird. Ein weiteres Symptom ist eine mit der Zeit zunehmende Speicherauslastung.

Ursache

Die wahrscheinlichste Ursache ist, dass ein STA-Thread (Singlethread-Apartment) keine Meldungen weiterleitet. Der STA-Thread wartet entweder, ohne Meldungen weiterzuleiten, oder führt langwierige Operationen aus und gestattet es der Meldungswarteschlange nicht, Meldungen weiterzuleiten.

Die mit der Zeit zunehmende Speicherauslastung wird durch den Finalizerthread verursacht, der für eine nicht verwaltete COM-Komponente versucht, Release aufzurufen, ohne dass die Ausführung zurückgegeben wird. Dies verhindert, dass der Finalizer andere Objekte freigibt.

Standardmäßig ist das Threadingmodell für den Hauptthread von Visual Basic-Konsolenanwendungen das STA-Modell. Dieser MDA wird aktiviert, wenn ein STA-Thread direkt oder indirekt über die Common Language Runtime oder ein Drittanbieter-Steuerelement COM-Interoperabilität verwendet. Um die Aktivierung dieses MDA in einer Visual Basic-Konsolenenanwendung zu vermeiden, wenden Sie das MTAThreadAttribute-Attribut auf die Hauptmethode an, oder ändern Sie die Anwendung, um Meldungen weiterzuleiten.

Dieser MDA kann fälschlicherweise aktiviert werden, wenn alle folgenden Bedingungen zutreffen:

  • Eine Anwendung erstellt COM-Komponenten entweder direkt oder indirekt über Bibliotheken aus STA-Threads.

  • Die Anwendung wurde im Debugger angehalten, und der Benutzer hat die Ausführung der Anwendung fortgesetzt oder einen Ausführungsschritt durchgeführt.

  • Nicht verwaltetes Debuggen ist nicht aktiviert.

Um zu bestimmen, ob der MDA fälschlicherweise aktiviert wurde, deaktivieren Sie alle Haltepunkte, starten Sie die Anwendung neu, und führen Sie sie aus, ohne sie anzuhalten. Wenn der MDA nicht aktiviert ist, war die erste Aktivierung wahrscheinlich ein Fehler. Deaktivieren Sie in diesem Fall den MDA, um eine Störung der Debugsitzung zu vermeiden.

Hinweis:

Dieser MDA befindet sich in der standardmäßigen Teilmenge für Visual Studio 2005 und höhere Versionen. Wenn der Hostprozess in Visual Studio aktiviert ist, kann die Bereitstellung von MDAs, die sich in der standardmäßigen Teilmenge befinden, nicht aufgehoben werden. Der Hostprozess wird standardmäßig aktiviert, sodass er explizit deaktiviert werden muss. Informationen zum Aufheben der Bereitstellung von MDAs finden Sie im Abschnitt "Bereitstellen und Aufheben der Bereitstellung von MDAs" unter Diagnostizieren von Fehlern mit Assistenten für verwaltetes Debuggen.

Lösung

Befolgen Sie die COM-Regeln hinsichtlich der STA-Meldungsweiterleitung.

Auswirkungen auf die Laufzeit

Dieser MDA hat keine Auswirkungen auf die CLR. Es werden nur Angaben über COM-Kontexte gemeldet.

Ausgabe

Eine Meldung mit einer Beschreibung des aktuellen Kontexts und des Zielkontexts.

Konfiguration

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

Siehe auch

Konzepte

Diagnostizieren von Fehlern mit Assistenten für verwaltetes Debuggen

Übersicht über das Interop-Marshalling

Referenz

MarshalAsAttribute

Weitere Ressourcen

Interoperabilität