Condividi tramite


Errore: il processo di destinazione è stato chiuso con codice 'code' durante la valutazione della funzione 'function'

Testo completo del Messaggio: il processo target è stato chiuso con codice 'code' durante la valutazione della funzione 'function'.

Per semplificare l'ispezione dello stato degli oggetti .NET, il debugger forza automaticamente l'esecuzione di altro codice nel processo sottoposto a debug (in genere metodi getter delle proprietà e funzioni ToString). Nella maggior parte degli scenari, queste funzioni vengono completate correttamente o generano eccezioni che possono essere rilevate dal debugger. Tuttavia, esistono alcune circostanze in cui le eccezioni non possono essere rilevate perché superano i limiti del kernel, richiedono il pumping dei messaggi dell'utente o non sono recuperabili. Di conseguenza, un metodo getter o ToString di proprietà che esegue codice che termina in modo esplicito il processo (ad esempio, chiama ExitProcess()) o genera un'eccezione non gestita che non può essere intercettata ,ad esempio , StackOverflowExceptiontermina il processo sottoposto a debug e termina la sessione di debug. Se viene visualizzato questo messaggio di errore, si è verificato questo errore.

Un motivo comune per questo problema è che quando il debugger valuta una proprietà che chiama se stessa, ciò potrebbe comportare un'eccezione di overflow dello stack. Non è possibile recuperare l'eccezione di overflow dello stack e il processo interessato termina.

Per correggere l'errore

Esistono due possibili soluzioni a questo problema.

Soluzione 1: Impedire al debugger di chiamare la proprietà getter o il metodo ToString

Il messaggio di errore visualizza il nome della funzione che il debugger ha tentato di chiamare. Con il nome della funzione, è possibile provare a rivalutare tale funzione dalla finestra Immediata per eseguire il debug della valutazione. Il debug è possibile quando si valuta dalla finestra Immediata perché, a differenza delle valutazioni implicite dalle finestre Autos/Variabili locali/Espressioni di controllo, il debugger si interrompe in caso di eccezioni non gestite.

Se è possibile modificare questa funzione, è possibile impedire al debugger di chiamare il getter o ToString il metodo della proprietà. Provare a eseguire una delle operazioni seguenti:

  • Modifica il metodo in un altro tipo di codice diverso da un getter di proprietà o al metodo ToString, e in questo modo il problema viene risolto.

    oppure

  • (Per ToString) Definire un DebuggerDisplay attributo nel tipo ed è possibile fare in modo che il debugger valuti un valore diverso da ToString.

    oppure

  • (Per un getter di proprietà) Inserisci l'attributo [System.Diagnostics.DebuggerBrowsable(DebuggerBrowsableState.Never)] sulla proprietà. Ciò può essere utile se si dispone di un metodo che deve rimanere una proprietà per motivi di compatibilità con le API, ma deve essere davvero un metodo.

Se non è possibile modificare questo metodo, potrebbe essere possibile interrompere il processo di destinazione in un'istruzione alternativa e ripetere la valutazione.

Soluzione 2: Disabilitare tutta la valutazione implicita

Se le soluzioni precedenti non risolessero il problema, è possibile disabilitare la funzionalità Abilita valutazione proprietà .

Aprire il riquadro Opzioni strumenti> ed espandere la sezione Tutte le impostazioni>>. Deseleziona la casella di controllo Abilita valutazione proprietà e altre chiamate di funzione implicite.

Aprire la finestra di dialogo Opzioni strumenti> ed espandere la sezione Debug>. Deseleziona la casella di controllo Abilita valutazione delle proprietà e altre chiamate a funzioni implicite.

Questa modifica disabilita la maggior parte delle valutazioni implicite delle funzioni e deve risolvere il problema.