Неможливо отримати значення локального або аргументу, оскільки воно недоступне в цьому покажчику інструкцій, можливо, тому, що воно було оптимізовано


211

Visual Studio 2010 вбиває (іншого слова немає) в одному з аргументів функції в небезпечному блоці. Що може спричинити цю помилку? Наступне повідомлення показує налагоджувачем.

Cannot obtain value of local or argument as it is not available at this instruction pointer, possibly because it has been optimized away.

2
У мене точно така ж проблема, і я використовую Debug build. Cannot obtain value of local or argument '<this>' as it is not available at this instruction pointer, possibly because it has been optimized away. System.Threading.Tasks.TaskExceptionHolder
javapowered

19
На жаль, у мене щойно було вибрано реліз, вибраний помилково ..
Деніел Літтл

У мене ця проблема у VS 2017, і я дотримувався всіх інструкцій у публікаціях нижче. Чи є інші варіанти?
Matt W

Не забудьте побудову меню -> Менеджер конфігурацій. Конфігурацію потрібно встановити на налагодження там, інакше проблема все ще виникає.
Боб Клегг

Відповіді:


344

Перейдіть до Властивості проекту та в розділі Складіть Переконайтесь, що прапорець "Оптимізувати код" не встановлений.

Також встановіть спадне меню "Інформація про налагодження" на "Повне" на вкладці Додаткові параметри (на вкладці "Збірка").


128
Спочатку перевірте, чи налаштування збірки є налагодженням, а не випуском.
Гіпокрит ApceH

До речі, якщо ви хочете протестувати його в режимі випуску, ви можете додати "Debugger.Launch ();" у коді
Джейсон

Зробив обидва кроки та змінив конфігурацію з "Випуску" на "Збірка". Працював над Visual Studio 2017 Community Edition.
Нео

1
Якщо у вас є VS 2017, і прийнята відповідь, і відповідь від xyq.384.b допоможуть. Для мене відповідь xyq.384.b - це виправлення, оскільки налагоджувач JIT пригнічував покажчик ... Вибачте, JIT "оптимізував" його ...
BillRuhl

Після переходу на конфігурацію налагодження я виявив, що поле оптимізації коду вже було знято. Урок: Не налагоджуйте в режимі конфігурації випуску.
eliteproxy

135

Також у VS 2015 Community Edition

перейдіть до Налагодження-> Параметри або Інструменти-> Опції

і перевірте Налагодження-> Загальне-> Придушити оптимізацію JIT на завантаженні модуля (лише керований)


7
Це вирішило моє питання після застосування всіх рішень, згаданих вище.
masih

1
Жодна із запропонованих відповідей для мене не працює. Мої змінні все ще оптимізовані ...
Sushi271

Не маю ідеї, чому це просто раптом почалося траплятися .. але це виправлено!
Мерфібро2

Святе лайно, це також виправило мене в спільноті VS2017! Не маю уявлення, коли або як цю опцію не було вибрано ...
Ian Kemp

Працює як чемпіон!
BillRuhl

59

Якщо ви компілюєте з увімкненою оптимізацією, багато змінних буде видалено; наприклад:

SomeType value = GetValue();
DoSomething(value);

тут локальна змінна value, як правило, видаляється, зберігаючи замість цього значення в стеці - трохи так, як ніби ви написали:

DoSomething(GetValue());

Крім того, якщо значення повернення взагалі не використовується , воно буде викинуто через "pop" (а не збережене в локальному через "stloc", і знову; локальне не буде).

Через це в такому складі налагоджувач не може отримати поточне значення, valueоскільки його не існує - він існує лише на короткий момент між GetValue()і DoSomething(...).

Так; якщо ви хочете налагоджувати ... не використовуйте версію версії! або принаймні відключити оптимізацію під час налагодження.


4
Дякую за Вашу відповідь - але я перевіряю властивість коду Optimize у моєму проекті, і він не обраний = (
цікаво

4
@Marc - Я розумію, про що ви говорите, однак я використовую бібліотеки довідкових джерел microsoft, щоб кодувати крок через їхнє власне лайно. Зараз я переживаю методи, але, здається, не можу спостерігати за жодними значеннями місцевих жителів. У чому сенс налагодження джерела .Net тоді? Будь-які пропозиції? stackoverflow.com/questions/13147132 / ...
one.beat.consumer

Здається, я роблю те саме, що і @ one.beat.consumer: намагаюся перейти через загальнодоступні символи Microsoft, щоб зрозуміти, чому рамка ASP.NET не працює. У моєму випадку прив’язка моделі в MVC 3 ...
бамбуки

@ one.beat.consumer Я припускаю, що посилання на мікрософт були складені з увімкненою оптимізацією, тож навіть якщо ви можете завантажити їх вихідний код, щоб переглянути його, як через значення перейшли, точно так само, як якщо б ви склали проект з оптимізаціями увімкнено. Це конкретний проект (dll) - якщо ви можете отримати "налагодження" версій посилань на MS, то ви зможете побачити значення. Не забувайте, що якщо на MS dll посилався інший проект, на який посилається ваш основний проект, "субреференція" може відповідати налаштуванням іншого проекту.
drzaus

22

http://www.guntucomputerhacks.blogspot.com.au/2014/07/cannot-obtain-value-of-local-or.html

Це працювало для мене у візуальній студії 2013 року.

Все, що вам потрібно зробити, це ..

  1. Клацніть правою кнопкою миші на проект, який ви не можете налагодити.
  2. Перейдіть до власних проектів.
  3. Клацніть на меню збірки.
  4. Натисніть на розширену кнопку.
  5. Встановіть повне значення спадної інформації про налагодження.
  6. Побудуйте свій проект.

20

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



8

Коли я стикався з тією ж проблемою, я просто повинен був очистити своє рішення перед перебудовою. Це подбало про мене.


6

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


1
Друга пропозиція змусила все знову працювати спасибі!
CodeMilian

1
У VS 2015 я не бачу Enable unmanaged code debugging. Є Enable native code debugging, я спробував це перевірити, але це не мало значення.
Аль-Лелопат

1
У VS 2015 я перевірив Увімкнути "Рідний код" у збірці проекту, Web, Налагоджувачах, і все це спрацювало.
Mouffette

6

Я зіткнувся з тим же питанням, і рішення для мене - це зміна Solution Configurationз Releaseна Debug. Сподіваюся, це допомагає


4

У моєму випадку я працював над веб-проектом api, і хоча проект був налаштований правильно на повну налагодження, я все одно бачив цю помилку кожного разу, коли я приєднувався до IIS процесу, я намагався налагоджувати. Потім я зрозумів, що профіль публікації налаштований на використання конфігурації випуску. Отже, ще одним місцем для перевірки є ваш профіль публікації, якщо ви використовуєте функцію "Опублікувати" для вашого веб-проекту apt dotnet.


3

Я виявив, що у мене була та сама проблема, коли я запускав проект і налагоджував, приєднавшись до процесу IIS. Я також працював у режимі налагодження з вимкненими оптимізаціями. Хоча я вважав, що код скомпільований нормально, коли я від'єднався і намагався його скласти, одна з посилань не була знайдена. Це було пов’язано з іншим розробником тут, який вніс зміни та змінив розташування посилання. Посилання не відображалося із символом оповіщення, тому я вважав, що все добре, доки не зробив компіляцію. Після виправлення посилання та запуску знову він працював.


1

Як додаткову відповідь для тих, хто відчуває цю проблему під час налагодження веб-програми веб-сайтів Azure:

Наприклад, при розгортанні з GitHub код складається на сервері Azure, оптимізованому за замовчуванням.

Я кажу серверу складати налагоджуваний спосіб, встановивши SCM_BUILD_ARGSна/p:Configuration=Debug

але є більше варіантів. Дивіться це: http://azure.microsoft.com/blog/2014/05/08/introduction-to-remote-debugging-on-azure-web-sites-part-3-multi-in substance-environment-and-git /


1

У Visual Studio 2012:

Перейдіть до властивостей проекту -> Налагодження -> зніміть прапорець "Увімкнути процес хостингу Visual Studio"


1

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

Ви можете створити додаток у режимі налагодження, але це може статися, коли ви публікуєте його в режимі випуску, який за замовчуванням опромінює код, але IDE може ввести вас в оману, оскільки він показує режим налагодження, коли опублікований код знаходиться в режимі випуску. Деталі ви можете побачити на знімку нижче: введіть тут опис зображення


0

Перевірте, чи є у вас файл атрибута Debuggable у файлі AssemblyInfo. Якщо є, видаліть його та відновіть рішення, щоб побачити, чи стають доступні локальні змінні.

Мій атрибут налагодження був встановлений на: DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints, який відповідно до цієї статті MSDN повідомляє компілятору JIT використовувати оптимізацію. Я видалив цей рядок із мого файлу AssemblyInfo.cs, і локальні змінні були доступні.


0

У Visual Studio 2017 або 2015:

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


0

У мене було те саме питання. Перепробував усе вищесказане і виявив, що мені також довелося видалити все всередині {PROJECT_ROOT} \ bin \ Release \ netcoreapp2.2 та {PROJECT_ROOT} \ obj \ Release \ netcoreapp2.2 для мого проекту. Він, безумовно, відмовився від публікації, тому що, хоча я використовую інструменти розгортання / бітбукет у своєму веб-додатку Azure, я спробував побудувати >> Опублікувати >> Опублікувати в Azure, тому що я хотів перевірити, які файли насправді розгорнуті.


0

Якщо у програмі WPF була та сама проблема, і всі рішення тут НЕ вирішили проблему . Проблема полягала в тому, що Модуль уже оптимізований, тому такі рішення НЕ РОБОТИ (або недостатньо для вирішення проблеми):

  • Зніміть прапорець " Оптимізувати код "
  • " Пригнічувати оптимізацію JIT при завантаженні модуля " встановлено
  • Конфігурація рішення на DEBUG

Модуль все ще завантажений Оптимізований. Дивіться наступний знімок екрана: Оптимізований модуль


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

Двічі клацніть на вашій програмі на панелі « Процес », а потім у новому вікні відкрийте вкладку « .NET Assembly ». Потім у стовпці " Шлях до рідного зображення " ви знайдете всі шляхи оптимізованих модулів . Знайдіть ту, яку потрібно знешкодити та видалити папку (див. Скріншот нижче): введіть тут опис зображення (Я розмив назву своєї компанії з очевидних причин)

Перезавантажте програму (прапорець у кроці 1 правильно встановлено), і вона повинна працювати.

Примітка : файл може бути заблокований, оскільки він був відкритий іншим процесом, спробуйте закрити Visual Studio. Якщо файл все ще заблокований, ви можете скористатися такою програмою, як Lock Hunter

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