Co robi " nie można ocenić wyrażenia, ponieważ kod bieżącej metody jest zoptymalizowany."wredny?

Napisałem kod z dużą ilością rekurencji, który zajmuje sporo czasu. Ilekroć "Zatrzymuję" bieg, żeby zobaczyć co się dzieje, dostaję:

Nie można ocenić wyrażenia, ponieważ kod bieżącej metody jest zoptymalizowany.

Chyba rozumiem, co to znaczy. Zastanawia mnie jednak to, że po naciśnięciu kroku kod nie jest już "zoptymalizowany" i mogę spojrzeć na moje zmienne. Jak to się stało? Jak można kod odwraca się między zoptymalizowanym i nieoptymalizowanym kodem?

Author: Esteban Araya, 2008-09-25

15 answers

Debugger używa FuncEval, aby umożliwić "przeglądanie" zmiennych. FuncEval wymaga, aby wątki były zatrzymywane w kodzie zarządzanym w bezpiecznym punkcie GarbageCollector. Ręczne "wstrzymanie" biegu w IDE powoduje zatrzymanie wszystkich wątków tak szybko, jak to możliwe. Twój wysoce rekurencyjny kod zatrzyma się w niebezpiecznym punkcie. W związku z tym debugger nie jest w stanie ocenić wyrażeń.

Naciśnięcie klawisza F10 przeniesie się do następnego bezpiecznego punktu Funceval i włączy ewaluację funkcji.

Do dalszych informacje przejrzyj Zasady FuncEval.

 29
Author: Nescio,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-06-20 09:12:55

Podczas debugowania.Linia Break() znajduje się na szczycie callstack, nie możesz ewalować wyrażeń. To dlatego, że linia jest zoptymalizowana. Naciśnij klawisz F10, aby przejść do następnej linii - poprawnej linii kodu - a zegarek będzie działał.

 45
Author: No one,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-07-28 13:33:10

Prawdopodobnie próbujesz debugować aplikację w trybie wydania zamiast trybu debugowania lub masz włączone optymalizacje w Ustawieniach kompilacji.

Gdy kod jest kompilowany z optymalizacjami, pewne zmienne są wyrzucane, gdy nie są już używane w funkcji, dlatego otrzymujesz tę wiadomość. W trybie debugowania z wyłączonymi optymalizacjami nie powinieneś uzyskać tego błędu.

 27
Author: Lamar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-25 05:46:43

To doprowadzało mnie do szału. Próbowałem podłączyć za pomocą zarządzanego i natywnego kodu - nie ma mowy.

udało mi się to i w końcu udało mi się ocenić wszystkie wyrażenia:

  • przejdź do projektu / właściwości
  • wybierz zakładkę Build i kliknij Zaawansowane...
  • upewnij się, że debug Info jest ustawione na " full" (nie tylko pdb)
  • Debuguj swój projekt-voila!
 7
Author: Ralph177,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-08-03 15:43:21

Poniżej działa dla mnie, dzięki @Vin.

Miałem ten problem, gdy używałem VS 2015. Moje rozwiązanie: konfiguracja została wybrana (Debug). Rozwiązałem to, odznaczając Właściwość Optimize Code w obszarze Właściwości projektu.

Projekt (kliknij prawym przyciskiem myszy) = > Właściwości => Build (tab) = > odznacz optymalizację kodu

 7
Author: Raghavendra Prasad,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-04-26 16:46:16

Upewnij się, że nie masz czegoś takiego

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

W Twoim AssemblyInfo

 3
Author: Guish,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-10-06 13:39:09

Poszukaj wywołania funkcji z wieloma paramami i spróbuj zmniejszyć liczbę, dopóki debugowanie nie powróci.

 2
Author: ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-11-14 02:34:27

Znajomy znajomego z Microsoftu wysłał to: http://blogs.msdn.com/rmbyers/archive/2008/08/16/Func_2D00_eval-can-fail-while-stopped-in-a-non_2D00_optimized-managed-method-that-pushes-more-than-256-argument-bytes-.aspx

Najbardziej prawdopodobnym problemem jest to, że stos wywołań jest optymalizowany, ponieważ podpis metody jest zbyt duży.

 1
Author: ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-03-09 22:11:36

Miał ten sam problem, ale był w stanie go rozwiązać, wyłączając zalewkowanie WYJĄTKÓW w debuggerze. Kliknij[Debug] [wyjątki] i ustaw wyjątki na "nieobsługiwane przez użytkownika".

Normalnie mam to wyłączone, ale czasami się przydaje. Muszę tylko pamiętać, żeby to wyłączyć, kiedy skończę.

 1
Author: Doug Lind,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-03-10 14:44:08

Miałem ten problem, gdy używałem VS 2010. Moja konfiguracja rozwiązania została wybrana (Debug). Rozwiązałem to, odznaczając Właściwość optymalizacji kodu w obszarze Właściwości projektu. Projekt (kliknij prawym przyciskiem myszy) = > Właściwości => Build (tab) = > odznacz optymalizację kodu

 1
Author: Vin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-05-02 21:42:04

W moim przypadku miałem 2 projekty w moim rozwiązaniu i prowadziłem projekt, który nie był projektem startupowym. Kiedy zmieniłem go na startup project, debugowanie zaczęło działać ponownie.

Mam nadzieję, że to komuś pomoże.

 0
Author: Vilhelm,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-03-13 22:00:50

Ocena:

W.NET, "Function Evaluation (funceval)" jest zdolnością CLR do wprowadzania dowolnego wywołania, podczas gdy debuggee jest gdzieś zatrzymany. Funceval przejmuje kontrolę nad wybranym wątkiem debuggera do wykonania żądanej metody. Gdy funceval zakończy działanie, zostanie wywołane zdarzenie debug. Technicznie CLR ma zdefiniowane sposoby, w jakie debugger może wydać funceval.

CLR pozwala na inicjowanie funceval tylko na tych wątkach, które znajdują się w bezpiecznym punkcie GC (tzn. gdy wątek nie zablokuje GC) i Funceval Safe (FESafe) punkt (tzn. gdzie CLR może faktycznie wykonać hijack dla funceval.) razem. Tak więc możliwe scenariusze dla CLR, wątek musi być:

  1. Stopped in managed code (and at a GC safe point): oznacza to, że nie możemy wykonać funceval w kodzie natywnym. Ponieważ kod macierzysty znajduje się poza kontrolą CLR, nie jest w stanie skonfigurować funceval.

  2. Zatrzymane przy pierwszej szansy lub nieobsługiwanym zarządzanym wyjątku (i w bezpiecznym punkcie GC): tj. w czasie wyjątek, aby sprawdzić jak najwięcej, aby ustalić, dlaczego ten wyjątek wystąpił. (np.: debugger może spróbować ocenić i zobaczyć właściwość Message w podniesionym wyjątku.)

Ogólnie rzecz biorąc, najczęstsze sposoby zatrzymywania się w kodzie zarządzanym obejmują zatrzymywanie się w punkcie przerwania, kroku, debugerze.Przerwanie połączenia, przechwycenie wyjątku lub na początku wątku. Pomaga to w ocenie metody i wyrażeń.

Możliwe rozwiązania: Na podstawie oceny, jeśli wątek nie jest w FESafe i GCSafe punktów, CLR nie będzie w stanie przejąć wątku, aby zainicjować funceval. Ogólnie rzecz biorąc, następujące informacje pomagają upewnić się, że funceval inicjuje się, gdy jest oczekiwany:

Krok # 1:

Upewnij się, że nie próbujesz debugować kompilacji "Release". Wydanie jest w pełni zoptymalizowane i tym samym doprowadzi do błędu w dyskusji. Używając standardowego paska narzędzi lub menedżera konfiguracji, możesz przełączać się między debugowaniem i wydaniem.

Krok # 2:

Jeśli nadal pojawi się błąd, opcja Debug może być ustawiona do optymalizacji. Zweryfikuj i odznacz właściwość "Optymalizuj kod" w projekcie "Właściwości":

Kliknij prawym przyciskiem myszy projekt Wybierz opcję " Właściwości" Przejdź do zakładki "Build" Odznacz pole wyboru "Optymalizuj kod"

Krok # 3:

Jeśli nadal pojawi się błąd, tryb informacji debugowania może być nieprawidłowy. Sprawdź i ustaw go na "pełny" w "zaawansowane ustawienia budowania":

Kliknij prawym przyciskiem myszy projekt Wybierz opcję " Właściwości" Przejdź do zakładki "Build" Kliknij przycisk" Zaawansowane" Ustaw "debug Info" jako "full"

Krok # 4:

Jeśli nadal napotykasz problem, spróbuj wykonać następujące czynności:

Wykonaj "Wyczyść", a następnie "Przebuduj" plik rozwiązania Podczas debugowania: Przejdź do okna Moduły (VS Menu - > Debug - > Windows - > Moduły) Znajdź swój zespół na liście załadowanych modułów. Sprawdź ścieżkę podaną względem załadowanego zestawu jest tym, czego oczekujesz Sprawdź zmodyfikowany Znacznik Czasu pliku, aby potwierdzić, że zespół został rzeczywiście przebudowany Sprawdź czy załadowany moduł jest optimized or not

Wniosek:

To nie jest błąd, ale informacja oparta na pewnych ustawieniach i zaprojektowana w oparciu o to, jak działa. NET runtime.

 0
Author: Vishal,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-10-28 11:43:38

W moim przypadku byłem w trybie release te które zmieniłem na debug to wszystko działało

 0
Author: CMS,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-03-20 03:35:01

Miałem podobny problem i został rozwiązany, gdy zbudowałem rozwiązanie w trybie debugowania i zamieniłem plik pdb w ścieżce wykonania.

 0
Author: Red Devil,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-11-08 09:07:58

Wierzę, że to, co widzisz, jest wynikiem optymalizacji-czasami zmienna zostanie ponownie użyta-szczególnie te, które są tworzone na stosie. Załóżmy na przykład, że masz metodę, która używa dwóch (lokalnych) liczb całkowitych. Pierwsza liczba całkowita jest zadeklarowana na początku metody i jest używana wyłącznie jako licznik pętli. Druga liczba całkowita jest używana po zakończeniu pętli i przechowuje wynik obliczeń, który jest później zapisywany do pliku. W tym przypadku optimiser może zdecydować się na ponowne użycie pierwszej liczby całkowitej, zapisując kod potrzebny dla drugiej liczby całkowitej. Kiedy próbujesz spojrzeć na drugą liczbę całkowitą wcześnie, pojawia się komunikat, że pytasz o "nie można ocenić wyrażenie". Chociaż nie mogę wyjaśnić dokładnych okoliczności, optymalizator może później przenieść wartość drugiej liczby całkowitej do osobnego elementu stosu, co spowoduje, że będziesz mógł uzyskać dostęp do wartości z debuggera.

 -1
Author: Anthony K,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-25 06:30:59