Condividi tramite


MDA contextSwitchDeadlock

L'assistente al debug gestito contextSwitchDeadlock viene attivato quando viene rilevato un deadlock durante un tentativo di transizione di contesto COM.

Sintomi

Il sintomo più comune consiste nella mancata restituzione di una chiamata su un componente COM non gestito dal codice gestito. Un altro sintomo può essere l'incremento dell'utilizzo di memoria nel tempo.

Causa

La causa più probabile è la mancata distribuzione di messaggi da parte di un thread STA. È possibile che il thread sia in uno stato di attesa durante il quale non distribuisce messaggi oppure stia eseguendo operazioni di lunga durata impedendo la distribuzione dei messaggi in coda.

L'incremento dell'utilizzo di memoria nel tempo è causato dal tentativo del thread finalizzatore di chiamare Release su un componente COM non gestito e dalla mancata restituzione di tale componente. In questo modo il finalizzatore non può recuperare altri oggetti.

Per impostazione predefinita, il modello di threading per il thread principale delle applicazioni console Visual Basic è STA. L'assistente al debug gestito viene attivato se un thread STA utilizza l'interoperabilità COM direttamente o indirettamente attraverso Common Language Runtime o un controllo di terze parti. Per evitarne l'attivazione in un'applicazione console Visual Basic, applicare l'attributo MTAThreadAttribute al metodo principale o modificare l'applicazione per la distribuzione dei messaggi.

È possibile che l'assistente al debug gestito sia stato falsamente attivato quando sono soddisfatte tutte le condizioni riportate di seguito.

  • Un'applicazione crea componenti COM da thread STA direttamente o indirettamente attraverso le librerie.

  • L'applicazione è stata interrotta nel debugger e l'utente ha continuato ad eseguirla o ha effettuato un'operazione di interruzione.

  • Il debug non gestito non è attivato.

Per determinare se l'assistente al debug gestito è stato attivato falsamente, disabilitare tutti i punti di interruzione, riavviare l'applicazione e consentirne l'esecuzione senza interromperla. Se l'assistente non è attivato, è probabile che l'attivazione iniziale fosse falsa. In tal caso, disabilitarlo per evitare interferenze con la sessione di debug.

NotaNota

Questo assistente al debug gestito si trova nell'insieme predefinito di Visual Studio 2005 e versioni successive.Quando si attiva il processo di hosting in Visual Studio non è possibile disabilitare gli assistenti al debug gestito che si trovano nell'insieme predefinito.Poiché il processo di hosting viene attivato per impostazione predefinita, deve essere disabilitato in modo esplicito.Per informazioni sulla disabilitazione di assistenti al debug gestito, vedere "Attivazione e disabilitazione di assistenti al debug gestito" nella sezione Diagnostica degli errori tramite gli assistenti al debug gestito.

Risoluzione

Seguire le regole COM relative alla distribuzione di messaggi STA.

Effetto sul runtime

Questo assistente al debug gestito non produce effetti su CLR. Si limita a generare un report dei dati relativi ai contesti COM.

Output

Un messaggio in cui sono descritti il contesto attuale e quello di destinazione.

Configurazione

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

Vedere anche

Riferimenti

MarshalAsAttribute

Concetti

Diagnostica degli errori tramite gli assistenti al debug gestito

Marshalling di interoperabilità

Altre risorse

Interoperabilità