"Ausdruck kann nicht ausgewertet werden, da der Code der aktuellen Methode optimiert ist" in Visual Studio 2010

153

Ich verwende Visual Studio 2010 im Debug-Modus und habe "Code optimieren" deaktiviert. Ich kann keine Variable im Debugger schnell beobachten (oder mit der Maus darüber fahren). Ich erhalte die Fehlermeldung "Ausdruck kann nicht ausgewertet werden, da der Code der aktuellen Methode optimiert ist".

Sogar eine Zeile wie: int i = -3, wenn ich i schnell beobachte, erhalte ich "Kann den Wert von local oder argument 'i' nicht erhalten, da er an diesem Befehlszeiger nicht verfügbar ist, möglicherweise weil er wegoptimiert wurde."

Dieser Link, auf den in einer ähnlichen Frage verwiesen wird, scheint nicht zuzutreffen.

Gibt es eine Einstellung, die mir fehlt?

Tony_Henrich
quelle
4
torulflundgren.blogspot.com.au/2010/03/… Dies ist die beste Lösung, die ich dafür gefunden habe. Ich habe dies auf Visual Studio 2013 getestet und gearbeitet ....
Dulanjana Wickramatantri

Antworten:

167

Während sich das Projekt im Debug-Modus befand, war dies nicht der Fall. Als ich es geändert habe, hat es funktioniert.

Tony_Henrich
quelle
9
Ich hatte dieses Problem in VS2012, aber die Lösung und alle Projekte wurden ohne Optimierung auf Debug gesetzt. Ich habe die Lösung gereinigt / neu aufgebaut und für mich behoben.
Saarp
20
Also ... Wie stellen Sie die Lösung auf den Nicht-Debug-Modus ein?
user1431072
user1431072 - Sie direkt auf Ihrer Lösung oder Projekt klicken und Eigenschaft wählen, dann können Sie es Debug - Modus zu sein
Yevgraf Andreyevich Zhivago
48

Ich hatte dieses Problem, als ich VS 2010 verwendete. Meine Lösungskonfiguration wurde (Debug) ausgewählt. Ich habe dieses Problem behoben, indem ich die Eigenschaft Code optimieren unter Projekteigenschaften deaktiviert habe. Projekt (Rechtsklick) => Eigenschaften => Erstellen (Registerkarte) => Deaktivieren Sie Code optimieren

Vin
quelle
29

Es hört sich so an, als würden Sie einen optimierten Build / Release-Build debuggen, obwohl das Kontrollkästchen "Optimiert" deaktiviert ist. Dinge, die Sie versuchen können, sind:

  • Führen Sie eine vollständige Neuerstellung Ihrer Lösungsdatei durch (klicken Sie mit der rechten Maustaste auf die Lösung und wählen Sie Alle neu erstellen).
  • Öffnen Sie beim Debuggen das Modulfenster (Debug -> Windows -> Module) und suchen Sie Ihre Assembly in der Liste der geladenen Module. Überprüfen Sie, ob der für Ihre geladene Assembly aufgeführte Pfad Ihren Erwartungen entspricht und ob der geänderte Zeitstempel der Datei darauf hinweist, dass die Assembly tatsächlich neu erstellt wurde.
  • Das Modulfenster sollte Ihnen auch mitteilen, ob das geladene Modul optimiert ist oder nicht. Stellen Sie sicher, dass das Modulfenster anzeigt, dass es nicht optimiert ist.

Wenn Sie den Menüpunkt Module im Menü Debug -> Windows nicht sehen können, müssen Sie ihn möglicherweise im Menü "Anpassen ..." hinzufügen.

Justin
quelle
2
Die Lösung wird neu aufgebaut. Das Modulfenster zeigt, dass die Baugruppe optimiert ist. Ich habe das Kontrollkästchen Optimieren deaktiviert, damit ich nicht weiß, warum die Baugruppe immer optimiert ist. Die Lösung hat ein Webprojekt, aber der Code, den ich betrachte, befindet sich in einem Klassenbibliotheksprojekt im Debug-Modus.
Tony_Henrich
@Tony - Dumme Frage, aber hat die Klassenbibliothek das Kontrollkästchen "Optimiert" deaktiviert?
Justin
Ja. Ich habe diese Tatsache in meiner Frage erwähnt. Ich habe meine eigene Frage bereits beantwortet.
Tony_Henrich
1
Mein Project.Webhat Optimierung deaktiviert, aber es wird immer noch als optimiert angezeigt, wenn ich mir seine Montage in Debug > Modules:(
J86
Die einzige Möglichkeit, VS zum Aktualisieren der Debugging-Informationen zu zwingen, bestand darin, die Assembly-Version des Moduls zu erhöhen, die immer noch als optimiert angesehen wurde, während die Option nicht aktiviert war.
Alphanoch
14

Gehen Sie in VS2013 zu: Extras -> Optionen -> Debugging -> Allgemein und aktivieren Sie 'Verwalteten Kompatibilitätsmodus verwenden'. Dies deaktiviert das neue Funktionsbewertungsverhalten.

Jesse
quelle
Vielen Dank! Von den anderen angebotenen Lösungen war dies diejenige, die für mich wichtig war. Seltsam war, dass es plötzlich passiert ist. Ich frage mich, warum es sich geändert hat.
squid808
10

Versuchen Sie, im Debug-Modus auszuführen. Wenn Sie im Release-Modus ausgeführt werden, wird diese Meldung angezeigt.

thejustv
quelle
5
Die Frage lautet ganz einfach: "Ich verwende Visual Studio 2010 im Debug-Modus und habe" Code optimieren "deaktiviert." ... Sie sollten diese Nichtantwort löschen.
Jim Balter
Ernsthaft. Er sagt es in der Frage, dass er im Debug läuft. Ich verstehe nicht, warum die Upvotes. Diese Antwort verschmutzt die möglichen Vorsätze
John Demetriou
1
FWIW, diese Frage hat bei Google einen hohen Stellenwert, wenn Sie nach dieser Fehlermeldung suchen. Diese Antwort war für mich richtig (ich wusste nicht, dass ich mich im Release-Modus befand).
Nate Barbettini
Möglicherweise hat er mehr als eine Assembly, und im Konfigurationsmanager kann die Assembly, über die er debuggt, auf Freigabe oder etw eingestellt werden.
Madoxdev
8

Meine Situation wurde durch keine der obigen Antworten abgedeckt. Ich habe Folgendes gefunden: MSDN-Artikel zum Thema Threading, in dem erklärt wird, dass der Debugger bei einigen primitiven nativen Threading-Vorgängen nicht auf die Daten zugreifen kann. Wenn beispielsweise ein Thread auf Task.Wait () sitzt, wird dies angezeigt.

Alan Baljeu
quelle
8

Ich hatte das gleiche Problem. In meinem Fall wurde das DebuggableAttribut jedoch in der AssemblyInfo.csDatei meines Projekts fest codiert und daher nicht durch Kompilierung (über-) geschrieben. Es funktionierte, nachdem die Zeile entfernt wurde, in der das DebuggableAttribut angegeben war.

riQQ
quelle
8

Für mich passierte es in VS2017 und VS2019. Es hörte auf, nachdem ich die Option "Unterdrückte JIT-Optimierung beim Laden des Moduls" ausgewählt hatte.

Geben Sie hier die Bildbeschreibung ein

Fernost
quelle
+1, dieser war die Ursache meines Problems. VS scheint nicht allzu gut darin zu sein, die csproj-Optionen tatsächlich zu verstehen, da ich die Optimierung im XML deaktiviert habe, wenn die Konfiguration mit "Debug" endet. Es funktioniert gut, wenn MSBuild direkt aufgerufen wird, aber in VS selbst nicht ganz richtig.
TheBeardedQuack
5

Ich hatte das gleiche Problem in VS2008. In meinem Fall wurde es durch Lösungswiederherstellung gelöst.

Ingmar
quelle
4

Abgesehen von @Kragen erwähnt, wenn Sie ein Webprojekt debuggen

Schließen Sie das Visual Studio und versuchen Sie, die temporären Dateien unter C: \ Windows \ Microsoft.NET \ Framework \ v2.0.50727 \ Temporäre ASP.NET-Dateien zu löschen

Testbenutzer
quelle
Die Lösung hat ein Webprojekt, aber der Code befindet sich im Klassenbibliotheksprojekt. Ich habe die temporären Dateien viele Male gelöscht.
Tony_Henrich
4

Eine andere Möglichkeit besteht darin, eine Datei mit demselben Namen wie die optimierte DLL mit der Erweiterung ini zu erstellen und Folgendes hinzuzufügen:

[.NET Framework Debugging Control]
GenerateTrackingInfo = 1
AllowOptimize = 0

Dadurch wird die JIT angewiesen, Ihre Variablen nicht zu optimieren.

Beachten Sie, dass Sie die PDF-Datei weiterhin benötigen, sodass Sie am Ende Folgendes erhalten: yourDll.dll yourDll.pdb yourDll.ini

Dies funktioniert besonders gut in Szenarien, in denen Sie keinen Zugriff haben, um die DLLs mit der Debug-Option neu zu generieren.

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

Bongo Sharp
quelle
4

Wenn nach dem Ausgeben einer Anweisung die Meldung " Ausdruck kann nicht ausgewertet werden, da der Code der aktuellen Methode optimiert ist " Debugger.Break()angezeigt wird, müssen Sie F10 drücken, um zur nächsten Anweisung zu gelangen.

Sobald Sie mit der nächsten Anweisung fortgefahren sind und davon ausgehen, dass Sie einen Debug-Build ausführen, sollte diese Meldung verschwinden.

Jeroen Ritmeijer
quelle
2
Das war's. Ich habe alle oben genannten Lösungen ausprobiert und diese kleine Sache hat
geklappt
Nein. Funktioniert nicht. Vs17 glaubt immer noch, dass ich einen Release-Build debugge
John Demetriou
3

In Bezug auf das Problem, dass die Eigenschaft "Code optimieren" nicht überprüft wurde und der Code dennoch als optimiert kompiliert wurde: Was mir schließlich geholfen hat, nachdem ich alles versucht hatte, war das Kontrollkästchen "Debuggen von nicht verwaltetem Code aktivieren" auf derselben Einstellungsseite (Projekteigenschaften - Debuggen). Es bezieht sich nicht direkt auf die Codeoptimierung, aber wenn diese Option aktiviert ist, optimiert VS meine Bibliothek nicht mehr und ich kann debuggen.

Miloš
quelle
3

Ich hatte das gleiche Problem beim Debuggen einer Klassenbibliothek aus einer Testbed-Web-App. Ich habe auf die Release-Version im Testbed verwiesen und diese wurde so eingestellt, dass sie in den Eigenschaften der Klassenbibliothek optimiert wird.

Das Deaktivieren des Kontrollkästchens Code optimieren für die Release-Version in den Eigenschaften der Klassenbibliothek, während ich es schreibe, hat das Problem behoben.

Tekiegirl
quelle
Danke, dass es geschafft hat. Sie finden dieses Kontrollkästchen, indem Sie mit der rechten Maustaste in jedes Projekt klicken und die Menüoption "Eigenschaften" und dann die Registerkarte "Erstellen" auswählen.
Goamn
3

Mir ist klar, dass dies eine spätere Antwort ist, aber ich habe einen weiteren Hinweis auf einen Weg gefunden, dieses Problem anzugehen, der anderen in Zukunft helfen könnte. Diese Webseite beschreibt das Festlegen einer Umgebungsvariablen (COMPLUS_ZapDisable = 1), die die Optimierung verhindert, zumindest für mich! (Vergessen Sie nicht den zweiten Teil des Deaktivierens des Visual Studio-Hosting-Prozesses.) In meinem Fall war dies möglicherweise noch relevanter, da ich eine externe DLL über einen Symbolserver debuggt habe, bin mir aber nicht sicher.

Michael Bray
quelle
3

Ich hatte dieses Problem mit einem F # -Projekt, das hier und da zwischen Visual Studio und MonoDevelop war und möglicherweise aus letzterem stammte (ich vergesse). In VS war das Kontrollkästchen "Optimieren" deaktiviert, doch für den Debugger schien die Optimierung sicherlich zu erfolgen.

Nach dem Vergleich der XML-Datei der Projektdatei mit der einer fehlerfreien Datei war das Problem offensichtlich: Das fehlerfreie Projekt hatte eine explizite <optimize>false</optimize>Zeile, während das fehlerhafte Projekt diese vollständig fehlte. VS folgerte offensichtlich aus seiner Abwesenheit, dass die Optimierung deaktiviert war, während der Compiler das Gegenteil tat.

Die Lösung bestand darin, diese Eigenschaft zur Projektdatei hinzuzufügen und neu zu laden.

Jason Holloway
quelle
1

Ich habe diese Nachricht erhalten, als ich zu Visual Studio 2017 migriert bin. Keine der Ideen auf dieser Seite, die ich ausprobiert habe, hat für mich funktioniert. In einem anderen Beitrag habe ich diesen Vorschlag gefunden und er hat funktioniert - entfernen:

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

... aus Ihrer AssemblyInfo-Datei.

Verrückte Katze
quelle
Ich liebe dich @Crazy Cat. Es ist mir passiert, als ich auf VS2019 migriert bin.
Antonio Rodríguez
0

Ich hatte das gleiche Problem in VS 2010. Die Lösung wurde bereinigt und neu erstellt, und es hat funktioniert.

Sanjay Gupta
quelle
0

Der Kommentar von vickramds oben bezieht sich auf http://torulflundgren.blogspot.com.au/2010/03/cannot-obtain-value-of-local-or.html , hat es für mich getan. Ich habe alles überprüft - alle DLLs, PDF-Dateien aus lokalen Bin-Ordnern gelöscht, Clean, Rebuild, alle Ordner mit temporären ASP.NET-Dateien gelöscht, sichergestellt, dass TRACE / DEBUG-Flags gesetzt wurden, die DLL-Pfade überprüft usw.

So legen Sie es ab, damit es nicht verloren geht, für die betroffenen Projekte:

Projekteigenschaften -> Erstellen -> Erweitert -> Debug-Informationen: Vollständig.

Sie möchten überprüfen, ob Sie die Debug-Konfiguration ausgewählt haben, bevor Sie dies tun, es sei denn, Sie haben natürlich etwas anderes beabsichtigt.

Mayyit
quelle
0

Wenn Sie versuchen, ein ASP.NET-Projekt zu debuggen, stellen Sie sicher, dass die Dropdown-Liste Eigenschaften> Web> Server des Projekts auf "IIS Express" eingestellt ist (zusätzlich zur Überprüfung aller anderen hier).

Oberherr Zurg
quelle
0

Ich hatte gemischte c ++ / cli mfc-Erweiterungs-DLLs, die auch bei Debug-Konfiguration optimiert wurden (siehe Fenster VS 2017-Module). Wie in der vorherigen Antwort vorgeschlagen, habe ich Folgendes geändert: "Gehen Sie in VS2013 zu: Extras -> Optionen -> Debugging -> Allgemein und aktivieren Sie" Verwalteten Kompatibilitätsmodus verwenden ". Dadurch wird das neue Funktionsbewertungsverhalten deaktiviert." Diese Einstellungen finden Sie auch in VS 2017.

Da dies jedoch nicht ausreichte, habe ich auch die Einstellung UseDebugLibraries aus der Projektdatei einer anderen MFC-App in die DLL-Projektdatei der Erweiterung kopiert.

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

Dann neu erstellen und das Problem behoben.

owluCoder
quelle
0

In Visual Studio 2012 hat es für mich funktioniert , die Option " Verwaltet " unter Extras> Debuggen> Just-In-Time zu aktivieren .

Geben Sie hier die Bildbeschreibung ein

QMaster
quelle