Nie można uzyskać wartości parametru lokalnego lub argumentu, ponieważ nie jest on dostępny w tym wskaźniku instrukcji, być może dlatego, że został zoptymalizowany

211

Visual Studio 2010 zabija (nie ma innego słowa) dane w jednym z argumentów funkcji w niebezpiecznym bloku. Co może powodować ten błąd? Debugger pokazuje następujący komunikat.

Cannot obtain value of local or argument as it is not available at this instruction pointer, possibly because it has been optimized away.
ciekawość
źródło
2
mam dokładnie ten sam problem i używam kompilacji debugowania. 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, właśnie wybrałem wersję przypadkowo wybraną ...
Daniel Little,
Mam ten problem w VS 2017 i wykonałem wszystkie instrukcje w poniższych postach. Czy są jakieś inne opcje?
Matt W
Nie zapomnij Kompilacja menu -> Menedżer konfiguracji. Konfiguracja musi być ustawiona na Debugowanie, w przeciwnym razie nadal występuje problem.
Bob Clegg,

Odpowiedzi:

344

Przejdź do Właściwości projektu i w Buduj Upewnij się, że pole wyboru „Optymalizuj kod” nie jest zaznaczone.

Ustaw także opcję „Informacje debugowania” na „Pełny” w Opcjach zaawansowanych (na karcie Kompilacja).

Karthik
źródło
128
Najpierw sprawdź, czy konfiguracja kompilacji to debugowanie, a nie wydanie.
ApceH Hypocrite
Nawiasem mówiąc, jeśli chcesz przetestować go w trybie Release, możesz dodać „Debugger.Launch ();” w kodzie
Jason
Wykonano oba kroki i zmieniłem konfigurację z „Release” na „Build”. Pracował nad Visual Studio 2017 Community Edition.
Neo
1
Jeśli masz VS 2017, pomoże zarówno zaakceptowana odpowiedź, jak i odpowiedź xyq.384.b. Dla mnie odpowiedź xyq.384.b był dylemat, jak to było JIT debugger, który został tłumienia wskaźnik ... Przepraszam JIT „zoptymalizowane” to ...
BillRuhl
Po przejściu do konfiguracji debugowania odkryłem, że pole optymalizacji kodu nie jest już zaznaczone. Wyciągnięta lekcja: Nie debuguj w trybie konfiguracji wersji.
eliteproxy
135

Również w VS 2015 Community Edition

przejdź do Debuguj-> Opcje lub Narzędzia-> Opcje

i zaznacz Debugowanie-> Ogólne-> Pomiń optymalizację JIT przy ładowaniu modułu (tylko Zarządzane)

xyq.384.b
źródło
7
To rozwiązało mój problem po zastosowaniu wszystkich wyżej wymienionych rozwiązań.
masih
1
Żadna z sugerowanych odpowiedzi nie działa dla mnie. Moje zmienne są nadal zoptymalizowane ...
Sushi271,
Nie mam pojęcia, dlaczego tak się nagle zaczęło ... ale to naprawiło!
Murphybro2
Cholera jasna, naprawiłem to również dla mnie w społeczności VS2017! Nie mam pojęcia, kiedy i jak ta opcja została odznaczona ...
Ian Kemp,
Działa jak mistrz!
BillRuhl
59

Jeśli skompilujesz z włączonymi optymalizacjami, wiele zmiennych zostanie usuniętych; na przykład:

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

tutaj zmienna lokalna valuezazwyczaj byłaby usuwana, zamiast tego utrzymując wartość na stosie - trochę tak, jakbyś napisał:

DoSomething(GetValue());

Ponadto, jeśli wartość zwracana w ogóle nie zostanie użyta , zostanie ona usunięta przez „pop” (zamiast przechowywana w lokalnym przez „stloc” i ponownie; lokalny nie będzie istniał).

Z tego powodu w takiej wersji debugger nie może uzyskać bieżącej wartości, valueponieważ nie istnieje - istnieje tylko przez krótką chwilę między GetValue()aDoSomething(...) .

Więc; jeśli chcesz debugować ... nie używaj kompilacji wersji! lub przynajmniej wyłącz optymalizacje podczas debugowania.

Marc Gravell
źródło
4
Dziękuję za odpowiedź - ale
zaznaczam
4
@Marc - Rozumiem, co mówisz, jednak używam bibliotek źródeł referencyjnych Microsoft do kodowania własnych bzdur. Idę teraz przez metody, ale nie mogę obserwować żadnej wartości Lokalnych. Jaki jest zatem sens debugowania źródła .Net? Jakieś sugestie? stackoverflow.com/questions/13147132/…
one.beat.consumer
Wygląda na to, że robię to samo, co @ one.beat.consumer: próbuję przejść przez publiczne symbole Microsoft, aby zrozumieć, dlaczego środowisko ASP.NET nie działa. W moim przypadku wiązanie modelu w MVC 3 ...
bambams
@ one.beat.consumer Zakładam, że referencje Microsoft zostały skompilowane z włączoną optymalizacją, więc nawet jeśli możesz pobrać ich kod źródłowy, aby zobaczyć, jak krok po kroku wartości zniknęły, to tak samo, jakbyś skompilował swój projekt z optymalizacjami włączone. Jest on specyficzny dla projektu (dll) - jeśli możesz uzyskać „debugujące” wersje referencji MS, możesz zobaczyć wartości. Nie zapominaj, że jeśli dll MS został przywołany przez inny projekt, do którego odwołuje się twój główny projekt, „subreferencja” może pasować do ustawień innego projektu.
drzaus
22

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

To działało dla mnie w Visual Studio 2013.

Wszystko co musisz zrobić to..

  1. Kliknij prawym przyciskiem myszy projekt, którego nie można debugować.
  2. Przejdź do właściwości projektu.
  3. Kliknij menu kompilacji.
  4. Kliknij przycisk zaawansowany.
  5. Ustaw wartość rozwijaną informacji debugowania na pełną.
  6. Odbuduj swój projekt.
Dulanjana Wickramatantri
źródło
20

Właśnie na to wpadłem i działałem w Releasekonfiguracji kompilacji zamiast Debugkonfiguracji kompilacji. Raz wróciłem do Debugmojej zmiennej pokazanej ponownie w zegarku.

JabberwockyDecompiler
źródło
14

W Visual Studio 2017 mam Debugowanie-> Opcja, a następnie zaznacz Debugowanie-> ogólne-> i zaznacz tę opcję

odpowiednie opcje programu Visual Studio 2017

Zahid Hasan
źródło
To jest duplikat odpowiedzi na jedną odpowiedź z 2015 roku powyżej: stackoverflow.com/a/34385875/1250319
Daniel
8

Kiedy napotkałem ten sam problem, musiałem po prostu wyczyścić moje rozwiązanie przed przebudową. To mnie załatwiło.

CJe
źródło
6

Jeśli chodzi o problem polegający na tym, że właściwość „Optimize code” jest UNCHECKED, a kod nadal kompiluje się jako zoptymalizowany: Ostatecznie pomógł mi po wypróbowaniu wszystkiego zaznaczenie pola wyboru „Enable niezarządzanego debugowania kodu” na tej samej stronie ustawień (Właściwości projektu - Debugowanie). Nie ma to bezpośredniego związku z optymalizacją kodu, ale po włączeniu tej opcji VS nie optymalizuje już mojej biblioteki i mogę debugować.

Miloš
źródło
1
Druga sugestia sprawiła, że ​​wszystko znów działało, dziękuję!
CodeMilian
1
W VS 2015 nie widzę Enable unmanaged code debugging. Jest Enable native code debugging, próbowałem sprawdzenia tego, ale to nie miało znaczenia.
Al Lelopath
1
W VS 2015 zaznaczyłem Włącz „Kod macierzysty” w kompilacji projektu, Web, Debuggers i wszystko działało.
Mouffette,
6

Napotkałem ten sam problem i rozwiązaniem dla mnie jest zmiana Solution Configurationz Releasena Debug. Mam nadzieję, że to pomoże

Hoang Tran
źródło
4

W moim przypadku pracowałem nad projektem interfejsu API sieci Web i mimo że projekt został poprawnie ustawiony na pełne debugowanie, nadal widziałem ten błąd za każdym razem, gdy dołączałem do procesu IIS, który próbowałem debugować. Potem zdałem sobie sprawę, że profil publikowania został skonfigurowany do używania konfiguracji wydania. Więc jeszcze jedno miejsce do sprawdzenia to Twój profil publikowania, jeśli korzystasz z funkcji „Publikuj” w projekcie dotnet web api.

użytkownik8683595
źródło
3

Odkryłem, że miałem ten sam problem, kiedy prowadziłem projekt i debugowałem, dołączając się do procesu IIS. Pracowałem również w trybie debugowania z wyłączonymi optymalizacjami. Podczas gdy myślałem, że kod dobrze się skompilował, kiedy odłączyłem się i próbowałem skompilować, jedno z odniesień nie zostało znalezione. Stało się tak za sprawą innego programisty, który dokonał modyfikacji i zmienił lokalizację odwołania. Odnośnik nie pojawił się z symbolem alertu, więc myślałem, że wszystko jest w porządku, dopóki nie skompilowałem. Po poprawieniu odniesienia i ponownym uruchomieniu zadziałało.

Derreck Dean
źródło
1

Jako dodatkowa odpowiedź dla osób, które doświadczają tego problemu podczas debugowania aplikacji internetowej witryn platformy Azure:

Na przykład podczas wdrażania z GitHub kod jest kompilowany na serwerze Azure zoptymalizowanym domyślnie.

Mówię serwerowi, aby skompilował się w debugowalny sposób, ustawiając SCM_BUILD_ARGSna/p:Configuration=Debug

ale jest więcej opcji. Zobacz: http://azure.microsoft.com/blog/2014/05/08/introduction-to-remote-debugging-on-azure-web-sites-part-3-multi-instance-environment-and-git /

diegosasw
źródło
1

W Visual Studio 2012:

Przejdź do właściwości projektu -> Debugowanie -> Odznacz „Włącz proces hostowania Visual Studio”

Milana
źródło
1

W przypadku aplikacji internetowych ważny jest inny problem, a mianowicie wybór prawidłowej konfiguracji podczas procesu publikowania aplikacji.

Możesz zbudować aplikację w trybie debugowania, ale może się zdarzyć, że opublikujesz ją w trybie wydania, który domyślnie komplikuje kod, ale IDE może Cię wprowadzić w błąd, ponieważ pokazuje tryb debugowania, gdy opublikowany kod jest w trybie wydania. Możesz zobaczyć szczegóły w poniższej migawce: wprowadź opis zdjęcia tutaj

VSB
źródło
0

Sprawdź, czy masz plik Debuggable w pliku AssemblyInfo. Jeśli tak, usuń go i przebuduj rozwiązanie, aby sprawdzić, czy zmienne lokalne staną się dostępne.

Mój atrybut debuggowalny został ustawiony na: DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints, który zgodnie z tym artykułem MSDN mówi kompilatorowi JIT o korzystaniu z optymalizacji. Usunąłem tę linię z mojego pliku AssemblyInfo.cs i lokalne zmienne były dostępne.

Nacięcie
źródło
0

W Visual Studio 2017 lub 2015:

Przejdź do rozwiązania Kliknij prawym przyciskiem myszy rozwiązanie, a następnie wybierz Właściwości-> wybierz wszystkie Konfiguracja-> Debuguj, a następnie kliknij OK. Po przebudowie i uruchomieniu to rozwiązanie zadziałało dla mnie.

Kalyan
źródło
0

Miałem ten sam problem. Wypróbowałem wszystkie powyższe i okazało się, że musiałem również usunąć wszystko z {PROJECT_ROOT} \ bin \ Release \ netcoreapp2.2 i {PROJECT_ROOT} \ obj \ Release \ netcoreapp2.2 dla mojego projektu. Jest to zdecydowanie związane z publikowaniem, ponieważ chociaż korzystam z narzędzi do wdrażania / bitbucket w mojej aplikacji sieci Web platformy Azure, próbowałem kompilacji >> Opublikuj >> Opublikuj na platformie Azure, ponieważ chciałem sprawdzić, które pliki zostały faktycznie wdrożone.

ozzy432836
źródło
0

Miałem ten sam problem z aplikacją WPF i wszystkie rozwiązania tutaj NIE rozwiązały problemu . Problem polegał na tym, że moduł został już zoptymalizowany, więc następujące rozwiązania NIE DZIAŁA (lub nie są wystarczające do rozwiązania problemu):

  • Pole wyboru „ Optymalizuj kod ” niezaznaczone
  • ZaznaczonoPomiń optymalizację JIT przy obciążeniu modułu
  • Konfiguracja rozwiązania w DEBUG

Moduł jest nadal załadowany Zoptymalizowany. Zobacz następujący zrzut ekranu: Zoptymalizowany moduł


Aby rozwiązać ten problem , musisz usunąć zoptymalizowany moduł. Aby znaleźć zoptymalizowaną ścieżkę modułu, możesz użyć narzędzia takiego jak Process Hacker .

Kliknij dwukrotnie swój program w „ panelu procesów ”, a następnie w nowym oknie otwórz kartę „ .NET Assemblies ”. Następnie w kolumnie „ Ścieżka obrazu natywnego ” znajdują się wszystkie ścieżki zoptymalizowanych modułów . Znajdź ten, który chcesz zoptymalizować i usuń folder (patrz zrzut ekranu poniżej): wprowadź opis zdjęcia tutaj (Z oczywistych powodów zatarłem nazwę mojej firmy)

Uruchom ponownie aplikację (z zaznaczonym polem wyboru w kroku 1) i powinno działać.

Uwaga : plik może być zablokowany, ponieważ został otwarty w innym procesie, spróbuj zamknąć program Visual Studio. Jeśli plik jest nadal zablokowany, możesz użyć programu takiego jak Lock Hunter

Ludovic Feltz
źródło