Если странность высказывания в Visual Studio 2008
Я столкнулся с проблемой настолько странной, что я записал свою сессию, потому что не думал, что кто-то меня поверит.
Я наткнулся на ошибку, которая, кажется, находится на очень фундаментальном уровне. Это однопоточное приложение, и все, что делает im, оценивают логическое значение.
Логическое значение равно false, однако оператор if выполняется так, как если бы он был истинным... вроде. Вы поймете, что я имею в виду. Я очистил решение и перестроил много раз. Не знаю, что происходит.
Мне понравятся некоторые объяснения.
http://www.youtube.com/watch?v=ope9kxEyt4g
Ответы
Ответ 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 исправил эту проблему. Это не проблема.