Włącz punkt przerwania B, jeśli punkt przerwania A został trafiony
Często ustawiam gdzieś w kodzie punkt przerwania A i ręcznie włączam jeden lub więcej punktów przerwania, gdy ten punkt przerwania zostanie trafiony. Typowy przypadek dotyczy debugowania jednostki i nie obchodzi mnie poprzednie testy.
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));
}
Wyobraź sobie, że testAddZeros()
i testAddOnes()
działa dobrze, ale testAddNegativeNumber()
. W tym przypadku ustawienie punktu przerwania na Number result = a.add(b);
byłoby naturalnym miejscem rozpoczęcia debugowania. Teraz wyobraź sobie, że błąd znajduje się gdzieś głęboko wewnątrz Number::add
, więc nie jesteśmy naprawdę interrested w rzeczy, które pojawiają się na początku Numbers::add
. Chcę ustawić punkt przerwania gdzieś wewnątrz Numbers::add
, który uruchamia się tylko wtedy, gdy jestem wewnątrz testAddNegativeNumber()
- testu.
Czy jest jakiś sposób, aby automatycznie włączyć breakpoint B
gdy breakpoint A
jest hit?
2 answers
Można uzyskać zależne punkty przerwania nawet bez zmiany kodu, używając jakiegoś globalnego magazynu do przechowywania znacznika, który włączy zależne punkty przerwania.
Jednym z najbardziej dostępnych magazynów, które znalazłem, są niestandardowe właściwości domeny aplikacji. Są one dostępne przez System.AppDomain.CurrentDomain.Metody GetData i SetData.
Więc na pierwszym breakpoincie definiujesz ustawienie "po trafieniu "za pomocą:
{System.AppDomain.CurrentDomain.SetData ("break", true)}
W zależności od punktu przerwania Ustaw warunek hit na:
System.AppDomain.CurrentDomain.GetData ("break")!= null
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-10-02 09:41:58
To chyba najlepsze, co możesz zrobić, ale wydaje się to zbyt dużym hackiem, aby nawet spróbować, ponieważ wymaga dodania zmiennej...
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");
Nie będziesz w stanie zatrzymać się na konsoli.WriteLine ("tutaj") linia, ale możesz włączyć lub wyłączyć punkt przerwania, co w efekcie włączy drugi punkt przerwania.
Uważaj jednak, warunkowe polecenia punktów przerwania poważnie pogorszą wydajność aplikacji podczas debugowania.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-11-14 14:11:48