Impossibile ottenere il valore di local o argomento in quanto non è disponibile in questo puntatore di istruzione, probabilmente perché è stato ottimizzato


212

Visual Studio 2010 uccide (non c'è altra parola) i dati in uno degli argomenti della funzione nel blocco non sicuro. Cosa potrebbe causare questo errore? Il seguente messaggio viene visualizzato dal debugger.

Cannot obtain value of local or argument as it is not available at this instruction pointer, possibly because it has been optimized away.

2
ho esattamente lo stesso problema e sto usando Debug build. Cannot obtain value of local or argument '<this>' as it is not available at this instruction pointer, possibly because it has been optimized away. System.Threading.Tasks.TaskExceptionHolder
javapowered il

19
Spiacenti, ho appena selezionato la versione selezionata per errore.
Daniel Little,

Sto riscontrando questo problema in VS 2017 e ho seguito tutte le istruzioni nei post seguenti. Ci sono altre opzioni?
Matt W,

Non dimenticare Menu Build -> Configuration Manager. La configurazione deve essere impostata su Debug lì o il problema persiste.
Bob Clegg,

Risposte:


347

Vai su Proprietà progetto e in Costruisci Assicurati che la casella di controllo "Ottimizza codice" sia deselezionata.

Inoltre, imposta il menu a discesa "Informazioni debug" su "Completo" nelle Opzioni avanzate (scheda Crea).


129
Innanzitutto, controlla che Build Configuration sia Debug, non Release.
ApceH Hypocrite,

A proposito, se vuoi testarlo in modalità Release, puoi aggiungere "Debugger.Launch ();" nel codice
Jason,

Ha fatto entrambi i passaggi e ha cambiato la configurazione da "Rilascio" a "Build". Ha lavorato su Visual Studio 2017 Community Edition.
Neo

1
Se hai VS 2017, saranno d'aiuto sia la risposta accettata che la risposta di xyq.384.b. Per me la risposta di xyq.384.b è stata la correzione dato che era il debugger JIT che stava sopprimendo il puntatore ... Mi dispiace che JIT lo abbia "ottimizzato" ...
BillRuhl,

Dopo essere passato alla configurazione di debug ho scoperto che la casella di codice di ottimizzazione era già deselezionata. Lezione appresa: non eseguire il debug in modalità di configurazione della versione.
eliteproxy,

135

Anche in VS 2015 Community Edition

vai su Debug-> Opzioni o Strumenti-> Opzioni

e controlla il debug-> Generale-> Sopprima l'ottimizzazione JIT sul carico del modulo (solo gestito)


7
Ciò ha risolto il mio problema dopo aver applicato tutte le soluzioni sopra menzionate.
masih,

1
Nessuna delle risposte suggerite funziona per me. Le mie variabili sono ancora ottimizzate via ...
Sushi271

Non ho idea del motivo per cui questo ha iniziato improvvisamente ad accadere ... ma questo l'ha risolto!
Murphybro2

Santa merda, anche questo mi ha risolto nella community VS2017! Non ho idea di quando o come questa opzione sia stata deselezionata ...
Ian Kemp il

Funziona come un campione!
BillRuhl,

59

Se si compila con le ottimizzazioni abilitate, verranno rimosse molte variabili; per esempio:

SomeType value = GetValue();
DoSomething(value);

qui la variabile locale valueverrebbe normalmente rimossa, mantenendo invece il valore nello stack - un po 'come se avessi scritto:

DoSomething(GetValue());

Inoltre, se un valore di ritorno non viene utilizzato affatto , verrà eliminato tramite "pop" (anziché memorizzato in un locale tramite "stloc", e di nuovo; il locale non esisterà).

Per questo valuemotivo , in una tale build il debugger non può ottenere il valore corrente di perché non esiste - esiste solo per il breve istante tra GetValue()e DoSomething(...).

Così; se vuoi eseguire il debug ... non usare una build di rilascio! o almeno disabilita le ottimizzazioni durante il debug.


4
Grazie per la tua risposta, ma controllo Ottimizza proprietà codice nel mio progetto e non è selezionato = (
curiosità

4
@Marc - Capisco quello che stai dicendo, tuttavia, sto usando le librerie dei sorgenti di riferimento di Microsoft per programmare la loro merda. Sto esaminando i metodi ora, ma non riesco a guardare nessuno dei valori della gente del posto. Qual è il punto di debug del sorgente .Net allora? Eventuali suggerimenti? stackoverflow.com/questions/13147132/...
one.beat.consumer

Sembra che stia facendo la stessa cosa di @ one.beat.consumer: tentare di passare attraverso i simboli pubblici di Microsoft per capire perché il framework ASP.NET non funziona. Nel mio caso, la rilegatura dei modelli in MVC 3 ...
bambams,

@ one.beat.consumer Sto assumendo perché i riferimenti microsoft sono stati compilati con l'ottimizzazione abilitata, quindi anche se puoi scaricare il loro codice sorgente per vederlo passare attraverso i valori spariti, proprio come se compili il tuo progetto con ottimizzazioni abilitato. È specifico del progetto (dll) - se riesci a ottenere versioni "debug" dei riferimenti MS, allora sarai in grado di vedere i valori. Non dimenticare che se la dll MS faceva riferimento a un altro progetto a cui fa riferimento il tuo progetto principale, il "riferimento secondario" potrebbe corrispondere alle impostazioni dell'altro progetto.
drzaus,


20

Mi sono appena imbattuto in questo e stavo correndo in Releaseconfigurazione build invece di Debugconfigurazione build. Una volta sono tornato alla Debugmia variabile mostrata di nuovo nell'orologio.



8

Quando ho dovuto affrontare lo stesso problema, ho dovuto pulire la mia soluzione prima di ricostruire. Mi sono preso cura di me.


6

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.


1
Il secondo suggerimento ha reso tutto di nuovo funzionante grazie!
CodeMilian,

1
In VS 2015, non vedo Enable unmanaged code debugging. V'è Enable native code debugging, ho provato a controllare questo, ma non faceva alcuna differenza.
Al Lelopath,

1
In VS 2015 ho controllato Abilita "Codice nativo" nella build del progetto, Web, Debugger e tutto ha funzionato.
Mouffette,

6

Ho affrontato lo stesso problema e la soluzione per me è cambiare Solution Configurationda Releasea Debug. Spero che sia d'aiuto


4

Nel mio caso, stavo lavorando a un progetto API Web e sebbene il progetto fosse impostato correttamente sul debug completo, stavo ancora vedendo questo errore ogni volta che mi sono collegato al processo IIS che stavo cercando di eseguire il debug. Quindi ho realizzato che il profilo di pubblicazione era impostato per utilizzare la configurazione di rilascio. Quindi un altro posto da controllare è il tuo profilo di pubblicazione se stai usando la funzione "Pubblica" del tuo progetto API Web dotnet.


3

Ho scoperto di avere lo stesso problema durante l'esecuzione di un progetto e il debug collegandomi a un processo IIS. Inoltre stavo correndo in modalità Debug con le ottimizzazioni disattivate. Mentre pensavo che il codice fosse compilato correttamente, quando mi sono staccato e ho provato a compilare, uno dei riferimenti non è stato trovato. Ciò è dovuto a un altro sviluppatore che ha apportato modifiche e modificato la posizione del riferimento. Il riferimento non è stato visualizzato con il simbolo di avviso, quindi ho pensato che tutto andasse bene fino a quando non ho fatto la compilazione. Una volta risolto il problema e eseguito nuovamente, ha funzionato.


1

Come ulteriore risposta per coloro che riscontrano questo problema durante il debug di un'app Web di siti Web di Azure:

Durante la distribuzione da GitHub, ad esempio, il codice viene compilato nel server di Azure ottimizzato per impostazione predefinita.

Dico al server di compilare in modo debuggable impostando SCM_BUILD_ARGSsu/p:Configuration=Debug

ma ci sono più opzioni. Vedi questo: http://azure.microsoft.com/blog/2014/05/08/introduction-to-remote-debugging-on-azure-web-sites-part-3-multi-instance-environment-and-git /


1

In Visual Studio 2012:

Vai alle proprietà del progetto -> Debug -> Deseleziona "Abilita il processo di hosting di Visual Studio"


1

Per le applicazioni Web esiste un altro problema importante che sta selezionando la configurazione corretta durante il processo di pubblicazione dell'applicazione.

Puoi creare la tua app in modalità debug, ma potrebbe accadere che tu la pubblichi in modalità di rilascio che omette il codice per impostazione predefinita, ma IDE potrebbe indurti in errore poiché mostra la modalità di debug mentre il codice pubblicato è in modalità di rilascio. Puoi vedere i dettagli nell'istantanea di seguito: inserisci qui la descrizione dell'immagine


0

Controlla se hai un attributo Debuggable nel tuo file AssemblyInfo. In tal caso, rimuoverlo e ricostruire la soluzione per vedere se le variabili locali diventano disponibili.

Il mio attributo debuggable è stato impostato su: DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints che secondo questo articolo MSDN dice al compilatore JIT di usare le ottimizzazioni. Ho rimosso questa riga dal mio file AssemblyInfo.cs e le variabili locali erano disponibili.


0

In Visual Studio 2017 o 2015:

Vai alla soluzione fai clic destro sulla soluzione, quindi seleziona Proprietà-> seleziona tutte le configurazioni-> Debug, quindi fai clic su OK. Dopo che Rebuild and Run, questa soluzione ha funzionato per me.


0

Ho avuto lo stesso problema. Ho provato tutto quanto sopra e ho scoperto che dovevo anche eliminare tutto all'interno di {PROJECT_ROOT} \ bin \ Release \ netcoreapp2.2 e {PROJECT_ROOT} \ obj \ Release \ netcoreapp2.2 per il mio progetto. È decisamente legato alla pubblicazione perché, sebbene io utilizzi gli strumenti di distribuzione / bitbucket nella mia app Web di Azure, ho provato a compilare >> Pubblica >> Pubblica in Azure perché volevo controllare quali file erano effettivamente distribuiti.


0

Ho avuto lo stesso problema in precedenza con un'applicazione WPF e tutte le soluzioni qui NON hanno risolto il problema . Il problema era che il modulo era già ottimizzato, quindi le seguenti soluzioni NON FUNZIONANO (o non sono sufficienti per risolvere il problema):

  • Casella di controllo " Ottimizza codice " non selezionata
  • " Sopprimere l'ottimizzazione JIT al caricamento del modulo " selezionato
  • Configurazione della soluzione su DEBUG

Il modulo è ancora caricato Ottimizzato. Vedi la seguente schermata: Modulo ottimizzato


Per risolvere questo problema devi eliminare il modulo ottimizzato. Per trovare il percorso del modulo ottimizzato è possibile utilizzare uno strumento come Process Hacker .

Fare doppio clic sul programma nel " Pannello dei processi ", quindi nella nuova finestra aprire la scheda " .NET Assembly ". Quindi nella colonna " Percorso immagine nativa " trovi tutti i percorsi dei moduli ottimizzati . Individua quello che vuoi de-ottimizzare ed elimina la cartella (vedi screenshot sotto): inserisci qui la descrizione dell'immagine (Ho sfocato il nome della mia azienda per ovvi motivi)

Riavvia l'applicazione (con la casella di controllo nel passaggio 1 selezionata correttamente) e dovrebbe funzionare.

Nota : il file potrebbe essere bloccato poiché è stato aperto da un altro processo, provare a chiudere Visual Studio. Se il file è ancora bloccato, è possibile utilizzare un programma come Lock Hunter

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.