Dela via


contextSwitchDeadlock MDA

Kommentar

Den här artikeln är specifik för .NET Framework. Det gäller inte för nyare implementeringar av .NET, inklusive .NET 6 och senare versioner.

Den contextSwitchDeadlock hanterade felsökningsassistenten (MDA) aktiveras när ett dödläge identifieras under ett försök till COM-kontextövergång.

Symtom

Det vanligaste problemet är att ett anrop på en ohanterad COM-komponent från hanterad kod inte returneras. Ett annat symptom är att minnesanvändningen ökar med tiden.

Orsak

Den mest sannolika orsaken är att en sta-tråd (single-threaded apartment) inte pumpar meddelanden. STA-tråden väntar antingen utan att pumpa meddelanden eller utför långa åtgärder och tillåter inte att meddelandekön pumpar.

Minnesanvändningen ökar med tiden orsakas av att finalizertråden försöker anropa Release en ohanterad COM-komponent och att komponenten inte returneras. Detta förhindrar att finalizern återtar andra objekt.

Som standard är trådningsmodellen för huvudtråden i Visual Basic-konsolprogram STA. Denna MDA aktiveras om en STA-tråd använder COM-samverkan direkt eller indirekt via den gemensamma språkkörningen eller en kontroll från tredje part. Om du vill undvika att aktivera denna MDA i ett Visual Basic-konsolprogram använder du MTAThreadAttribute attributet för huvudmetoden eller ändrar programmet för att pumpa meddelanden.

Det är möjligt att denna MDA aktiveras felaktigt när alla följande villkor uppfylls:

  • Ett program skapar COM-komponenter från STA-trådar antingen direkt eller indirekt via bibliotek.

  • Programmet stoppades i felsökningsprogrammet och användaren fortsatte antingen programmet eller utförde en stegåtgärd.

  • Ohanterad felsökning är inte aktiverat.

För att avgöra om MDA aktiveras felaktigt inaktiverar du alla brytpunkter, startar om programmet och tillåter att det körs utan att stoppa. Om MDA inte är aktiverat är det troligt att den första aktiveringen var falsk. I det här fallet inaktiverar du MDA för att undvika störningar i felsökningssessionen.

Kommentar

Denna MDA finns i standarduppsättningen för Visual Studio. Information om hur du inaktiverar MDA finns i Diagnostisera fel med hanterade felsökningsassistenter.

Åtgärd

Följ COM-reglerna för STA-meddelandepumpning.

Effekt på körningen

Denna MDA har ingen effekt på CLR. Den rapporterar endast data om COM-kontexter.

Output

Ett meddelande som beskriver den aktuella kontexten och målkontexten.

Konfiguration

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

Se även