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.

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


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)


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.


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


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.



8

Kiedy napotkałem ten sam problem, musiałem po prostu wyczyścić moje rozwiązanie przed przebudową. To mnie załatwił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ć.


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


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.


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.


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 /


1

W Visual Studio 2012:

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


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


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.


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.


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.


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

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.