Was bedeutet „Ausdruck kann nicht beurteilen, da der Code der aktuellen Methode optimiert ist.“ Bedeuten?

StackOverflow https://stackoverflow.com/questions/131628

Frage

Ich schrieb einige Code mit viel Rekursion, die ziemlich viel Zeit in Anspruch nimmt. Immer, wenn ich „Pause“, um den Lauf zu sehen, was ich los zu bekommen:

  
    

Kann nicht Ausdruck auswerten, da der Code der aktuellen Methode optimiert wird.

  

Ich glaube, ich verstehe, was das bedeutet. Doch was mir ein Rätsel ist, dass, nachdem ich Schritt getroffen, wird der Code nicht „optimiert“ mehr, und ich kann meine Variablen sehen. Wie kommt es dazu? Wie kann der Code Flip hin und her zwischen optimiert und nicht-optimierter Code?

War es hilfreich?

Lösung

Der Debugger verwendet FuncEval, damit Sie Variablen „sehen“. FuncEval erfordert Fäden in verwaltetem Code auf einem GarbageCollector sicheren Punkt gestoppt werden. Manuell „Pause“ der Lauf in der IDE bewirkt, dass alle Threads so schnell wie möglich zu stoppen. Ihr sehr rekursive Code wird dazu neigen, an einem unsicheren Punkt zu stoppen. Daher ist der Debugger nicht mehr Ausdrücke bewerten.

Durch Drücken von F10 auf den nächsten Funceval sicheren Punkt bewegen und Funktionsauswertung ermöglichen.

Für weitere Informationen über die Regeln FuncEval überprüfen .

Andere Tipps

Während die Debug.Break () Linie oben auf der Aufrufliste ist nicht eval Ausdrücke können. Das ist, weil diese Linie optimiert ist. Drücken Sie F10, um die nächste Zeile zu bewegen - eine gültige Codezeile -. Und die Uhr funktionieren

Wahrscheinlich versuchen Sie Ihre App im Release-Modus statt Debug-Modus zu debuggen, oder Sie haben Optimierungen in Ihrer Kompilierung Einstellungen eingeschaltet.

Wenn der Code mit Optimierungen kompiliert wird, werden bestimmte Variablen weggeworfen, sobald sie nicht mehr in der Funktion verwendet werden, weshalb Sie diese Nachricht bekommen. Im Debug-Modus mit Optimierungen deaktiviert, sollten Sie nicht diesen Fehler erhalten.

Das machte mich verrückt. Ich habe versucht, mit Managed und Native Code Befestigung -. No go

Das funktionierte für mich und ich war schließlich in der Lage, alle Ausdrücke zu bewerten:

  • Gehen Sie in Projekt / Eigenschaften
  • die Registerkarte Erstellen auswählen und Erweitert ...
  • Stellen Sie sicher, dass Debug-Info wird auf „voll“ (Nicht pdb-only)
  • Debug Ihr Projekt - voila

Die unten funktionierte gut für mich, dank @Vin.

hatte ich dieses Problem, wenn ich VS 2015 Meine Lösung wurde unter Verwendung: Konfiguration (Debug) ausgewählt. Ich beschloss, dies durch die Optimize Code Eigenschaft unter Projekteigenschaften deaktivieren.

  

Project (rechte Maustaste) => Eigenschaften => Build (tab) => Deaktivieren Sie die Option Optimieren Code

Geben Sie für einen Funktionsaufruf mit vielen params und versuchen, die Zahl abnimmt, bis kehrt debuggen.

Stellen Sie sicher, Sie haben nicht so etwas wie das

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

in Ihrem AssemblyInfo

Freund eines Freundes von Microsoft gesendet dies: http://blogs.msdn.com/rmbyers/archive/2008/08/16/Func_2D00_eval-can-fail-while-stopped-in -a-non_2D00_optimized-Managed-Methode-that-schiebt-mehr-als-256-Argument-Byte-ASPX

Das wahrscheinlichste Problem ist, dass Ihr Call-Stack optimiert zu werden, weil Ihre Methodensignatur zu groß ist.

Haben das gleiche Problem, aber war in der Lage, es zu lösen, indem Ausnahme Trapping im Debugger ausschalten. Klicken Sie auf [Debug] [Ausnahmen] und legen Sie die Ausnahmen von "User-unhandled".

Normalerweise habe ich dies aus, aber es kommt gelegentlich in praktisch. Ich muss nur daran denken, es auszuschalten, wenn ich fertig bin.

hatte ich dieses Problem, wenn ich VS 2010 Meine Lösung Konfiguration wurde unter Verwendung hat (Debug) ausgewählt. Ich beschloss, das durch den Code optimieren Eigenschaft unter Projekteigenschaften deaktivieren. Project (rechte Maustaste) => Eigenschaften => Build (tab) => Deaktivieren Sie die Option Optimieren Code

In meinem Fall hatte ich zwei Projekte in meiner Lösung und lief ein Projekt, das nicht das Startprojekt war. Als ich es geändert Projekt zum Start der Fehlersuche begann wieder zu arbeiten.

Hoffe, es hilft jemand.

Bewertung:

In .NET „Function Evaluation (funceval)“ ist die Fähigkeit der CLR einig beliebigen Anruf zu injizieren, während die Debuggee irgendwo angehalten wird. Funceval nimmt den gewählten Thread des Debuggers angeforderten Methode auszuführen. Sobald funceval beendet ist, löst es ein Debug-Ereignis. Technisch haben CLR Möglichkeiten für Debugger definiert eine funceval zu erteilen.

CLR erlaubt funceval zu initiieren nur auf jene Themen, die auf der GC sicheren Punkt sind (dh, wenn der Thread blockiert GC nicht) und Funceval Safe (FESafe) Punkt (dh wo CLR tun kann tatsächlich die Hijack für die funceval.) Zusammen . Damit mögliche Szenarien für die CLR, muss ein Gewinde sein:

  1. in verwaltetem Code gestoppt (und bei einem GC sicheren Punkt): Dies bedeutet, dass wir keine funceval in nativen Code tun. Da nativen Code außerhalb der Kontrolle des CLR ist, ist es nicht in der Lage der Einrichtung der funceval.

  2. hielt an einer ersten Chance oder nicht behandelte verwaltete Ausnahme (und bei einem GC sicheren Punkt): das heißt zum Zeitpunkt der Ausnahme, um so viel wie möglich, zu untersuchen, um festzustellen, warum die Ausnahme aufgetreten ist. (Z. Debugger versuchen, die Message-Eigenschaft auf erhöhten Ausnahme zu bewerten und sehen)

Insgesamt gemeinsame Wege in verwaltetem Code zu stoppen, umfassen an einem Haltepunkt zu stoppen, Schritt, Debugger.Break Anruf, eine Ausnahme abfängt, oder an einem Gewindeanfang. Dies hilft bei der Methode der Bewertung und Ausdrücke.

Mögliche Lösungen: Auf der Grundlage der Beurteilung, ob Thread nicht an einem FESafe und GCSafe Punkte ist, wird CLR kapern der Lage sein, den Faden nicht funceval zu initiieren. Im Allgemeinen hilft folgende, um sicherzustellen, funceval einleitet, wenn zu erwarten:

Schritt 1:

Stellen Sie sicher, dass Sie nicht ein „Release“ Build versuchen, zu debuggen. Release ist vollständig optimiert und somit wird der Fehler in der Diskussion führen. Durch die Verwendung der Standard-Symbolleiste oder das Configuration Manager können Sie zwischen Debug & Release wechseln.

Schritt 2:

Wenn Sie immer noch den Fehler, könnte Debug-Option für die Optimierung eingestellt werden. Stellen Sie sicher, und Deaktivieren Sie die „Code optimieren“ Eigenschaft unter Projekt „Eigenschaften“:

Rechtsklick auf das Projekt Wählen Sie die Option „Eigenschaften“ Gehen Sie auf „Build“ tab Deaktivieren Sie das Kontrollkästchen „Optimieren Code“

Schritt 3:

Wenn Sie immer noch den Fehler, Debug Info-Modus könnte falsch sein. Stellen Sie sicher, und legen Sie es auf „voll“ unter „Advanced Build-Einstellungen“:

Rechtsklick auf das Projekt Wählen Sie die Option „Eigenschaften“ Gehen Sie auf „Build“ tab Klicken Sie auf „Erweitert“ Stellen Sie „Debug Info“ als „voll“

Schritt 4:

Wenn Sie immer noch das Problem konfrontiert, versuchen Sie Folgendes:

Sie ein „Clean“ und dann ein „Rebuild“ Ihre Lösungsdatei Während des Debuggens: Zur Module Fenster (VS-Menü -> Debug -> Fenster -> Module) Finden Sie Ihre Assembly in der Liste der geladenen Module. Überprüfen Sie den Pfad aufgeführt gegen die geladene Assembly ist, was Sie erwarten, dass es sein, Überprüfen Sie die geänderte Zeitstempel der Datei zu bestätigen, dass die Baugruppe tatsächlich wieder aufgebaut wurde Überprüfen Sie, ob das geladene Modul optimiert ist oder nicht

Fazit:

Es ist kein Fehler, sondern eine Information auf der Grundlage bestimmte Einstellungen und wie geplant auf, wie .NET-Runtime funktioniert.

in meinem Fall war ich im Release-Modus diejenigen, änderte es sich geklappt zu debuggen

Ich hatte ein ähnliches Problem und es wurde aufgelöst, wenn ich die Lösung in Debug-Modus bauen und ersetzt die PDB-Datei in dem Ausführungspfad.

Ich glaube, dass das, was Sie sehen, ein Ergebnis der Optimierungen ist - manchmal wird eine Variable wiederverwendet werden - insbesondere solche, die auf dem Stapel erstellt werden. Zum Beispiel: Angenommen, Sie haben eine Methode, die zwei (lokal) ganze Zahlen verwendet. Die erste Ganzzahl wird zu Beginn des Verfahrens erklärt, und wird ausschließlich als Zähler für eine Schleife verwendet. Ihre zweite ganze Zahl verwendet wird, nachdem die Schleife beendet ist, und speichert das Ergebnis einer Berechnung, die später geschrieben wird aus Datei. In diesem Fall kann der Optimierer entscheiden, Ihre erste ganze Zahl wieder zu verwenden, den Code Speicher für die zweite ganze Zahl benötigt. Wenn Sie versuchen, auf früh in der zweiten ganzen Zahl zu suchen, erhalten Sie die Nachricht, die Sie über „Ausdruck kann nicht beurteilen“ fragen. Obwohl ich nicht die genauen Umstände erklären kann, ist es möglich, dass die optimiser später den Wert der zweiten Ganzzahl in ein separates Stapelobjekt zu übertragen, was Sie dann den Wert aus dem Debugger zugreifen zu können.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top