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


153

Я використовую Visual Studio 2010 в режимі налагодження, і у мене не встановлено прапорці "оптимізувати код". Я не можу швидко переглянути (або навести курсор) будь-яку змінну в налагоджувачі. Я отримую цю помилку "Неможливо оцінити вираз, тому що код поточного методу оптимізований".

Навіть такий рядок, як: int i = -3, швидко переглядаючи i, я отримую "Неможливо отримати значення локального чи аргументу" i ", оскільки воно не доступне в цьому покажчику інструкцій, можливо, тому, що воно було оптимізовано."

Це посилання, на яке посилається аналогічне запитання, схоже, не застосовується.

Чи є налаштування, якого я відсутній?


4
torulflundgren.blogspot.com.au/2010/03/… Це найкраще рішення для мене. Я перевірив це на візуальній студії 2013. і працював ....
Dulanjana Wickramatantri

Відповіді:


167

Поки проект знаходився в режимі налагодження, рішення не було. Коли я його змінив, це спрацювало.


9
У мене виникла ця проблема у VS2012, проте рішення та всі проекти були налаштовані на налагодження без оптимізації. Я чистий розчин / відновлення зафіксував це для мене.
saarp

20
Отже ... Як ви налаштовуєте рішення на режим не налагодження?
користувач1431072

user1431072 - ви клацаєте правою кнопкою миші на вашому рішенні або проекті вибираєте властивість, тоді ви можете встановити його в режимі налагодження
Євграф Андрійович Живаго

48

У мене виникла ця проблема, коли я використовував VS 2010. У моїй конфігурації рішення вибрано (Debug). Я вирішив це, знявши позначку властивості Optimize Code під властивостями проекту. Проект (клацніть правою кнопкою миші) => Властивості => Збірка (вкладка) => зніміть прапорці Оптимізувати код


29

Це здається, що ви налагоджуєте оптимізовану / випущену версію, незважаючи на те, що оптимізований прапорець не встановлено. Що ви можете спробувати:

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

Якщо ви не можете побачити пункт меню Модулі в меню «Налагодження -> Windows», можливо, вам знадобиться додати його в меню «Налаштувати ...».


2
Рішення перебудовується. Вікно модулів показує, що збірка оптимізована. У мене не встановлено прапорець Optimize Optimize, тому я не знаю, чому збірка завжди оптимізована. Рішення має веб-проект, але код, на який я дивлюся, знаходиться в проекті бібліотеки класів у режимі налагодження.
Tony_Henrich

@Tony - Нерозумне запитання, але чи в бібліотеці класів встановлено прапорець "Оптимізований"?
Джастін

Так. Я згадував цей факт у своєму питанні. Я вже відповів на власне запитання.
Tony_Henrich

1
Мій Project.Webмає Optimization прапорців але все ще показує , як Optimized , коли я дивлюся на його збірку в Debug > Modules:(
J86

Єдиним способом, який я змусив VS оновлювати інформацію про налагодження, було збільшити версію збірки модуля, яка досі вважалася оптимізованою, тоді як параметр не перевірявся.
альфанох

14

У VS2013 перейдіть до: Інструменти -> Параметри -> Налагодження -> Загальне та увімкніть "Використовувати керований режим сумісності". Це вимикає нову поведінку оцінки функції.


Дякую! З інших запропонованих рішень це було для мене важливим. Дивна річ, що це сталося раптово, мені цікаво, що спричинило її зміни.
кальмар808

10

Спробуйте запустити в режимі налагодження. Якщо ви працюєте в режимі випуску, ви отримаєте це повідомлення.


5
Питання просте, як день: "Я використовую Visual Studio 2010 в режимі налагодження, і я" оптимізував код "не перевірено". Ви повинні видалити цю невідповідь.
Джим Балтер

Серйозно. Він говорить про це в питанні, що він працює в налагодженні. Я не розумію чому нагороди. Ця відповідь забруднює можливі резолюції
Джон Деметриу

1
FWIW, під час пошуку цього повідомлення про помилку, це питання займає високу позицію в Google. Ця відповідь була правильною для мене (я не розумів, що перебуваю у режимі випуску).
Нейт Барбеттіні

У нього може бути більше однієї збірки, і в диспетчері конфігурацій збірку, через яку він налагоджує, можна встановити для випуску або що-небудь.
madoxdev

8

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


8

У мене була така ж проблема. Але в моєму випадку Debuggableатрибут був жорстко закодований у AssemblyInfo.csфайлі мого проекту і не був (пере-) написаний компіляцією. Він працював після видалення рядка із зазначенням Debuggableатрибута.


8

Для мене це відбувалося у VS2017 та VS2019. Це припинилося після того, як я вибрав опцію "Пригнічена оптимізація JIT при завантаженні модуля".

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


+1, це було причиною моєї проблеми. VS не здається надто хорошим в розумінні параметрів csproj, оскільки я оптимізував вимкнено в XML, коли конфігурація закінчується "Налагодження". Це добре працює при виклику MSBuild безпосередньо, але не зовсім правильно в самому VS.
TheBeardedQuack

5

У мене була така ж проблема в VS2008. У моєму випадку це було вирішено за допомогою рішення-відновити.


4

Крім @Kragen згаданого, Якщо ви налагоджуєте веб-проект

закрийте візуальну студію та спробуйте видалити тимчасові файли на C: \ Windows \ Microsoft.NET \ Framework \ v2.0.50727 \ Тимчасові файли ASP.NET


Рішення має веб-проект, але код знаходиться в проекті бібліотеки класів. Я тимчасові файли видаляв багато разів.
Tony_Henrich

4

Ще одне, що ви можете зробити, - це створити файл з тим же ім'ям, що і dll, який оптимізовано, але з розширенням ini, і додайте до нього наступне:

[.NET Framework Debugging Control]
GenerateTrackingInfo = 1
AllowOptimize = 0

Це дозволить JIT не оптимізувати ваші змінні.

Зауважте, що вам все-таки потрібен pdb, тому ви отримаєте щось подібне: yourDll.dll yourDll.pdb yourDll.ini

Це особливо добре працює в сценаріях, коли у вас немає доступу до повторної генерації dlls з можливістю налагодження.

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


4

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

Після переходу до наступного твердження та припускаючи, що ви використовуєте збірку налагодження, це повідомлення має зникнути.


2
Це було все. Я спробував усі рішення вище, і ця дрібниця спрацювала .. Дякую вам за те, що я поділився цим, я витратив би ще більше годин, не побачивши цього банального натяку ..
Krzysztof Szynter

Ні. Не працює. Vs17 все ще думає, що я налагоджую версію версії
Джон Demetriou

3

Що стосується проблеми з властивістю "Оптимізувати код", яку НЕВЕРЕЗНАЛЬНО, то код все ще збирається оптимізованим. Нарешті, мені допомогло після спроби все, встановити прапорець "Увімкнути невпорядковану налагодження коду" на тій же сторінці налаштувань (властивості проекту - налагодження). Це не пов'язане безпосередньо з оптимізацією коду, але при цьому увімкнено VS більше не оптимізує мою бібліотеку, і я можу налагоджувати.


3

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

Якщо відмітити галочку для оптимізації коду для версії версії у властивостях бібліотеки класів, я просто вирішив проблему.


Дякую, що це вдалося. Ви можете знайти цей прапорець, клацнувши правою кнопкою миші на кожному проекті та вибравши їх параметр меню "Властивості", а потім вкладку "Створити".
goamn

3

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


3

У мене була ця проблема з проектом F #, який був тут і там між Visual Studio і MonoDevelop, можливо, виникла в останньому (я забуваю). У VS поле оптимізації не було відмічене, проте оптимізація, безумовно, виникала, що стосується налагоджувача.

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

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


1

Я почав отримувати це повідомлення, коли перейшов на Visual Studio 2017. Жодна з ідей на цій сторінці, які я спробував, не працювала для мене. В іншому дописі я знайшов цю пропозицію, і це DID працює - видалити:

[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 файли з локальних папок бін, очистити, відновити, очистив усі папки тимчасових файлів ASP.NET, забезпечив встановлення прапорців TRACE / DEBUG, перевірив шляхи DLL тощо.

Щоб відкласти його, щоб він не був загублений, для порушених проектів:

Властивості проекту -> Збірка -> Додатково -> Інформація про налагодження: Повна.

Ви хочете перевірити, чи вибрано налаштування налагодження перед цим, якщо, звичайно, ви не планували інше.


0

Якщо ви намагаєтеся налагодити проект ASP.NET, переконайтесь, що для спадного меню Властивості> Веб> Сервери встановлено значення "IIS Express" (крім перевірки всього іншого тут).


0

У мене були змішані dlc розширення c ++ / cli mfc, які були оптимізовані, навіть якщо конфігурація налагодження (видно з вікна модулів VS 2017). Як було запропоновано в попередній відповіді, я змінив "У VS2013 перейдіть до: Інструменти -> Опції -> Налагодження -> Загальне та увімкніть" Використовувати керований режим сумісності ". Це відключає нову поведінку оцінки функції." Ці налаштування також знайдені у VS 2017.

Але цього було недостатньо, тому я також скопіював налаштування UseDebugLibraries з файлу проекту іншого додатка MFC у розширення файлу проекту dll.

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

Потім відновіть і це вирішило проблему.


0

У Visual Studio 2012 ввімкнення параметра " Керований " в меню Інструменти> Налагодження> Тільки вчасно працював на мене.

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.