Debuguj aplikację Java bez uruchamiania maszyny JVM z argumentami debugowania

98

Zwykle, aby dołączyć debuger do działającego jvm, musisz uruchomić jvm z argumentami takimi jak:

> java -Xdebug -Xrunjdwp:transport=dt_socket,address=1000,server=y,suspend=n

Co mogę teraz zrobić, jeśli chcę debugować proces, który nie został uruchomiony w trybie debugowania?

Taka sytuacja ma miejsce, gdy system produkcyjny (tj. Uruchomiony bez argumentów debugowania) wykazuje „losowy” (używam tego terminu luźno) błąd. Nie mogę więc ponownie uruchomić jvm z odpowiednimi argumentami, ponieważ nikt nie wie, jak ponownie odtworzyć błąd. Czy w tej sytuacji nie można dołączyć do JVM?

Aby wyjaśnić, nie można używać narzędzi takich jak jdb do dołączania do już działających maszyn JVM, chyba że zostały one uruchomione w trybie debugowania

ze strony podręcznika JVM

Innym sposobem wykorzystania jdb jest dołączenie go do już uruchomionej maszyny wirtualnej Java. Maszyna wirtualna, która ma być debugowana za pomocą jdb, musi zostać uruchomiona z następującymi opcjami:

hhafez
źródło

Odpowiedzi:

48

Możesz użyć jsadebugd ( JDK ), aby dołączyć serwer debugowania do procesu (dostępne w systemie Windows z narzędziami debugowania dla systemu Windows ). Jest oznaczony jako eksperymentalny, więc możesz najpierw wypróbować go na maszynie testowej.

Stosowanie:

jsadebugd <pid>
jdb -connect sun.jvm.hotspot.jdi.SADebugServerAttachingConnector:debugServerName=localhost

Nazwę łącznika z argumentem można znaleźć za pomocą jdb -listconnectors.

McDowell
źródło
1
Używam Linuksa, więc wydaje mi się, że jest to najbardziej obiecujące rozwiązanie
hhafez
Czy chcesz się z tym podzielić?
Thorbjørn Ravn Andersen
1
Z mojego doświadczenia wynika, że ​​działało dobrze w czasach, w których tego potrzebowałem, w międzyczasie wszystkie fabryczne instancje oprogramowania nie są domyślnie skonfigurowane do uruchamiania z opcjami debugowania jvm, więc możemy użyć obsługiwanej metody.
hhafez
Na Javie 11 jsadebugdzostał zastąpiony przez jhsdb debugd. I tak się stało jhsdb debugd --pid <pid>. Zobacz slajdy wykładu przedstawiającego jhsdb i dokumentację dla jhsdb
Delthas
Wygląda na SADebugServerAttachingConnectorto, że został również usunięty jdbi myślę, że zamiennik ma być jhsdb hsdb/ jhsdb clhsdb. Nie mogę znaleźć żadnych dokumentów na temat argumentów, którym mam podać jhsdb clhsdb.
Delthas
32

Aby wyjaśnić, nie można używać narzędzi takich jak jdb do dołączania do już działających maszyn JVM>> chyba że zostały uruchomione w trybie debugowania

w sowieckiej rosji czyta cię źródło

jdb -connect sun.jvm.hotspot.jdi.SAPIDAttachingConnector:pid=9426
roślina doniczkowa
źródło
1
cóż, to jest "obsługiwana" odpowiedź, ale eksperymentalna odpowiedź jest tą, którą zaakceptowałem, więc można to zrobić w nieobsługiwanym
frazie
7

VisualVM nie jest debugerem, ale można z niego uzyskać zrzuty wątków i sterty, które mogą być przydatne w diagnozowaniu niektórych problemów. Najbardziej przydatne funkcje wymagają JVM 5 lub 6.

sk.
źródło
link nie działa .... może usunąłeś http: // przed https: // ... Nie mam jeszcze wystarczającej reputacji
Newtopian,
+1 VisualVM wygląda naprawdę interesująco. BTW: Link jest teraz naprawiony.
sleske
5

użycie jstacka (przydatne w przypadku zakleszczeń) lub wtyczki btrace VisualVM również może załatwić sprawę

Vijay
źródło
-5

Zawsze możesz użyć jdb i debugować ręcznie: P

OscarRyz
źródło
2
Zawsze myślałem, że nie można dołączyć do jvm za pomocą jdb, chyba że jvm został uruchomiony z, aby umożliwić połączenia debugowania. Czy się mylę?
hhafez
O ile rozumiem, wspomniana opcja polega na „włączeniu” zdalnego debugowania polecenia „java” (maszyny wirtualnej). Zamiast tego można też użyć polecenia jdb. Więc zamiast java MyApp możesz przejść jak jdb MyApp (i debugować interaktywnie, ustawiać punkty przerwania, uruchamiać, zatrzymywać, obserwować itp.)
OscarRyz
1
Nie wydaje mi się, żeby to było poprawne według strony podręcznika jdb - zacznij cytat Innym sposobem użycia jdb jest dołączenie go do już uruchomionej maszyny wirtualnej Java. Maszyna wirtualna, która ma być debugowana za pomocą jdb, musi zostać uruchomiona z następującymi opcjami: - end quote
hhafez
Z odpowiednim złączem (na razie nieobsługiwanym) jdb może połączyć się z działającym procesem.
Thorbjørn Ravn Andersen