Предотвращение отладки от взлома в течение определенного c блока кода / метода - PullRequest
0 голосов
/ 07 января 2020

Позвольте мне начать с того, что я знаю о DebuggerStepThroughAttribute и использую его во многих местах с большим успехом.

Однако я ищу дополнительное решение, которое бы работало для моего конкретного c сценария, который я сейчас проиллюстрирую ...

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

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

Так, например, если моя отладка неудачного теста потребовала, чтобы я поместил точку останова в один такой общий метод, отладчик остановился бы там несколько раз (может быть, раздражающе большое количество раз!), Прежде чем я добрались до сути, которая меня интересует (фактический тест, а не посев).

Оставляя в стороне тот факт, что я могу теоретически реорганизовать все и улучшить развязку, я спрашиваю следующее:

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

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

Но это кажется утомительным, потому что точки останова часто добавляются, удаляются, затем добавляются снова, и так далее c. Учитывая элементарную поддержку управления точками останова в Visual Studio, это быстро становится действительно раздражающим.

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


РЕДАКТИРОВАТЬ: Вот надуманный пример того, что я мог бы иметь:
public class MyFramework
{
    public bool TryDoCommonWork(string s)
    {
        // Picture an actual breakpoint here instead of this line.
        // As it is, debugger would stop here 3 times during the seeding
        // phase and then one final time during the test phase.
        Debugger.Break();

        if (s != null)
        {
            // Do the work.
            return true;
        }

        return false;
    }
}

[TestClass]
public class MyTests
{
    [TestMethod]
    public void Test()
    {
        var fw = new MyFramework();

        // Seeding stage of test.
        fw.TryDoCommonWork("1");
        fw.TryDoCommonWork("2");
        fw.TryDoCommonWork("3");

        // Test.
        Assert.IsTrue(fw.TryDoCommonWork("X"));
    }
}

То, что я действительно ищу, примерно что-то похожее на это:

[TestClass]
public class MyTests
{
    [TestMethod]
    public void Test()
    {
        var fw = new MyFramework();

        // Seeding stage of test with no debugger breaking.
        using (Debugger.NoBreakingWhatsoever())
        {
            fw.TryDoCommonWork("1");
            fw.TryDoCommonWork("2");
            fw.TryDoCommonWork("3");
        }

        // Test with normal debugger breaking.
        Assert.IsTrue(fw.TryDoCommonWork("X"));
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...