Visual Studio ведет себя странно при отладке с условиями точки останова - PullRequest
3 голосов
/ 14 ноября 2008

Метод, с которым я работаю и который называется десятки тысяч раз, в последнее время начал вызывать исключения. В большинстве случаев отладки я устанавливаю точку останова в верхней части этого метода и выполняю ее до тех пор, пока не достигну интересующего меня вызова со значением параметра, которое вызывает исключение. В этом случае это было бы нецелесообразно, поэтому я попытался установить точку останова с условием, которое будет прерываться только при появлении этого значения параметра. Я создал точку останова в позиции, указанной ниже, и дал ей условие str == "OffendingValue".

class Foo
{
    // Bar() is called many, many times
    void Bar(string str)
    {
        try
        {
            // Breakpoint inserted here
            ...
        }
        catch (Exception ex)
        {
            ...
        }
    }
}

К моему удивлению, из-за этого Visual Studio и мое приложение перестали работать в режиме отладки. Мое приложение запустилось и вывело несколько простых сообщений, но потом перестало отвечать полностью. Думая, что Visual Studio может работать немного медленнее из-за дополнительной работы, которую он должен выполнять для контроля состояния точки останова, я отступил от своего стола на 15 минут, чтобы дать ему некоторое время для запуска. Когда я вернулся, не было никаких изменений. Я могу воспроизвести условие, удалив точку останова и воссоздав ее с тем же условием. Самое странное, что команда отладки Break All, которая обычно прерывает выполнение программы в операторе, который в данный момент ожидает, является ли она точкой останова, или вообще ничего не делает, когда у меня включена эта проблемная точка останова.

Кто-нибудь сталкивался с подобным поведением в условиях точки останова Visual Studio? Я могу использовать условия Hit Count без проблем.

Ответы [ 3 ]

7 голосов
/ 14 ноября 2008

Каждый раз, когда я пытался использовать условные точки останова в Visual Studio, у меня возникала та же проблема. Отладчик работает так медленно, что становится бесполезным. Вместо этого я заканчиваю тем, что временно добавляю в код оператор if и добавляю свою точку останова внутри него. Это не так удобно, но код выполняется в нормальном темпе и выполняет свою работу.

class Foo
{
    // Bar() is called many, many times
    void Bar(string str)
    {
        try
        {

            if(str == "condition")
            {
                int i = 0;   // Breakpoint inserted here
            }
            ...
        }
        catch (Exception ex)
        {
                ...
        }
    }
}
2 голосов
/ 14 ноября 2008

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

Если нет, если вы знаете исключение, вы можете настроить отладчик так, чтобы он прерывался при возникновении этого исключения. Перейти к отладке | Исключения и проверьте Брошенный для рассматриваемого исключения.

0 голосов
/ 14 ноября 2008

Интересно, у вас переполнение стека? Отслеживает ли VS все значения для str или что-либо связанное с каждым состоянием Bar? Если это так, тысячи копий могут сложиться.

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

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