Что значит «Невозможно оценить выражение, потому что код текущего метода оптимизирован». имею в виду? - PullRequest
45 голосов
/ 25 сентября 2008

Я написал некоторый код с большим количеством рекурсии, выполнение которого занимает довольно много времени. Всякий раз, когда я «делаю паузу», чтобы посмотреть, что происходит, я получаю:

Невозможно оценить выражение, так как код текущего метода оптимизирован.

Мне кажется, я понимаю, что это значит. Однако меня озадачивает то, что после того, как я нажимаю на шаг, код больше не «оптимизируется», и я могу посмотреть на свои переменные. Как это произошло? Как код может переключаться между оптимизированным и неоптимизированным кодом?

Ответы [ 15 ]

44 голосов
/ 12 декабря 2008

Пока строка Debug.Break () находится над стеком вызовов, вы не можете использовать выражения. Это потому, что эта линия оптимизирована. Нажмите F10, чтобы перейти к следующей строке - действительной строке кода - и часы будут работать.

27 голосов
/ 25 сентября 2008

Возможно, вы пытаетесь отладить свое приложение в режиме выпуска, а не в режиме отладки, или в настройках компиляции включена оптимизация.

Когда код скомпилирован с оптимизацией, некоторые переменные выбрасываются, как только они больше не используются в функции, поэтому вы получаете это сообщение. В режиме отладки с отключенными оптимизациями вы не должны получать эту ошибку.

26 голосов
/ 25 сентября 2008

Отладчик использует FuncEval, чтобы позволить вам «смотреть» на переменные. FuncEval требует остановки потоков в управляемом коде в безопасной точке GarbageCollector. «Приостановка» запуска в IDE вручную приводит к остановке всех потоков как можно скорее. Ваш высокорекурсивный код будет иметь тенденцию останавливаться в опасной точке. Следовательно, отладчик не может оценить выражения.

Нажатие F10 переместит вас к следующей точке Funceval Safe и включит оценку функции.

Для получения дополнительной информации ознакомьтесь с правилами FuncEval .

7 голосов
/ 26 апреля 2016

Ниже работает для меня, спасибо @ Vin.

У меня была эта проблема, когда я использовал VS 2015. Мое решение: выбрана конфигурация (Debug). Я решил эту проблему, сняв отметку со свойства Optimize Code в свойствах проекта.

Проект (правый клик) => Свойства => Построить (вкладка) => снять флажок Оптимизировать код

7 голосов
/ 03 августа 2010

Это сводило меня с ума. Я пытался подключиться с помощью управляемого и собственного кода - не пошло.

Это сработало для меня, и я наконец смог оценить все выражения:

  • Зайдите в Проект / Свойства
  • Выберите вкладку Build и нажмите Дополнительно ...
  • Убедитесь, что для «Отладочная информация» установлено «полное» (не только для pdb)
  • Отладка вашего проекта - вуаля!
2 голосов
/ 06 октября 2016

Убедитесь, что у вас нет ничего подобного

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

в вашем AssemblyInfo

2 голосов
/ 14 ноября 2009

Найдите вызов функции со многими параметрами и попробуйте уменьшить число, пока не вернется отладка.

1 голос
/ 03 мая 2011

У меня была эта проблема, когда я использовал VS 2010. Моя конфигурация решения (Отладка) выбрана. Я решил эту проблему, сняв флажок со свойством Оптимизировать код в свойствах проекта. Проект (щелкните правой кнопкой мыши) => Свойства => Построить (вкладка) => снять флажок Оптимизировать код

1 голос
/ 10 марта 2009

Была такая же проблема, но удалось решить ее, отключив перехват исключений в отладчике. Нажмите [Отладка] [Исключения] и установите для исключений значение «Необработанный пользователь».

Обычно у меня это отключено, но иногда оно пригодится. Мне просто нужно помнить, чтобы выключить его, когда я закончу.

1 голос
/ 10 марта 2009

Друг друга из Microsoft отправил это: 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

Наиболее вероятная проблема в том, что ваш стек вызовов оптимизируется из-за слишком большой сигнатуры метода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...