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

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

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

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

Ответы [ 15 ]

0 голосов
/ 08 ноября 2017

У меня была похожая проблема, и она была решена, когда я собрал решение в режиме отладки и заменил файл pdb в пути выполнения.

0 голосов
/ 20 марта 2016

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

0 голосов
/ 28 октября 2015

Оценка:

В .NET «Оценка функции (funceval)» - это способность CLR вводить произвольный вызов, когда отладчик где-то останавливается. Funceval отвечает за выбранный поток отладчика для выполнения запрошенного метода. После завершения funceval запускается событие отладки. Технически, CLR определили способы отладчика для выдачи funceval.

CLR позволяет инициировать funceval только для тех потоков, которые находятся в безопасной точке GC (т. Е. Когда поток не будет блокировать GC) и в точке Funceval Safe (FESafe) (т. Е. Где CLR может фактически выполнить захват для funceval.) , Таким образом, возможные сценарии для CLR потока должны быть:

  1. остановлено в управляемом коде (и в безопасной точке GC): это означает, что мы не можем выполнять funceval в собственном коде. Поскольку нативный код находится вне контроля CLR, он не может установить funceval.

  2. остановлен с 1-й случайностью или необработанным управляемым исключением (и в безопасной точке GC): т.е. во время исключения, чтобы как можно больше проверить, чтобы определить причину возникновения этого исключения. (например: отладчик может попытаться оценить и увидеть свойство Message в возбужденном исключении.)

В целом, распространенные способы остановки в управляемом коде включают остановку в точке останова, шаг, вызов Debugger.Break, перехват исключения или запуск потока. Это помогает в оценке метода и выражений.

Возможные разрешения: На основании оценки, если поток не находится в точках FESafe и GCSafe, CLR не сможет перехватить поток, чтобы инициировать funceval. Как правило, следующее гарантирует, что funceval запускается, когда ожидается:

Шаг № 1:

Убедитесь, что вы не пытаетесь отладить сборку «Release». Релиз полностью оптимизирован и поэтому приведет к ошибке в обсуждении. Используя стандартную панель инструментов или диспетчер конфигурации, вы можете переключаться между режимами отладки и выпуска.

Шаг № 2:

Если вы по-прежнему получаете сообщение об ошибке, возможно, для оптимизации задана опция отладки. Проверьте и снимите флажок «Оптимизировать код» в разделе «Свойства» проекта:

Щелкните правой кнопкой мыши проект Выберите опцию «Свойства» Перейти на вкладку «Сборка» Снимите флажок «Оптимизировать код»

Шаг № 3:

Если вы все еще получаете сообщение об ошибке, режим отладочной информации может быть неправильным. Проверьте и установите его на «полный» в разделе «Расширенные настройки сборки»:

Щелкните правой кнопкой мыши Проект Выберите опцию «Свойства» Перейти на вкладку «Сборка» Нажмите кнопку «Дополнительно» Установите «Отладочная информация» как «полная»

Шаг № 4:

Если проблема не устранена, попробуйте следующее:

Выполните «Очистку», а затем «Перестройку» вашего файла решения. Во время отладки: Зайдите в окно модулей (Меню VS -> Отладка -> Windows -> Модули) Найдите свою сборку в списке загруженных модулей. Проверьте, что путь, указанный для загруженной сборки, соответствует ожидаемому. Проверьте измененную метку времени файла, чтобы убедиться, что сборка была фактически перестроена. Проверьте, оптимизирован ли загруженный модуль или нет

Вывод:

Это не ошибка, а информация, основанная на определенных настройках и разработанная на основе работы .NET runtime.

0 голосов
/ 14 марта 2015

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

Надеюсь, это кому-нибудь поможет.

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

Я считаю, что то, что вы видите, является результатом оптимизации - иногда переменная будет использоваться повторно - особенно те, которые создаются в стеке. Например, предположим, у вас есть метод, который использует два (локальных) целых числа. Первое целое число объявляется в начале метода и используется исключительно как счетчик цикла. Ваше второе целое число используется после завершения цикла, и в нем хранятся результаты вычислений, которые впоследствии записываются в файл. В этом случае оптимизатор МОЖЕТ принять решение повторно использовать ваше первое целое число, сохранив код, необходимый для второго целого числа. Когда вы пытаетесь взглянуть на второе целое число в начале, вы получаете сообщение о том, что «Не удается оценить выражение». Хотя я не могу объяснить точные обстоятельства, оптимизатор может позже перенести значение второго целого числа в отдельный элемент стека, в результате чего вы сможете получить доступ к значению отладчика.

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