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?

Author: abatishchev, 2011-11-14

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)}

stan punktu przerwania

W zależności od punktu przerwania Ustaw warunek hit na:

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

 20
Author: alex,
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.

 2
Author: Daryl,
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