web-dev-qa-db-de.com

Was bedeutet "Ausdruck kann nicht ausgewertet werden, da der Code der aktuellen Methode optimiert ist." bedeuten?

Ich habe etwas Code mit viel Rekursion geschrieben, was einige Zeit in Anspruch nimmt. Immer wenn ich den Lauf "pausiere", um zu sehen, was los ist, bekomme ich: 

Der Ausdruck kann nicht ausgewertet werden, da der Code der aktuellen Methode optimiert ist.

Ich glaube ich verstehe was das bedeutet. Was mich jedoch verwundert, ist, dass der Code nach dem Klick auf step nicht mehr "optimiert" wird und ich meine Variablen betrachten kann. Wie kommt es dazu? Wie kann der Code zwischen optimiertem und nicht optimiertem Code hin und her wechseln?

45
Esteban Araya

Der Debugger verwendet FuncEval, damit Sie Variablen "betrachten" können. FuncEval erfordert, dass Threads im verwalteten Code an einem sicheren GarbageCollector-Punkt angehalten werden. Durch das manuelle Anhalten des Laufs in der IDE werden alle Threads so schnell wie möglich angehalten. Ihr stark rekursiver Code wird an einem unsicheren Punkt anhalten. Daher kann der Debugger keine Ausdrücke auswerten.

Durch Drücken von F10 wird zum nächsten Funceval Safe-Punkt gewechselt und die Funktionsauswertung aktiviert.

Weitere Informationen finden Sie in den Regeln von FuncEval .

26
Nescio

Während sich die Debug.Break () - Zeile über dem Callstack befindet, können Sie keine Ausdrücke auswerten. Das liegt daran, dass diese Linie optimiert ist. Drücken Sie F10, um zur nächsten Zeile - einer gültigen Codezeile - zu gelangen. Die Uhr funktioniert.

44
No one

Sie versuchen wahrscheinlich, Ihre App im Freigabemodus zu debuggen, anstatt den Debug-Modus, oder Sie haben Optimierungen in Ihren Kompilierungseinstellungen aktiviert. 

Wenn der Code mit Optimierungen kompiliert wird, werden bestimmte Variablen verworfen, sobald sie nicht mehr in der Funktion verwendet werden. Aus diesem Grund wird diese Meldung angezeigt. Im Debug-Modus mit deaktivierten Optimierungen sollten Sie diesen Fehler nicht erhalten.

27
Lamar

Das hat mich verrückt gemacht. Ich habe versucht, mit Managed und Native Code anzuschließen - nein.

Das funktionierte für mich und ich konnte endlich alle Ausdrücke bewerten:

  • Gehen Sie in Projekt/Eigenschaften 
  • Wählen Sie die Registerkarte "Erstellen" und klicken Sie auf Erweitert ...
  • Stellen Sie sicher, dass Debug Info auf "full" eingestellt ist (Nicht nur für pdb)
  • Debuggen Sie Ihr Projekt - voila!
7
Ralph177

Das Folgende hat für mich funktioniert, danke @Vin.

Ich hatte dieses Problem, als ich VS 2015 verwendete. Meine Lösung: Konfiguration wurde (Debuggen) ausgewählt. Ich habe das Problem gelöst, indem Sie die Optimize Code-Eigenschaft unter den Projekteigenschaften deaktivieren. 

Projekt (Rechtsklick) => Eigenschaften => Erstellen (Registerkarte) => Deaktivieren Sie Code optimieren

7

Stellen Sie sicher, dass Sie so etwas nicht haben

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

in deiner AssemblyInfo

2
Guish

Suchen Sie nach einem Funktionsaufruf mit vielen Parametern, und verringern Sie die Anzahl, bis das Debuggen angezeigt wird.

2
George

Ein Freund eines Freundes von Microsoft hat folgendes gesendet: http://blogs.msdn.com/rmbyers/archive/2008/08/16/Func_2D00_eval-can-fail-while-stopped-in-a-non_2D00_optimized- Managed-Method-that-Pushes-mehr als-256-Argument-Bytes-.aspx

Das wahrscheinlichste Problem ist, dass Ihr Aufrufstack optimiert wird, weil Ihre Methodensignatur zu groß ist.

1

Hatte das gleiche Problem, konnte es jedoch beheben, indem die Ausnahmebindung im Debugger deaktiviert wurde. Klicken Sie auf [Debug] [Ausnahmen] und setzen Sie die Ausnahmen auf "Vom Benutzer nicht behandelt".

Normalerweise habe ich dies ausgeschaltet, aber es ist gelegentlich nützlich. Ich muss nur daran denken, es abzuschalten, wenn ich fertig bin.

1
Doug Lind

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

1
Vin

In meinem Fall hatte ich 2 Projekte in meiner Lösung und führte ein Projekt aus, das nicht das Startprojekt war. Wenn ich es zu Startprojekt änderte, funktionierte das Debugging wieder.

Hoffe es hilft jemandem.

0
Vilhelm

Bewertung:

In .NET ist "Funktionsbewertung (funceval)" die Fähigkeit der CLR, einen beliebigen Aufruf einzufügen, während der Debuggee irgendwo angehalten wird. Funceval übernimmt den vom Debugger ausgewählten Thread, um die angeforderte Methode auszuführen. Sobald funceval beendet ist, wird ein Debug-Ereignis ausgelöst. Technisch gesehen hat CLR Möglichkeiten für den Debugger definiert, ein Funceval auszugeben.

CLR ermöglicht das Auslösen von funceval nur für diejenigen Threads, die sich an einem sicheren GC-Punkt befinden (d. H. Wenn der Thread GC nicht blockiert) und an einem Funceval Safe (FESafe) -Punkt (d. H. Wo CLR die Entführung für das funceval tatsächlich ausführen kann). Mögliche Szenarien für CLR müssen daher ein Thread sein:

  1. in verwaltetem Code (und an einem sicheren GC-Punkt) gestoppt: Dies bedeutet, dass wir keine Funktion in nativem Code ausführen können. Da der native Code außerhalb der Kontrolle der CLR liegt, kann er das funceval nicht einrichten.

  2. bei einer 1. Chance oder einer nicht behandelten verwalteten Ausnahme (und an einem sicheren GC-Punkt) gestoppt: d. h. zum Zeitpunkt der Ausnahme, um so viel wie möglich zu untersuchen, um festzustellen, warum diese Ausnahme aufgetreten ist. (Beispiel: Der Debugger kann versuchen, die Message-Eigenschaft bei einer erhöhten Ausnahme zu ermitteln und anzuzeigen.)

Zu den gängigen Möglichkeiten, um in verwaltetem Code zu stoppen, gehören das Stoppen an einem Haltepunkt, Schritt, Aufruf von Debugger.Break, das Abfangen einer Ausnahme oder das Starten eines Threads. Dies hilft bei der Bewertung der Methode und der Ausdrücke.

Mögliche Lösungen: Wenn der Thread sich nicht an einem FESafe- und einem GCSafe-Punkt befindet, kann CLR aufgrund der Bewertung nicht den Thread hijacken, um funceval zu initiieren. Im Allgemeinen hilft Folgendes, um sicherzustellen, dass funceval bei Erwartung initiiert wird:

Schritt 1:

Stellen Sie sicher, dass Sie nicht versuchen, einen Build "Release" zu debuggen. Das Release ist vollständig optimiert und führt daher zu Diskussionsfehlern. Mit der Standard-Symbolleiste oder dem Konfigurations-Manager können Sie zwischen Debug & Release wechseln.

Schritt 2:

Wenn der Fehler weiterhin angezeigt wird, ist die Option Debug möglicherweise zur Optimierung eingestellt. Überprüfen und deaktivieren Sie die Eigenschaft "Code optimieren" unter "Projekt" "Eigenschaften":

Klicken Sie mit der rechten Maustaste auf das Projekt. Wählen Sie die Option "Eigenschaften". Gehen Sie zur Registerkarte "Erstellen". Deaktivieren Sie das Kontrollkästchen "Code optimieren".

Schritt 3:

Wenn der Fehler weiterhin angezeigt wird, ist der Debug-Info-Modus möglicherweise falsch. Vergewissern Sie sich, dass unter "Advanced Build Settings" der Wert "full" eingestellt ist:

Klicken Sie mit der rechten Maustaste auf das Projekt. Wählen Sie die Option "Eigenschaften" aus. Gehen Sie zur Registerkarte "Erstellen". Klicken Sie auf die Schaltfläche "Erweitert". Legen Sie "Debug Info" als "voll" fest.

Schritt 4:

Wenn das Problem weiterhin auftritt, versuchen Sie Folgendes:

Führen Sie eine "Bereinigung" und anschließend eine "Neuerstellung" Ihrer Lösungsdatei durch Gehen Sie beim Debuggen folgendermaßen vor: Gehen Sie zum Modulfenster (VS-Menü -> Debug -> Windows -> Module) Suchen Sie Ihre Assembly in der Liste von geladenen Modulen . Prüfen Sie, ob der angegebene Pfad mit der geladenen Assembly übereinstimmt. __ Überprüfen Sie den geänderten Zeitstempel der Datei, um zu bestätigen, dass die Assembly tatsächlich neu erstellt wurde Überprüfen Sie, ob das geladene Modul vorhanden ist ist optimiert oder nicht

Fazit:

Es handelt sich nicht um einen Fehler, sondern um Informationen, die auf bestimmten Einstellungen basieren und auf der Funktionsweise von .NET Runtime basieren.

0
Vishal

Ich hatte ein ähnliches Problem und es wurde behoben, als ich die Lösung im Debug-Modus erstellte und die PDB-Datei im Ausführungspfad ersetzte.

0
Red Devil

in meinem Fall war ich im Release-Modus, und ich änderte das Debuggen, es funktionierte alles

0
CMS