Включить точку останова B, если была достигнута точка останова A - PullRequest
22 голосов
/ 14 ноября 2011

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

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() -теста.

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

Ответы [ 2 ]

24 голосов
/ 02 октября 2012

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

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

Итак, на первой точке останова вы определяете настройку «когда попадете» с помощью:

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

breakpoint condition

На зависимой точке останова установите условие попадания на:

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

2 голосов
/ 14 ноября 2011

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

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 ("HERE"), но вы можете включить или отключить точку останова, что фактически активирует другую точку останова.ваше приложение во время отладки.

...