Deljenje 4 veštine debugovanja u IDEA-i neophodne za čitanje izvornog koda
Danas vam donosim nekoliko naprednih veština debugovanja u IntelliJ IDEA-i koje su mi neophodne u svakodnevnom radu i čitanju izvornog koda — za tren ćete poleteti.
Dodavanje logova na tački prekida
Mnogi programeri vole da print-uju određeni sadržaj tokom debugovanja koda, jer tako izgleda direktinije. Pošto završe sa ispisivanjem, lako zaborave da obrišu taj beskoristan sadržaj, pa ga na kraju zajedno sa kodom pošalju na remote. Tokom code review-a moraju ponovo da brišu i ponovo šalju, što ne samo da povećava nepotreban obim rada, već čini i da neki čvorovi u log tree-u nemaju nikakvu vrednost.
IntelliJ IDEA nudi funkciju Evaluate and Log at Breakpoints koja nam upravo može pomoći da rešimo ovaj problem. Pogledajmo sledeći kod:
public static void main(String[] args) {
ThreadLocalRandom random = ThreadLocalRandom.current();
int count = 0;
for (int i = 0; i < 5; i++) {
if (isInterested(random.nextInt(10))) {
count++;
}
}
System.out.printf("Found %d interested values%n", count);
}
private static boolean isInterested(int i) {
return i % 2 == 0;
}Ako želimo da na 15. liniji vidimo koja je vrednost promenljive i pri svakom pozivu, ne moramo ovde dodavati nikakav log. Na mestu gde inače postavljamo tačku prekida, koristimo prečicu Shift + levi klik miša i pojaviće se sledeći sadržaj:

Označite Evaluate and log i definišite log/promenljivu koju želite da vidite, na primer ovde "interested" + i. Zatim pokrenite program u Debug režimu (u normalnom režimu pokretanja ovi logovi se ne ispisuju):
interested 7
interested 5
interested 1
interested 2
interested 0
Found 2 interested valuesAko ste dodali ovakve tačke prekida na više mesta, prosti pregled logova ponekad možda nije dovoljno intuitivan, pa možete označiti "Breakpoint hit" message iz zelenog okvira na gornjoj slici:
Breakpoint reached at top.dayarch.TestDebug.isInterested(TestDebug.java:49)
interested 6
Breakpoint reached at top.dayarch.TestDebug.isInterested(TestDebug.java:49)
interested 0
Breakpoint reached at top.dayarch.TestDebug.isInterested(TestDebug.java:49)
interested 9
Breakpoint reached at top.dayarch.TestDebug.isInterested(TestDebug.java:49)
interested 8
Breakpoint reached at top.dayarch.TestDebug.isInterested(TestDebug.java:49)
interested 1
Found 3 interested values
Disconnected from the target VM, address: '127.0.0.1:0', transport: 'socket'
Process finished with exit codeAko želite detaljnije informacije, označite Stack trace (pogledajte sami rezultat izvršavanja). Sa ovom funkcijom, gore pomenuti problemi više ne postoje.
Tačka prekida na polju
Ako čitate izvorni kod, sigurno ste se našli u nedoumici: gde se zapravo menja vrednost nekog polja u klasi? Morate pažljivo da pratite pozivni stek i korak po korak isključujete mogućnosti, pri čemu vam lako može nešto promaći.
U IntelliJ IDEA-i možemo dodati tačku prekida na određeno polje; kada se vrednost polja izmeni, automatski se skače na odgovarajuću poziciju metode.
Korišćenje je vrlo jednostavno:
- Na mestu definicije polja dodajte tačku prekida levim klikom miša (pojaviće se ikona „oka").
- Desni klik na ikonu „oka".
- U iskačućem prozoru označite opcije
Field accessiField modification.

Ako je broj metoda koje menjaju vrednost polja veliki, možete u polju Condition definisati i uslov ulaska u tačku prekida. Uz podršku ove funkcije, verujem da će vam čitanje izvornog koda ići mnogo glatko.
Tačka prekida na izuzetke
Pored čitanja izvornog koda, debugovanje koda započinjemo tek kada naiđemo na izuzetak. Kod se nakon bacanja izuzetka automatski zaustavlja, ali mi bismo želeli:
Da se kod zaustavi pre bacanja izuzetka, kako bismo mogli da pregledamo informacije o promenljivama u tom trenutku.
Tada nam treba Exception Breakpoints. Kada se baci izuzetak, postavimo tačku prekida u catch bloku. Preko nekoliko lokacija na donjoj slici možemo dobiti tip izuzetka na vrhu steka, na primer ovde NumberFormatException.

Kada znate tip izuzetka, možete dodati tačku prekida na izuzetak prema sledećim koracima:

Zatim u iskačućem prozoru izaberite NumberFormatException.

Ponovo pokrenite program u Debug režimu:

Program „na zelenom talasu" locira mesto gde je bačen izuzetak i istovremeno prikazuje informacije o promenljivama u tom trenutku. Tri reči: stabilno, precizno, odlučno — ima li iko bolji?
Tačka prekida na metodi
Prilikom čitanja izvornog koda, na primer u Spring-u, metod jednog interfejsa može biti implementiran od strane više podklasa. Pri izvršavanju je potrebno pregledati pozivni stek i korak po korak locirati klasu implementacije. IDEA takođe podržava dodavanje tačke prekida na metod interfejsa (prečica cmd+F8/ctrl+F8):
- Levi klik miša na metod radi dodavanja tačke prekida (oblik ♦).
- Desni klik na tačku prekida.
Označite sadržaj u zelenom okviru, a takođe možete definisati i uslov skoka Condition.

Kada pokrenete program u Debug režimu, automatski će ući u metod klase implementacije (obratite pažnju na oblik tačke prekida):

Videvši ovo, verovatno vam pada na pamet i metod run u poznatom interfejsu Runnable — i on radi isto, možete sami isprobati.
Zaključak
Verujem da uz podršku ovih četiri veštine debugovanja, bilo da debug-ujete na poslu ili privatno čitate izvorni kod, sve će teći lako. Na kraju, pogledajte različite tipove tačaka prekida koje IDEA podržava — ako znate samo za male crvene tačke, hajde da o tome porazgovaramo u sekciji za komentare.

Autor: tan (rigongyibing), preštampano sa: https://mp.weixin.qq.com/s/KG0yzb_9XhhTSzjHr4DkIQ
