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

Какой пример использования DebuggerStepperBoundaryAttribute?

Я знаком с DebuggerHiddenAttribute и DebuggerStepThroughAttribute. Сегодня я заметил DebuggerStepperBoundaryAttribute, и если я правильно его понимаю, если вы попытаетесь использовать F10 над свойством (или методом или любым другим), имеющим этот атрибут, оно будет превратитесь в F5.

Использовать атрибут DebuggerStepperBoundaryAttribute для выхода из степпинга через код для запуска кода. Например, в Visual Studio 2005, столкнувшись с атрибутом DebuggerStepperBoundaryAttribute, код с использованием клавиши F10 (или команды "Шаг за шагом" ) имеет тот же эффект, что и нажатие клавиши F5 или команда "Начать отладки".

Я не могу придумать пример, что это было бы полезно/полезно. Поэтому либо мое понимание неверно, либо я не могу придумать хороший пример того, как это было бы полезно. Каким будет использование DebuggerStepperBoundaryAttribute, которое было бы полезно/полезно?

4b9b3361

Ответ 1

Вот простая тестовая программа (Включите только мой код и поместите точку прерывания в строках Test 1,2,3 и 4), упомянутую ниже:

class Program
{
    static void Main(string[] args)
    {
        TestDebuggerStepperBoundary();                        // Test 1
        Test();                                               // Test 2
        TestDebuggerNonUserCode(TestDebuggerStepperBoundary); // Test 3
        TestDebuggerNonUserCode(Test);                        // Test 4
    }

    [DebuggerNonUserCode]
    private static void TestDebuggerNonUserCode(Action action) { action(); }

    [DebuggerStepperBoundary]
    private static void TestDebuggerStepperBoundary() { SomethingHorrible(); }

    [DebuggerNonUserCode]
    private static void Test() { SomethingHorrible(); }

    private static void SomethingHorrible()
    {
        var foo = "bar";
    }
}

После просмотра определения для DebuggerStepperBoundaryAttribute, я не думаю, что это определение совершенно правильно:

Атрибут DebuggerStepperBoundaryAttribute используется как escape от эффекта атрибута DebuggerNonUserCodeAttribute.

Вы можете использовать DebuggerStepperBoundaryAttribute, не будучи в контексте DebuggerNonUserCodeAttribute. F11 в тесте 1 немедленно попадает в следующую точку останова на тесте 2, не находясь в "эффекте a DebuggerNonUserCodeAttribute". Я думаю, что это должно действительно читать: "Атрибут DebuggerStepperBoundaryAttribute используется как побег от эффекта Step Into или Step Over во время отладки". Остальная часть defintion имеет смысл:

При выполнении в пределах атрибута DebuggerNonUserCodeAttribute, созданный разработчиком код выполняется как шаг за шагом до следующего пользовательский код встречается. Когда переключатели контекста выполняются на нить, следующий входящий в систему код, входящий в модуль кода, может не соответствовать к коду, который был в процессе отладки. Чтобы избежать этого отладки, используйте атрибут DebuggerStepperBoundaryAttribute для избежать перехода от кода к запущенному коду. Например, в Visual Studio 2005, столкнувшись с атрибутом DebuggerStepperBoundaryAttribute выполняя код, используя клавишу F10 (или команду "Шаг за шагом" ) имеет тот же эффект, что и нажатие клавиши F5 или с помощью Start Команда отладки.

Итак, чтобы ответить на мой вопрос, если бы был какой-то другой код, который вы должны были вызвать, то вы не можете/не хотите добавлять DebuggerStepThrough, DebuggerNonUserCode или DebuggerHidden, но если отладчик, введенный в этот метод, будет более резким, чем от пошагового кода до запуска кода, а затем использовать DebuggerStepperBoundaryAttribute. (В моей примерной программе F11 на Test 2 вы сразу попадаете в SomethingHorrible, что потенциально хуже, чем переход к запуску (F5)). Он был добавлен явно добавленным контекстным переключением потоков, и за его пределами я не знаю любой ситуации, в которой это было бы полезно.

Ответ 2

[DebuggerStepperBoundary] буквально означает, что есть граница отладки. отладчик, как правило, перепрыгивает через это (независимо от того, насколько сильно вы любите StepInto), НО ДОЛЖНЫ ПОЗВОЛЯТЬ, чтобы поставить точку останова, и в этом случае она сломается. Но обычным поведением будет перепрыгнуть через эту функцию (пропустить).

[DebuggerStepThrough], это означает, что вы НИКОГДА не ломаетесь здесь. если вы попытаетесь установить точку останова, она будет отключена, если выбран "Только мой код". обычно используется для свойств и linq и таких

Когда вы будете использовать это:

У меня есть приложение, которое использует user32.dll для отправки нажатий клавиш в определенное приложение. Я поставил DebuggerStepThrough на 90% этих функций, так как они не влияют, если они разбиты. Они должны работать в целом.

Надеюсь, это ответит на ваш вопрос.