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.
Odpowiedzi:
Instrukcje drukowania i debuger nie wykluczają się wzajemnie. Są to po prostu różne narzędzia dostępne w celu zlokalizowania / identyfikacji błędów. Są tacy, którzy twierdzą, że nigdy nie dotykają debuggera, i tacy, którzy nie mają ani jednej instrukcji logowania / drukowania w kodzie, który piszą. Moja rada jest taka, że nie chcesz być w żadnej z tych grup.
Zamiast tego naucz się korzystać z rejestrowania i nauczyć się korzystać z debuggera. Dzięki doświadczeniu (prawie bez zastanowienia) wybierzesz odpowiednie narzędzie i wykonasz zadanie dokładnie i wydajnie. Bez doświadczenia czasami wybierzesz jedną z nich, a może trochę dłużej zajmiesz się przeglądaniem zmiennych lub przeglądaniem plików dziennika, ale to wszystko jest częścią procesu uczenia się.
Tak więc, aby odpowiedzieć na konkretne pytanie. Tak. Używanie wydruków do śledzenia wykonania jest dobrą i szeroko stosowaną strategią debugowania. Jednak...
Zamiast używać instrukcji print, rozważ użycie struktury rejestrowania. Ramy rejestrowania mają koncepcję poziomów rejestrowania, dzięki czemu można dodać całą masę komunikatów dziennika, ale wybrać poziom dla każdego z nich. Gdy aplikacja działa w normalnych warunkach, Twój poziom to BŁĄD lub OSTRZEŻENIE, aby zgłaszane były tylko ważne rzeczy. Jednak gdy śledzisz kod i potrzebujesz zrozumieć przebieg wykonywania, możesz zmienić rejestrator na INFO lub DEBUG, a teraz wszystkie te instrukcje „drukowania”, które już masz w kodzie, będą zgłaszać dodatkowe informacje.
Korzystanie ze środowiska rejestrowania ...
Aktualizacja: Właśnie zauważyłem na końcu, że pytasz: „Czy to możliwe, aby powiedzieć debugerowi, aby wypisał tylko niektóre wartości do dziennika”. W zależności od używanego debugera. Wiele nowoczesnych debuggerów pozwala zdefiniować akcję, która ma być wywoływana, gdy zostanie osiągnięty punkt przerwania. W niektórych (zrobiłem to w VS i WinDbg) można określić „wydrukuj i wznów”. Visual Studio nazywa je „punktami śledzenia” zamiast „punktami przerwania”
źródło
Rejestrowanie / drukowanie i debugowanie to techniki uzupełniające, które mają różne mocne i słabe strony - najlepiej używać obu. Ale ogólnie rzecz biorąc, powiedziałbym, że debugery są w większości przypadków najlepszym narzędziem i powinny być używane jako pierwsze, a rejestrowanie / drukowanie jest używane tylko do rzeczy, w których jest rzeczywiście lepszy.
Zalety debuggerów:
Zalety rejestrowania / drukowania:
źródło
W pewien sposób drukowanie na standardowe wyjście może być dobrą strategią do debugowania kodu
używam wielu instrukcji drukowania, aby zobaczyć, co dzieje się na różnych poziomach mojego kodu, szczególnie jeśli nie w pełni rozumiem błąd
a może błąd nie zawiera żadnych szczegółowych informacji, które mogłyby wskazać, która część kodu dokładnie powoduje problem.
Jednak musisz przyzwyczaić się do narzędzi do debugowania, istnieje wiele dostępnych opcji w zależności od używanego języka lub platformy.
Inną metodą jest rejestrowanie, rejestruję błędy przez cały czas podczas pracy na aplikacjach na Androida, również z obsługą wyjątków, można łatwo zarejestrować ślad stosu lub komunikat o błędzie zgłaszanego wyjątku.
źródło