Подтвердить что ты не робот

Если странность высказывания в Visual Studio 2008

Я столкнулся с проблемой настолько странной, что я записал свою сессию, потому что не думал, что кто-то меня поверит.

Я наткнулся на ошибку, которая, кажется, находится на очень фундаментальном уровне. Это однопоточное приложение, и все, что делает im, оценивают логическое значение.

Логическое значение равно false, однако оператор if выполняется так, как если бы он был истинным... вроде. Вы поймете, что я имею в виду. Я очистил решение и перестроил много раз. Не знаю, что происходит.

Мне понравятся некоторые объяснения.

http://www.youtube.com/watch?v=ope9kxEyt4g

4b9b3361

Ответ 1

Я видел это много раз в прошлом. В основном происходит то, что код, который вы отлаживаете, не соответствует коду, который вы видите.

Я не знаю, что вызывает это, и решение следует принципам грузового культа.

  • Закройте все копии Visual Studio
  • Удалите все ваши папки bin и объектов для этого проекта.
  • Удалите все папки bin и объектов для всех проектов .NET.
  • Удалите все файлы, находящиеся в папке "C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\Temporary ASP.NET"

Ответ 2

Я предполагаю, что при развертывании происходит что-то странное, поэтому pdb не синхронизируется с фактическим кодом. Если вы используете ведение журнала вместо отладчика, чтобы выяснить, что происходит, я подозреваю, что вы увидите более разумное поведение. Я сомневаюсь, что сама CLR ведет себя странно с "if" - это, скорее всего, будет несоответствием отладчика/времени выполнения.

Ответ 3

Я видел подобный случай давным-давно, в Delphi, поэтому мой вопрос таков: компилируете ли вы для Release или Debug с оптимизацией или без нее?

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

В принципе, со следующим типом кода:

procedure Test;
begin
    Line1;
    Line2;
    Line3;
    line4;
end;

Порядок выполнения, согласно отладчику, был следующим:

procedure Test;
begin             start -+
    Line1;               |                             +-> here -+
    Line2;               |                   +-> here -+         |
    Line3;               |         +-> here -+                   |
    line4;               +-> here -+                             |
end;                                                             +-> end

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

Итак, у вас есть оператор throw дальше, который на самом деле тот, который выполняется, но компилятор показывает это как тот, с которым у вас проблемы, потому что из-за переупорядочения кода на самом деле только выбросы один раз в качестве исполняемого кода?

Примечание. У меня нет причин знать, что это то, что делает Visual Studio, но это было то, что пришло мне в голову при просмотре вашего видео.

Ответ 4

Я думаю, что это похоже на случай, когда диапазоны степпинга отладки просто выключены. Вы не всегда можете доверять желтой подсветке в отладчике. Вы на самом деле не вступаете. В ранних версиях Betas F # у нас было много ошибок вроде этого, где желтая подсветка прыгала бы как сумасшедшая. Выделение отладчика в основном зависит от того, что компилятор записывает в .pdb файл в качестве "исходного диапазона", который соответствует определенному скомпилированному набору инструкций.

Какая версия VS/С# это?

ИЗМЕНИТЬ Увидев другие ответы, действительно, вероятно, причина в том, что ваш .pdb файл не синхронизирован с вашей .dll.

Ответ 5

У меня была такая же проблема неделю назад. Также есть VS2008, последний SP. WinForms. Значение было ложным, но тело if всегда выполнялось. Я делал те же исследования, что и в вашем видео. Вот мой фрагмент кода:

 if (CurrentFileFormatVersion > int.Parse(metaInfo.SimulationFileVersion))
     throw new SimulationFormatException(ws, ss);

Работа без отладчика, скомпилированного как "Release", была прекрасной. Попробуйте.

Я предполагаю, что в отладчике VS2008 есть ошибка. Как-то воспроизводимо с ключевыми словами "if" и "throw".

РЕДАКТИРОВАТЬ: слово "исполнено" выше неправильно, конечно. Вместо этого нужно использовать "Stepped in, но не выполнил".

Ответ 6

Просто добавив "меня тоже" здесь, на фанк-подсветку кода. Я запускаю VS2008 с С#. У меня есть проект Windows Forms, ссылающийся на библиотеку классов в другом проекте, и я отлаживаю их по очереди. "В какой-то момент" желтая подсветка в отлабе была от 14 до 20 строк от фактической выполняемой строки.

Я закрыл VS, открыл каталоги для обоих проектов, удалил все из bin/Debug и obj/Debug в обоих каталогах, а затем перезапустил VS. При перекомпиляции и переходе через отладку все было хорошо.

Я не знаю, была ли проблема в файле .manifest,.pdb или, возможно, в файле .Cache. Это не имеет значения. Удалите все, и все будет хорошо.

FWIW, Googling был почти бесполезен, за исключением того, что он вернул эту SO-нить. Все остальные обращения касались проблем с шаблонами VС++ и VS2005, где SP исправил эту проблему. Это не проблема.