Powiedzmy, że mamy taką funkcję:
public void myStart()
{
for (int i = 0; i<10; i++) myFunction(i);
}
private int myFunction(int a)
{
a = foo(a);
a = bar(a);
return a;
}
private int foo(int a)
{
//do something here
//something gnarly here
//etc
return aValue;
}
private int bar(int a)
{
// do something here
//return aValue;
}
Teraz z jakiegokolwiek powodu nasz kod nie działa. Być może generuje błąd, może zwraca nieprawidłową wartość, być może utknął w nieskończonej pętli.
Pierwszą rzeczą dla programistów pierwszego roku jest drukowanie na konsolę / standardowe wyjście (nauczyłem się drukować Hello World przed nauczeniem się korzystania z debuggera).
Na przykład w celu debugowania tego kodu mogą wykonać następujące czynności:
private int myFunction(int a)
{
print("before foo: a=" + a);
a = foo(a);
print("before bar: a=" + a);
a = bar(a);
return a;
}
private int foo(int a)
{
//do something here
print ("foo step1: a=" + a);
//something gnarly here
print ("foo step2: a=" + a + " someOtherValue="+ someOtherValue + " array.length= " + someArray.length());
//etc
return aValue;
}
private int bar(int a)
{
// do something here
//return aValue;
}
Teraz uruchamiają kod i drukują dużą konsolę, przez którą mogą przejść, aby sprawdzić, co się dzieje.
Alternatywą jest oczywiście ustawienie punktów przerwania i przejście przez kod w każdym punkcie.
Jedną z głównych zalet drukowania na konsolę jest to, że programista widzi przepływ wartości za jednym razem, bez konieczności klikania kroków itp.
Wadą jest jednak to, że kod jest pełen tych wszystkich instrukcji drukowania, które należy usunąć.
(Czy jest możliwe powiedzenie debuggerowi, aby wypisał tylko niektóre wartości do dziennika ?, punkty przerwania można następnie łatwo dodać lub usunąć bez faktycznej modyfikacji kodu).
Nadal używam drukowania z konsoli jako podstawowej metody debugowania, zastanawiam się, jak często jest to skuteczne w porównaniu z czymś innym.