miercuri, 24 decembrie 2008

Debug-area unei aplicatii Java in timp ce ruleaza

Zilele astea m-am lovit de urmatoarea problema: o aplicatie Java se blocheaza (aparent) fara motiv. Pentru ca nu am acces la codul sursa al aplicatiei, am procedat in felul urmator (treaba se desfasoara pe un sistem *nix):
  • am aflat PID-ul JVM-ului in care e rulata aplicatia (daca ea se numeste "Test", un ps ax | grep Test e suficient)
  • am facut un core dump pentru procesul respectiv: gcore pid_no (va rezulta un fisier numit core.pid_no). Acesta contine spatiul de adresa al JVM-ului (pe romaneste, toata memoria pe care o accesa JVM-ul in timp ce rula, inclusiv executabilul sau incarcat in memorie)
  • am apelat which java pentru a determina calea catre JVM-ul default (sa speram ca va aflati in cazul simplu in care ati compilat cu javac-ul corespunzator JVM-ului default)
  • acum totul e simplu: jstack path_to_jvm core.pid_no. Acesta ne va intoarce cate un stack trace pentru fiecare thread care ruleaza, impreuna cu informatia de debug asociata; drept bonus, are si deadlock detector asociat
Happy debugging!

Niciun comentariu:

Trimiteți un comentariu