отладчик visual studio 2010 - выполняет оператор if, несмотря на условие false - PullRequest
8 голосов
/ 06 декабря 2010

Я использую VS 2010 Professional (в Windows 7 Professional 64), пишу с WCF 4.0. У меня есть следующий код:

        if (responseMessage.StatusCode == HttpStatusCode.NotFound)
        {                
            throw new ContentNotFoundException(contentId, SSPErrorCode.PartnerRestGetStream404);
        }

При подключении отладчика к процессу, установив точку останова в операторе «if» или перед этим, в то время как условие ложно (responseMessage.StatusCode имеет значение «OK»), отладчик переходит в оператор «if». Затем он переходит через оператор «throw», ничего не делая, а затем продолжает работу с кодом.

Я пробовал:

Перезапуск VS, выход из системы моего пользователя Windows, перезагрузка, очистка решения, его сборка, перестройка, переработка пула приложений, перезапуск IIS, добавление дополнительного кода в оператор if и в условие - ничего не получалось далеко.

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

Погуглив это, я нашел только http: - social.msdn.microsoft.com/Forums/en-US/vsdebug/thread/d4b70fd7-b74a-42ce-a538-7185df3d3254/, поэтому я попытался вручную установить точку останова, и в этом классе он не сломался, хотя в других классах - то же самое.

Я бы хотел исправить это без переустановки VS. Заранее спасибо!


Обновление

  1. Так как я поднял это и не смог найти ответ, я продолжил свой проект.
  2. Я наткнулся на эту проблему, о которой Джон Макинтайр сообщил в этом посте , что заканчивается упрощенным примером:
using System; 

namespace IEnumerableBug2 
{ 
    class Program 
    {
        static void Main(string[] args) 
        {
            if (new object() == null)
                throw new Exception();
            try { }  catch { }
        }
    }
}

Обновление № 2 :

Обратите внимание, что мой метод также содержит оператор try-catch, через несколько строк после оператора if.

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

Ответы [ 3 ]

3 голосов
/ 10 ноября 2011

Я тоже испытываю эту проблему, но немного по-другому. Вот мой код:

        string lockCode = Guid.NewGuid().ToString();
        bool alreadyLocked = string.IsNullOrWhiteSpace(lockCode);

        if (alreadyLocked) {
            throw new Exception("already running");
        }

        try {
            PerformTask(task);
        }
        finally {
            UnlockTask(task, lockCode);
        }

Как видите, строке lockCode всегда присваивается значение Guid. Отладчик входит в область «если», хотя не должен. Исключение не выдается.

Я использую Visual Studio 2010 с пакетом обновления 1 (SP1) в 64-разрядной версии Windows 7 с ReSharper 6.0.

Microsoft Visual Studio 2010
Version 10.0.40219.1 SP1Rel
Microsoft .NET Framework
Version 4.0.30319 SP1Rel
Installed Version: Premium

Это происходит со мной в приложении ASP.NET на платформе 4.0. Я попытался запустить код repro, размещенный здесь, в другом проекте на моей машине, но не смог воспроизвести проблему.

Кроме того, я удалил кэш теневого копирования для .NET Framework по этому пути:

C:\Users\username\AppData\Local\assembly

Я удалил каталог кэша символов VS2010 и временные файлы ASP.NET. Я перезагрузил свой компьютер, очистил все решение и восстановил все. Понятия не имею, почему это происходит.

Обходной путь: Если я удаляю часть «try-finally» из метода или извлекаю оператор throw в другой метод, отладчик правильно переходит область «if».

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

1 голос
/ 17 мая 2012

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

using System; 

namespace IEnumerableBug2 
{ 
    class Program 
    {
        static void Main(string[] args) 
        {
            if (new object() == null)
                throw new Exception();

            #if DEBUG
            bool workaround = true; // dummy instruction
            #endif

            try { }  catch { }
        }
    }
}
0 голосов
/ 18 декабря 2010

Хотя на самом деле происходили странные вещи, я сильно сомневаюсь, что это ошибка в отладчике или плохая установка VS.

Я думаю, что-то должно происходить, что вы не правильно взаимодействуете.Вы поместили выражение «responseMessage.StatusCode == HttpStatusCode.NotFound» в окно «Отладка»?Что это возвращает?Возможно, StatusCode каждый раз возвращает другое значение?Вы пытались оценить его несколько раз, чтобы убедиться, что он согласован?

Единственный способ, которым я мог представить это, - это если код был изменен, и когда было предложено, хотите ли вы отладить исходный файл, хотяего версия не совпадает, вы ответили Да.Это объясняет, почему вы можете пропустить строку «throw», не делая ничего - вы не отлаживаете реальный код, который вы видите, а его более старую версию.Чтобы это исправить, перестройте все и никогда не говорите «да» в ответ на запрос, если хотите отладить, даже если есть несоответствие версий - это слишком запутанно!

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