Gyakorlati alapok
Programozási molytalanítás avagy a debug üzemmód
A programozás során gyakran szembesülünk különféle belső programhibákkal (bugs), amelyek a program futását megakasztják. Legtöbbjük forrását valamelyik szoftveres rendszerszint képes detektálni (JVM vagy az Eclipse, súlyosabb esetben maga az operációs rendszer), ám a legalattomosabbak tökéletesen elrejtik magukat és mi csak a hibajelenséget érzékeljük.
Máskor -főként bonyolultabb algoritmusok tanulmányozásakor-, rendkívül hasznos lenne, ha az algoritmus lépéseit egyenként is tanulmányozhatnánk. A program futtatása (run) ezt alapértelmezésben nem teszi lehetővé, hiszen annak sebessége a számítógép erőforrásaitól függően mindig maximális sebességű. Adott tehát az igény egy olyan üzemmódra, amely programlépésről programlépésre lassítja le a futtatást, sőt meg is jeleníti a program aktuális állapotait, ezáltal tárva fel a program pillanatnyi belső összefüggéseit.
Ezt a hibakereső, hibafeltáró, hibadetektáló üzemmódot debug üzemmódnak nevezzük.
Először nézzük meg azt a futtatható Java-kódot, amelyet most szemléltetés gyanánt használni fogunk. A kód nagyon egyszerű, de tartalmaz egy külső metódust is, amelyik voltaképpen a for ciklusban elkövetett folyamatos értékátadás (valtozo = i;) végeredményét írja ki.
public class Main {
public static void kulsoMetodus(int valtozo){
System.out.println(valtozo);
}
public static void main(String[] args) {
int valtozo = 0;
for(int i = 1; i <= 5; i++){
valtozo = i;
}
kulsoMetodus(valtozo);
}
}
Végeredmény:
5
1.
Mivel a belső működés tanulmányozása a program futtatásakor (run) alapértelmezésben nem lehetséges -hiszen annak sebessége a számítógép erőforrásaitól függően mindig maximális sebességű-, ezért először ki kell jelölnünk egy olyan kiindulópontot (valójában futási töréspontot /breakpoint/), ahonnan a debug üzemmód indulni fog. Ezt a kiválasztott kódsor mellett balra tehetjük meg a jobb egérgomb megnyomásával, majd a Toggle Breakpoint opció kiválasztásával. Ekkor a kódsor mellett balra egy kis kék kör fog megjelenni:
A töréspontot a Disable Breakpoint kiválasztásával tudjuk megszüntetni.
2.
Ezután ki kell adnunk a Run - Debug (vagy F11) parancsot. Hatására debug üzemmódba váltunk, még pedig a törésponttól (Breakpoint) kezdve:
Ha a töréspont nem a program elején helyezkedik el, akkor a program a töréspontig fog futni és ott megáll. Az Eclipse érzékeli a töréspontot és további információkat szolgáltat az aktuális körülményekről. Ugyanakkor megjelenik egy gombsor is, amely a debug üzemmód kezelésére hivatott. Közülük a legfontosabb gombok:
-
Piros négyszög - Terminate - kilépés a debug üzemmódból,
-
Step over - (balról a 2. görbült, lefelé mutató nyíl) - a program utasításonkénti léptetése; a kódban lépésről lépésre halad fentről lefelé, de nem lép be a külső metódusokba,
-
Step into (balról az 1. görbült, lefelé mutató nyíl) - a program utasításonkénti léptetése; a kódban lépésről lépésre halad fentről lefelé, de ha van külső metódushívás, akkor belép.
Nagyon hasznos, ha a Window - Show View - Variables parancsot kiadva ilyenkor egy további ablakot is megjelenítünk, amelyik a program változóinak aktuális állapotait, tartalmait jeleníti meg:
További érdekesség, hogy ezen ablakon belül a változók értékeit akár felül is írhatjuk:
A fenti változó-felülírás hatására a konzolon végül nem 5, hanem 6 jelent meg:
Végeredmény:
6
Rengeteg további lehetőségünk van debug üzemmódban, például a Step into segítségével gond nélkül beugorhatunk bármelyik olyan külső Java-osztályba, amelyikre a program hivatkozik (itt most a PrintStream osztály println() metódusára):
Ezáltal pontosan azon kódokba tekinthetünk bele, amelyek magát a Java-rendszert műveltetik.