2011-11-14 2 views
17

Я часто нахожу, что я устанавливаю точку останова. Где-то в коде и вручную включаю одну или несколько точек останова при ударе этой точки останова. Типичный случай - когда я отлаживаю unittest и не забочусь о предыдущих тестах.Включить точку останова B, если точка останова 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() -test.

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

+1

Вы проверили условные точки останова? Вероятно, вы могли бы использовать условие, на которое ударяется точка останова A, чтобы включить «условную» точку останова B. (В этом случае вам больше не нужна точка останова A) – ChristiaanV

+0

@ChristiaanV: да, но я боюсь, что условные точки останова не будут достаточно в этом случае - по крайней мере, не в общем. – larsmoa

+0

Не могли бы вы показать образец кода, где вы хотели бы использовать это? – ChristiaanV

ответ

19

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

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

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

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

breakpoint condition

На зависимой контрольной точке установите условие готовности к работе:

System.AppDomain.Current Domain.GetData ("break")! = Null

+0

Мне было интересно, будет ли это работать со следами ... теперь я знаю. Upvoted! – codekaizen

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 («ЗДЕСЬ»), но вы можете включить или отключить точку останова, что фактически позволит другой точке останова.

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

+0

Хотя это не то, что я искал, я думаю, это лучшее (ну, только) предложение. – larsmoa

Смежные вопросы