Невозможно получить значение local или аргумента, так как оно недоступно по указателю этой инструкции, возможно, из-за того, что оно было оптимизировано


212

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. 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, и я следовал всем инструкциям в постах ниже. Есть ли другие варианты?
Мэтт W

Не забудьте меню Build -> Configuration Manager. Конфигурация должна быть настроена на Debug там, или вы все еще получаете проблему.
Боб Клегг

Ответы:


347

Перейдите в Свойства проекта и в разделе «Сборка». Убедитесь, что флажок «Оптимизировать код» снят.

Кроме того, установите раскрывающийся список «Отладочная информация» на «Полный» во вкладке «Дополнительные параметры» (на вкладке «Сборка»).


129
Во-первых, проверьте, что Конфигурация сборки является Отладкой, а не Выпуском.
ApceH Hypocrite

Кстати, если вы хотите протестировать его в режиме Release, вы можете добавить «Debugger.Launch ();» в коде
Джейсон

Сделал оба шага и изменил конфигурацию с «Release» на «Build». Работал над Visual Studio 2017 Community Edition.
Neo

1
Если у вас VS 2017, то и принятый ответ, и ответ от xyq.384.b помогут. Для меня xyq.384.b ответом было исправление, так как именно JIT-отладчик подавлял указатель ... Извините, JIT "оптимизировал" его ...
BillRuhl

После перехода в отладочную конфигурацию я обнаружил, что окно оптимизации кода уже не проверено. Извлеченный урок: не отлаживайте в режиме конфигурации выпуска.
eliteproxy

135

Также в VS 2015 Community Edition

зайдите в Debug-> Options или Tools-> Options

и проверьте Отладка-> Общие-> Подавить оптимизацию JIT при загрузке модуля (Только управляемые)


7
Это решило мою проблему после применения всех решений, упомянутых выше.
Маси

1
Ни один из предложенных ответов не работает для меня. Мои переменные по-прежнему оптимизированы ...
Sushi271

Не знаю, почему это так внезапно начало происходить ... но это исправило!
Murphybro2

Святое дерьмо, это также исправило это для меня в Сообществе VS2017! Понятия не имею, когда или как эта опция была отменена ...
Ян Кемп

Работает как чемпион!
BillRuhl

59

Если вы скомпилируете с включенной оптимизацией, многие переменные будут удалены; например:

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

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

DoSomething(GetValue());

Кроме того, если возвращаемое значение не используется вообще , оно будет отброшено с помощью «pop» (а не сохранено в локальном через «stloc», и снова; локальное не будет существовать).

Из-за этого в такой сборке отладчик не может получить текущее значение, valueпотому что он не существует - он существует только на короткий промежуток времени между GetValue()иDoSomething(...) .

Так; если вы хотите отладить ... не используйте сборку релиза! или, по крайней мере, отключите оптимизацию во время отладки.


4
Спасибо за ваш ответ - но я отмечаю Оптимизировать свойство кода в моем проекте, и оно не выбрано = (
любопытство

4
@Marc - я понимаю, что вы говорите, однако я использую справочные библиотеки Microsoft для кодирования пошагового кода. Сейчас я хожу по методам, но я не могу наблюдать какие-либо ценности местных жителей. Какой смысл отлаживать источник .Net? Какие-либо предложения? stackoverflow.com/questions/13147132/…
one.beat.consumer

Кажется, я делаю то же самое, что и @ one.beat.consumer: пытаюсь пройтись по общедоступным символам Microsoft, чтобы понять, почему не работает среда ASP.NET. В моем случае модель привязки в MVC 3 ...
bambams

@ one.beat.consumer Я полагаю, потому что ссылки Microsoft были скомпилированы с включенной оптимизацией, поэтому, даже если вы можете загрузить их исходный код, чтобы посмотреть, как пошаговые значения пропали, точно так же, как если бы вы компилировали свой проект с оптимизацией включен. Это зависит от проекта (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, я пытался проверить это, но это не имело никакого значения.
Al Lelopath

1
В VS 2015 я проверил Enable "Native code" в сборке проекта, Web, отладчиках и все заработало.
Муффетт

6

Я столкнулся с той же проблемой, и решение для меня - изменить Solution Configurationс Releaseна Debug. Надеюсь, поможет


4

В моем случае я работал над проектом веб-API и, хотя проект был настроен на полную отладку, я все еще видел эту ошибку каждый раз, когда подключался к процессу IIS, который пытался отладить. Затем я понял, что профиль публикации был настроен на использование конфигурации выпуска. Итак, еще одно место, которое нужно проверить, - это ваш профиль публикации, если вы используете функцию «Опубликовать» вашего проекта dotnet web api.


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-instance-environment-and-git /


1

В Visual Studio 2012:

Перейдите в свойства проекта -> Отладка -> Снимите флажок «Включить процесс размещения Visual Studio»


1

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

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


0

Проверьте, есть ли у вас атрибут Debuggable в вашем файле AssemblyInfo. Если есть, удалите его и пересоберите решение, чтобы увидеть, станут ли доступны локальные переменные.

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


0

В Visual Studio 2017 или 2015:

Перейдите в Решение, щелкните правой кнопкой мыши решение, затем выберите Свойства-> выберите все настройки-> Отладка, затем нажмите ОК. После этого Rebuild and Run это решение сработало для меня.


0

Я была такая же проблема. Попробовал все вышеперечисленное и обнаружил, что мне также пришлось удалить все внутри {PROJECT_ROOT} \ bin \ Release \ netcoreapp2.2 и {PROJECT_ROOT} \ obj \ Release \ netcoreapp2.2 для моего проекта. Это определенно подходит для публикации, потому что, хотя я использую средства развертывания / bitbucket в своем веб-приложении Azure, я попробовал «Построить» >> «Опубликовать» >> «Опубликовать в Azure», потому что я хотел проверить, какие файлы были фактически развернуты.


0

Раньше такая же проблема была с приложением WPF, и все решения здесь НЕ решали проблему . Проблема заключалась в том, что модуль уже был оптимизирован, поэтому следующие решения НЕ РАБОТАЮТ (или их недостаточно для решения проблемы):

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

Модуль все еще загружен Оптимизирован. Смотрите следующий скриншот: Оптимизированный модуль


Чтобы решить эту проблему, вы должны удалить оптимизированный модуль. Чтобы найти оптимизированный путь к модулю, вы можете использовать такой инструмент, как Process Hacker .

Дважды щелкните вашу программу на « панели процессов », затем в новом окне откройте вкладку « Сборки .NET ». Затем в столбце « Путь к собственному изображению » вы найдете все пути к оптимизированным модулям . Найдите файл, который вы хотите де-оптимизировать, и удалите папку (см. Скриншот ниже): введите описание изображения здесь (Я размыл название своей компании по понятным причинам)

Перезапустите приложение (с установленным флажком в шаге 1), и оно должно работать.

Примечание . Файл может быть заблокирован, так как он был открыт другим процессом, попробуйте закрыть Visual Studio. Если файл все еще заблокирован, вы можете использовать такую ​​программу, как Lock Hunter

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.