Der Wert von local oder argument kann nicht abgerufen werden, da er an diesem Anweisungszeiger nicht verfügbar ist, möglicherweise weil er wegoptimiert wurde


211

Visual Studio 2010 beendet Daten in einem der Argumente der Funktion im unsicheren Block (es gibt kein anderes Wort). Was könnte diesen Fehler verursachen? Die folgende Meldung wird vom Debugger angezeigt.

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

2
Ich habe genau das gleiche Problem und ich benutze 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

19
Ups, ich hatte gerade versehentlich eine Veröffentlichung ausgewählt.
Daniel Little

Ich habe dieses Problem in VS 2017 und habe alle Anweisungen in den folgenden Beiträgen befolgt. Gibt es noch andere Möglichkeiten?
Matt W

Vergessen Sie nicht Menu Build -> Configuration Manager. Die Konfiguration muss dort auf Debug eingestellt sein, sonst tritt das Problem weiterhin auf.
Bob Clegg

Antworten:


343

Gehen Sie zu Projekteigenschaften und stellen Sie unter Erstellen sicher, dass das Kontrollkästchen "Code optimieren" deaktiviert ist.

Setzen Sie außerdem die Dropdown-Liste "Debug Info" in den erweiterten Optionen (unter der Registerkarte "Erstellen") auf "Vollständig".


128
Überprüfen Sie zunächst, ob die Build-Konfiguration Debug und nicht Release ist.
ApceH Heuchler

Übrigens, wenn Sie es im Release-Modus testen möchten, können Sie "Debugger.Launch ();" im Code
Jason

Hat beide Schritte ausgeführt und die Konfiguration von "Release" in "Build" geändert. Arbeitete an der Visual Studio 2017 Community Edition.
Neo

1
Wenn Sie VS 2017 haben, helfen sowohl die akzeptierte Antwort als auch die Antwort von xyq.384.b. Für mich war die Antwort auf xyq.384.b die Lösung, da der JIT-Debugger den Zeiger unterdrückte ... Es tut mir leid, dass JIT ihn "optimiert" hat ...
BillRuhl

Nach dem Wechsel zur Debug-Konfiguration stellte ich fest, dass das Kontrollkästchen Code optimieren bereits deaktiviert war. Lektion gelernt: Debuggen Sie nicht im Release-Konfigurationsmodus.
Eliteproxy

135

Auch in der VS 2015 Community Edition

Gehen Sie zu Debug-> Optionen oder Extras-> Optionen

und aktivieren Sie Debugging-> Allgemein-> JIT-Optimierung beim Laden des Moduls unterdrücken (nur verwaltet).


7
Dies löste mein Problem, nachdem ich alle oben genannten Lösungen angewendet hatte.
Masih

1
Keine der vorgeschlagenen Antworten funktioniert für mich. Meine Variablen sind immer noch weg optimiert ...
Sushi271

Keine Ahnung, warum dies plötzlich passierte ... aber das hat es behoben!
Murphybro2

Heiliger Mist, das hat es auch für mich in der VS2017 Community behoben! Keine Ahnung wann oder wie diese Option abgewählt wurde ...
Ian Kemp

Funktioniert wie ein Champion!
BillRuhl

59

Wenn Sie mit aktivierten Optimierungen kompilieren, werden viele Variablen entfernt. beispielsweise:

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

Hier wird die lokale Variable valuenormalerweise entfernt, wobei der Wert stattdessen auf dem Stapel bleibt - ein bisschen so, als hätten Sie geschrieben:

DoSomething(GetValue());

Wenn ein Rückgabewert überhaupt nicht verwendet wird, wird er über "pop" gelöscht (anstatt über "stloc" in einem lokalen gespeichert, und der lokale Wert ist nicht vorhanden).

Aus diesem Grund kann der Debugger in einem solchen Build nicht den aktuellen Wert von erhalten, valueda er nicht vorhanden ist - er existiert nur für den kurzen Moment zwischen GetValue()und DoSomething(...).

So; Wenn Sie debuggen möchten, verwenden Sie keinen Release-Build! oder deaktivieren Sie zumindest Optimierungen, während Sie debuggen.


4
Vielen Dank für Ihre Antwort - aber ich überprüfe die Code-Eigenschaft in meinem Projekt optimieren und es ist nicht ausgewählt = (
Neugier

4
@Marc - Ich verstehe, was Sie sagen, aber ich verwende die Referenzquellenbibliotheken von Microsoft, um Schritt für Schritt durch ihren eigenen Mist zu codieren. Ich gehe jetzt Methoden durch, aber ich kann anscheinend keinen der Werte der Einheimischen beobachten. Was bringt es dann, die .Net-Quelle zu debuggen? Irgendwelche Vorschläge? stackoverflow.com/questions/13147132/…
one.beat.consumer

Ich mache anscheinend dasselbe wie @ one.beat.consumer: Ich versuche, durch die öffentlichen Symbole von Microsoft zu gehen, um zu verstehen, warum das ASP.NET-Framework nicht funktioniert. In meinem Fall Modellbindung in MVC 3 ...
Bambams

@ one.beat.consumer Ich gehe davon aus, dass die Microsoft-Referenzen mit aktivierter Optimierung kompiliert wurden. Obwohl Sie den Quellcode herunterladen können, um zu sehen, wie die Werte schrittweise durchlaufen werden, sind sie verschwunden, genauso wie wenn Sie Ihr Projekt mit Optimierungen kompilieren aktiviert. Es ist projektspezifisch (dll) - wenn Sie "Debug" -Versionen der MS-Referenzen erhalten können, können Sie Werte sehen. Vergessen Sie nicht, dass die "Unterreferenz" möglicherweise mit den Einstellungen des anderen Projekts übereinstimmt, wenn die MS-DLL von einem anderen Projekt referenziert wurde, auf das Ihr Hauptprojekt verweist.
Drzaus

22

http://www.guntucomputerhacks.blogspot.com.au/2014/07/cannot-obtain-value-of-local-or.html

Das hat bei mir im Visual Studio 2013 funktioniert.

Alles was du tun musst, ist..

  1. Klicken Sie mit der rechten Maustaste auf das Projekt, das Sie nicht debuggen können.
  2. Gehen Sie zu den Projekteigenschaften.
  3. Klicken Sie auf das Build-Menü.
  4. Klicken Sie auf die Schaltfläche Erweitert.
  5. Setzen Sie den Dropdown-Wert für Debug-Informationen auf voll.
  6. Erstellen Sie Ihr Projekt neu.

20

Ich bin gerade darauf gestoßen und habe unter ReleaseBuild-Konfiguration statt DebugBuild-Konfiguration ausgeführt. Einmal wechselte ich wieder zu Debugmeiner Variablen, die wieder in der Uhr angezeigt wurde.



8

Als ich mit dem gleichen Problem konfrontiert war, musste ich nur meine Lösung reinigen, bevor ich sie neu aufbaute. Das hat sich für mich erledigt.


6

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.


1
Der zweite Vorschlag ließ alles wieder funktionieren, danke!
CodeMilian

1
In VS 2015 sehe ich nicht Enable unmanaged code debugging. Es gibt Enable native code debugging, habe ich versucht diese Überprüfung aber es machte keinen Unterschied.
Al Lelopath

1
In VS 2015 habe ich die Option "Native Code" in Project Build, Web, Debuggers aktivieren aktiviert und alles hat funktioniert.
Mouffette

6

Ich habe das gleiche Problem und die Lösung für mich ist der Wechsel Solution Configurationvon Releasezu Debug. Ich hoffe es hilft


4

In meinem Fall arbeitete ich an einem Web-API-Projekt, und obwohl das Projekt korrekt auf vollständiges Debugging eingestellt war, wurde dieser Fehler jedes Mal angezeigt, wenn ich an den IIS-Prozess anhängte, den ich zu debuggen versuchte. Dann wurde mir klar, dass das Veröffentlichungsprofil so eingestellt war, dass es die Release-Konfiguration verwendet. Ein weiterer zu überprüfender Ort ist Ihr Veröffentlichungsprofil, wenn Sie die Funktion "Veröffentlichen" Ihres dotnet-Web-API-Projekts verwenden.


3

Ich stellte fest, dass ich das gleiche Problem hatte, als ich ein Projekt ausführte und das Debuggen durch Anhängen an einen IIS-Prozess durchführte. Ich lief auch im Debug-Modus mit deaktivierten Optimierungen. Während ich dachte, der Code sei gut kompiliert, wurde beim Trennen und Kompilieren eine der Referenzen nicht gefunden. Dies war auf einen anderen Entwickler zurückzuführen, der Änderungen vorgenommen und den Speicherort der Referenz geändert hat. Die Referenz wurde nicht mit dem Warnsymbol angezeigt, daher dachte ich, dass alles in Ordnung war, bis ich die Kompilierung durchgeführt habe. Nachdem die Referenz repariert und erneut ausgeführt wurde, funktionierte sie.


1

Als zusätzliche Antwort für diejenigen, bei denen dieses Problem beim Debuggen der Web-App einer Azure-Website auftritt:

Bei der Bereitstellung von GitHub wird der Code beispielsweise in Azure Server optimiert kompiliert standardmäßig .

Ich sage dem Server in einer debug Art und Weise zu erstellen , indem Sie SCM_BUILD_ARGSauf/p:Configuration=Debug

Es gibt jedoch noch mehr Optionen. Siehe dies: 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:

Gehen Sie zu den Projekteigenschaften -> Debuggen -> Deaktivieren Sie "Visual Studio-Hosting-Prozess aktivieren".


1

Für Webanwendungen gibt es ein weiteres Problem, das wichtig ist und die Auswahl der richtigen Konfiguration während des Veröffentlichungsprozesses der Anwendung.

Sie können Ihre App im Debug-Modus erstellen, aber es kann vorkommen, dass Sie sie im Release-Modus veröffentlichen, der standardmäßig den Code omptimiert. IDE kann Sie jedoch irreführen, da der Debug-Modus angezeigt wird, während sich der veröffentlichte Code im Release-Modus befindet. Sie können Details im folgenden Schnappschuss sehen: Geben Sie hier die Bildbeschreibung ein


0

Überprüfen Sie, ob Ihre AssemblyInfo-Datei ein Debuggable-Attribut enthält. Wenn dies der Fall ist, entfernen Sie es und erstellen Sie Ihre Lösung neu, um festzustellen, ob die lokalen Variablen verfügbar sind.

Mein debuggable-Attribut wurde auf DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints festgelegt, das gemäß diesem MSDN-Artikel den JIT-Compiler anweist , Optimierungen zu verwenden. Ich habe diese Zeile aus meiner AssemblyInfo.cs-Datei entfernt und die lokalen Variablen waren verfügbar.


0

In Visual Studio 2017 oder 2015:

Gehen Sie zur Lösung, klicken Sie mit der rechten Maustaste auf Lösung, wählen Sie Eigenschaften-> Alle Konfigurationen auswählen-> Debuggen und klicken Sie dann auf OK. Nach diesem Rebuild and Run funktionierte diese Lösung für mich.


0

Ich hatte das gleiche Problem. Ich habe alles versucht und festgestellt, dass ich auch alles in {PROJECT_ROOT} \ bin \ Release \ netcoreapp2.2 und {PROJECT_ROOT} \ obj \ Release \ netcoreapp2.2 für mein Projekt löschen musste. Es wird definitiv für die Veröffentlichung freigegeben, da ich, obwohl ich in meiner Azure-Webanwendung Bereitstellungstools / Bitbucket verwende, Build >> Veröffentlichen >> In Azure veröffentlichen versucht habe, weil ich überprüfen wollte, welche Dateien tatsächlich bereitgestellt wurden.


0

Hatte das gleiche Problem zuvor mit einer WPF-Anwendung und alle Lösungen hier haben das Problem NICHT gelöst . Das Problem war, dass das Modul bereits optimiert wurde, sodass die folgenden Lösungen NICHT FUNKTIONIEREN (oder nicht ausreichen, um das Problem zu lösen):

  • Kontrollkästchen " Code optimieren " deaktiviert
  • " JIT-Optimierung bei Modullast unterdrücken " aktiviert
  • Lösungskonfiguration auf DEBUG

Das Modul ist noch geladen Optimiert. Siehe folgenden Screenshot: Optimiertes Modul


Um dieses Problem zu lösen, müssen Sie das optimierte Modul löschen. Um den optimierten Modulpfad zu finden, können Sie ein Tool wie Process Hacker verwenden .

Doppelklicken Sie im " Prozessfenster " auf Ihr Programm und öffnen Sie im neuen Fenster die Registerkarte " .NET Assemblies ". In der Spalte " Native Image Path " finden Sie dann alle optimierten Modulpfade . Suchen Sie den Ordner, den Sie deoptimieren möchten, und löschen Sie den Ordner (siehe Abbildung unten): Geben Sie hier die Bildbeschreibung ein (Ich habe meinen Firmennamen aus offensichtlichen Gründen verwischt.)

Starten Sie Ihre Anwendung neu (mit korrekt aktiviertem Kontrollkästchen in Schritt 1) ​​und es sollte funktionieren.

Hinweis : Die Datei ist möglicherweise gesperrt, da sie von einem anderen Prozess geöffnet wurde. Schließen Sie Visual Studio. Wenn die Datei noch gesperrt ist, können Sie ein Programm wie Lock Hunter verwenden

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.