"Impossibile valutare l'espressione perché il codice del metodo corrente è ottimizzato" in Visual Studio 2010


153

Sto usando Visual Studio 2010 in modalità debug e ho "ottimizza il codice" deselezionato. Non riesco a guardare rapidamente (o passare con il mouse su) qualsiasi variabile nel debugger. Ottengo questo errore "Impossibile valutare l'espressione perché il codice del metodo corrente è ottimizzato".

Anche una riga come: int i = -3, facendo una rapida occhiata su i, ottengo "Impossibile ottenere il valore di locale o argomento 'i' in quanto non è disponibile in questo puntatore di istruzione, probabilmente perché è stato ottimizzato via."

Questo link a cui fa riferimento una domanda simile non sembra applicarsi.

C'è un'impostazione che mi manca?


4
torulflundgren.blogspot.com.au/2010/03/… Questa è la soluzione migliore che ho trovato per questo. Ho provato questo su Visual Studio 2013. e
ho

Risposte:


167

Mentre il progetto era in modalità debug, la soluzione non lo era. Quando l'ho cambiato, ha funzionato.


9
Ho riscontrato questo problema in VS2012, tuttavia la soluzione e tutti i progetti sono stati impostati su Debug senza ottimizzazione. Pulisco soluzione / ricostruzione risolto per me.
Saarp

20
Quindi ... Come si imposta la soluzione in modalità non debug?
user1431072,

user1431072 - fai clic con il pulsante destro del mouse sulla soluzione o sul progetto e scegli la proprietà, quindi puoi impostarla come modalità di debug
Yevgraf Andreyevich Zhivago

48

Ho avuto questo problema quando stavo usando VS 2010. La mia soluzione di configurazione è stata selezionata (Debug). Ho risolto questo deselezionando la proprietà Ottimizza codice nelle proprietà del progetto. Progetto (clic destro) => Proprietà => Genera (scheda) => deseleziona Ottimizza codice


29

Sembra che tu stia eseguendo il debug di una build ottimizzata / di rilascio, nonostante la casella ottimizzata sia deselezionata. Le cose che puoi provare sono:

  • Esegui una ricostruzione completa del file della soluzione (fai clic con il pulsante destro del mouse sulla soluzione e seleziona Ricostruisci tutto)
  • Durante il debug aprire la finestra dei moduli (Debug -> Windows -> Moduli) e trovare il proprio assieme nell'elenco dei moduli caricati. Verificare che il percorso elencato nell'assembly caricato sia quello previsto e che il timestamp modificato del file indichi che l'assembly è stato effettivamente ricostruito.
  • La finestra dei moduli dovrebbe anche indicare se il modulo caricato è ottimizzato o meno - assicurarsi che la finestra dei moduli indichi che non è ottimizzato.

Se non riesci a visualizzare la voce di menu Moduli nel menu Debug -> Windows, potrebbe essere necessario aggiungerla nel menu "Personalizza ...".


2
La soluzione è stata ricostruita. La finestra dei moduli mostra che l'assemblaggio è ottimizzato. La casella di controllo Ottimizza è deselezionata, quindi non so perché l'assemblaggio sia sempre ottimizzato. La soluzione ha un progetto web ma il codice che sto guardando è in un progetto di libreria di classi in modalità debug.
Tony_Henrich

@Tony - Domanda sciocca, ma la libreria di classi ha la casella di controllo "Ottimizzata" deselezionata?
Giustino,

Sì. Ho menzionato questo fatto nella mia domanda. Ho già risposto alla mia domanda.
Tony_Henrich

1
Il mio Project.Webha l'ottimizzazione deselezionata, ma mostra ancora come ottimizzato quando guardo il suo assemblaggio in Debug > Modules:(
J86

L'unico modo in cui ho scoperto di forzare VS ad aggiornare le informazioni di debug era aumentare la versione dell'assembly del modulo che era ancora considerata ottimizzata mentre l'opzione non era selezionata.
Alphanoch,

14

In VS2013 vai a: Strumenti -> Opzioni -> Debug -> Generale e abilita 'Usa la modalità di compatibilità gestita'. Ciò disabilita il nuovo comportamento di valutazione delle funzioni.


Grazie! Delle altre soluzioni offerte, questa era quella che contava per me. La cosa strana è stata all'improvviso, mi chiedo cosa l'abbia cambiato.
squid808,

10

Prova a eseguire la modalità di debug. Se stai eseguendo la modalità di rilascio riceverai questo messaggio.


5
La domanda dice: "Sto usando Visual Studio 2010 in modalità debug e ho" Ottimizza codice "deselezionato." ... dovresti eliminare questa non risposta.
Jim Balter,

Sul serio. Lo dice nella domanda che sta eseguendo il debug. Non capisco perché i voti. Questa risposta inquina le possibili risoluzioni
John Demetriou,

1
FWIW, questa domanda si colloca molto bene su Google quando cerchi questo messaggio di errore. Questa risposta era corretta per me (non mi ero reso conto di essere in modalità di rilascio).
Nate Barbettini,

Potrebbe avere più di un assembly e nel gestore della configurazione è possibile impostare l'assembly su cui sta eseguendo il debug su release o sth.
madoxdev,

8

La mia situazione non era coperta da nessuna delle risposte di cui sopra. Ho trovato quanto segue: articolo MSDN sul threading che spiega che quando bloccato in alcune operazioni di threading nativo primitivo, il debugger non può accedere ai dati. Ad esempio, quando un thread è seduto su Task.Wait (), questo si presenta.


8

Ho avuto lo stesso problema. Ma nel mio caso, l' Debuggableattributo era codificato nel AssemblyInfo.csfile del mio progetto e quindi non (sovra) scritto dalla compilazione. Ha funzionato dopo aver rimosso la riga specificando l' Debuggableattributo.


8

Per me stava succedendo in VS2017 e VS2019. Ha smesso di succedere dopo aver selezionato l'opzione "Soppressione dell'ottimizzazione JIT al caricamento del modulo".

inserisci qui la descrizione dell'immagine


+1, questo è stato la causa del mio problema. VS non sembra molto bravo a capire effettivamente le opzioni di csproj poiché ho ottimizzato disattivato in XML quando la configurazione termina con "Debug". Funziona bene quando si chiama MSBuild direttamente ma non proprio in VS stesso.
TheBeardedQuack

5

Ho avuto lo stesso problema in VS2008. Nel mio caso è stato risolto tramite la ricostruzione della soluzione.


4

A parte @Kragen menzionato, se stai eseguendo il debug di un progetto web

chiudere Visual Studio e provare a eliminare i file temporanei in C: \ Windows \ Microsoft.NET \ Framework \ v2.0.50727 \ File ASP.NET temporanei


La soluzione ha un progetto Web ma il codice è nel progetto di libreria di classi. Ho eliminato i file temporanei molte volte.
Tony_Henrich

4

Un'altra cosa che puoi fare è creare un file con lo stesso nome della dll ottimizzato ma con estensione ini e aggiungere quanto segue:

[Controllo debug .NET Framework]
GenerateTrackingInfo = 1
AllowOptimize = 0

Questo dirà alla JIT di non ottimizzare le variabili.

Nota che hai ancora bisogno del pdb, quindi finirai con qualcosa del genere: yourDll.dll yourDll.pdb yourDll.ini

Funziona particolarmente bene in scenari in cui non si ha accesso per rigenerare le DLL con l'opzione di debug.

http://www.hanselman.com/blog/DebugVsReleaseTheBestOfBothWorlds.aspx


4

Quando viene visualizzato il messaggio " Impossibile valutare l'espressione perché il codice del metodo corrente è ottimizzato " dopo aver emesso unDebugger.Break() un'istruzione, assicurarsi di premere F10 per passare all'istruzione successiva.

Una volta passati all'istruzione successiva e supponendo che tu stia eseguendo una build di debug, questo messaggio dovrebbe scomparire.


2
Questo è stato. Ho provato tutte le soluzioni sopra e questa piccola cosa ha funzionato .. Grazie per averlo condiviso, sprecherei ancora più ore senza vedere questo banale suggerimento ..
Krzysztof Szynter

Nop. Non ha funzionato. Vs17 pensa ancora che sto eseguendo il debug di una build di rilascio
John Demetriou,

3

Per quanto riguarda il problema con la proprietà "Ottimizza codice" che è NON CONTROLLATO ma il codice è ancora compilato come ottimizzato: ciò che alla fine mi ha aiutato dopo aver provato tutto è stato selezionare la casella di controllo "Abilita debug di codice non gestito" nella stessa pagina delle impostazioni (Proprietà progetto - Debug). Non si riferisce direttamente all'ottimizzazione del codice, ma con questo abilitato, VS non ottimizza più la mia libreria e posso eseguire il debug.


3

Ho avuto lo stesso problema durante il debug di una libreria di classi da un'app Web testbed. Mi riferivo alla versione di rilascio nel banco di prova e che era impostato per essere ottimizzato nelle proprietà della libreria di classi.

Deselezionando la casella di controllo Ottimizza codice per la versione di rilascio nelle proprietà della libreria di classi, proprio mentre la scrivo, il problema è stato risolto.


Grazie lo ha fatto. È possibile trovare questa casella di controllo facendo clic con il pulsante destro del mouse su ogni progetto e selezionando la relativa opzione del menu "Proprietà", quindi la scheda "Crea".
Goamn,

3

Mi rendo conto che questa è una risposta successiva, ma ho trovato un altro riferimento a un modo di affrontare questo problema che potrebbe aiutare gli altri in futuro. Questa pagina web descrive l'impostazione di una variabile d'ambiente (COMPLUS_ZapDisable = 1) che impedisce l'ottimizzazione, almeno per me! (Non dimenticare la seconda parte della disabilitazione del processo di hosting di Visual Studio.) Nel mio caso, questo potrebbe essere stato ancora più rilevante perché stavo eseguendo il debug di una DLL esterna tramite un server di simboli, ma non ne sono sicuro.


3

Ho avuto questo problema con un progetto F # che era stato qua e là tra Visual Studio e MonoDevelop, forse originando in quest'ultimo (dimentico). In VS, la casella di ottimizzazione era deselezionata, ma l'ottimizzazione sembrava certamente avvenire per quanto riguardava il debugger.

Dopo aver confrontato l'XML del file di progetto con quello di uno sano, il problema era evidente: il progetto sano aveva un esplicito <optimize>false</optimize> linea , mentre quello cattivo lo mancava completamente. VS stava ovviamente inferendo dalla sua assenza che l'ottimizzazione era disabilitata, mentre il compilatore stava facendo il contrario.

La soluzione era aggiungere questa proprietà al file di progetto e ricaricare.


1

Ho iniziato a ricevere questo messaggio quando sono passato a Visual Studio 2017. Nessuna delle idee in questa pagina che ho provato ha funzionato per me. In un altro post ho trovato questo suggerimento e DID ha funzionato - rimuovi:

[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]

... dal tuo file AssemblyInfo.


Ti amo @Crazy Cat. Mi è successo quando sono migrato su VS2019.
Antonio Rodríguez,

0

Ho avuto lo stesso problema in VS 2010. Ripulito e ricostruito la soluzione e ha funzionato.


0

Il commento di vickramds sopra, riferito a http://torulflundgren.blogspot.com.au/2010/03/cannot-obtain-value-of-local-or.html , lo ha fatto per me. Ho controllato tutto: cancellato tutti i file dll, pdb dalle cartelle bin locali, Clean, Rebuild, cancellato tutte le cartelle dei file temporanei ASP.NET, assicurato che fossero impostati flag TRACE / DEBUG, controllato i percorsi DLL, ecc.

Per metterlo giù in modo che non sia perso, per i progetti interessati:

Proprietà progetto -> Crea -> Avanzate -> Informazioni debug: completo.

Si desidera verificare di aver selezionato la configurazione di debug prima di eseguire questa operazione, a meno che, naturalmente, non si intendesse diversamente.


0

Se stai tentando di eseguire il debug di un progetto ASP.NET, assicurati che il menu a discesa Proprietà> Web> Server sia impostato su "IIS Express" (oltre a controllare tutto il resto qui).


0

Avevo misto DLL di estensione c ++ / cli mfc, che erano ottimizzate anche se la configurazione di debug (vista dalla finestra dei moduli VS 2017). Come suggerito dalla risposta precedente, ho modificato "In VS2013 vai a: Strumenti -> Opzioni -> Debug -> Generale e abilita 'Usa la modalità di compatibilità gestita'. Questo disabilita il nuovo comportamento di valutazione delle funzioni." Tali impostazioni si trovano anche in VS 2017.

Ma ciò non era abbastanza, quindi ho anche copiato l'impostazione UseDebugLibraries dal file di progetto di un'altra app MFC nel file di progetto di estensione dll.

    <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
      ...
      <UseDebugLibraries>true</UseDebugLibraries>

Quindi ricostruire e questo ha risolto il problema.


0

In Visual Studio 2012 abilitare l' opzione " Gestito " da Strumenti> Debug> Just-In-Time ha funzionato per me.

inserisci qui la descrizione dell'immagine

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.