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:
źródło
Odpowiedzi:
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:
Nazwę łącznika z argumentem można znaleźć za pomocą
jdb -listconnectors
.źródło
jsadebugd
został zastąpiony przezjhsdb debugd
. I tak się stałojhsdb debugd --pid <pid>
. Zobacz slajdy wykładu przedstawiającego jhsdb i dokumentację dla jhsdbSADebugServerAttachingConnector
to, że został również usuniętyjdb
i 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
.w sowieckiej rosji czyta cię źródło
jdb -connect sun.jvm.hotspot.jdi.SAPIDAttachingConnector:pid=9426
źródło
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.
źródło
użycie jstacka (przydatne w przypadku zakleszczeń) lub wtyczki btrace VisualVM również może załatwić sprawę
źródło
Zawsze możesz użyć jdb i debugować ręcznie: P
źródło