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.
Neugier
quelle
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".

Karthik
quelle
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).

xyq.384.b
quelle
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.

Marc Gravell
quelle
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.
Dulanjana Wickramatantri
quelle
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.

JabberwockyDecompiler
quelle
14

Gehen Sie in Visual Studio 2017 zu Debug-> Option, aktivieren Sie dann Debugging-> Allgemein-> und aktivieren Sie diese Option

relevante Visual Studio 2017-Optionen

Zahid Hasan
quelle
Dies ist eine doppelte Antwort von einer Antwort aus dem Jahr 2015 oben: stackoverflow.com/a/34385875/1250319
Daniel
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.

CJe
quelle
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.

Miloš
quelle
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

Hoang Tran
quelle
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.

user8683595
quelle
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.

Derreck Dean
quelle
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 /.

diegosasw
quelle
1

In Visual Studio 2012:

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

Milana
quelle
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

VSB
quelle
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.

Nick
quelle
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.

Kalyan
quelle
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.

ozzy432836
quelle
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

Ludovic Feltz
quelle