it-roy-ru.com

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

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

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

Ссылка ссылка в аналогичном вопросе, похоже, не применима.

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

139
Tony_Henrich

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

154
Tony_Henrich

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

44
Vin

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

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

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

27
Justin

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

14
Jesse

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

9
thejustv

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

5
Ingmar

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

5
Alan Baljeu

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

4
riQQ

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

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

4
testuser

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

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

4
Jeroen Ritmeijer

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

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

3
tekiegirl

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

3
Michael Bray

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

[Управление отладкой .NET Framework]
GenerateTrackingInfo = 1
AllowOptimize = 0

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

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

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

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

3
Bongo Sharp

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

3
Miloš

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

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

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

3
Jason Holloway

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

0
Sanjay Gupta

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

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

Свойства проекта -> Build -> Advanced -> Debug Info: Full.

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

0
Mayyit

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

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

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

0
Crazy Cat

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

0
Overlord Zurg

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

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

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

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

0
owluCoder