Moje omiljene tehnike otklanjanja pogrešaka u Javi

Ovaj članak govori o tehnikama koje sam koristio za otklanjanje pogrešaka kodova različitih vrsta, kao što su:

  1. CodeBase s visokom istodobnom prirodom.
  2. CodeBase s puno vlastitih (nepodržanih) knjižnica.
  3. CodeBase s puno zastarjelog / neželjenog koda.
  4. CodeBase s curenjem memorije.
  5. CodeBase gdje svaki JVM može razgovarati sa svakim drugim JVM-om.

Pa pogledajmo ih jedan po jedan.

CodeBase s visokom istodobnom prirodom.

Može se dogoditi da za posluživanje zahtjeva JVM koristi mnoge niti za npr.

Req -> tomcatThread-1 -> executorThread-2 -> BizThread-3->…`

Recimo, otkrivamo da iznimka dolazi u BizThread-3. Sada kao program za ispravljanje pogrešaka želimo razumjeti tijek zahtjeva. Ali stacktrace neće moći pružiti cjelovit tijek zahtjeva (na primjer, što se dogodilo u executorThread-2 i što se dogodilo u tomcatThread-1 i tako dalje).

Tehnika 1.1: Napišite prilagođeni java-agent koji će se koristiti za učinkovito dodavanje log.debug()na početak i kraj svake metode određenih java paketa. To će nam dati uvid u to što se sve naziva.

Tehnika 1.2: U određenim okvirima, ako su podržani, upotrijebite AOP za proksiranje svih metoda i učinkovito dodavanje log.debug().

CodeBase s puno vlastitih (nepodržanih) knjižnica.

Ponekad se nađemo u situaciji da, nakon višesatnog otklanjanja pogrešaka, zakuvamo problem u tome što se xyz-gov-secret knjižnica loše ponaša i ova knjižnica sada nije podržana.

Tehnika 2.1: zasučite rukave i instalirajte eclipse-decompileri zaronite u bazu koda.

CodeBase s puno zastarjelog / neželjenog koda.

Ovo je klasično: ponekad se nađemo u metodi od 500+ redaka s tonama zastarjelih if-else. Sada, kako da shvatimo koji je protok koda za određeni poziv, koji će if-else koristiti, a koji mrtvi kôd?

Tehnika 3.1: Možemo koristiti alat koji se naziva jacoco agent . Prikuplja detalje izvršenja tijekom izvođenja i može kodirati kod u boji u eclipseu.

U osnovi, to je isti alat, koji se obično koristi za analizu pokrivenosti koda pomoću JUnit testa.

CodeBase s curenjem memorije.

Svaki programer ima dan kada u njihovom lokalnom sustavu sve ide u redu u proizvodnji OutOfMemory :(

Tehnika 4.1:JVM pruža tehnike za hvatanje deponija hrpe u slučaju outOfMemory.

Dodajte sljedeće kao argument tijekom pokretanja JVM-a

-XX: + HeapDumpOnOutOfMemoryError . Ovo će zabilježiti odlagalište hrpe i staviti ga u datoteku koja se može koristiti za analizu onoga što jede memoriju.

Tehnika 4.2: Također možete izvršiti dump heap / dump niti pokrenute JVM koristeći jProfiler / Jvisiualvm.

CodeBase gdje svaki JVM može razgovarati sa svakim drugim JVM-om.

Kada vas bace u okruženje distribuiranog špageta, postaje teško pratiti tijek zahtjeva.

Tehnika 5.1: Možete koristiti alate poput Wiresharka . Wireshark bilježi mrežne podatke i predstavlja ih u lijepom korisničkom sučelju. Tada možete vidjeti HTTP zahtjev / odgovor koji prolazi kroz sustav

Časna spomena

Tehnika 6.1: Namjerno umetnite u okruženje s jednim navojem

try catch kako bi se brzo saznao trag stoga.

try { throw new RuntimeException(); } catch(Exception e){ e.printStackTrace(); }

Tehnika 6.2: Korištenje točke prekida pomrčine ili korištenja uvjetne točke prekida.

Tehnika 6.3: //en.wikipedia.org/wiki/Rubber_duck_debugging

Motivacija članka: Timsko učenje / razmjena znanja.