«Невозможно оценить выражение, потому что код текущего метода оптимизирован» в Visual Studio 2010

153

Я использую Visual Studio 2010 в режиме отладки, и у меня снят флажок «оптимизировать код». Я не могу быстро наблюдать (или зависать) любую переменную в отладчике. Я получаю эту ошибку «Невозможно оценить выражение, потому что код текущего метода оптимизирован».

Даже в такой строке, как: int i = -3, быстро просматривая i, я получаю «Не удается получить значение local или аргумента« i », так как оно недоступно по указателю этой инструкции, возможно, потому, что оно было оптимизировано».

Эта ссылка ссылается на подобный вопрос , кажется, не применяется.

Есть настройки, которые мне не хватает?

Tony_Henrich
источник
4
torulflundgren.blogspot.com.au/2010/03/… Это лучшее решение, которое я нашел для этого. Я проверил это на Visual Studio 2013. и работал ....
Дуланжана Викраматантри

Ответы:

167

Пока проект находился в режиме отладки, решения не было. Когда я изменил это, это сработало.

Tony_Henrich
источник
9
У меня была эта проблема в VS2012, однако решение и все проекты были настроены на отладку без оптимизации. Я убираю решение / перестраиваю исправленное для меня.
saarp
20
Итак ... Как установить решение в режим без отладки?
user1431072
user1431072 - вы щелкаете правой кнопкой мыши по вашему решению или проекту и выбираете свойство, затем вы можете установить его в режим отладки
Евграф Андреевич Живаго
48

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

Vin
источник
29

Похоже, что вы отлаживаете оптимизированную / выпускную сборку, несмотря на то, что оптимизированный флажок не установлен. Вот что вы можете попробовать:

  • Выполните полную перестройку файла решения (щелкните правой кнопкой мыши решение и выберите «Перестроить все»).
  • Во время отладки откройте окно модулей (Debug -> Windows -> Modules) и найдите свою сборку в списке загруженных модулей. Убедитесь, что путь, указанный для загруженной сборки, соответствует ожидаемому, и что измененная временная метка файла указывает, что сборка фактически была перестроена.
  • В окне модулей также должно быть указано, оптимизирован ли загруженный модуль или нет - убедитесь, что в окне модулей указано, что он не оптимизирован.

Если вы не видите пункт меню «Модули» в меню «Отладка -> Windows», вам может потребоваться добавить его в меню «Настройка ...».

Джастин
источник
2
Решение перестроено. Окно модулей показывает, что сборка оптимизирована. У меня не установлен флажок «Оптимизировать», поэтому я не знаю, почему сборка всегда оптимизируется. У решения есть веб-проект, но код, который я рассматриваю, находится в проекте библиотеки классов в режиме отладки.
Tony_Henrich
@ Тони - Глупый вопрос, но в библиотеке классов снят флажок «Оптимизировано»?
Джастин
Да. Я упомянул этот факт в своем вопросе. Я уже ответил на свой вопрос.
Tony_Henrich
1
Project.WebОптимизация у меня снята, но она по-прежнему отображается как Оптимизированная, когда я смотрю на ее сборку в Debug > Modules:(
J86
Единственный способ заставить VS обновить информацию отладки - увеличить версию сборки модуля, которая все еще считалась оптимизированной, тогда как опция не была проверена.
alphanoch
14

В VS2013 перейдите: Инструменты -> Параметры -> Отладка -> Общие и включите «Использовать режим управляемой совместимости». Это отключает поведение оценки новой функции.

Джесси
источник
Спасибо! Из других предложенных решений это было то, что имело значение для меня. Странно, что это случилось внезапно, интересно, что заставило это измениться.
squid808
10

Попробуйте запустить в режиме отладки. Если вы работаете в режиме выпуска, вы получите это сообщение.

thejustv
источник
5
Вопрос говорит, как день: «Я использую Visual Studio 2010 в режиме отладки, и у меня снят флажок« Оптимизировать код ». ... Вы должны удалить этот ответ без ответа.
Джим Балтер
Шутки в сторону. Он говорит это в вопросе, что он работает в режиме отладки. Я не понимаю, почему против. Этот ответ загрязняет возможные решения
Джон Demetriou
1
FWIW, этот вопрос высоко ценится в Google при поиске этого сообщения об ошибке. Этот ответ был правильным для меня (я не понимал, что я был в режиме выпуска).
Нейт Барбеттини,
У него может быть более одной сборки, и в диспетчере конфигурации сборка, с помощью которой он отлаживает, может быть установлена ​​на release или sth.
madoxdev
8

Моя ситуация не была охвачена ни одним из вышеуказанных ответов. Я обнаружил следующее: статья MSDN о потоках, в которой объясняется, что при застревании в некоторых примитивных нативных операциях с потоками отладчик не может получить доступ к данным. Например, когда поток находится на Task.Wait (), это происходит.

Алан Бальжеу
источник
8

У меня такая же проблема. Но в моем случае Debuggableатрибут был жестко запрограммирован в AssemblyInfo.csфайле моего проекта и поэтому не был перезаписан компиляцией. Сработало после удаления строки, указывающей Debuggableатрибут.

riQQ
источник
8

Для меня это происходило в VS2017 и VS2019. Это перестало происходить после того, как я выбрал опцию «Подавленная оптимизация JIT при загрузке модуля».

введите описание изображения здесь

farfareast
источник
+1, этот был причиной моей проблемы. Кажется, VS не слишком хорошо разбирается в параметрах csproj, поскольку я отключил оптимизацию в XML, когда конфигурация заканчивается «Отладка». Он работает нормально при вызове MSBuild напрямую, но не совсем правильно в самой VS.
TheBeardedQuack
5

У меня была такая же проблема в VS2008. В моем случае это было решено с помощью решения перестроить.

Ингмар
источник
4

Помимо упомянутого @Kragen, если вы отлаживаете веб-проект

закройте Visual Studio и попробуйте удалить временные файлы в C: \ Windows \ Microsoft.NET \ Framework \ v2.0.50727 \ Temporary ASP.NET Files

TestUser
источник
У решения есть веб-проект, но код находится в проекте библиотеки классов. Я удалял временные файлы много раз.
Tony_Henrich
4

Еще одна вещь, которую вы можете сделать, это создать файл с тем же именем, что и dll, который оптимизирован, но с расширением ini, и добавить к нему следующее:

[.NET Framework Отладка управления]
GenerateTrackingInfo = 1
AllowOptimize = 0

Это скажет JIT не оптимизировать ваши переменные.

Обратите внимание, что вам все еще нужен pdb, поэтому вы получите что-то вроде этого: yourDll.dll yourDll.pdb yourDll.ini

Это особенно хорошо работает в сценариях, когда у вас нет доступа к повторной генерации DLL с опцией отладки.

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

Бонго Шарп
источник
4

Когда вы увидите сообщение « Невозможно оценить выражение, потому что код текущего метода оптимизирован. » После выполнения Debugger.Break()оператора, убедитесь, что вы нажимаете F10, чтобы перейти к следующему оператору.

После перехода к следующему оператору и при условии, что вы запускаете сборку Debug, это сообщение должно исчезнуть.

Йерун Ритмейер
источник
2
Вот и все. Я перепробовал все решения, описанные выше, и эта мелочь сработала. Спасибо, что поделились ею, я бы потратил еще больше часов, не увидев этот тривиальный намек ..
Кшиштоф Шинтер
Nop. Не сработало. Vs17 все еще думает, что я отлаживаю сборку релиза
Джон Деметриу
3

Относительно проблемы со свойством «Оптимизировать код» НЕПРАВИЛЬНО, но код все еще компилировался как оптимизированный: в конце концов, после всех попыток мне помог флажок «Включить отладку неуправляемого кода» на той же странице настроек (Свойства проекта - Отладка). Это не имеет прямого отношения к оптимизации кода, но с этим включенным VS больше не оптимизирует мою библиотеку, и я могу отлаживать.

Милош
источник
3

У меня была такая же проблема при отладке библиотеки классов из тестового веб-приложения. Я ссылался на версию релиза на тестовом стенде, и она была настроена для оптимизации в свойствах библиотеки классов.

Сняв флажок «Оптимизировать код» для версии выпуска в свойствах библиотеки классов, я решил написать эту проблему.

tekiegirl
источник
Спасибо, что сделали это. Вы можете найти этот флажок, щелкнув правой кнопкой мыши в каждом проекте и выбрав их пункт «Свойства», а затем вкладку «Построить».
goamn
3

Я понимаю, что это более поздний ответ, но я нашел другую ссылку на способ решения этой проблемы, который может помочь другим в будущем. На этой веб-странице описывается установка переменной среды (COMPLUS_ZapDisable = 1), которая препятствует оптимизации, по крайней мере, для меня! (Не забудьте про вторую часть отключения процесса размещения Visual Studio.) В моем случае это могло бы быть даже более актуально, потому что я отлаживал внешнюю DLL через сервер символов, но я не уверен.

Майкл Брей
источник
3

У меня была эта проблема с проектом F #, который был здесь и там между Visual Studio и MonoDevelop, возможно, возник в последнем (я забыл). В VS блок оптимизации не был отмечен, но оптимизация, безусловно, происходила в том, что касается отладчика.

После сравнения XML файла проекта со здоровым, проблема была очевидна: у здорового проекта был явный <optimize>false</optimize> строка, а у плохого ее полностью не было. VS явно выводил из своего отсутствия, что оптимизация была отключена, в то время как компилятор делал обратное.

Решением было добавить это свойство в файл проекта и перезагрузить.

Джейсон Холлоуэй
источник
1

Я начал получать это сообщение, когда перешел на Visual Studio 2017. Ни одна из идей на этой странице, которые я пробовал, не сработала для меня. В другом посте я нашел это предложение, и оно работало - удалить:

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

... из вашего файла AssemblyInfo.

Сумасшедший кот
источник
Люблю тебя @Crazy Cat. Это случилось со мной, когда я перешел на VS2019.
Антонио Родригес
0

У меня была такая же проблема в VS 2010. Очистил и пересобрал решение, и оно заработало.

Санджай Гупта
источник
0

Комментарий vickramds выше со ссылкой на http://torulflundgren.blogspot.com.au/2010/03/cannot-obtain-value-of-local-or.html , сделал это для меня. Я проверил все - удалил все файлы dll, pdb из локальных папок bin, очистил, перестроил, очистил все папки временных файлов ASP.NET, проверил, установлены ли флаги TRACE / DEBUG, проверил пути к DLL и т. Д.

Чтобы отложить это, чтобы это не потеряно, для затронутого проекта (ов):

Свойства проекта -> Сборка -> Дополнительно -> Отладочная информация: Полная.

Вы хотите проверить, что у вас выбрана конфигурация Debug, прежде чем вы это сделаете, если, конечно, вы не намеревались иначе.

Mayyit
источник
0

Если вы пытаетесь отладить проект ASP.NET, убедитесь, что в раскрывающемся списке «Свойства»> «Веб»> «Серверы» для проекта задано значение «IIS Express» (помимо проверки здесь всего остального).

Повелитель Цург
источник
0

Я имел смешанные dll расширения c ++ / cli mfc, которые были оптимизированы даже при отладочной конфигурации (видно из окна VS 2017 Modules). Как и предполагалось в предыдущем ответе, я изменил: «В VS2013 перейдите по адресу: Инструменты -> Параметры -> Отладка -> Общие и включите« Использовать режим управляемой совместимости ». Это отключает поведение оценки новой функции». Эти настройки найти также в VS 2017.

Но этого было недостаточно, поэтому я также скопировал параметр UseDebugLibraries из файла проекта другого приложения MFC в файл проекта расширения dll.

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

Затем восстановите, и это решило проблему.

owluCoder
источник
0

В Visual Studio 2012 у меня работало включение опции « Управляемый » в меню «Инструменты»> «Отладка»> «Just-In-Time» .

введите описание изображения здесь

Qmaster
источник