IntelliJ trikovi za uklanjanje pogrešaka

1. Pregled

U ovom ćemo tutorijalu pogledati neke napredni IntelliJ uređaji za otklanjanje pogrešaka.

Pretpostavlja se da su osnove otklanjanja pogrešaka već poznate (kako započeti s otklanjanjem pogrešaka, Zakoračiti u, Prijeđi preko radnje itd.). Ako ne, pogledajte ovaj članak za više detalja o tome.

2. Pametan korak u

Postoje situacije kada se više metoda poziva u jednom retku izvornog koda, kao što je doJob (getArg1 (), getArg2 ()). Ako nazovemo Zakoračiti u akcija (F7), program za pronalaženje pogrešaka ulazi u metode redom koji JVM koristi za procjenu: getArg1getArg2doJob.

Međutim, možda bismo htjeli preskočiti sve posredne pozive i izravno prijeći na ciljnu metodu. Pametan korak u akcija to omogućuje.

To je vezan za Shift + F7 prema zadanim postavkama i izgleda ovako kada se pozove:

Sada možemo odabrati ciljnu metodu za nastavak. Također imajte na umu da IntelliJ uvijek stavlja najudaljeniju metodu na vrh popisa. To znači da pritiskom na njega možemo brzo prijeći Shift + F7 | Unesi.

3. Okvir za ispuštanje

Možda shvatimo da se već dogodila neka obrada koja nas zanima (npr. Izračun trenutnog argumenta metode). U ovom slučaju, moguće je ispustiti trenutne okvire JVM stoga kako biste ih ponovno obradili.

Razmotrimo sljedeću situaciju:

Pretpostavimo da nas zanima otklanjanje pogrešaka getArg1 obrade, pa ispuštamo trenutni okvir (doJob metoda):

Sada mi smo u prethodnoj metodi:

Međutim, argumenti poziva već su izračunati u ovom trenutku, pa, trebamo ispustiti i trenutni okvir:

Sada možemo ponovno pokrenuti obradu pozivanjem Zakoračiti u.

4. Točke prijelaza na terenu

Ponekad ne-privatna polja modificiraju druge klase, ne putem postavljača, već izravno (to je slučaj s bibliotekama trećih strana u kojima ne kontroliramo izvorni kod).

U takvim situacijama možda će biti teško razumjeti kada se izvrši izmjena. IntelliJ omogućuje stvaranje točaka prekida na razini polja da bi se to moglo pratiti.

Postavljeni su kao i obično - kliknite lijevu tipku miša na lijevom žlijebu uređivača na liniji polja. Nakon toga je moguće otvorite svojstva točke prekida (desni klik na oznaku točke prekida) i konfigurirajte ako nas zanima čitanje, pisanje ili oboje u polju:

5. Bilježenje točaka prekida

Ponekad znamo da u prijavi postoji stanje utrke, ali ne znamo gdje je točno. Možda će biti izazov zakucati ga, posebno tijekom rada s novim kodom.

Izjave za otklanjanje pogrešaka možemo dodati izvorima našeg programa. Međutim, ne postoji takva mogućnost za biblioteke trećih strana.

IDE vam ovdje može pomoći - omogućuje postavljanje točaka prekida koje ne blokiraju izvršenje jednom pogođenim, već umjesto toga proizvode zapisnike o evidentiranju.

Razmotrimo sljedeći primjer:

javna statička void glavna (String [] args) {ThreadLocalRandom random = ThreadLocalRandom.current (); broj brojeva = 0; for (int i = 0; i <5; i ++) {if (isInterested (random.nextInt (10))) {count ++; }} System.out.printf ("Pronađena% d zainteresirana vrijednost% n", brojanje); } privatni statički logički isInterested (int i) {return i% 2 == 0; }

Pretpostavimo da nas zanima stvarna prijava zanima me parametri poziva.

Stvorimo neblokirajuću točku prekida u ciljnoj metodi (Shift + lijevi klik na lijevom žlijebu za uređivanje). Nakon toga otvorimo njegova svojstva (desni klik na točku prekida) i definirajte ciljni izraz u zapisnik:

Prilikom pokretanja aplikacije (imajte na umu da je i dalje potrebno koristiti način otklanjanja pogrešaka), vidjet ćemo izlaz:

zainteresirano (1) zainteresirano (4) zainteresirano (3) zainteresirano (1) zainteresirano (6) Pronađeno 2 zainteresirane vrijednosti

6. Uvjetne točke prekida

Možemo imati situaciju da se određena metoda istovremeno poziva iz više niti i trebamo otkloniti pogreške u obradi samo za određeni argument.

IntelliJ dopušta stvaranje točaka prekida koje zaustavljaju izvršenje samo ako je zadovoljen korisnički definiran uvjet.

Evo primjera koji koristi gornji izvorni kod:

Sada će se program za pronalaženje pogrešaka zaustaviti na točki prekida samo ako je zadani argument veći od 3.

7. Oznake predmeta

Ovo je najsnažnija i najmanje poznata značajka IntelliJ. U biti je vrlo jednostavno - JVM objektima možemo priložiti prilagođene oznake.

Pogledajmo aplikaciju koju ćemo koristiti za demonstraciju:

test javne klase {public static void main (String [] args) {Zadaci kolekcije = Arrays.asList (novi zadatak (), novi zadatak ()); zadaci.forEach (zadatak -> nova nit (zadatak) .start ()); } privatna statička praznina mayBeAdd (držač zbirke) {int i = ThreadLocalRandom.current (). nextInt (10); if (i% 3 == 0) {holder.add (i); }} privatna statička klasa Zadatak implementira Runnable {private final Collection owner = new ArrayList (); @Preuzmi javnu void run () {for (int i = 0; i <20; i ++) {mayBeAdd (holder); }}}}

7.1. Stvaranje oznaka

Objekt se može označiti kada je aplikacija zaustavljena na točki prekida, a cilj je dostupan iz okvira stoga.

Odaberite ga, pritisnite F11 (Označi objekt akcija) i definirajte naziv cilja:

7.2. Pregled oznaka

Sada možemo vidjeti naše oznake prilagođenih objekata čak i u drugim dijelovima aplikacije:

Super je stvar u tome čak i ako označeni objekt trenutno nije dostupan iz okvira stoga, još uvijek možemo vidjeti njegovo stanje - otvorite Procijenite izraz dijalog ili dodajte novi sat i počnite upisivati ​​ime oznake.

IntelliJ nudi da ga upotpunite s _DebugLabel sufiks:

Kada ga procijenimo, prikazuje se stanje ciljnog objekta:

7.3. Oznake kao uvjeti

Također je moguće koristiti oznake u uvjetima prekida:

8. Zaključak

Provjerili smo niz tehnika koje uvelike povećavaju produktivnost tijekom uklanjanja pogrešaka u višenitnoj aplikaciji.

To je obično izazovan zadatak i ovdje ne možemo podcijeniti važnost pomoći alata.