„Nie można ocenić wyrażenia, ponieważ kod bieżącej metody jest zoptymalizowany” w programie Visual Studio 2010

153

Używam programu Visual Studio 2010 w trybie debugowania i opcja „optymalizuj kod” jest odznaczona. Nie mogę szybko obserwować (lub najeżdżać) żadnej zmiennej w debugerze. Otrzymuję ten błąd „Nie można ocenić wyrażenia, ponieważ kod bieżącej metody jest zoptymalizowany”.

Nawet wiersz taki jak: int i = -3, wykonując szybki podgląd na i, otrzymuję komunikat „Nie można uzyskać wartości lokalnego lub argumentu 'i', ponieważ nie jest on dostępny w tym wskaźniku instrukcji, prawdopodobnie dlatego, że został zoptymalizowany”.

Wydaje się, że ten link, do którego odnosi się podobne pytanie, nie ma zastosowania.

Czy brakuje mi ustawienia?

Tony_Henrich
źródło
4
torulflundgren.blogspot.com.au/2010/03/… To najlepsze rozwiązanie, jakie znalazłem. Przetestowałem to w Visual Studio 2013. i
działałem

Odpowiedzi:

167

Gdy projekt był w trybie debugowania, rozwiązanie nie było. Kiedy to zmieniłem, zadziałało.

Tony_Henrich
źródło
9
Miałem ten problem w VS2012, jednak rozwiązanie i wszystkie projekty były ustawione na debugowanie bez optymalizacji. Czyściłem rozwiązanie / przebudowałem, naprawiłem to za mnie.
saarp
20
Więc ... Jak ustawić rozwiązanie w trybie bez debugowania?
user1431072
user1431072 - klikasz prawym przyciskiem myszy rozwiązanie lub projekt i wybierasz właściwość, a następnie możesz ustawić tryb debugowania
Yevgraf Andreyevich Zhivago
48

Miałem ten problem podczas korzystania z VS 2010. W mojej konfiguracji rozwiązania wybrano opcję (Debugowanie). Rozwiązałem to, odznaczając właściwość Optymalizuj kod we właściwościach projektu. Projekt (prawy przycisk myszy) => Właściwości => Kompiluj (zakładka) => odznacz Optymalizuj kod

Vin
źródło
29

Wygląda na to, że debugujesz wersję zoptymalizowaną / wydaną, mimo odznaczenia zoptymalizowanego pola. Możesz spróbować:

  • Przebuduj całkowicie plik rozwiązania (kliknij rozwiązanie prawym przyciskiem myszy i wybierz opcję Odbuduj wszystko)
  • Podczas debugowania otwórz okno modułów (Debuguj -> Windows -> Moduły) i znajdź swój zestaw na liście załadowanych modułów. Sprawdź, czy ścieżka wymieniona w załadowanym zestawie jest tym, czego się spodziewasz i czy zmodyfikowana sygnatura czasowa pliku wskazuje, że zestaw został faktycznie odbudowany.
  • Okno modułów powinno również informować, czy załadowany moduł jest zoptymalizowany, czy nie - upewnij się, że okno modułów wskazuje, że nie jest zoptymalizowany.

Jeśli nie widzisz elementu menu Moduły w menu Debuguj -> Windows, może być konieczne dodanie go w menu „Dostosuj ...”.

Justin
źródło
2
Rozwiązanie zostało przebudowane. Okno modułów pokazuje, że zestaw jest zoptymalizowany. Mam odznaczone pole wyboru Optymalizuj, więc nie wiem, dlaczego zespół jest zawsze optymalizowany. Rozwiązanie ma projekt sieci Web, ale kod, na który patrzę, znajduje się w projekcie biblioteki klas w trybie debugowania.
Tony_Henrich
@Tony - Głupie pytanie, ale czy w bibliotece klas jest odznaczone pole wyboru „Zoptymalizowana”?
Justin
Tak. Wspomniałem o tym w swoim pytaniu. Odpowiedziałem już na własne pytanie.
Tony_Henrich
1
Moja Project.Weboptymalizacja jest odznaczona, ale nadal jest wyświetlana jako zoptymalizowana, gdy patrzę na jej montaż w Debug > Modules:(
J86
Jedynym sposobem, w jaki udało mi się zmusić VS do zaktualizowania informacji debugowania, było zwiększenie wersji zestawu modułu, który był nadal uważany za zoptymalizowany, podczas gdy opcja nie była zaznaczona.
alphanoch
14

W VS2013 przejdź do: Narzędzia -> Opcje -> Debugowanie -> Ogólne i włącz opcję „Użyj zarządzanego trybu zgodności”. To wyłącza nowe zachowanie oceny funkcji.

Jesse
źródło
Dzięki! Z pozostałych oferowanych rozwiązań to właśnie się dla mnie liczyło. Dziwne było to, że stało się to nagle, zastanawiam się, co spowodowało zmianę.
squid808
10

Spróbuj uruchomić w trybie debugowania.Jeśli pracujesz w trybie wydania, pojawi się ten komunikat.

thejustv
źródło
5
Pytanie brzmi: „Używam programu Visual Studio 2010 w trybie debugowania i opcja„ optymalizuj kod ”jest niezaznaczona.”… Należy usunąć tę odpowiedź bez odpowiedzi.
Jim Balter,
Poważnie. Mówi to w pytaniu, że uruchamia debugowanie. Nie rozumiem, dlaczego głosy poparcia. Ta odpowiedź zanieczyszcza możliwe rezolucje
John Demetriou
1
FWIW, to pytanie zajmuje wysoką pozycję w Google podczas wyszukiwania tego komunikatu o błędzie. Ta odpowiedź była dla mnie poprawna (nie zdawałem sobie sprawy, że jestem w trybie wydania).
Nate Barbettini
Może mieć więcej niż jeden zestaw, aw menedżerze konfiguracji zestaw, przez który debuguje, można ustawić na zwolnienie lub coś.
madoxdev
8

Moja sytuacja nie została uwzględniona w żadnej z powyższych odpowiedzi. Znalazłem: artykuł MSDN na temat wątków, w którym wyjaśniono, że debugger nie może uzyskać dostępu do danych, gdy utknie w niektórych prymitywnych natywnych operacjach wątkowania. Na przykład, gdy wątek znajduje się w Task.Wait (), pojawia się.

Alan Baljeu
źródło
8

Miałem ten sam problem. Ale w moim przypadku Debuggableatrybut został zakodowany na stałe w AssemblyInfo.cspliku mojego projektu i dlatego nie został (nad-) zapisany przez kompilację. Zadziałało po usunięciu linii określającej Debuggableatrybut.

riQQ
źródło
8

U mnie działo się to w VS2017 i VS2019. Przestało się to dziać po wybraniu opcji „Stłumiona optymalizacja JIT przy ładowaniu modułu”.

wprowadź opis obrazu tutaj

farfareast
źródło
+1, ten był przyczyną mojego problemu. VS nie wydaje się zbyt dobry w zrozumieniu opcji csproj, ponieważ optymalizacja została wyłączona w XML, gdy konfiguracja kończy się na „Debuguj”. Działa dobrze podczas bezpośredniego wywoływania MSBuild, ale nie do końca w samym VS.
TheBeardedQuack
5

Miałem ten sam problem w VS2008. W moim przypadku został rozwiązany poprzez przebudowę rozwiązania.

Ingmar
źródło
4

Oprócz wspomnianego @Kragen, jeśli debugujesz projekt internetowy

zamknij program Visual Studio i spróbuj usunąć pliki tymczasowe w C: \ Windows \ Microsoft.NET \ Framework \ v2.0.50727 \ Temporary ASP.NET Files

testuser
źródło
Rozwiązanie ma projekt sieci Web, ale kod znajduje się w projekcie biblioteki klas. Wielokrotnie usuwałem pliki tymczasowe.
Tony_Henrich
4

Inną rzeczą, którą możesz zrobić, jest utworzenie pliku o tej samej nazwie co dll, który jest zoptymalizowany, ale z rozszerzeniem ini, i dodanie do niego:

[Kontrola debugowania .NET Framework]
GenerateTrackingInfo = 1
AllowOptimize = 0

To powie zespołowi JIT, aby nie optymalizował zmiennych.

Pamiętaj, że nadal potrzebujesz pdb, więc otrzymasz coś takiego: yourDll.dll yourDll.pdb yourDll.ini

Działa to szczególnie dobrze w scenariuszach, w których nie masz dostępu do ponownego generowania bibliotek dll z opcją debugowania.

http://www.hanselman.com/blog/DebugVsReleaseTheBestOfBothWorlds.aspx

Bongo Sharp
źródło
4

Gdy zobaczysz komunikat „ Nie można ocenić wyrażenia, ponieważ kod bieżącej metody jest zoptymalizowany. ” Po wydaniu Debugger.Break()instrukcji, upewnij się, że naciskasz klawisz F10, aby przejść do następnej instrukcji.

Po przejściu do następnej instrukcji i przy założeniu, że korzystasz z kompilacji debugowania, ten komunikat powinien zniknąć.

Jeroen Ritmeijer
źródło
2
To było to. Wypróbowałem wszystkie powyższe rozwiązania i ten drobiazg się powiódł .. Dziękuję za udostępnienie, zmarnowałbym jeszcze więcej godzin bez zobaczenia tej banalnej podpowiedzi ..
Krzysztof Szynter
Nie. Nie działał. Vs17 nadal myśli, że debuguję kompilację wydania
John Demetriou
3

Odnośnie problemu z NIEZADANIOWANĄ właściwością „Optymalizuj kod”, ale kod nadal kompiluje się jako zoptymalizowany: Ostatecznie pomogło mi po wypróbowaniu wszystkiego zaznaczenie pola wyboru „Włącz debugowanie kodu niezarządzanego” na tej samej stronie ustawień (Właściwości projektu - Debugowanie). Nie ma 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
3

Miałem ten sam problem podczas debugowania biblioteki klas z aplikacji internetowej na stanowisku testowym. Odwoływałem się do wersji wydania w stanowisku testowym i została ustawiona na optymalizację we właściwościach biblioteki klas.

Usunięcie zaznaczenia pola wyboru optymalizacji kodu dla wersji wydania we właściwościach biblioteki klas właśnie podczas jej pisania rozwiązało problem.

tekiegirl
źródło
Dzięki, że to zrobiłem. Możesz znaleźć to pole wyboru, klikając prawym przyciskiem myszy każdy projekt i wybierając z menu opcję „Właściwości”, a następnie zakładkę „Buduj”.
goamn
3

Zdaję sobie sprawę, że jest to późniejsza odpowiedź, ale znalazłem inne odniesienie do sposobu rozwiązania tego problemu, który może pomóc innym w przyszłości. Ta strona internetowa opisuje ustawienie zmiennej środowiskowej (COMPLUS_ZapDisable = 1), która zapobiega optymalizacji, przynajmniej tak było w moim przypadku! (Nie zapomnij o drugiej części wyłączania procesu hostingu programu Visual Studio). W moim przypadku mogło to być jeszcze bardziej istotne, ponieważ debugowałem zewnętrzną bibliotekę DLL za pośrednictwem serwera symboli, ale nie jestem pewien.

Michael Bray
źródło
3

Miałem ten problem z projektem F #, który był tu i ówdzie między Visual Studio i MonoDevelop, być może pochodzącym z tego ostatniego (zapomniałem). W VS pole optymalizacji nie było zaznaczone, ale optymalizacja z pewnością zdawała się zachodzić, jeśli chodzi o debugger.

Po porównaniu XML pliku projektu ze zdrowym, problem był oczywisty: zdrowy projekt miał wyraźną <optimize>false</optimize>linię, podczas gdy zły całkowicie go brakowało. VS najwyraźniej wywnioskował z jego braku, że optymalizacja została wyłączona, podczas gdy kompilator postępował odwrotnie.

Rozwiązaniem było dodanie tej właściwości do pliku projektu i ponowne wczytanie.

Jason Holloway
źródło
1

Zacząłem otrzymywać tę wiadomość po migracji do programu Visual Studio 2017. Żaden z pomysłów na tej stronie, które wypróbowałem, nie zadziałał dla mnie. W innym poście znalazłem tę sugestię i DZIAŁAŁO - usuń:

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

... z pliku AssemblyInfo.

Szalony kot
źródło
Kocham Cię @Crazy Cat. Zdarzyło mi się to podczas migracji na VS2019.
Antonio Rodríguez
0

Miałem ten sam problem w VS 2010. Oczyszczono i odbudowałem rozwiązanie i zadziałało.

Sanjay Gupta
źródło
0

Komentarz vickramds powyżej, odnoszący się do http://torulflundgren.blogspot.com.au/2010/03/cannot-obtain-value-of-local-or.html , zrobił to za mnie. Sprawdziłem wszystko - usunąłem wszystkie pliki dll, pdb z lokalnych folderów bin, wyczyść, odbuduj, wyczyściłem wszystkie foldery tymczasowych plików ASP.NET, upewniłem się, że zostały ustawione flagi TRACE / DEBUG, sprawdziłem ścieżki DLL itp.

Aby go odłożyć, aby nie został utracony, dla projektów, których dotyczy problem:

Właściwości projektu -> Kompilacja -> Zaawansowane -> Informacje o debugowaniu: pełne.

Chcesz sprawdzić, czy masz wybraną konfigurację debugowania, zanim to zrobisz, chyba że oczywiście zamierzałeś inaczej.

Mayyit
źródło
0

Jeśli próbujesz debugować projekt ASP.NET, upewnij się, że lista rozwijana Właściwości> Sieć> Serwery projektu jest ustawiona na „IIS Express” (oprócz sprawdzania wszystkiego innego tutaj).

Overlord Zurg
źródło
0

Miałem mieszane biblioteki dll rozszerzeń mfc c ++ / cli, które zostały zoptymalizowane, nawet jeśli konfiguracja debugowania (widok z okna modułów VS 2017). Jak sugerowała poprzednia odpowiedź, zmieniłem „W VS2013 przejdź do: Narzędzia -> Opcje -> Debugowanie -> Ogólne i włącz„ Użyj zarządzanego trybu zgodności ”. Spowoduje to wyłączenie nowego zachowania oceny funkcji”. Te ustawienia można znaleźć również w VS 2017.

Ale to nie wystarczyło, więc skopiowałem również ustawienie UseDebugLibraries z pliku projektu innej aplikacji MFC do pliku projektu rozszerzenia dll.

    <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
      ...
      <UseDebugLibraries>true</UseDebugLibraries>

Następnie odbuduj i to rozwiązało problem.

owluCoder
źródło
0

W programie Visual Studio 2012 włączenie opcji „ Zarządzane ” w menu Narzędzia> Debugowanie> Just-In-Time działało dla mnie.

wprowadź opis obrazu tutaj

QMaster
źródło