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

Включить точку останова B, если была удалена точка останова A

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

void testAddZeros()
{
  Number a(0);
  Number b(0);
  Number result = a.add(b);
  assert((a + b) == Number(0))
}
void testAddOnes()
{
  Number a(1);
  Number b(1);
  Number result = a.add(b);
  assert((a + b) == Number(2));
}
void testAddNegativeNumber()
{
  Number a(1);
  Number b(-1)
  Number result = a.add(b);
  assert((a + b) == Number(0));
}

Представьте, что если testAddZeros() и testAddOnes() работают нормально, но testAddNegativeNumber(). В этом случае установка точки останова при Number result = a.add(b); была бы естественным местом для начала отладки. Теперь представьте, что ошибка находится где-то глубоко внутри Number::add, поэтому нас не интересует материал, который встречается на раннем этапе Numbers::add. Я хочу сделать, чтобы установить точку останова где-то внутри Numbers::add, которая запускается только в том случае, если я внутри testAddNegativeNumber() -test.

Есть ли способ автоматического включения точки останова B при ударе точки останова A?

4b9b3361

Ответ 1

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

Одним из наиболее доступных хранилищ, которые я нашел, являются пользовательские свойства домена приложения. К ним можно обратиться с помощью методов System.AppDomain.CurrentDomain.GetData и SetData.

Итак, на первой точке останова вы определяете настройку "при попадании":

{System.AppDomain.CurrentDomain.SetData( "перерыв", правда)}

breakpoint condition

В зависимой точке останова установите условие готовности:

System.AppDomain.CurrentDomain.GetData( "break" )!= null

Ответ 2

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

string breakpointToStopOn = string.Empty;
Console.WriteLine("HERE"); // You can set breakpoint A here, 
                           // with a condition (right click on the breakpoint, then selectCondition),
                           // that sets breakpointToStopOn = "A"
Console.WriteLine("B"); // and you can set your breakpoint here with this condition
                        // (breakpointToStopOn == "A");  

Фактически вы не сможете остановиться на строке Console.WriteLine( "ЗДЕСЬ" ), но вы можете включить или отключить точку останова, которая фактически разрешит другую точку останова.

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