Jako administrator systemu czasami spotykam się z sytuacjami, w których program zachowuje się nienormalnie, nie generując wcale błędów lub tworząc nonsensowne komunikaty o błędach.
W przeszłości - zanim pojawiła się java - istniały dwa środki zaradcze:
- Jeśli nic innego nie pomoże - RTFM ;-)
- Jeśli nawet 1. nie pomaga - prześledzić wywołania systemowe i zobaczyć, co się dzieje
Zwykle używam strace -f
do tego zadania w systemie Linux (inne systemy operacyjne mają podobne narzędzia do śledzenia). Teraz, chociaż zwykle działa to dobrze w przypadku każdego staromodnego programu, ślad staje się bardzo niewyraźny, gdy robi się to samo w procesie Java . Jest tak wiele wywołań systemowych pozornie niezwiązanych z żadnym rzeczywistym działaniem, że przeszukiwanie takiego zrzutu jest okropne.
Czy są lepsze sposoby na to (jeśli kod źródłowy nie jest dostępny)?
Z tej samej próżności podczas debugowania programów, które nie działały poprawnie w systemie Linux, można użyć podobnych narzędzi do debugowania uruchomionych maszyn JVM w systemie.
Narzędzie nr 1 - jvmtop
Podobnie
top
, możesz użyć jvmtop, aby zobaczyć, jakie są klasy w uruchomionych maszynach JVM w twoim systemie. Po zainstalowaniu wywołujesz go w następujący sposób:Jego dane wyjściowe są podobnie zaprojektowane, aby wyglądały jak narzędzie
top
:Narzędzie nr 2 - jvmmonitor
Inną alternatywą jest użycie jvmmonitor . JVM Monitor to profiler Java zintegrowany z Eclipse do monitorowania zużycia procesora, wątków i pamięci przez aplikacje Java. Możesz użyć go do automatycznego znalezienia uruchomionych maszyn JVM na lokalnym hoście lub połączyć się ze zdalnymi maszynami JVM za pomocą portu @ host.
Narzędzie nr 3 - visualvm
visualvm jest prawdopodobnie „narzędziem”, do którego można sięgać podczas debugowania problemów z JVM. Jego zestaw funkcji jest dość głęboki i można bardzo głęboko przyjrzeć się wnętrznościom.
Profiluj działanie aplikacji lub analizuj przydział pamięci:
Pobieraj i wyświetlaj zrzuty wątków:
Referencje
źródło
Zastanów się
jstack
. Niezupełnie pasuje dostrace
, bardziej jakpstack
-analog, ale przynajmniej da ci zdjęcie migawki w czasie. Można połączyć je razem, aby uzyskać surowy ślad, jeśli trzeba.Zobacz także sugestie w tym artykule SO: /programming/1025681/call-trace-in-java
źródło
Jeśli używasz RHEL OpenJDK (lub podobnie, chodzi o to, że nie jest to JDK Oracle), możesz do tego użyć SystemTap .
Niektóre sondy są włączane za pomocą opcji wiersza poleceń java
-XX:+DTraceMethodProbes
,-XX:+DTraceAllocProbes
,-XX:+DTraceMonitorProbes
. Pamiętaj, że włączenie tych sond znacząco wpłynie na wydajność programu.Oto przykładowy skrypt SystemTap:
Możesz także użyć,
jstack()
aby uzyskać stos Java procesu, ale zadziała to tylko wtedy, gdy uruchomisz SystemTap przed JVM.Zauważ, że SystemTap będzie śledził każdą metodę. Nie jest również w stanie uzyskać argumentów metody. Inną opcją jest użycie własnych możliwości śledzenia JVM, które nazywa się JVMTI. Jedną z najbardziej znanych implementacji JVMTI jest BTrace .
źródło
Zaleca się wypróbowanie Jackplay , który jest narzędziem śledzenia JVM, umożliwiającym śledzenie wejścia i wyjścia metody bez zmiany kodu lub ponownego wdrożenia.
źródło