Если утверждение странное в Visual Studio 2008 - PullRequest
11 голосов
/ 22 октября 2009

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

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

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

Я бы с удовольствием объяснил, пожалуйста.

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

Ответы [ 6 ]

8 голосов
/ 22 октября 2009

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

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

  • Закройте все копии Visual Studio
  • Удалите все ваши папки bin и объектов для этого проекта
  • Удалите все папки bin и объектов для всех проектов .NET
  • Удалите все файлы, которые находятся в «C: \ WINDOWS \ Microsoft.NET \ Framework \ v2.0.50727 \ Временные файлы ASP.NET»
6 голосов
/ 22 октября 2009

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

3 голосов
/ 22 октября 2009

Я уже видел похожий случай в 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, но именно это пришло мне в голову при просмотре вашего видео.

0 голосов
/ 17 января 2010

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

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

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

FWIW, поиск в Google был почти бесполезен, за исключением того, что он возвратил этот SO поток. Все остальные хиты касались проблем с шаблонами VC ++ и VS2005, где SP исправил эту проблему. Это не та проблема.

0 голосов
/ 22 октября 2009

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

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

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

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

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

0 голосов
/ 22 октября 2009

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

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

EDIT Видя ответы других, действительно вероятной причиной является то, что ваш файл .pdb не синхронизирован с вашим .dll.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...