2009-10-13 12 views
11

Ostatnie 4 godziny spędziłem na skonfigurowaniu profilowania Eclipse TPTP na instancji Tomcat, która musi być uruchamiana zdalnie (tj. Nie w Eclipse). Powinno to być możliwe zgodnie z dokumentami kontrolnymi TPTP i Agent .Java JVMTI nie działa obok -Xdebug-Xrunjdwp

Zainstalowałem komponenty TPTP (4.6.0) w moim środowisku roboczym Eclipse (Galileo) , a także Agent Controller zgodnie z instrukcjami na stronie internetowej . Aby włączyć agenta, dodałem następujące opcje do linii poleceń, który rozpoczyna wystąpienie Tomcat:

-agentlib:JPIBootLoader=JPIAgent:server=enabled;HeapProf:allocsites=true 

i dodaje następujące katalogi do przodu Ścieżka:

D:\dev\tools\ac\plugins\org.eclipse.tptp.javaprofiler 
D:\dev\tools\ac\bin 

podczas próby rozpocząć Tomcat I konsekwentnie dostaje następujący błąd wiadomość:

ERROR: JDWP unable to get necessary JVMTI capabilities. ["debugInit.c",L279] 

zrobiłem dużo Googling ale nic nie znalazłem releva nt; Próbowałem ponownie zainstalować TPTP i różne wersje programu Agent Controller.

W końcu problem okazało się, że zacząłem Tomcat z opcją „jpda”, co przekłada się catalina.bat

-Xdebug -Xrunjdwp:transport=..... 

Zdejmowanie „jpda” argumentem polecenia spowodowane JVMTI zacząć pracujący.

WIĘC, pytanie brzmi: podczas żadnego z moich wyszukiwań nic nie znalazłem pod numerem wskazującym, że agent JVMTI jest niezgodny z debugowaniem. Czy ktoś może wyjaśnić, co się dzieje i dlaczego JVMTI + JDWP nie jest prawidłową konfiguracją ?

Odpowiedz

20

Żadna z dotychczasowych odpowiedzi nie jest poprawna i jest to pierwsze trafienie, które pojawia się w Google, jeśli zapytasz o wspomniany błąd, więc uważam, że potrzebne jest pewne wyjaśnienie.

JVMTI i JDWP do działają razem, w rzeczywistości generalnie muszą być używane razem. Otrzymasz ERROR: JDWP unable to get necessary JVMTI capabilities, jeśli -Xrunjdwp (i/lub ewentualnie -agentlib:jdwp) zostanie określone więcej niż jeden raz w wierszu poleceń. Aby to naprawić, upewnij się, że masz tylko jeden z -Xrunjdwp lub -agentlib:jdwp w linii poleceń.

Aby uzyskać więcej informacji, czytaj dalej ...

JVMTI (Java Virtual Machine Interface Tool) jest następcą JVMDI (Java Virtual Machine Debug Interface) i JVMPI (Java Virtual Machine Profilowanie Interface). Obejmuje on funkcje zarówno JVMDI, jak i JVMPI, które zostały wycofane w Javie 5 i usunięte w Javie 6. Jest to interfejs API, który eksponuje wewnętrzne elementy JVM w celu debugowania i profilowania.

JDWP (Java Debug Wire Protocol) to protokół opisujący prosty mechanizm przesyłania poleceń i odpowiedzi. O ile mi wiadomo, jest to jedyny sposób na to, aby debugger siedzący poza JVM komunikował się z nim i komunikował się z JVMTI.

JDI (Java Debugger Interface) to interfejs API po stronie klienta (po stronie debuggera), który udostępnia niektóre funkcje JVMTI przy mniej więcej przezroczystym użyciu JDWP.

Wymieniona w odpowiedzi Boba Dobbsa bug dotyczy błędnego komunikatu o błędzie oraz faktu, że JVM spróbuje załadować JDWP raz za każdym razem, gdy zostanie określone w wierszu poleceń. Nigdzie nie stwierdza, że ​​JDWP i JVMTI nie mogą być używane razem.

Więcej informacji tutaj: http://publib.boulder.ibm.com/infocenter/iseries/v5r4/topic/rzaha/jpdebuga.htm

+0

, czy możliwe jest jednoczesne korzystanie z zdalnego debugowania z profilowaniem? –

+1

@michael Wierzę, że tak, ale jeśli nie próbujesz naśladować dziwnych warunków, próbując odtworzyć wyciek pamięci lub gigantyczny skok procesora, nie profiluje, a debugowanie brzmi jak zły pomysł? –

+0

Świetna odpowiedź. Wystąpił ten błąd. Musiałem wyłączyć tryb debugowania na moim starszym serwerze aplikacji Sun, zanim mogłem uzyskać dostęp do konfiguracji profilera YourKit. Dziękuję Ci! – jlpp

3

Wpadłem na ten sam problem co ty, ale wymyśliłem raport błędu JVM (http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6354345), który rzucił nieco światła na problem. Zasadniczo sprowadza się do biblioteki agenta Java, która nigdy nie była przeznaczona do załadowania dwa razy na tę samą maszynę wirtualną. Jest do bani, ale wydaje się, że jest to podstawowe ograniczenie systemu agentów, którego nie można wykonywać jednocześnie.

+0

Dzięki za informacje. –

1

Dla mnie to był taki sam problem jak Kodeks Bling postu, byli duplikat -Xrunjdwp nie zdawali sobie sprawy było drugie -Xrunjdwp jak to było ukryte w zmiennej %JAVA_OPTIONS% sprawdzić swoją aplikację Skrypt uruchamiania serwera.